예제 #1
0
<?php

// Run this with:
// php -S localhost:8080 native.php
require '../vendor/autoload.php';
$keyDB = new ArrayObject(array('EscherExample' => 'TheBeginningOfABeautifulFriendship'));
$escher = Escher::create('escher_request');
switch ($_SERVER["SCRIPT_NAME"]) {
    case "/":
        echo "Escher Example";
        break;
    case "/validate_request":
        try {
            $escher->validateRequest($keyDB);
            echo "OK";
        } catch (EscherException $ex) {
            echo 'ERR: ' . $ex->getMessage();
        }
        break;
}
예제 #2
0
 /**
  * Read SpContainer record (Shape Container)
  */
 private function readSpContainer()
 {
     $length = \PHPExcel\Reader\Excel5::getInt4d($this->data, $this->pos + 4);
     $recordData = substr($this->data, $this->pos + 8, $length);
     // add spContainer to spgrContainer
     $spContainer = new \PHPExcel\Shared\Escher\DgContainer\SpgrContainer\SpContainer();
     $this->object->addChild($spContainer);
     // move stream pointer to next record
     $this->pos += 8 + $length;
     // record is a container, read contents
     $reader = new Escher($spContainer);
     $escher = $reader->load($recordData);
 }
예제 #3
0
 /**
  * Process the object to be written
  */
 public function close()
 {
     // initialize
     $this->data = '';
     switch (get_class($this->object)) {
         case '\\PHPExcel\\Shared\\Escher':
             if ($dggContainer = $this->object->getDggContainer()) {
                 $writer = new Escher($dggContainer);
                 $this->data = $writer->close();
             } elseif ($dgContainer = $this->object->getDgContainer()) {
                 $writer = new Escher($dgContainer);
                 $this->data = $writer->close();
                 $this->spOffsets = $writer->getSpOffsets();
                 $this->spTypes = $writer->getSpTypes();
             }
             break;
         case '\\PHPExcel\\Shared\\Escher\\DggContainer':
             // this is a container record
             // initialize
             $innerData = '';
             // write the dgg
             $recVer = 0x0;
             $recInstance = 0x0;
             $recType = 0xf006;
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             // dgg data
             $dggData = pack('VVVV', $this->object->getSpIdMax(), $this->object->getCDgSaved() + 1, $this->object->getCSpSaved(), $this->object->getCDgSaved());
             // add file identifier clusters (one per drawing)
             $IDCLs = $this->object->getIDCLs();
             foreach ($IDCLs as $dgId => $maxReducedSpId) {
                 $dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
             }
             $header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
             $innerData .= $header . $dggData;
             // write the bstoreContainer
             if ($bstoreContainer = $this->object->getBstoreContainer()) {
                 $writer = new Escher($bstoreContainer);
                 $innerData .= $writer->close();
             }
             // write the record
             $recVer = 0xf;
             $recInstance = 0x0;
             $recType = 0xf000;
             $length = strlen($innerData);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header . $innerData;
             break;
         case '\\PHPExcel\\Shared\\Escher\\DggContainer\\BstoreContainer':
             // this is a container record
             // initialize
             $innerData = '';
             // treat the inner data
             if ($BSECollection = $this->object->getBSECollection()) {
                 foreach ($BSECollection as $BSE) {
                     $writer = new Escher($BSE);
                     $innerData .= $writer->close();
                 }
             }
             // write the record
             $recVer = 0xf;
             $recInstance = count($this->object->getBSECollection());
             $recType = 0xf001;
             $length = strlen($innerData);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header . $innerData;
             break;
         case '\\PHPExcel\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE':
             // this is a semi-container record
             // initialize
             $innerData = '';
             // here we treat the inner data
             if ($blip = $this->object->getBlip()) {
                 $writer = new Escher($blip);
                 $innerData .= $writer->close();
             }
             // initialize
             $data = '';
             $btWin32 = $this->object->getBlipType();
             $btMacOS = $this->object->getBlipType();
             $data .= pack('CC', $btWin32, $btMacOS);
             $rgbUid = pack('VVVV', 0, 0, 0, 0);
             // todo
             $data .= $rgbUid;
             $tag = 0;
             $size = strlen($innerData);
             $cRef = 1;
             $foDelay = 0;
             //todo
             $unused1 = 0x0;
             $cbName = 0x0;
             $unused2 = 0x0;
             $unused3 = 0x0;
             $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
             $data .= $innerData;
             // write the record
             $recVer = 0x2;
             $recInstance = $this->object->getBlipType();
             $recType = 0xf007;
             $length = strlen($data);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header;
             $this->data .= $data;
             break;
         case '\\PHPExcel\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE\\Blip':
             // this is an atom record
             // write the record
             switch ($this->object->getParent()->getBlipType()) {
                 case \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_JPEG:
                     // initialize
                     $innerData = '';
                     $rgbUid1 = pack('VVVV', 0, 0, 0, 0);
                     // todo
                     $innerData .= $rgbUid1;
                     $tag = 0xff;
                     // todo
                     $innerData .= pack('C', $tag);
                     $innerData .= $this->object->getData();
                     $recVer = 0x0;
                     $recInstance = 0x46a;
                     $recType = 0xf01d;
                     $length = strlen($innerData);
                     $recVerInstance = $recVer;
                     $recVerInstance |= $recInstance << 4;
                     $header = pack('vvV', $recVerInstance, $recType, $length);
                     $this->data = $header;
                     $this->data .= $innerData;
                     break;
                 case \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG:
                     // initialize
                     $innerData = '';
                     $rgbUid1 = pack('VVVV', 0, 0, 0, 0);
                     // todo
                     $innerData .= $rgbUid1;
                     $tag = 0xff;
                     // todo
                     $innerData .= pack('C', $tag);
                     $innerData .= $this->object->getData();
                     $recVer = 0x0;
                     $recInstance = 0x6e0;
                     $recType = 0xf01e;
                     $length = strlen($innerData);
                     $recVerInstance = $recVer;
                     $recVerInstance |= $recInstance << 4;
                     $header = pack('vvV', $recVerInstance, $recType, $length);
                     $this->data = $header;
                     $this->data .= $innerData;
                     break;
             }
             break;
         case '\\PHPExcel\\Shared\\Escher\\DgContainer':
             // this is a container record
             // initialize
             $innerData = '';
             // write the dg
             $recVer = 0x0;
             $recInstance = $this->object->getDgId();
             $recType = 0xf008;
             $length = 8;
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             // number of shapes in this drawing (including group shape)
             $countShapes = count($this->object->getSpgrContainer()->getChildren());
             $innerData .= $header . pack('VV', $countShapes, $this->object->getLastSpId());
             //$innerData .= $header . pack('VV', 0, 0);
             // write the spgrContainer
             if ($spgrContainer = $this->object->getSpgrContainer()) {
                 $writer = new Escher($spgrContainer);
                 $innerData .= $writer->close();
                 // get the shape offsets relative to the spgrContainer record
                 $spOffsets = $writer->getSpOffsets();
                 $spTypes = $writer->getSpTypes();
                 // save the shape offsets relative to dgContainer
                 foreach ($spOffsets as &$spOffset) {
                     $spOffset += 24;
                     // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)
                 }
                 $this->spOffsets = $spOffsets;
                 $this->spTypes = $spTypes;
             }
             // write the record
             $recVer = 0xf;
             $recInstance = 0x0;
             $recType = 0xf002;
             $length = strlen($innerData);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header . $innerData;
             break;
         case '\\PHPExcel\\Shared\\Escher\\DgContainer\\SpgrContainer':
             // this is a container record
             // initialize
             $innerData = '';
             // initialize spape offsets
             $totalSize = 8;
             $spOffsets = array();
             $spTypes = array();
             // treat the inner data
             foreach ($this->object->getChildren() as $spContainer) {
                 $writer = new Escher($spContainer);
                 $spData = $writer->close();
                 $innerData .= $spData;
                 // save the shape offsets (where new shape records begin)
                 $totalSize += strlen($spData);
                 $spOffsets[] = $totalSize;
                 $spTypes = array_merge($spTypes, $writer->getSpTypes());
             }
             // write the record
             $recVer = 0xf;
             $recInstance = 0x0;
             $recType = 0xf003;
             $length = strlen($innerData);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header . $innerData;
             $this->spOffsets = $spOffsets;
             $this->spTypes = $spTypes;
             break;
         case '\\PHPExcel\\Shared\\Escher\\DgContainer\\SpgrContainer\\SpContainer':
             // initialize
             $data = '';
             // build the data
             // write group shape record, if necessary?
             if ($this->object->getSpgr()) {
                 $recVer = 0x1;
                 $recInstance = 0x0;
                 $recType = 0xf009;
                 $length = 0x10;
                 $recVerInstance = $recVer;
                 $recVerInstance |= $recInstance << 4;
                 $header = pack('vvV', $recVerInstance, $recType, $length);
                 $data .= $header . pack('VVVV', 0, 0, 0, 0);
             }
             $this->spTypes[] = $this->object->getSpType();
             // write the shape record
             $recVer = 0x2;
             $recInstance = $this->object->getSpType();
             // shape type
             $recType = 0xf00a;
             $length = 0x8;
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $data .= $header . pack('VV', $this->object->getSpId(), $this->object->getSpgr() ? 0x5 : 0xa00);
             // the options
             if ($this->object->getOPTCollection()) {
                 $optData = '';
                 $recVer = 0x3;
                 $recInstance = count($this->object->getOPTCollection());
                 $recType = 0xf00b;
                 foreach ($this->object->getOPTCollection() as $property => $value) {
                     $optData .= pack('vV', $property, $value);
                 }
                 $length = strlen($optData);
                 $recVerInstance = $recVer;
                 $recVerInstance |= $recInstance << 4;
                 $header = pack('vvV', $recVerInstance, $recType, $length);
                 $data .= $header . $optData;
             }
             // the client anchor
             if ($this->object->getStartCoordinates()) {
                 $clientAnchorData = '';
                 $recVer = 0x0;
                 $recInstance = 0x0;
                 $recType = 0xf010;
                 // start coordinates
                 list($column, $row) = \PHPExcel\Cell::coordinateFromString($this->object->getStartCoordinates());
                 $c1 = \PHPExcel\Cell::columnIndexFromString($column) - 1;
                 $r1 = $row - 1;
                 // start offsetX
                 $startOffsetX = $this->object->getStartOffsetX();
                 // start offsetY
                 $startOffsetY = $this->object->getStartOffsetY();
                 // end coordinates
                 list($column, $row) = \PHPExcel\Cell::coordinateFromString($this->object->getEndCoordinates());
                 $c2 = \PHPExcel\Cell::columnIndexFromString($column) - 1;
                 $r2 = $row - 1;
                 // end offsetX
                 $endOffsetX = $this->object->getEndOffsetX();
                 // end offsetY
                 $endOffsetY = $this->object->getEndOffsetY();
                 $clientAnchorData = pack('vvvvvvvvv', $this->object->getSpFlag(), $c1, $startOffsetX, $r1, $startOffsetY, $c2, $endOffsetX, $r2, $endOffsetY);
                 $length = strlen($clientAnchorData);
                 $recVerInstance = $recVer;
                 $recVerInstance |= $recInstance << 4;
                 $header = pack('vvV', $recVerInstance, $recType, $length);
                 $data .= $header . $clientAnchorData;
             }
             // the client data, just empty for now
             if (!$this->object->getSpgr()) {
                 $clientDataData = '';
                 $recVer = 0x0;
                 $recInstance = 0x0;
                 $recType = 0xf011;
                 $length = strlen($clientDataData);
                 $recVerInstance = $recVer;
                 $recVerInstance |= $recInstance << 4;
                 $header = pack('vvV', $recVerInstance, $recType, $length);
                 $data .= $header . $clientDataData;
             }
             // write the record
             $recVer = 0xf;
             $recInstance = 0x0;
             $recType = 0xf004;
             $length = strlen($data);
             $recVerInstance = $recVer;
             $recVerInstance |= $recInstance << 4;
             $header = pack('vvV', $recVerInstance, $recType, $length);
             $this->data = $header . $data;
             break;
     }
     return $this->data;
 }