74                $this->_BIG_BLOCK_SIZE  = pow(2,
 
   75                                          ((isset($this->_BIG_BLOCK_SIZE))? self::_adjust2($this->_BIG_BLOCK_SIZE)  : 9));
 
   76                $this->_SMALL_BLOCK_SIZE= pow(2,
 
   77                                          ((isset($this->_SMALL_BLOCK_SIZE))?  self::_adjust2($this->_SMALL_BLOCK_SIZE): 6));
 
   82                        if ($this->_tmp_dir === NULL)
 
   84                        $this->_tmp_filename = tempnam($this->_tmp_dir, 
"OLE_PPS_Root");
 
   85                        $this->_FILEH_ = fopen($this->_tmp_filename,
"w+b");
 
   86                        if ($this->_FILEH_ == 
false) {
 
   92                if ($this->_FILEH_ == 
false) {
 
   99                list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->
_calcSize($aList); 
 
  111                $this->
_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt);
 
  114                        fclose($this->_FILEH_);
 
  130                list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0);
 
  133                $iCount = count($raList);
 
  134                for (
$i = 0; 
$i < $iCount; ++
$i) {
 
  136                                $raList[
$i]->Size = $raList[
$i]->_DataLen();
 
  138                                        $iSBcnt += floor($raList[
$i]->Size / $this->_SMALL_BLOCK_SIZE)
 
  139                                                                  + (($raList[
$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
 
  141                                        $iBBcnt += (floor($raList[
$i]->Size / $this->_BIG_BLOCK_SIZE) +
 
  142                                                (($raList[
$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
 
  146                $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE;
 
  148                $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0);
 
  149                $iBBcnt +=  (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) +
 
  150                                          (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0));
 
  151                $iCnt = count($raList);
 
  153                $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0));
 
  155                return array($iSBDcnt, $iBBcnt, $iPPScnt);
 
  168                $iWk = log($i2)/log(2);
 
  169                return ($iWk > floor($iWk))? floor($iWk)+1:$iWk;
 
  182                $FILE = $this->_FILEH_;
 
  189                $iAll = $iBBcnt + $iPPScnt + $iSBDcnt;
 
  191                $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
 
  192                $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
 
  195                if ($iBdCnt > $i1stBdL) {
 
  199                                $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
 
  200                                $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
 
  201                                if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) {
 
  209                                "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" 
  223                                . pack(
"V", $iBBcnt+$iSBDcnt) 
 
  226                                . pack(
"V", $iSBDcnt ? 0 : -2)                  
 
  227                                . pack(
"V", $iSBDcnt)
 
  230                if ($iBdCnt < $i1stBdL) {
 
  236                        fwrite($FILE, pack(
"V", $iAll+$iBdCnt) . pack(
"V", $iBdExL));
 
  240                for (
$i = 0; 
$i < $i1stBdL && 
$i < $iBdCnt; ++
$i) {
 
  241                        fwrite($FILE, pack(
"V", $iAll+
$i));
 
  245                        for ($j = 0; $j < $jB; ++$j) {
 
  246                                fwrite($FILE, (pack(
"V", -1)));
 
  260                $FILE = $this->_FILEH_;
 
  263                $iCount = count($raList);
 
  264                for (
$i = 0; 
$i < $iCount; ++
$i) {
 
  266                                $raList[
$i]->Size = $raList[
$i]->_DataLen();
 
  279                                                fwrite($FILE, $raList[
$i]->_data);
 
  282                                        if ($raList[
$i]->Size % $this->_BIG_BLOCK_SIZE) {
 
  283                                                fwrite($FILE, str_repeat(
"\x00", $this->_BIG_BLOCK_SIZE - ($raList[
$i]->Size % $this->_BIG_BLOCK_SIZE)));
 
  286                                        $raList[
$i]->_StartBlock = $iStBlk;
 
  288                                                        (floor($raList[
$i]->Size / $this->_BIG_BLOCK_SIZE) +
 
  289                                                                (($raList[
$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
 
  310                $FILE = $this->_FILEH_;
 
  313                $iCount = count($raList);
 
  314                for (
$i = 0; 
$i < $iCount; ++
$i) {
 
  317                                if ($raList[
$i]->Size <= 0) {
 
  321                                        $iSmbCnt = floor($raList[
$i]->Size / $this->_SMALL_BLOCK_SIZE)
 
  322                                                                  + (($raList[
$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
 
  325                                        for ($j = 0; $j < $jB; ++$j) {
 
  326                                                fwrite($FILE, pack(
"V", $j+$iSmBlk+1));
 
  328                                        fwrite($FILE, pack(
"V", -2));
 
  337                                                $sRes .= $raList[
$i]->_data;
 
  339                                        if ($raList[
$i]->Size % $this->_SMALL_BLOCK_SIZE) {
 
  340                                                $sRes .= str_repeat(
"\x00",$this->_SMALL_BLOCK_SIZE - ($raList[
$i]->Size % $this->_SMALL_BLOCK_SIZE));
 
  343                                        $raList[
$i]->_StartBlock = $iSmBlk;
 
  349                if ($iSmBlk % $iSbCnt) {
 
  350                        $iB = $iSbCnt - ($iSmBlk % $iSbCnt);
 
  351                        for (
$i = 0; 
$i < $iB; ++
$i) {
 
  352                                fwrite($FILE, pack(
"V", -1));
 
  367                $iC = count($raList);
 
  368                for (
$i = 0; 
$i < $iC; ++
$i) {
 
  372                $iCnt = count($raList);
 
  374                if ($iCnt % $iBCnt) {
 
  387        public function _saveBbd($iSbdSize, $iBsize, $iPpsCnt)
 
  389                $FILE = $this->_FILEH_;
 
  395                $iAll = $iBsize + $iPpsCnt + $iSbdSize;
 
  397                $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
 
  398                $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
 
  400                if ($iBdCnt >$i1stBdL) {
 
  404                                $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
 
  405                                $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
 
  406                                if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) {
 
  415                        for (
$i = 0; 
$i < ($iSbdSize - 1); ++
$i) {
 
  416                                fwrite($FILE, pack(
"V", 
$i+1));
 
  418                        fwrite($FILE, pack(
"V", -2));
 
  421                for (
$i = 0; 
$i < ($iBsize - 1); ++
$i) {
 
  422                        fwrite($FILE, pack(
"V", 
$i+$iSbdSize+1));
 
  424                fwrite($FILE, pack(
"V", -2));
 
  427                for (
$i = 0; 
$i < ($iPpsCnt - 1); ++
$i) {
 
  428                        fwrite($FILE, pack(
"V", 
$i+$iSbdSize+$iBsize+1));
 
  430                fwrite($FILE, pack(
"V", -2));
 
  432                for (
$i = 0; 
$i < $iBdCnt; ++
$i) {
 
  433                        fwrite($FILE, pack(
"V", 0xFFFFFFFD));
 
  436                for (
$i = 0; 
$i < $iBdExL; ++
$i) {
 
  437                        fwrite($FILE, pack(
"V", 0xFFFFFFFC));
 
  440                if (($iAllW + $iBdCnt) % $iBbCnt) {
 
  441                        $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt));
 
  442                        for (
$i = 0; 
$i < $iBlock; ++
$i) {
 
  443                                fwrite($FILE, pack(
"V", -1));
 
  447                if ($iBdCnt > $i1stBdL) {
 
  450                        for (
$i = $i1stBdL;
$i < $iBdCnt; 
$i++, ++$iN) {
 
  451                                if ($iN >= ($iBbCnt - 1)) {
 
  454                                        fwrite($FILE, pack(
"V", $iAll+$iBdCnt+$iNb));
 
  456                                fwrite($FILE, pack(
"V", $iBsize+$iSbdSize+$iPpsCnt+
$i));
 
  458                        if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) {
 
  459                                $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1));
 
  460                                for (
$i = 0; 
$i < $iB; ++
$i) {
 
  461                                        fwrite($FILE, pack(
"V", -1));
 
  464                        fwrite($FILE, pack(
"V", -2));
 
An exception for terminatinating execution or to throw for unit testing.
static sys_get_temp_dir()
Get the systems temporary directory.
_saveBigData($iStBlk, &$raList)
Saving big data (PPS's with data bigger than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL)
_savePps(&$raList)
Saves all the PPS's WKs.
_calcSize(&$raList)
Calculate some numbers.
_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt)
Save OLE header.
_saveBbd($iSbdSize, $iBsize, $iPpsCnt)
Saving Big Block Depot.
static _adjust2($i2)
Helper function for caculating a magic value for block sizes.
__construct($time_1st, $time_2nd, $raChild)
save($filename)
Method for saving the whole OLE container (including files).
_makeSmallData(&$raList)
get small data (PPS's with data smaller than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL)
static _savePpsSetPnt(&$raList, $to_save, $depth=0)
Updates index and pointers to previous, next and children PPS's for this PPS.
_getPpsWk()
Returns a string with the PPS's WK (What is a WK?)
const OLE_DATA_SIZE_SMALL
static Asc2Ucs($ascii)
Utility function to transform ASCII text to Unicode.