ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
ChainedBlockStream.php
Go to the documentation of this file.
1 <?php
39 {
44  public $ole;
45 
50  public $params;
51 
56  public $data;
57 
62  public $pos;
63 
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 
135  public function stream_close()
136  {
137  $this->ole = null;
138  unset($GLOBALS['_OLE_INSTANCES']);
139  }
140 
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 
162  public function stream_eof()
163  {
164  return $this->pos >= strlen($this->data);
165  }
166 
173  public function stream_tell()
174  {
175  return $this->pos;
176  }
177 
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 
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 }
Add some data
$path
Definition: aliased.php:25
stream_stat()
Implements support for fstat().
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
stream_read($count)
Implements support for fread(), fgets() etc.
if(!is_array($argv)) $options
stream_eof()
Implements support for feof().
stream_close()
Implements support for fclose().
stream_open($path, $mode, $options, &$openedPath)
Implements support for fopen().
stream_tell()
Returns the position of the file pointer, i.e.
Create styles array
The data for the language used.
stream_seek($offset, $whence)
Implements support for fseek().