ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
ILIAS\Filesystem\Stream\Stream Class Reference

Class Stream. More...

+ Inheritance diagram for ILIAS\Filesystem\Stream\Stream:
+ Collaboration diagram for ILIAS\Filesystem\Stream\Stream:

Public Member Functions

 __construct ($stream, StreamOptions $options=null)
 Stream constructor. More...
 
 close ()
 
 detach ()
 
 getSize ()
 
 tell ()
 
 eof ()
 
 isSeekable ()
 
 seek ($offset, $whence=SEEK_SET)
 
 rewind ()
 
 isWritable ()
 
 write ($string)
 
 isReadable ()
 
 read ($length)
 
 getContents ()
 
 getMetadata ($key=null)
 
 __toString ()
 
 __destruct ()
 

Data Fields

const MASK_ACCESS_READ = 01
 
const MASK_ACCESS_WRITE = 02
 
const MASK_ACCESS_READ_WRITE = 03
 

Private Member Functions

 assertStreamAttached ()
 Checks if the stream is attached to the wrapper. More...
 

Private Attributes

 $readable
 
 $writeable
 
 $seekable
 
 $stream
 
 $size
 
 $uri
 
 $customMetadata
 

Static Private Attributes

static $accessMap
 

Detailed Description

Class Stream.

Author
Nicolas Schäfli ns@st.nosp@m.uder.nosp@m.-raim.nosp@m.ann..nosp@m.ch
Since
5.3
Version
1.0.0

Definition at line 17 of file Stream.php.

Constructor & Destructor Documentation

◆ __construct()

ILIAS\Filesystem\Stream\Stream::__construct (   $stream,
StreamOptions  $options = null 
)

Stream constructor.

Parameters
resource$streamThe resource which should be wrapped by the Stream.
StreamOptions$optionsThe additional options which are accessible via getMetadata

Definition at line 82 of file Stream.php.

References $options, ILIAS\Filesystem\Stream\Stream\$stream, ILIAS\Filesystem\Stream\Stream\getMetadata(), and size.

83  {
84  if (!is_resource($stream)) {
85  throw new \InvalidArgumentException('Stream must be a valid resource but "' . gettype($stream) . '" was given.');
86  }
87 
88  if ($options !== null) {
89  $this->customMetadata = $options->getMetadata();
90  $this->size = ($options->getSize() !== -1) ? $options->getSize() : null;
91  } else {
92  $this->customMetadata = [];
93  }
94 
95  $this->stream = $stream;
96 
97  $meta = stream_get_meta_data($this->stream);
98  $mode = $meta['mode'];
99 
100  $this->readable = array_key_exists($mode, self::$accessMap) && boolval(self::$accessMap[$mode] & self::MASK_ACCESS_READ);
101  $this->writeable = array_key_exists($mode, self::$accessMap) && boolval(self::$accessMap[$mode] & self::MASK_ACCESS_WRITE);
102  $this->seekable = boolval($meta['seekable']);
103  $this->uri = $this->getMetadata('uri');
104  }
if(!isset($_REQUEST['ReturnTo'])) if(!isset($_REQUEST['AuthId'])) $options
Definition: as_login.php:20
Set page orientation and size
Definition: 04printing.php:77
+ Here is the call graph for this function:

◆ __destruct()

ILIAS\Filesystem\Stream\Stream::__destruct ( )

Definition at line 364 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\close().

365  {
366 
367  //cleanup the resource on object destruction if the stream is not detached.
368  if (!is_null($this->stream)) {
369  $this->close();
370  }
371  }
+ Here is the call graph for this function:

Member Function Documentation

◆ __toString()

ILIAS\Filesystem\Stream\Stream::__toString ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 349 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\getContents(), and ILIAS\Filesystem\Stream\Stream\rewind().

350  {
351  try {
352  $this->rewind();
353  return strval($this->getContents());
354  } catch (\Exception $ex) {
355  //to string must not throw an error.
356  return '';
357  }
358  }
+ Here is the call graph for this function:

◆ assertStreamAttached()

ILIAS\Filesystem\Stream\Stream::assertStreamAttached ( )
private

Checks if the stream is attached to the wrapper.

An exception if thrown if the stream is already detached.

Exceptions

Definition at line 380 of file Stream.php.

Referenced by ILIAS\Filesystem\Stream\Stream\eof(), ILIAS\Filesystem\Stream\Stream\getContents(), ILIAS\Filesystem\Stream\Stream\read(), ILIAS\Filesystem\Stream\Stream\seek(), ILIAS\Filesystem\Stream\Stream\tell(), and ILIAS\Filesystem\Stream\Stream\write().

381  {
382  if ($this->stream === null) {
383  throw new \RuntimeException('Stream is detached');
384  }
385  }
+ Here is the caller graph for this function:

◆ close()

ILIAS\Filesystem\Stream\Stream::close ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 110 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\detach(), and ILIAS\Filesystem\Util\PHPStreamFunctions\fclose().

Referenced by ILIAS\Filesystem\Stream\Stream\__destruct().

111  {
112  if ($this->stream !== null && is_resource($this->stream)) {
113  PHPStreamFunctions::fclose($this->stream);
114  }
115 
116  $this->detach();
117  }
static fclose($handle)
fclose wrapper
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ detach()

ILIAS\Filesystem\Stream\Stream::detach ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 123 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\$stream, and size.

Referenced by ILIAS\Filesystem\Stream\Stream\close().

124  {
126  $this->stream = $this->size = $this->uri = null;
127 
128  return $stream;
129  }
Set page orientation and size
Definition: 04printing.php:77
+ Here is the caller graph for this function:

◆ eof()

ILIAS\Filesystem\Stream\Stream::eof ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 184 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\assertStreamAttached().

185  {
186  $this->assertStreamAttached();
187 
188  return feof($this->stream);
189  }
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
+ Here is the call graph for this function:

◆ getContents()

ILIAS\Filesystem\Stream\Stream::getContents ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 299 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\assertStreamAttached(), and ILIAS\Filesystem\Util\PHPStreamFunctions\stream_get_contents().

Referenced by ILIAS\Filesystem\Stream\Stream\__toString().

300  {
301  $this->assertStreamAttached();
302 
303  $content = PHPStreamFunctions::stream_get_contents($this->stream);
304 
305  if ($content === false) {
306  throw new \RuntimeException('Unable to read stream contents');
307  }
308 
309  return $content;
310  }
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
static stream_get_contents($handle, $length=-1)
stream_get_contents wrapper
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getMetadata()

ILIAS\Filesystem\Stream\Stream::getMetadata (   $key = null)

Implements Psr\Http\Message\StreamInterface.

Definition at line 316 of file Stream.php.

References $key.

Referenced by ILIAS\Filesystem\Stream\Stream\__construct().

317  {
318 
319  //return empty array if stream is detached
320  if ($this->stream === null) {
321  return [];
322  }
323 
324  //return merged metadata if key is missing
325  if ($key === null) {
326  return array_merge(stream_get_meta_data($this->stream), $this->customMetadata);
327  }
328 
329  //return value if key was provided
330 
331  //try fetch data from custom metadata
332  if (array_key_exists($key, $this->customMetadata)) {
333  return $this->customMetadata[$key];
334  }
335 
336  //try to fetch data from php resource metadata
337  $meta = stream_get_meta_data($this->stream);
338  if (array_key_exists($key, $meta)) {
339  return $meta[$key];
340  }
341 
342  //the key was not found in standard and custom metadata.
343  return null;
344  }
$key
Definition: croninfo.php:18
+ Here is the caller graph for this function:

◆ getSize()

ILIAS\Filesystem\Stream\Stream::getSize ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 135 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\$size, $stats, and size.

136  {
137 
138  //check if we know the size
139  if ($this->size !== null) {
140  return $this->size;
141  }
142 
143  //check if stream is detached
144  if ($this->stream === null) {
145  return null;
146  }
147 
148  //clear stat cache if we got a uri (indicates that we have a file resource)
149  if ($this->uri !== null) {
150  clearstatcache(true, $this->uri);
151  }
152 
153  $stats = fstat($this->stream);
154  if (array_key_exists('size', $stats)) {
155  $this->size = $stats['size'];
156  return $this->size;
157  }
158 
159  //unable to determine stream size
160  return null;
161  }
$stats
Set page orientation and size
Definition: 04printing.php:77

◆ isReadable()

ILIAS\Filesystem\Stream\Stream::isReadable ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 262 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\$readable.

Referenced by ILIAS\Filesystem\Stream\Stream\read().

263  {
264  return $this->readable;
265  }
+ Here is the caller graph for this function:

◆ isSeekable()

ILIAS\Filesystem\Stream\Stream::isSeekable ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 195 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\$seekable.

Referenced by ILIAS\Filesystem\Stream\Stream\seek().

196  {
197  return $this->seekable;
198  }
+ Here is the caller graph for this function:

◆ isWritable()

ILIAS\Filesystem\Stream\Stream::isWritable ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 230 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\$writeable.

Referenced by ILIAS\Filesystem\Stream\Stream\write().

231  {
232  return $this->writeable;
233  }
+ Here is the caller graph for this function:

◆ read()

ILIAS\Filesystem\Stream\Stream::read (   $length)

Implements Psr\Http\Message\StreamInterface.

Definition at line 271 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\assertStreamAttached(), ILIAS\Filesystem\Util\PHPStreamFunctions\fread(), and ILIAS\Filesystem\Stream\Stream\isReadable().

272  {
273  $this->assertStreamAttached();
274 
275  if (!$this->isReadable()) {
276  throw new \RuntimeException('Can not read from non-readable stream');
277  }
278 
279  if ($length < 0) {
280  throw new \RuntimeException('Length parameter must not be negative');
281  }
282 
283  if ($length === 0) {
284  return '';
285  }
286 
287  $junk = PHPStreamFunctions::fread($this->stream, $length);
288  if ($junk === false) {
289  throw new \RuntimeException('Unable to read from stream');
290  }
291 
292  return $junk;
293  }
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
static fread($handle, $length)
fread wrapper
+ Here is the call graph for this function:

◆ rewind()

ILIAS\Filesystem\Stream\Stream::rewind ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 221 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\seek().

Referenced by ILIAS\Filesystem\Stream\Stream\__toString().

222  {
223  $this->seek(0);
224  }
seek($offset, $whence=SEEK_SET)
Definition: Stream.php:204
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ seek()

ILIAS\Filesystem\Stream\Stream::seek (   $offset,
  $whence = SEEK_SET 
)

Implements Psr\Http\Message\StreamInterface.

Definition at line 204 of file Stream.php.

References ILIAS\Filesystem\Stream\Stream\assertStreamAttached(), ILIAS\Filesystem\Util\PHPStreamFunctions\fseek(), and ILIAS\Filesystem\Stream\Stream\isSeekable().

Referenced by ILIAS\Filesystem\Stream\Stream\rewind().

205  {
206  $this->assertStreamAttached();
207 
208  if (!$this->isSeekable()) {
209  throw new \RuntimeException('Stream is not seekable');
210  }
211 
212  if (PHPStreamFunctions::fseek($this->stream, $offset, $whence) === -1) {
213  throw new \RuntimeException("Unable to seek to stream position \"$offset\" with whence \"$whence\"");
214  }
215  }
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
static fseek($stream, $offset, $whence)
fseek wrapper.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ tell()

ILIAS\Filesystem\Stream\Stream::tell ( )

Implements Psr\Http\Message\StreamInterface.

Definition at line 167 of file Stream.php.

References $result, ILIAS\Filesystem\Stream\Stream\assertStreamAttached(), and ILIAS\Filesystem\Util\PHPStreamFunctions\ftell().

168  {
169  $this->assertStreamAttached();
170 
171  $result = PHPStreamFunctions::ftell($this->stream);
172 
173  if ($result === false) {
174  throw new \RuntimeException('Unable to determine stream position');
175  }
176 
177  return $result;
178  }
$result
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
+ Here is the call graph for this function:

◆ write()

ILIAS\Filesystem\Stream\Stream::write (   $string)

Implements Psr\Http\Message\StreamInterface.

Definition at line 239 of file Stream.php.

References $result, ILIAS\Filesystem\Stream\Stream\assertStreamAttached(), ILIAS\Filesystem\Util\PHPStreamFunctions\fwrite(), ILIAS\Filesystem\Stream\Stream\isWritable(), and size.

240  {
241  $this->assertStreamAttached();
242 
243  if (!$this->isWritable()) {
244  throw new \RuntimeException('Can not write to a non-writable stream');
245  }
246 
247  //we can't know the new size
248  $this->size = null;
249  $result = PHPStreamFunctions::fwrite($this->stream, $string);
250 
251  if ($result === false) {
252  throw new \RuntimeException('Unable to write to stream');
253  }
254 
255  return $result;
256  }
$result
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:380
static fwrite($handle, $string, $length=null)
fwrite wrapper
Set page orientation and size
Definition: 04printing.php:77
+ Here is the call graph for this function:

Field Documentation

◆ $accessMap

ILIAS\Filesystem\Stream\Stream::$accessMap
staticprivate
Initial value:
= [
'r' => self::MASK_ACCESS_READ

Definition at line 23 of file Stream.php.

◆ $customMetadata

ILIAS\Filesystem\Stream\Stream::$customMetadata
private

Definition at line 73 of file Stream.php.

◆ $readable

bool ILIAS\Filesystem\Stream\Stream::$readable
private
Initial value:
=> self::MASK_ACCESS_READ_WRITE,
'r+' => self::MASK_ACCESS_READ_WRITE,
'x+' => self::MASK_ACCESS_READ_WRITE,
'c+' => self::MASK_ACCESS_READ_WRITE,
'rb' => self::MASK_ACCESS_READ,
'w+b' => self::MASK_ACCESS_READ_WRITE,
'r+b' => self::MASK_ACCESS_READ_WRITE,
'x+b' => self::MASK_ACCESS_READ_WRITE,
'c+b' => self::MASK_ACCESS_READ_WRITE,
'rt' => self::MASK_ACCESS_READ,
'w+t' => self::MASK_ACCESS_READ_WRITE,
'r+t' => self::MASK_ACCESS_READ_WRITE,
'x+t' => self::MASK_ACCESS_READ_WRITE,
'c+t' => self::MASK_ACCESS_READ_WRITE,
'a+' => self::MASK_ACCESS_READ_WRITE,
'w' => self::MASK_ACCESS_WRITE,
'rw' => self::MASK_ACCESS_WRITE,
'wb' => self::MASK_ACCESS_WRITE,
'a' => self::MASK_ACCESS_WRITE
]

Definition at line 49 of file Stream.php.

Referenced by ILIAS\Filesystem\Stream\Stream\isReadable().

◆ $seekable

bool ILIAS\Filesystem\Stream\Stream::$seekable
private

Definition at line 57 of file Stream.php.

Referenced by ILIAS\Filesystem\Stream\Stream\isSeekable().

◆ $size

int ILIAS\Filesystem\Stream\Stream::$size
private

Definition at line 65 of file Stream.php.

Referenced by ILIAS\Filesystem\Stream\Stream\getSize().

◆ $stream

resource ILIAS\Filesystem\Stream\Stream::$stream
private

◆ $uri

string ILIAS\Filesystem\Stream\Stream::$uri
private

Definition at line 69 of file Stream.php.

◆ $writeable

bool ILIAS\Filesystem\Stream\Stream::$writeable
private

Definition at line 53 of file Stream.php.

Referenced by ILIAS\Filesystem\Stream\Stream\isWritable().

◆ MASK_ACCESS_READ

const ILIAS\Filesystem\Stream\Stream::MASK_ACCESS_READ = 01

Definition at line 19 of file Stream.php.

◆ MASK_ACCESS_READ_WRITE

const ILIAS\Filesystem\Stream\Stream::MASK_ACCESS_READ_WRITE = 03

Definition at line 21 of file Stream.php.

◆ MASK_ACCESS_WRITE

const ILIAS\Filesystem\Stream\Stream::MASK_ACCESS_WRITE = 02

Definition at line 20 of file Stream.php.


The documentation for this class was generated from the following file: