Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2390 jpm 1
<?php
2
/* vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +----------------------------------------------------------------------+
4
// | PHP Version 4                                                        |
5
// +----------------------------------------------------------------------+
6
// | Copyright (c) 1997-2002 The PHP Group                                |
7
// +----------------------------------------------------------------------+
8
// | This source file is subject to version 2.02 of the PHP license,      |
9
// | that is bundled with this package in the file LICENSE, and is        |
10
// | available at through the world-wide-web at                           |
11
// | http://www.php.net/license/2_02.txt.                                 |
12
// | If you did not receive a copy of the PHP license and are unable to   |
13
// | obtain it through the world-wide-web, please send a note to          |
14
// | license@php.net so we can mail you a copy immediately.               |
15
// +----------------------------------------------------------------------+
16
// | Author: Xavier Noguer <xnoguer@php.net>                              |
17
// | Based on OLE::Storage_Lite by Kawai, Takanori                        |
18
// +----------------------------------------------------------------------+
19
//
20
// $Id: PPS.php,v 1.7 2007/02/13 21:00:42 schmidt Exp $
21
 
22
 
23
/**
24
* Class for creating PPS's for OLE containers
25
*
26
* @author   Xavier Noguer <xnoguer@php.net>
27
* @category PHPExcel
28
* @package  PHPExcel_Shared_OLE
29
*/
30
class PHPExcel_Shared_OLE_PPS
31
{
32
	/**
33
	* The PPS index
34
	* @var integer
35
	*/
36
	public $No;
37
 
38
	/**
39
	* The PPS name (in Unicode)
40
	* @var string
41
	*/
42
	public $Name;
43
 
44
	/**
45
	* The PPS type. Dir, Root or File
46
	* @var integer
47
	*/
48
	public $Type;
49
 
50
	/**
51
	* The index of the previous PPS
52
	* @var integer
53
	*/
54
	public $PrevPps;
55
 
56
	/**
57
	* The index of the next PPS
58
	* @var integer
59
	*/
60
	public $NextPps;
61
 
62
	/**
63
	* The index of it's first child if this is a Dir or Root PPS
64
	* @var integer
65
	*/
66
	public $DirPps;
67
 
68
	/**
69
	* A timestamp
70
	* @var integer
71
	*/
72
	public $Time1st;
73
 
74
	/**
75
	* A timestamp
76
	* @var integer
77
	*/
78
	public $Time2nd;
79
 
80
	/**
81
	* Starting block (small or big) for this PPS's data  inside the container
82
	* @var integer
83
	*/
84
	public $_StartBlock;
85
 
86
	/**
87
	* The size of the PPS's data (in bytes)
88
	* @var integer
89
	*/
90
	public $Size;
91
 
92
	/**
93
	* The PPS's data (only used if it's not using a temporary file)
94
	* @var string
95
	*/
96
	public $_data;
97
 
98
	/**
99
	* Array of child PPS's (only used by Root and Dir PPS's)
100
	* @var array
101
	*/
102
	public $children = array();
103
 
104
	/**
105
	* Pointer to OLE container
106
	* @var OLE
107
	*/
108
	public $ole;
109
 
110
	/**
111
	* The constructor
112
	*
113
	* @access public
114
	* @param integer $No   The PPS index
115
	* @param string  $name The PPS name
116
	* @param integer $type The PPS type. Dir, Root or File
117
	* @param integer $prev The index of the previous PPS
118
	* @param integer $next The index of the next PPS
119
	* @param integer $dir  The index of it's first child if this is a Dir or Root PPS
120
	* @param integer $time_1st A timestamp
121
	* @param integer $time_2nd A timestamp
122
	* @param string  $data  The (usually binary) source data of the PPS
123
	* @param array   $children Array containing children PPS for this PPS
124
	*/
125
	public function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children)
126
	{
127
		$this->No      = $No;
128
		$this->Name    = $name;
129
		$this->Type    = $type;
130
		$this->PrevPps = $prev;
131
		$this->NextPps = $next;
132
		$this->DirPps  = $dir;
133
		$this->Time1st = $time_1st;
134
		$this->Time2nd = $time_2nd;
135
		$this->_data      = $data;
136
		$this->children   = $children;
137
		if ($data != '') {
138
			$this->Size = strlen($data);
139
		} else {
140
			$this->Size = 0;
141
		}
142
	}
143
 
144
	/**
145
	* Returns the amount of data saved for this PPS
146
	*
147
	* @access public
148
	* @return integer The amount of data (in bytes)
149
	*/
150
	public function _DataLen()
151
	{
152
		if (!isset($this->_data)) {
153
			return 0;
154
		}
155
		//if (isset($this->_PPS_FILE)) {
156
		//	fseek($this->_PPS_FILE, 0);
157
		//	$stats = fstat($this->_PPS_FILE);
158
		//	return $stats[7];
159
		//} else {
160
			return strlen($this->_data);
161
		//}
162
	}
163
 
164
	/**
165
	* Returns a string with the PPS's WK (What is a WK?)
166
	*
167
	* @access public
168
	* @return string The binary string
169
	*/
170
	public function _getPpsWk()
171
	{
172
		$ret = str_pad($this->Name,64,"\x00");
173
 
174
		$ret .= pack("v", strlen($this->Name) + 2)  // 66
175
			  . pack("c", $this->Type)              // 67
176
			  . pack("c", 0x00) //UK                // 68
177
			  . pack("V", $this->PrevPps) //Prev    // 72
178
			  . pack("V", $this->NextPps) //Next    // 76
179
			  . pack("V", $this->DirPps)  //Dir     // 80
180
			  . "\x00\x09\x02\x00"                  // 84
181
			  . "\x00\x00\x00\x00"                  // 88
182
			  . "\xc0\x00\x00\x00"                  // 92
183
			  . "\x00\x00\x00\x46"                  // 96 // Seems to be ok only for Root
184
			  . "\x00\x00\x00\x00"                  // 100
185
			  . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time1st)       // 108
186
			  . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time2nd)       // 116
187
			  . pack("V", isset($this->_StartBlock)?
188
						$this->_StartBlock:0)        // 120
189
			  . pack("V", $this->Size)               // 124
190
			  . pack("V", 0);                        // 128
191
		return $ret;
192
	}
193
 
194
	/**
195
	* Updates index and pointers to previous, next and children PPS's for this
196
	* PPS. I don't think it'll work with Dir PPS's.
197
	*
198
	* @access public
199
	* @param array &$raList Reference to the array of PPS's for the whole OLE
200
	*                          container
201
	* @return integer          The index for this PPS
202
	*/
203
	public static function _savePpsSetPnt(&$raList, $to_save, $depth = 0)
204
	{
205
		if ( !is_array($to_save) || (empty($to_save)) ) {
206
			return 0xFFFFFFFF;
207
		} elseif( count($to_save) == 1 ) {
208
			$cnt = count($raList);
209
			// If the first entry, it's the root... Don't clone it!
210
			$raList[$cnt] = ( $depth == 0 ) ? $to_save[0] : clone $to_save[0];
211
			$raList[$cnt]->No = $cnt;
212
			$raList[$cnt]->PrevPps = 0xFFFFFFFF;
213
			$raList[$cnt]->NextPps = 0xFFFFFFFF;
214
			$raList[$cnt]->DirPps  = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++);
215
		} else {
216
			$iPos  = floor(count($to_save) / 2);
217
			$aPrev = array_slice($to_save, 0, $iPos);
218
			$aNext = array_slice($to_save, $iPos + 1);
219
			$cnt   = count($raList);
220
			// If the first entry, it's the root... Don't clone it!
221
			$raList[$cnt] = ( $depth == 0 ) ? $to_save[$iPos] : clone $to_save[$iPos];
222
			$raList[$cnt]->No = $cnt;
223
			$raList[$cnt]->PrevPps = self::_savePpsSetPnt($raList, $aPrev, $depth++);
224
			$raList[$cnt]->NextPps = self::_savePpsSetPnt($raList, $aNext, $depth++);
225
			$raList[$cnt]->DirPps  = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++);
226
 
227
		}
228
		return $cnt;
229
	}
230
}