1*890232f2SAndroid Build Coastguard Worker<?php 2*890232f2SAndroid Build Coastguard Worker/* 3*890232f2SAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 4*890232f2SAndroid Build Coastguard Worker * 5*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*890232f2SAndroid Build Coastguard Worker * 9*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*890232f2SAndroid Build Coastguard Worker * 11*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*890232f2SAndroid Build Coastguard Worker * limitations under the License. 16*890232f2SAndroid Build Coastguard Worker */ 17*890232f2SAndroid Build Coastguard Worker 18*890232f2SAndroid Build Coastguard Workernamespace Google\FlatBuffers; 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Workerabstract class Table 21*890232f2SAndroid Build Coastguard Worker{ 22*890232f2SAndroid Build Coastguard Worker /** 23*890232f2SAndroid Build Coastguard Worker * @var int $bb_pos 24*890232f2SAndroid Build Coastguard Worker */ 25*890232f2SAndroid Build Coastguard Worker protected $bb_pos; 26*890232f2SAndroid Build Coastguard Worker /** 27*890232f2SAndroid Build Coastguard Worker * @var ByteBuffer $bb 28*890232f2SAndroid Build Coastguard Worker */ 29*890232f2SAndroid Build Coastguard Worker protected $bb; 30*890232f2SAndroid Build Coastguard Worker 31*890232f2SAndroid Build Coastguard Worker public function __construct() 32*890232f2SAndroid Build Coastguard Worker { 33*890232f2SAndroid Build Coastguard Worker } 34*890232f2SAndroid Build Coastguard Worker 35*890232f2SAndroid Build Coastguard Worker public function setByteBufferPos($pos) 36*890232f2SAndroid Build Coastguard Worker { 37*890232f2SAndroid Build Coastguard Worker $this->bb_pos = $pos; 38*890232f2SAndroid Build Coastguard Worker } 39*890232f2SAndroid Build Coastguard Worker 40*890232f2SAndroid Build Coastguard Worker public function setByteBuffer($bb) 41*890232f2SAndroid Build Coastguard Worker { 42*890232f2SAndroid Build Coastguard Worker $this->bb = $bb; 43*890232f2SAndroid Build Coastguard Worker } 44*890232f2SAndroid Build Coastguard Worker 45*890232f2SAndroid Build Coastguard Worker /** 46*890232f2SAndroid Build Coastguard Worker * returns actual vtable offset 47*890232f2SAndroid Build Coastguard Worker * 48*890232f2SAndroid Build Coastguard Worker * @param $vtable_offset 49*890232f2SAndroid Build Coastguard Worker * @return int offset > 0 means exist value. 0 means not exist 50*890232f2SAndroid Build Coastguard Worker */ 51*890232f2SAndroid Build Coastguard Worker protected function __offset($vtable_offset) 52*890232f2SAndroid Build Coastguard Worker { 53*890232f2SAndroid Build Coastguard Worker $vtable = $this->bb_pos - $this->bb->getInt($this->bb_pos); 54*890232f2SAndroid Build Coastguard Worker return $vtable_offset < $this->bb->getShort($vtable) ? $this->bb->getShort($vtable + $vtable_offset) : 0; 55*890232f2SAndroid Build Coastguard Worker } 56*890232f2SAndroid Build Coastguard Worker 57*890232f2SAndroid Build Coastguard Worker /** 58*890232f2SAndroid Build Coastguard Worker * @param $offset 59*890232f2SAndroid Build Coastguard Worker * @return mixed 60*890232f2SAndroid Build Coastguard Worker */ 61*890232f2SAndroid Build Coastguard Worker protected function __indirect($offset) 62*890232f2SAndroid Build Coastguard Worker { 63*890232f2SAndroid Build Coastguard Worker return $offset + $this->bb->getInt($offset); 64*890232f2SAndroid Build Coastguard Worker } 65*890232f2SAndroid Build Coastguard Worker 66*890232f2SAndroid Build Coastguard Worker /** 67*890232f2SAndroid Build Coastguard Worker * fetch utf8 encoded string. 68*890232f2SAndroid Build Coastguard Worker * 69*890232f2SAndroid Build Coastguard Worker * @param $offset 70*890232f2SAndroid Build Coastguard Worker * @return string 71*890232f2SAndroid Build Coastguard Worker */ 72*890232f2SAndroid Build Coastguard Worker protected function __string($offset) 73*890232f2SAndroid Build Coastguard Worker { 74*890232f2SAndroid Build Coastguard Worker $offset += $this->bb->getInt($offset); 75*890232f2SAndroid Build Coastguard Worker $len = $this->bb->getInt($offset); 76*890232f2SAndroid Build Coastguard Worker $startPos = $offset + Constants::SIZEOF_INT; 77*890232f2SAndroid Build Coastguard Worker return substr($this->bb->_buffer, $startPos, $len); 78*890232f2SAndroid Build Coastguard Worker } 79*890232f2SAndroid Build Coastguard Worker 80*890232f2SAndroid Build Coastguard Worker /** 81*890232f2SAndroid Build Coastguard Worker * @param $offset 82*890232f2SAndroid Build Coastguard Worker * @return int 83*890232f2SAndroid Build Coastguard Worker */ 84*890232f2SAndroid Build Coastguard Worker protected function __vector_len($offset) 85*890232f2SAndroid Build Coastguard Worker { 86*890232f2SAndroid Build Coastguard Worker $offset += $this->bb_pos; 87*890232f2SAndroid Build Coastguard Worker $offset += $this->bb->getInt($offset); 88*890232f2SAndroid Build Coastguard Worker return $this->bb->getInt($offset); 89*890232f2SAndroid Build Coastguard Worker } 90*890232f2SAndroid Build Coastguard Worker 91*890232f2SAndroid Build Coastguard Worker /** 92*890232f2SAndroid Build Coastguard Worker * @param $offset 93*890232f2SAndroid Build Coastguard Worker * @return int 94*890232f2SAndroid Build Coastguard Worker */ 95*890232f2SAndroid Build Coastguard Worker protected function __vector($offset) 96*890232f2SAndroid Build Coastguard Worker { 97*890232f2SAndroid Build Coastguard Worker $offset += $this->bb_pos; 98*890232f2SAndroid Build Coastguard Worker // data starts after the length 99*890232f2SAndroid Build Coastguard Worker return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT; 100*890232f2SAndroid Build Coastguard Worker } 101*890232f2SAndroid Build Coastguard Worker 102*890232f2SAndroid Build Coastguard Worker protected function __vector_as_bytes($vector_offset, $elem_size=1) 103*890232f2SAndroid Build Coastguard Worker { 104*890232f2SAndroid Build Coastguard Worker $o = $this->__offset($vector_offset); 105*890232f2SAndroid Build Coastguard Worker if ($o == 0) { 106*890232f2SAndroid Build Coastguard Worker return null; 107*890232f2SAndroid Build Coastguard Worker } 108*890232f2SAndroid Build Coastguard Worker 109*890232f2SAndroid Build Coastguard Worker return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size); 110*890232f2SAndroid Build Coastguard Worker } 111*890232f2SAndroid Build Coastguard Worker 112*890232f2SAndroid Build Coastguard Worker /** 113*890232f2SAndroid Build Coastguard Worker * @param Table $table 114*890232f2SAndroid Build Coastguard Worker * @param int $offset 115*890232f2SAndroid Build Coastguard Worker * @return Table 116*890232f2SAndroid Build Coastguard Worker */ 117*890232f2SAndroid Build Coastguard Worker protected function __union($table, $offset) 118*890232f2SAndroid Build Coastguard Worker { 119*890232f2SAndroid Build Coastguard Worker $offset += $this->bb_pos; 120*890232f2SAndroid Build Coastguard Worker $table->setByteBufferPos($offset + $this->bb->getInt($offset)); 121*890232f2SAndroid Build Coastguard Worker $table->setByteBuffer($this->bb); 122*890232f2SAndroid Build Coastguard Worker return $table; 123*890232f2SAndroid Build Coastguard Worker } 124*890232f2SAndroid Build Coastguard Worker 125*890232f2SAndroid Build Coastguard Worker /** 126*890232f2SAndroid Build Coastguard Worker * @param ByteBuffer $bb 127*890232f2SAndroid Build Coastguard Worker * @param string $ident 128*890232f2SAndroid Build Coastguard Worker * @return bool 129*890232f2SAndroid Build Coastguard Worker * @throws \ArgumentException 130*890232f2SAndroid Build Coastguard Worker */ 131*890232f2SAndroid Build Coastguard Worker protected static function __has_identifier($bb, $ident) 132*890232f2SAndroid Build Coastguard Worker { 133*890232f2SAndroid Build Coastguard Worker if (strlen($ident) != Constants::FILE_IDENTIFIER_LENGTH) { 134*890232f2SAndroid Build Coastguard Worker throw new \ArgumentException("FlatBuffers: file identifier must be length " . Constants::FILE_IDENTIFIER_LENGTH); 135*890232f2SAndroid Build Coastguard Worker } 136*890232f2SAndroid Build Coastguard Worker 137*890232f2SAndroid Build Coastguard Worker for ($i = 0; $i < 4; $i++) { 138*890232f2SAndroid Build Coastguard Worker if ($ident[$i] != $bb->get($bb->getPosition() + Constants::SIZEOF_INT + $i)) { 139*890232f2SAndroid Build Coastguard Worker return false; 140*890232f2SAndroid Build Coastguard Worker } 141*890232f2SAndroid Build Coastguard Worker } 142*890232f2SAndroid Build Coastguard Worker 143*890232f2SAndroid Build Coastguard Worker return true; 144*890232f2SAndroid Build Coastguard Worker } 145*890232f2SAndroid Build Coastguard Worker} 146