PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.3
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.3
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
visualizer / vendor / phpoffice / phpexcel / Classes / PHPExcel / Shared / OLE / ChainedBlockStream.php

ChainedBlockStream.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.3, at vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/OLE/ChainedBlockStream.php

223 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * PHPExcel
4 *
5 * Copyright (C) 2006 - 2014 PHPExcel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 * @category PHPExcel
22 * @package PHPExcel_Shared_OLE
23 * @copyright Copyright (c) 2006 - 2007 Christian Schmidt
24 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25 * @version ##VERSION##, ##DATE##
26 */
27
28 /**
29 * PHPExcel_Shared_OLE_ChainedBlockStream
30 *
31 * Stream wrapper for reading data stored in an OLE file. Implements methods
32 * for PHP's stream_wrapper_register(). For creating streams using this
33 * wrapper, use PHPExcel_Shared_OLE_PPS_File::getStream().
34 *
35 * @category PHPExcel
36 * @package PHPExcel_Shared_OLE
37 */
38 class PHPExcel_Shared_OLE_ChainedBlockStream
39 {
40 /**
41 * The OLE container of the file that is being read.
42 * @var OLE
43 */
44 public $ole;
45
46 /**
47 * Parameters specified by fopen().
48 * @var array
49 */
50 public $params;
51
52 /**
53 * The binary data of the file.
54 * @var string
55 */
56 public $data;
57
58 /**
59 * The file pointer.
60 * @var int byte offset
61 */
62 public $pos;
63
64 /**
65 * Implements support for fopen().
66 * For creating streams using this wrapper, use OLE_PPS_File::getStream().
67 *
68 * @param string $path resource name including scheme, e.g.
69 * ole-chainedblockstream://oleInstanceId=1
70 * @param string $mode only "r" is supported
71 * @param int $options mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH
72 * @param string &$openedPath absolute path of the opened stream (out parameter)
73 * @return bool true on success
74 */
75 public function stream_open($path, $mode, $options, &$openedPath)
76 {
77 if ($mode != 'r') {
78 if ($options & STREAM_REPORT_ERRORS) {
79 trigger_error('Only reading is supported', E_USER_WARNING);
80 }
81 return false;
82 }
83
84 // 25 is length of "ole-chainedblockstream://"
85 parse_str(substr($path, 25), $this->params);
86 if (!isset($this->params['oleInstanceId'],
87 $this->params['blockId'],
88 $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) {
89
90 if ($options & STREAM_REPORT_ERRORS) {
91 trigger_error('OLE stream not found', E_USER_WARNING);
92 }
93 return false;
94 }
95 $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']];
96
97 $blockId = $this->params['blockId'];
98 $this->data = '';
99 if (isset($this->params['size']) &&
100 $this->params['size'] < $this->ole->bigBlockThreshold &&
101 $blockId != $this->ole->root->_StartBlock) {
102
103 // Block id refers to small blocks
104 $rootPos = $this->ole->_getBlockOffset($this->ole->root->_StartBlock);
105 while ($blockId != -2) {
106 $pos = $rootPos + $blockId * $this->ole->bigBlockSize;
107 $blockId = $this->ole->sbat[$blockId];
108 fseek($this->ole->_file_handle, $pos);
109 $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize);
110 }
111 } else {
112 // Block id refers to big blocks
113 while ($blockId != -2) {
114 $pos = $this->ole->_getBlockOffset($blockId);
115 fseek($this->ole->_file_handle, $pos);
116 $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize);
117 $blockId = $this->ole->bbat[$blockId];
118 }
119 }
120 if (isset($this->params['size'])) {
121 $this->data = substr($this->data, 0, $this->params['size']);
122 }
123
124 if ($options & STREAM_USE_PATH) {
125 $openedPath = $path;
126 }
127
128 return true;
129 }
130
131 /**
132 * Implements support for fclose().
133 *
134 */
135 public function stream_close()
136 {
137 $this->ole = null;
138 unset($GLOBALS['_OLE_INSTANCES']);
139 }
140
141 /**
142 * Implements support for fread(), fgets() etc.
143 *
144 * @param int $count maximum number of bytes to read
145 * @return string
146 */
147 public function stream_read($count)
148 {
149 if ($this->stream_eof()) {
150 return false;
151 }
152 $s = substr($this->data, $this->pos, $count);
153 $this->pos += $count;
154 return $s;
155 }
156
157 /**
158 * Implements support for feof().
159 *
160 * @return bool TRUE if the file pointer is at EOF; otherwise FALSE
161 */
162 public function stream_eof()
163 {
164 return $this->pos >= strlen($this->data);
165 }
166
167 /**
168 * Returns the position of the file pointer, i.e. its offset into the file
169 * stream. Implements support for ftell().
170 *
171 * @return int
172 */
173 public function stream_tell()
174 {
175 return $this->pos;
176 }
177
178 /**
179 * Implements support for fseek().
180 *
181 * @param int $offset byte offset
182 * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END
183 * @return bool
184 */
185 public function stream_seek($offset, $whence)
186 {
187 if ($whence == SEEK_SET && $offset >= 0) {
188 $this->pos = $offset;
189 } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) {
190 $this->pos += $offset;
191 } elseif ($whence == SEEK_END && -$offset <= sizeof($this->data)) {
192 $this->pos = strlen($this->data) + $offset;
193 } else {
194 return false;
195 }
196 return true;
197 }
198
199 /**
200 * Implements support for fstat(). Currently the only supported field is
201 * "size".
202 * @return array
203 */
204 public function stream_stat()
205 {
206 return array(
207 'size' => strlen($this->data),
208 );
209 }
210
211 // Methods used by stream_wrapper_register() that are not implemented:
212 // bool stream_flush ( void )
213 // int stream_write ( string data )
214 // bool rename ( string path_from, string path_to )
215 // bool mkdir ( string path, int mode, int options )
216 // bool rmdir ( string path, int options )
217 // bool dir_opendir ( string path, int options )
218 // array url_stat ( string path, int flags )
219 // string dir_readdir ( void )
220 // bool dir_rewinddir ( void )
221 // bool dir_closedir ( void )
222 }
223