ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
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 ()
 @inheritDoc More...
 
 detach ()
 @inheritDoc More...
 
 getSize ()
 @inheritDoc More...
 
 tell ()
 @inheritDoc More...
 
 eof ()
 @inheritDoc More...
 
 isSeekable ()
 @inheritDoc More...
 
 seek ($offset, $whence=SEEK_SET)
 @inheritDoc More...
 
 rewind ()
 @inheritDoc More...
 
 isWritable ()
 @inheritDoc More...
 
 write ($string)
 @inheritDoc More...
 
 isReadable ()
 @inheritDoc More...
 
 read ($length)
 @inheritDoc More...
 
 getContents ()
 @inheritDoc More...
 
 getMetadata ($key=null)
 @inheritDoc More...
 
 __toString ()
 @inheritDoc More...
 
 __destruct ()
 @inheritDoc More...
 
 __toString ()
 Reads all data from the stream into a string, from the beginning to end. More...
 
 close ()
 Closes the stream and any underlying resources. More...
 
 detach ()
 Separates any underlying resources from the stream. More...
 
 getSize ()
 Get the size of the stream if known. More...
 
 tell ()
 Returns the current position of the file read/write pointer. More...
 
 eof ()
 Returns true if the stream is at the end of the stream. More...
 
 isSeekable ()
 Returns whether or not the stream is seekable. More...
 
 seek ($offset, $whence=SEEK_SET)
 Seek to a position in the stream. More...
 
 rewind ()
 Seek to the beginning of the stream. More...
 
 isWritable ()
 Returns whether or not the stream is writable. More...
 
 write ($string)
 Write data to the stream. More...
 
 isReadable ()
 Returns whether or not the stream is readable. More...
 
 read ($length)
 Read data from the stream. More...
 
 getContents ()
 Returns the remaining contents in a string. More...
 
 getMetadata ($key=null)
 Get stream metadata as an associative array or retrieve a specific key. More...
 

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 18 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 83 of file Stream.php.

84 {
85 if (!is_resource($stream)) {
86 throw new \InvalidArgumentException('Stream must be a valid resource but "' . gettype($stream) . '" was given.');
87 }
88
89 if ($options !== null) {
90 $this->customMetadata = $options->getMetadata();
91 $this->size = ($options->getSize() !== -1) ? $options->getSize() : null;
92 } else {
93 $this->customMetadata = [];
94 }
95
96 $this->stream = $stream;
97
98 $meta = stream_get_meta_data($this->stream);
99 $mode = $meta['mode'];
100
101 $this->readable = array_key_exists($mode, self::$accessMap) && boolval(self::$accessMap[$mode] & self::MASK_ACCESS_READ);
102 $this->writeable = array_key_exists($mode, self::$accessMap) && boolval(self::$accessMap[$mode] & self::MASK_ACCESS_WRITE);
103 $this->seekable = boolval($meta['seekable']);
104 $this->uri = $this->getMetadata('uri');
105 }
getMetadata($key=null)
@inheritDoc
Definition: Stream.php:317
font size
Definition: langcheck.php:162

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

+ Here is the call graph for this function:

◆ __destruct()

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

@inheritDoc

Definition at line 365 of file Stream.php.

366 {
367
368 //cleanup the resource on object destruction if the stream is not detached.
369 if (!is_null($this->stream)) {
370 $this->close();
371 }
372 }

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

+ Here is the call graph for this function:

Member Function Documentation

◆ __toString()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 350 of file Stream.php.

351 {
352 try {
353 $this->rewind();
354 return strval($this->getContents());
355 } catch (\Exception $ex) {
356 //to string must not throw an error.
357 return '';
358 }
359 }

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

+ 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

RuntimeException Thrown if the stream is already detached.

Definition at line 381 of file Stream.php.

382 {
383 if ($this->stream === null) {
384 throw new \RuntimeException('Stream is detached');
385 }
386 }

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().

+ Here is the caller graph for this function:

◆ close()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 111 of file Stream.php.

112 {
113 if ($this->stream !== null && is_resource($this->stream)) {
114 PHPStreamFunctions::fclose($this->stream);
115 }
116
117 $this->detach();
118 }
static fclose($handle)
fclose wrapper

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

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ detach()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 124 of file Stream.php.

125 {
127 $this->stream = $this->size = $this->uri = null;
128
129 return $stream;
130 }

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

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

+ Here is the caller graph for this function:

◆ eof()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 185 of file Stream.php.

186 {
187 $this->assertStreamAttached();
188
189 return feof($this->stream);
190 }
assertStreamAttached()
Checks if the stream is attached to the wrapper.
Definition: Stream.php:381

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

+ Here is the call graph for this function:

◆ getContents()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 300 of file Stream.php.

301 {
302 $this->assertStreamAttached();
303
304 $content = PHPStreamFunctions::stream_get_contents($this->stream);
305
306 if ($content === false) {
307 throw new \RuntimeException('Unable to read stream contents');
308 }
309
310 return $content;
311 }
static stream_get_contents($handle, $length=-1)
stream_get_contents wrapper

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

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getMetadata()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 317 of file Stream.php.

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

References $key.

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

+ Here is the caller graph for this function:

◆ getSize()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 136 of file Stream.php.

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

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

◆ isReadable()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 263 of file Stream.php.

264 {
265 return $this->readable;
266 }

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

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

+ Here is the caller graph for this function:

◆ isSeekable()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 196 of file Stream.php.

197 {
198 return $this->seekable;
199 }

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

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

+ Here is the caller graph for this function:

◆ isWritable()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 231 of file Stream.php.

232 {
233 return $this->writeable;
234 }

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

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

+ Here is the caller graph for this function:

◆ read()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 272 of file Stream.php.

273 {
274 $this->assertStreamAttached();
275
276 if (!$this->isReadable()) {
277 throw new \RuntimeException('Can not read from non-readable stream');
278 }
279
280 if ($length < 0) {
281 throw new \RuntimeException('Length parameter must not be negative');
282 }
283
284 if ($length === 0) {
285 return '';
286 }
287
288 $junk = PHPStreamFunctions::fread($this->stream, $length);
289 if ($junk === false) {
290 throw new \RuntimeException('Unable to read from stream');
291 }
292
293 return $junk;
294 }
static fread($handle, $length)
fread wrapper

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

+ Here is the call graph for this function:

◆ rewind()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 222 of file Stream.php.

223 {
224 $this->seek(0);
225 }
seek($offset, $whence=SEEK_SET)
@inheritDoc
Definition: Stream.php:205

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

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

+ 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 
)

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 205 of file Stream.php.

206 {
207 $this->assertStreamAttached();
208
209 if (!$this->isSeekable()) {
210 throw new \RuntimeException('Stream is not seekable');
211 }
212
213 if (PHPStreamFunctions::fseek($this->stream, $offset, $whence) === -1) {
214 throw new \RuntimeException("Unable to seek to stream position \"$offset\" with whence \"$whence\"");
215 }
216 }
static fseek($stream, $offset, $whence)
fseek wrapper.

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

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ tell()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 168 of file Stream.php.

169 {
170 $this->assertStreamAttached();
171
172 $result = PHPStreamFunctions::ftell($this->stream);
173
174 if ($result === false) {
175 throw new \RuntimeException('Unable to determine stream position');
176 }
177
178 return $result;
179 }
$result

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

+ Here is the call graph for this function:

◆ write()

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

@inheritDoc

Implements Psr\Http\Message\StreamInterface.

Definition at line 240 of file Stream.php.

241 {
242 $this->assertStreamAttached();
243
244 if (!$this->isWritable()) {
245 throw new \RuntimeException('Can not write to a non-writable stream');
246 }
247
248 //we can't know the new size
249 $this->size = null;
250 $result = PHPStreamFunctions::fwrite($this->stream, $string);
251
252 if ($result === false) {
253 throw new \RuntimeException('Unable to write to stream');
254 }
255
256 return $result;
257 }
static fwrite($handle, $string, $length=null)
fwrite wrapper

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

+ Here is the call graph for this function:

Field Documentation

◆ $accessMap

◆ $customMetadata

string[] ILIAS\Filesystem\Stream\Stream::$customMetadata
private

Definition at line 74 of file Stream.php.

◆ $readable

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

Definition at line 50 of file Stream.php.

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

◆ $seekable

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

Definition at line 58 of file Stream.php.

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

◆ $size

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

Definition at line 66 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 70 of file Stream.php.

◆ $writeable

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

Definition at line 54 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 20 of file Stream.php.

◆ MASK_ACCESS_READ_WRITE

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

Definition at line 22 of file Stream.php.

◆ MASK_ACCESS_WRITE

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

Definition at line 21 of file Stream.php.


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