23 require_once
'OLE/PPS.php';
24 require_once
'System.php';
74 $this->_tmp_dir =
$dir;
92 $this->_BIG_BLOCK_SIZE = pow(2,
93 ((isset($this->_BIG_BLOCK_SIZE))? $this->
_adjust2($this->_BIG_BLOCK_SIZE) : 9));
94 $this->_SMALL_BLOCK_SIZE= pow(2,
95 ((isset($this->_SMALL_BLOCK_SIZE))? $this->
_adjust2($this->_SMALL_BLOCK_SIZE): 6));
99 $this->_tmp_filename = tempnam($this->_tmp_dir,
"OLE_PPS_Root");
100 $this->_FILEH_ = @fopen($this->_tmp_filename,
"w+b");
101 if ($this->_FILEH_ ==
false) {
102 return $this->
raiseError(
"Can't create temporary file.");
105 $this->_FILEH_ = @fopen(
$filename,
"wb");
106 if ($this->_FILEH_ ==
false) {
107 return $this->
raiseError(
"Can't open $filename. It may be in use or protected.");
114 list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->
_calcSize($aList);
126 $this->
_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt);
129 fseek($this->_FILEH_, 0);
130 fpassthru($this->_FILEH_);
131 @fclose($this->_FILEH_);
133 @unlink($this->_tmp_filename);
135 @fclose($this->_FILEH_);
151 list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0);
154 for ($i = 0; $i < count($raList); $i++) {
156 $raList[$i]->Size = $raList[$i]->_DataLen();
158 $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)
159 + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
161 $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +
162 (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
166 $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE;
168 $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0);
169 $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) +
170 (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0));
171 $iCnt = count($raList);
173 $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0));
175 return array($iSBDcnt, $iBBcnt, $iPPScnt);
188 $iWk = log($i2)/log(2);
189 return ($iWk > floor($iWk))? floor($iWk)+1:$iWk;
202 $FILE = $this->_FILEH_;
209 $iAll = $iBBcnt + $iPPScnt + $iSBDcnt;
211 $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
212 $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
215 if ($iBdCnt > $i1stBdL) {
219 $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0);
220 $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0);
221 if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) {
229 "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"
243 . pack(
"V", $iBBcnt+$iSBDcnt)
250 if ($iBdCnt < $i1stBdL) {
256 fwrite($FILE, pack(
"V", $iAll+$iBdCnt) . pack(
"V", $iBdExL));
260 for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; $i++) {
261 fwrite($FILE, pack(
"V", $iAll+$i));
264 for ($j = 0; $j < ($i1stBdL-$i); $j++) {
265 fwrite($FILE, (pack(
"V", -1)));
279 $FILE = $this->_FILEH_;
282 for ($i = 0; $i < count($raList); $i++) {
284 $raList[$i]->Size = $raList[$i]->_DataLen();
289 if (isset($raList[$i]->_PPS_FILE)) {
291 fseek($raList[$i]->_PPS_FILE, 0);
292 while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) {
293 $iLen += strlen($sBuff);
294 fwrite($FILE, $sBuff);
297 fwrite($FILE, $raList[$i]->_data);
300 if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) {
301 for ($j = 0; $j < ($this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)); $j++) {
302 fwrite($FILE,
"\x00");
306 $raList[$i]->_StartBlock = $iStBlk;
308 (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) +
309 (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0));
312 if (isset($raList[$i]->_PPS_FILE)) {
313 @fclose($raList[$i]->_PPS_FILE);
314 $raList[$i]->_PPS_FILE = null;
315 @unlink($raList[$i]->_tmp_filename);
330 $FILE = $this->_FILEH_;
333 for ($i = 0; $i < count($raList); $i++) {
336 if ($raList[$i]->Size <= 0) {
340 $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE)
341 + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0);
343 for ($j = 0; $j < ($iSmbCnt-1); $j++) {
344 fwrite($FILE, pack(
"V", $j+$iSmBlk+1));
346 fwrite($FILE, pack(
"V", -2));
349 if ($raList[$i]->_PPS_FILE) {
350 fseek($raList[$i]->_PPS_FILE, 0);
351 while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) {
355 $sRes .= $raList[$i]->_data;
357 if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) {
358 for ($j = 0; $j < ($this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); $j++) {
363 $raList[$i]->_StartBlock = $iSmBlk;
369 if ($iSmBlk % $iSbCnt) {
370 for ($i = 0; $i < ($iSbCnt - ($iSmBlk % $iSbCnt)); $i++) {
371 fwrite($FILE, pack(
"V", -1));
386 for ($i = 0; $i < count($raList); $i++) {
387 fwrite($this->_FILEH_, $raList[$i]->
_getPpsWk());
390 $iCnt = count($raList);
392 if ($iCnt % $iBCnt) {
393 for ($i = 0; $i < (($iBCnt - ($iCnt % $iBCnt)) *
OLE_PPS_SIZE); $i++) {
394 fwrite($this->_FILEH_,
"\x00");
409 $FILE = $this->_FILEH_;
415 $iAll = $iBsize + $iPpsCnt + $iSbdSize;
417 $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
418 $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
420 if ($iBdCnt >$i1stBdL) {
424 $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0);
425 $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0);
426 if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) {
435 for ($i = 0; $i < ($iSbdSize - 1); $i++) {
436 fwrite($FILE, pack(
"V", $i+1));
438 fwrite($FILE, pack(
"V", -2));
441 for ($i = 0; $i < ($iBsize - 1); $i++) {
442 fwrite($FILE, pack(
"V", $i+$iSbdSize+1));
444 fwrite($FILE, pack(
"V", -2));
447 for ($i = 0; $i < ($iPpsCnt - 1); $i++) {
448 fwrite($FILE, pack(
"V", $i+$iSbdSize+$iBsize+1));
450 fwrite($FILE, pack(
"V", -2));
452 for ($i = 0; $i < $iBdCnt; $i++) {
453 fwrite($FILE, pack(
"V", 0xFFFFFFFD));
456 for ($i = 0; $i < $iBdExL; $i++) {
457 fwrite($FILE, pack(
"V", 0xFFFFFFFC));
460 if (($iAllW + $iBdCnt) % $iBbCnt) {
461 for ($i = 0; $i < ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); $i++) {
462 fwrite($FILE, pack(
"V", -1));
466 if ($iBdCnt > $i1stBdL) {
469 for ($i = $i1stBdL;$i < $iBdCnt; $i++, $iN++) {
470 if ($iN >= ($iBbCnt - 1)) {
473 fwrite($FILE, pack(
"V", $iAll+$iBdCnt+$iNb));
475 fwrite($FILE, pack(
"V", $iBsize+$iSbdSize+$iPpsCnt+$i));
477 if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) {
478 for ($i = 0; $i < (($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1))); $i++) {
479 fwrite($FILE, pack(
"V", -1));
482 fwrite($FILE, pack(
"V", -2));