From b527d066086c7ed72ff07fd8fdae704b4dfdd946 Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 21 Jun 2014 09:18:57 +0200 Subject: [PATCH] #23 : Implement Word97 aka MsDoc Reader --- samples/Sample_11_ReadWord97.php | 19 + samples/resources/Sample_11_ReadWord97.doc | Bin 0 -> 49664 bytes src/PhpWord/IOFactory.php | 2 +- src/PhpWord/Reader/MsDoc.php | 1419 ++++++++++++++++++++ src/PhpWord/Shared/OLERead.php | 310 +++++ 5 files changed, 1749 insertions(+), 1 deletion(-) create mode 100644 samples/Sample_11_ReadWord97.php create mode 100644 samples/resources/Sample_11_ReadWord97.doc create mode 100644 src/PhpWord/Reader/MsDoc.php create mode 100644 src/PhpWord/Shared/OLERead.php diff --git a/samples/Sample_11_ReadWord97.php b/samples/Sample_11_ReadWord97.php new file mode 100644 index 00000000..f0df59bf --- /dev/null +++ b/samples/Sample_11_ReadWord97.php @@ -0,0 +1,19 @@ + 'docx', 'ODText' => 'odt', 'RTF' => 'rtf'); +foreach ($writers as $writer => $extension) { + echo date('H:i:s'), " Write to {$writer} format", EOL; + $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, $writer); + $xmlWriter->save("{$name}.{$extension}"); + rename("{$name}.{$extension}", "results/{$name}.{$extension}"); +}*/ + +include_once 'Sample_Footer.php'; diff --git a/samples/resources/Sample_11_ReadWord97.doc b/samples/resources/Sample_11_ReadWord97.doc new file mode 100644 index 0000000000000000000000000000000000000000..a5ce295d8aa8c35e681eb66e26857259659f5955 GIT binary patch literal 49664 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 P>HePb{}m?uU)KL$=${T1 literal 0 HcmV?d00001 diff --git a/src/PhpWord/IOFactory.php b/src/PhpWord/IOFactory.php index ade4398e..0a156aca 100644 --- a/src/PhpWord/IOFactory.php +++ b/src/PhpWord/IOFactory.php @@ -45,7 +45,7 @@ abstract class IOFactory */ public static function createReader($name = 'Word2007') { - if ($name !== 'ReaderInterface' && $name !== 'Word2007') { + if ($name !== 'ReaderInterface' && !in_array($name, array('Word2007', 'MsDoc'))) { throw new Exception("\"{$name}\" is not a valid reader."); } diff --git a/src/PhpWord/Reader/MsDoc.php b/src/PhpWord/Reader/MsDoc.php new file mode 100644 index 00000000..13fde479 --- /dev/null +++ b/src/PhpWord/Reader/MsDoc.php @@ -0,0 +1,1419 @@ +phpWord = new PhpWord(); + + $this->loadOLE($filename); + + $this->readFib($this->dataWorkDocument); + $this->readFibContent(); + /*$this->read1Table($this->data1Table); + $this->readData($this->dataData); + $this->readObjectPool($this->dataObjectPool);*/ + + return $this->phpWord; + } + + /** + * Load an OLE Document + * @param string $filename + */ + private function loadOLE($filename) + { + // OLE reader + $ole = new OLERead(); + $ole->read($filename); + + // Get WorkDocument stream + $this->dataWorkDocument = $ole->getStream($ole->wrkdocument); + // Get 1Table stream + $this->data1Table = $ole->getStream($ole->wrk1Table); + // Get Data stream + $this->dataData = $ole->getStream($ole->wrkData); + // Get Data stream + $this->dataObjectPool = $ole->getStream($ole->wrkObjectPool); + // Get Summary Information data + $this->_summaryInformation = $ole->getStream($ole->summaryInformation); + // Get Document Summary Information data + $this->_documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + } + + /** + * + * @link http://msdn.microsoft.com/en-us/library/dd949344%28v=office.12%29.aspx + * @link https://igor.io/2012/09/24/binary-parsing.html + */ + private function readFib($data) + { + $length = 0; + print_r('============ readFib'.PHP_EOL); + print_r('============ length : '.strlen($data).PHP_EOL); + print_r('======================== FibBase'.PHP_EOL); + //----- FibBase + // wIdent + $wIdent = self::_GetInt2d($data, $length); + $length += 2; + print_r('$wIdent : '.$wIdent.'#'.dechex($wIdent).PHP_EOL); + // nFib + $nFib = self::_GetInt2d($data, $length); + print_r('$nFib : '.$nFib.'#'.dechex($nFib).PHP_EOL); + $length += 2; + // unused + $length += 2; + // lid : Language Identifier + $lid = self::_GetInt2d($data, $length); + $length += 2; + // pnNext + $pnNext = self::_GetInt2d($data, $length); + $length += 2; + + $mem = self::_GetInt2d($data, $length); + $fDot = ($mem >> 15) & 1; + $fGlsy = ($mem >> 14) & 1; + $fComplex = ($mem >> 13) & 1; + $fHasPic = ($mem >> 12) & 1; + $cQuickSaves = ($mem >> 8) & bindec('1111'); + $fEncrypted = ($mem >> 7) & 1; + $fWhichTblStm = ($mem >> 6) & 1; + print_r('$fWhichTblStm : '.$fWhichTblStm.'#'.dechex($fWhichTblStm).PHP_EOL); + $fReadOnlyRecommended = ($mem >> 5) & 1; + $fWriteReservation = ($mem >> 4) & 1; + $fExtChar = ($mem >> 3) & 1; + $fLoadOverride = ($mem >> 2) & 1; + $fFarEast = ($mem >> 1) & 1; + $fObfuscated = ($mem >> 0) & 1; + $length += 2; + // nFibBack + $nFibBack = self::_GetInt2d($data, $length); + $length += 2; + // lKey + $lKey = self::_GetInt4d($data, $length); + $length += 4; + // envr + $envr = self::_GetInt1d($data, $length); + $length += 1; + + $mem = self::_GetInt1d($data, $length); + $fMac = ($mem >> 7) & 1; + $fEmptySpecial = ($mem >> 6) & 1; + $fLoadOverridePage = ($mem >> 5) & 1; + $reserved1 = ($mem >> 4) & 1; + $reserved2 = ($mem >> 3) & 1; + $fSpare0 = ($mem >> 0) & bindec('111'); + $length += 1; + + $reserved3 = self::_GetInt2d($data, $length); + $length += 2; + $reserved4 = self::_GetInt2d($data, $length); + $length += 2; + $reserved5 = self::_GetInt4d($data, $length); + $length += 4; + $reserved6 = self::_GetInt4d($data, $length); + $length += 4; + + //----- csw + print_r('======================== csw'.PHP_EOL); + $csw = self::_GetInt2d($data, $length); + $length += 2; + print_r('$csw : '.$csw.'#'.dechex($csw).PHP_EOL); + + //----- fibRgW + print_r('======================== fibRgW'.PHP_EOL); + $fibRgW_reserved1 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved2 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved3 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved4 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved5 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved6 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved7 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved8 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved9 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved10 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved11 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved12 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved13 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_lidFE = self::_GetInt2d($data, $length); + $length += 2; + + //----- cslw + print_r('======================== cslw'.PHP_EOL); + $cslw = self::_GetInt2d($data, $length); + $length += 2; + print_r('$cslw : '.$cslw.'#'.dechex($cslw).PHP_EOL); + + //----- fibRgLw + print_r('======================== fibRgLw'.PHP_EOL); + $fibRgLw_cbMac = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved1 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved2 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpText = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpFtn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpHdd = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved3 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpAtn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpEdn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpTxbx = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpHdrTxbx = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved4 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved5 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved6 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved7 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved8 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved9 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved10 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved11 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved12 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved13 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved14 = self::_GetInt4d($data, $length); + $length += 4; + + //----- cbRgFcLcb + print_r('======================== cbRgFcLcb'.PHP_EOL); + $cbRgFcLcb = self::_GetInt2d($data, $length); + print_r('$cbRgFcLcb : '.$cbRgFcLcb.'#'.dechex($cbRgFcLcb).PHP_EOL); + $length += 2; + //----- fibRgFcLcbBlob + print_r('======================== fibRgFcLcbBlob'.PHP_EOL); + switch ($cbRgFcLcb) { + case 0x005D: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + break; + case 0x006C: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + break; + case 0x0088: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + break; + case 0x00A4 : + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); + break; + case 0x00B7: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2007); + break; + } + //print_r($this->arrayFib); + //----- cswNew + print_r('======================== cswNew'.PHP_EOL); + $cswNew = self::_GetInt2d($data, $length); + $length += 2; + print_r('$cswNew : '.$cswNew.'#'.dechex($cswNew).PHP_EOL); + + if($cswNew != 0){ + // fibRgCswNew + print_r('======================== fibRgCswNew'.PHP_EOL); + } + + print_r('======================== length : '.$length.'#'.dechex($length).PHP_EOL); + return $length; + } + + const VERSION_97 = '97'; + const VERSION_2000 = '2000'; + const VERSION_2002 = '2002'; + const VERSION_2003 = '2003'; + const VERSION_2007 = '2007'; + + /** + * @var array + */ + private $arrayFib = array(); + + private function readBlockFibRgFcLcb($data, $length, $version) + { + if($version == self::VERSION_97){ + $this->arrayFib['fcStshfOrig'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStshfOrig'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcStshf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStshf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffndRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffndRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffndTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffndTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfandRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfandRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfandTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfandTxt '] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSed'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSed'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcPad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcPad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPhe'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPhe'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfHdd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfHdd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBteChpx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBteChpx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBtePapx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBtePapx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSea'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSea'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfFfn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfFfn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldAtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldAtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCmds'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCmds'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrDrvr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrDrvr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrEnvPort'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrEnvPort'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrEnvLand'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrEnvLand'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcWss'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbWss'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDop'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDop'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAssoc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAssoc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcClx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbClx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAutosaveSource'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAutosaveSource'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcGrpXstAtnOwners'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbGrpXstAtnOwners'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAtnBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAtnBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcSpaMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcSpaMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcSpaHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcSpaHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAtnBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAtnBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAtnBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAtnBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPms'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPms'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcFormFldSttbs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbFormFldSttbs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfendRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfendRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfendTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfendTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDggInfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDggInfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfRMark'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfRMark'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAutoCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAutoCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfWkb'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfWkb'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSpl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSpl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcftxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcftxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcStwUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStwUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbTtmbd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbTtmbd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCookieData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCookieData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfIntlFld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfIntlFld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRouteSlip'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRouteSlip'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbSavedBy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbSavedBy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbFnm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbFnm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfLst'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfLst'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfLfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfLfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfTxbxBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTxbxBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDocUndoWord9'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDocUndoWord9'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUskf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUskf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcupcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcupcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcupcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcupcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbGlsyStyle'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbGlsyStyle'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlgosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlgosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcocx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcocx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBteLvc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBteLvc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['dwLowDateTime'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['dwHighDateTime'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfLvcPre10'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfLvcPre10'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAsumy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAsumy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfGram'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfGram'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbListNames'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbListNames'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfUssr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfUssr'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2000){ + $this->arrayFib['fcPlcfTch'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTch'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRmdThreading'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRmdThreading'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcMid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbMid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbRgtplc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbRgtplc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcMsoEnvelope'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbMsoEnvelope'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfLad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfLad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRgDofr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRgDofr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfCookieOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfCookieOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2002){ + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPgp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPgp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfuim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfuim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfguidUim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfguidUim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAtrdExtra'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAtrdExtra'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlrsid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlrsid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfcookie'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfcookie'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcFactoidData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbFactoidData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDocUndo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDocUndo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPmsNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPmsNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcODSO'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbODSO'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2003){ + $this->arrayFib['fcHplxsdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbHplxsdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCustomXForm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCustomXForm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbProtUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbProtUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfd'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2007){ + $this->arrayFib['fcPlcfmthd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfmthd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcArtoData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbArtoData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused5'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused5'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused6'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused6'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcOssTheme'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbOssTheme'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcColorSchemeMapping'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbColorSchemeMapping'] = self::_GetInt4d($data, $length); + $length += 4; + } + return $length; + } + + private function readFibContent() + { + #$this->readRecordSTSH(); + $this->readRecordPlcfSed(); + } + private function readRecordSTSH() + { + print_r('============ readRecordSTSH'.PHP_EOL); + // Table Stream + // fcStshf (4 bytes): An unsigned integer that specifies an offset in the Table Stream. An STSH that specifies the style sheet for this document begins at this offset. + // lcbStshf (4 bytes): An unsigned integer that specifies the size, in bytes, of the STSH that begins at offset fcStshf in the Table Stream. This MUST be a nonzero value. + /*[fcStshf] => 0 + [lcbStshf] => 1060*/ + + $posMem = $this->arrayFib['fcStshf']; + + // RECORD "STSH" + + // lpstshi (variable): An LPStshi that specifies information about the stylesheet. + // - LPStshi + // - LPStshi : cbStshi + $cbStshi = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$cbStshi :'.$cbStshi.PHP_EOL); + + // - LPStshi : stshi + // - LPStshi : stshi : stshif (18o) + // - LPStshi : stshi : stshif : cstd + $cstd = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : cbSTDBaseInFile + $cbSTDBaseInFile = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : fStdStylenamesWritten (1 bit) + // - LPStshi : stshi : stshif : fReserved (15 bits) + $fStdStylenamesWritten = self::_GetInt1d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : stiMaxWhenSaved + $stiMaxWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$stiMaxWhenSaved :'.$stiMaxWhenSaved.PHP_EOL); + // - LPStshi : stshi : stshif : istdMaxFixedWhenSaved + $istdMaxFixedWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : nVerBuiltInNamesWhenSaved + $nVerBuiltInNamesWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcAsci + $ftcAsci = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcFE + $ftcFE = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcOther + $ftcOther = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + + // - LPStshi : stshi : ftcBi (2o) + $ftcBi = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : StshiLsd + // - LPStshi : stshi : StshiLsd : cbLSD + $cbLSD = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$cbLSD :'.$cbLSD.PHP_EOL); + + + // - LPStshi : stshi : StshiLsd : mpstiilsd + // - LPStshi : stshi : StshiB + + // rglpstd (variable): An array of LPStd that specifies the style definitions. + } + private function readRecordPlcfSed(){ + // fcPlcfSed (4 bytes): An unsigned integer that specifies an offset in the Table Stream. A PlcfSed begins at this offset and specifies the locations of property lists for each section in the Main Document. If lcbPlcfSed is zero, fcPlcfSed is undefined and MUST be ignored. + // lcbPlcfSed (4 bytes): An unsigned integer that specifies the size, in bytes, of the PlcfSed that begins at offset fcPlcfSed in the Table Stream. + print_r('============ readRecordPlcfSed'.PHP_EOL); + + $posMem = $this->arrayFib['fcPlcfSed']; + // PlcfSed + // PlcfSed : aCP + $aCP = array(); + $aCP[0] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + $aCP[1] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + + print_r('$aCP :'.PHP_EOL); + print_r($aCP); + + // PlcfSed : aSed + $numSed = ($this->arrayFib['lcbPlcfSed'] - 4) / 12; + + $aSed = array(); + for($iInc = 1 ; $iInc < $numSed ; ++$iInc){ + // ignored + $posMem += 2; + // A signed integer value that specifies the position in the WordDocument Stream at which a Sepx structure is located. + $aSed[$iInc] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + // ignored + $posMem += 2; + // ignored + $posMem += 4; + } + + // page 541 pour la lecture des informations sur la section + } + + + private function read1Table($data) + { + /* + offset[0] = offsetClx + 1; + int lcb = stream.getInteger(offset); + + int countPcd = (lcb - 4)/12; + int countCp = (lcb - countPcd*8)/4; + int offsetPlcpcd = offsetClx + 5; + + for(int i=0;i> 30; + start = (start << 2) >> 2; + + offset[0] = offsetPlcpcd + i*4; + int cpPre = stream.getInteger(offset); + int cpNext = stream.getInteger(offset); + int length = cpNext - cpPre -1; + if(fc == 0) + { + length *= 2; + } + else + { + start = start/2; + } + + start += 512; + bytesToString(ogiBytes, content, start, length, fc); + + System.out.println(start +", "+ length); + }*/ + + print_r('============ read1Table'.PHP_EOL); + $clxPosition = $this->arrayFib['fcClx']; + + $text = self::_GetInt1d($data, $clxPosition); + print_r('$text : '.$text.PHP_EOL); + $lcb_piece_table = self::_GetInt4d($data, $clxPosition + 1); + $piece_table = $clxPosition + 5; + $piece_count = ($lcb_piece_table - 4) / 12; + print_r('$piece_count : '.$piece_count.PHP_EOL); + + + $countCp = ($lcb_piece_table - $piece_count*8)/4; + print_r('$countCp : '.$countCp.PHP_EOL); + for($i=0 ; $i < $piece_count ; $i++) { + + $piece_start = self::_GetInt4d($data, $piece_table + ($i * 4)); + $piece_end = self::_GetInt4d($data, $piece_table + (($i + 1) * 4)); + $piece_descriptor = $piece_table + (($piece_count + 1) * 4) + ($i * 8); + $fc = self::_GetInt4d ($data, $piece_descriptor + 2); + $is_ansi = ($fc & 0x40000000) == 0x40000000; + if (!$is_ansi) { + $fc = ($fc & 0xBFFFFFFF); + } else { + $fc = ($fc & 0xBFFFFFFF) >> 1; + } + $piece_size = $piece_end - $piece_start; + print_r('$piece_size : '.$piece_size.PHP_EOL); + if (!$is_ansi) { + $piece_size *= 2; + } + print_r('$piece_size : '.$piece_size.PHP_EOL); + if ($piece_size >= 1) { + $fc+=512; + print_r(chr(self::_GetInt2d($data, $fc + 2))); + print_r(chr(self::_GetInt2d($data, $fc + 4))); + print_r(chr(self::_GetInt2d($data, $fc + 6))); + print_r(chr(self::_GetInt2d($data, $fc + 8))); + print_r(chr(self::_GetInt2d($data, $fc + 10))); + print_r(chr(self::_GetInt2d($data, $fc + 12))); + print_r(chr(self::_GetInt2d($data, $fc + 14))); + print_r(chr(self::_GetInt2d($data, $fc + 16))); + print_r(chr(self::_GetInt2d($data, $fc + 18))); + print_r(chr(self::_GetInt2d($data, $fc + 20))); + print_r(chr(self::_GetInt2d($data, $fc + 22))); + print_r(chr(self::_GetInt2d($data, $fc + 24))); + print_r(chr(self::_GetInt2d($data, $fc + 26))); + print_r(chr(self::_GetInt2d($data, $fc + 28))); + print_r(chr(self::_GetInt2d($data, $fc + 30))); + print_r(chr(self::_GetInt2d($data, $fc + 32))); + print_r(chr(self::_GetInt2d($data, $fc + 34))); + print_r(chr(self::_GetInt2d($data, $fc + 36))); + print_r(chr(self::_GetInt2d($data, $fc + 38))); + print_r(PHP_EOL); + } + + $offsetPcd = $piece_table + $countCp*4 + $i*8; + + $start = self::_GetInt4d($data, $offsetPcd+2); + print_r('$start : '.$start.PHP_EOL); + $fc = $start >> 30; + $start = ($start << 2) >> 2; + print_r('$fc : '.$fc.PHP_EOL); + print_r('$start : '.$start.PHP_EOL); + + $offset = $piece_table + $i*4; + print_r('$offset : '.$offset.PHP_EOL); + $cpPre = self::_GetInt4d($data, $offset); + print_r('$cpPre : '.$cpPre.PHP_EOL); + $cpNext = self::_GetInt4d($data, $offset + 4); + print_r('$cpNext : '.$cpNext.PHP_EOL); + $length = $cpNext - $cpPre -1; + if($fc == 0) { + $length *= 2; + } else { + $start = $start/2; + } + + $start += 512; + print_r($start); + print_r(PHP_EOL); + print_r($length); + print_r(PHP_EOL); + print_r(self::_GetInt2d($data, $start + 2)); + print_r(PHP_EOL); + print_r(chr(self::_GetInt2d($data, $start + 2))); + print_r(PHP_EOL); + print_r(chr(self::_GetInt2d($data, $start + 4))); + print_r(chr(self::_GetInt2d($data, $start + 6))); + print_r(chr(self::_GetInt2d($data, $start + 8))); + print_r(chr(self::_GetInt2d($data, $start + 10))); + print_r(chr(self::_GetInt2d($data, $start + 12))); + print_r(chr(self::_GetInt2d($data, $start + 14))); + print_r(chr(self::_GetInt2d($data, $start + 16))); + print_r(chr(self::_GetInt2d($data, $start + 18))); + print_r(chr(self::_GetInt2d($data, $start + 20))); + print_r(chr(self::_GetInt2d($data, $start + 22))); + print_r(chr(self::_GetInt2d($data, $start + 24))); + print_r(chr(self::_GetInt2d($data, $start + 26))); + print_r(chr(self::_GetInt2d($data, $start + 28))); + print_r(chr(self::_GetInt2d($data, $start + 30))); + print_r(chr(self::_GetInt2d($data, $start + 32))); + print_r(chr(self::_GetInt2d($data, $start + 34))); + print_r(chr(self::_GetInt2d($data, $start + 36))); + print_r(chr(self::_GetInt2d($data, $start + 38))); + } +/* + + $start = self::_GetInt4d($data, 1850); + print_r('$start : '.$start.PHP_EOL); + $end = self::_GetInt4d($data, 1854); + print_r('$end : '.$end.PHP_EOL);*/ + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + private function readData($data) + { + print_r('============ readData'.PHP_EOL); + $text = self::_GetInt1d($data, 0); + print_r(dechex($text)); + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + private function readObjectPool($data) + { + print_r('============ readObjectPool'.PHP_EOL); + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + /** + * Read 8-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt1d($data, $pos) + { + return ord($data[$pos]); + } + + /** + * Read 16-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt2d($data, $pos) + { + return ord($data[$pos]) | (ord($data[$pos+1]) << 8); + } + + /** + * Read 32-bit signed integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24; + } +} diff --git a/src/PhpWord/Shared/OLERead.php b/src/PhpWord/Shared/OLERead.php new file mode 100644 index 00000000..5235d37e --- /dev/null +++ b/src/PhpWord/Shared/OLERead.php @@ -0,0 +1,310 @@ +data = file_get_contents($sFileName, FALSE, NULL, 0, 8); + + // Check OLE identifier + if ($this->data != self::IDENTIFIER_OLE) { + throw new Exception('The filename ' . $sFileName . ' is not recognised as an OLE file'); + } + + // Get the file data + $this->data = file_get_contents($sFileName); + + // Total number of sectors used for the SAT + $this->numBigBlockDepotBlocks = self::_GetInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + + // SecID of the first sector of the directory stream + $this->rootStartBlock = self::_GetInt4d($this->data, self::ROOT_START_BLOCK_POS); + + // SecID of the first sector of the SSAT (or -2 if not extant) + $this->sbdStartBlock = self::_GetInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); + + // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) + $this->extensionBlock = self::_GetInt4d($this->data, self::EXTENSION_BLOCK_POS); + + // Total number of sectors used by MSAT + $this->numExtensionBlocks = self::_GetInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); + + $bigBlockDepotBlocks = array(); + $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; + + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { + $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = self::_GetInt4d($this->data, $pos); + } + } + + $pos = 0; + $this->bigBlockChain = ''; + $bbs = self::BIG_BLOCK_SIZE / 4; + for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; + + $this->bigBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + } + + $pos = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = ''; + while ($sbdBlock != -2) { + $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; + + $this->smallBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + + $sbdBlock = self::_GetInt4d($this->bigBlockChain, $sbdBlock*4); + } + + // read the directory stream + $block = $this->rootStartBlock; + $this->entry = $this->_readData($block); + + $this->_readPropertySets(); + } + + /** + * Extract binary stream data + * + * @return string + */ + public function getStream($stream) + { + if ($stream === NULL) { + return null; + } + + $streamData = ''; + + if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { + $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']); + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = $block * self::SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + + $block = self::_GetInt4d($this->smallBlockChain, $block*4); + } + + return $streamData; + } else { + $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE; + if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) { + ++$numBlocks; + } + + if ($numBlocks == 0) return ''; + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::_GetInt4d($this->bigBlockChain, $block*4); + } + + return $streamData; + } + } + + /** + * Read a standard stream (by joining sectors using information from SAT) + * + * @param int $bl Sector ID where the stream starts + * @return string Data for standard stream + */ + private function _readData($bl) + { + $block = $bl; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::_GetInt4d($this->bigBlockChain, $block*4); + } + return $data; + } + + /** + * Read entries in the directory stream. + */ + private function _readPropertySets() { + $offset = 0; + + // loop through entires, each entry is 128 bytes + $entryLen = strlen($this->entry); + while ($offset < $entryLen) { + // entry data (128 bytes) + $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + + // size in bytes of name + $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8); + + // type of entry + $type = ord($d[self::TYPE_POS]); + + // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) + // sectorID of first sector of the short-stream container stream, if this entry is root entry + $startBlock = self::_GetInt4d($d, self::START_BLOCK_POS); + + $size = self::_GetInt4d($d, self::SIZE_POS); + + $name = str_replace("\x00", "", substr($d,0,$nameSize)); + + + $this->props[] = array ( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size); + + // tmp helper to simplify checks + $upName = strtoupper($name); + + // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) + // print_r($upName.PHP_EOL); + if (($upName === 'WORDDOCUMENT')) { + $this->wrkdocument = count($this->props) - 1; + } elseif (($upName === '1TABLE')) { + $this->wrk1Table = count($this->props) - 1; + } elseif (($upName === 'DATA')) { + $this->wrkData = count($this->props) - 1; + } elseif (($upName === 'OBJECTPOOL')) { + $this->wrkObjectPoolelseif = count($this->props) - 1; + } elseif ( $upName === 'ROOT ENTRY' || $upName === 'R') { + $this->rootentry = count($this->props) - 1; + } + + // Summary information + if ($name == chr(5) . 'SummaryInformation') { + $this->summaryInformation = count($this->props) - 1; + } + + // Additional Document Summary information + if ($name == chr(5) . 'DocumentSummaryInformation') { + $this->documentSummaryInformation = count($this->props) - 1; + } + + $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; + } + + } + + /** + * Read 4 bytes of data at specified position + * + * @param string $data + * @param int $pos + * @return int + */ + private static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + } + +}