<?php 
/* vim: set expandtab tabstop=4 shiftwidth=4: */ 
// +----------------------------------------------------------------------+ 
// | PHP Version 4                                                        | 
// +----------------------------------------------------------------------+ 
// | Copyright (c) 1997-2002 The PHP Group                                | 
// +----------------------------------------------------------------------+ 
// | This source file is subject to version 2.02 of the PHP license,      | 
// | that is bundled with this package in the file LICENSE, and is        | 
// | available at through the world-wide-web at                           | 
// | http://www.php.net/license/2_02.txt.                                 | 
// | If you did not receive a copy of the PHP license and are unable to   | 
// | obtain it through the world-wide-web, please send a note to          | 
// | [email protected] so we can mail you a copy immediately.               | 
// +----------------------------------------------------------------------+ 
// | Author: Xavier Noguer <[email protected]>                              | 
// | Based on OLE::Storage_Lite by Kawai, Takanori                        | 
// +----------------------------------------------------------------------+ 
// 
// $Id: PPS.php,v 1.5 2003/12/14 18:12:28 xnoguer Exp $ 
 
 
//require_once('PEAR.php'); 
require_once dirname ( __FILE__ ) . '/OLE.php'; 
 
/** 
* Class for creating PPS's for OLE containers 
* 
* @author   Xavier Noguer <[email protected]> 
* @category Structures 
* @package  OLE 
*/ 
class OLE_PPS 
{ 
    /** 
    * The PPS index 
    * @var integer 
    */ 
    var $No; 
 
    /** 
    * The PPS name (in Unicode) 
    * @var string 
    */ 
    var $Name; 
 
    /** 
    * The PPS type. Dir, Root or File 
    * @var integer 
    */ 
    var $Type; 
 
    /** 
    * The index of the previous PPS 
    * @var integer 
    */ 
    var $PrevPps; 
 
    /** 
    * The index of the next PPS 
    * @var integer 
    */ 
    var $NextPps; 
 
    /** 
    * The index of it's first child if this is a Dir or Root PPS 
    * @var integer 
    */ 
    var $DirPps; 
 
    /** 
    * A timestamp 
    * @var integer 
    */ 
    var $Time1st; 
 
    /** 
    * A timestamp 
    * @var integer 
    */ 
    var $Time2nd; 
 
    /** 
    * Starting block (small or big) for this PPS's data  inside the container 
    * @var integer 
    */ 
    var $_StartBlock; 
 
    /** 
    * The size of the PPS's data (in bytes) 
    * @var integer 
    */ 
    var $Size; 
 
    /** 
    * The PPS's data (only used if it's not using a temporary file) 
    * @var string 
    */ 
    var $_data; 
 
    /** 
    * Array of child PPS's (only used by Root and Dir PPS's) 
    * @var array 
    */ 
    var $children = array(); 
 
    /** 
    * The constructor 
    * 
    * @access public 
    * @param integer $No   The PPS index 
    * @param string $name  The PPS name (in Unicode) 
    * @param integer $type The PPS type. Dir, Root or File 
    * @param integer $prev The index of the previous PPS 
    * @param integer $next The index of the next PPS 
    * @param integer $dir  The index of it's first child if this is a Dir or Root PPS 
    * @param integer $time_1st A timestamp 
    * @param integer $time_2nd A timestamp 
    * @param array   $children Array containing children PPS for this PPS 
    */ 
    function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) 
    { 
        $this->No      = $No; 
        $this->Name    = $name; 
        $this->Type    = $type; 
        $this->PrevPps = $prev; 
        $this->NextPps = $next; 
        $this->DirPps  = $dir; 
        $this->Time1st = $time_1st; 
        $this->Time2nd = $time_2nd; 
        $this->_data      = $data; 
        $this->children   = $children; 
        if ($data != '') { 
            $this->Size = strlen($data); 
        } 
        else { 
            $this->Size = 0; 
        } 
    } 
 
    /** 
    * Returns the amount of data saved for this PPS 
    * 
    * @access private 
    * @return integer The amount of data (in bytes) 
    */ 
    function _DataLen() 
    { 
        if (!isset($this->_data)) { 
            return 0; 
        } 
        if (isset($this->_PPS_FILE)) 
        { 
            fseek($this->_PPS_FILE, 0); 
            $stats = fstat($this->_PPS_FILE); 
            return $stats[7]; 
        } 
        else { 
            return strlen($this->_data); 
        } 
    } 
 
    /** 
    * Returns a string with the PPS's WK (What is a WK?) 
    * 
    * @access private 
    * @return string The binary string 
    */ 
    function _getPpsWk() 
    { 
        $ret = $this->Name; 
        for ($i = 0; $i < (64 - strlen($this->Name)); $i++) { 
            $ret .= "\x00"; 
        } 
        $ret .= pack("v", strlen($this->Name) + 2)  // 66 
              . pack("c", $this->Type)              // 67 
              . pack("c", 0x00) //UK                // 68 
              . pack("V", $this->PrevPps) //Prev    // 72 
              . pack("V", $this->NextPps) //Next    // 76 
              . pack("V", $this->DirPps)  //Dir     // 80 
              . "\x00\x09\x02\x00"                  // 84 
              . "\x00\x00\x00\x00"                  // 88 
              . "\xc0\x00\x00\x00"                  // 92 
              . "\x00\x00\x00\x46"                  // 96 // Seems to be ok only for Root 
              . "\x00\x00\x00\x00"                  // 100 
              . OLE::LocalDate2OLE($this->Time1st)       // 108 
              . OLE::LocalDate2OLE($this->Time2nd)       // 116 
              . pack("V", isset($this->_StartBlock)? 
                        $this->_StartBlock:0)        // 120 
              . pack("V", $this->Size)               // 124 
              . pack("V", 0);                        // 128 
        return $ret; 
    } 
 
    /** 
    * Updates index and pointers to previous, next and children PPS's for this 
    * PPS. I don't think it'll work with Dir PPS's. 
    * 
    * @access private 
    * @param array &$pps_array Reference to the array of PPS's for the whole OLE 
    *                          container 
    * @return integer          The index for this PPS 
    */ 
    function _savePpsSetPnt(&$pps_array) 
    { 
        $pps_array[count($pps_array)] = &$this; 
        $this->No = count($pps_array) - 1; 
        $this->PrevPps = 0xFFFFFFFF; 
        $this->NextPps = 0xFFFFFFFF; 
        if (count($this->children) > 0) { 
            $this->DirPps = $this->children[0]->_savePpsSetPnt($pps_array); 
        } 
        else { 
            $this->DirPps = 0xFFFFFFFF; 
        } 
        return $this->No; 
    } 
} 
 
 |