Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Stream.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 6.81 KiB


 001  <?php
 002  namespace GuzzleHttp\Stream;
 003   
 004  /**
 005   * PHP stream implementation
 006   */
 007  class Stream implements StreamInterface
 008  {
 009      private $stream;
 010      private $size;
 011      private $seekable;
 012      private $readable;
 013      private $writable;
 014      private $uri;
 015      private $customMetadata;
 016   
 017      /** @var array Hash of readable and writable stream types */
 018      private static $readWriteHash = [
 019          'read' => [
 020              'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
 021              'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
 022              'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
 023              'x+t' => true, 'c+t' => true, 'a+' => true
 024          ],
 025          'write' => [
 026              'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
 027              'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
 028              'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
 029              'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
 030          ]
 031      ];
 032   
 033      /**
 034       * Create a new stream based on the input type.
 035       *
 036       * This factory accepts the same associative array of options as described
 037       * in the constructor.
 038       *
 039       * @param resource|string|StreamInterface $resource Entity body data
 040       * @param array                           $options  Additional options
 041       *
 042       * @return Stream
 043       * @throws \InvalidArgumentException if the $resource arg is not valid.
 044       */
 045      public static function factory($resource = '', array $options = [])
 046      {
 047          $type = gettype($resource);
 048   
 049          if ($type == 'string') {
 050              $stream = fopen('php://temp', 'r+');
 051              if ($resource !== '') {
 052                  fwrite($stream, $resource);
 053                  fseek($stream, 0);
 054              }
 055              return new self($stream, $options);
 056          }
 057   
 058          if ($type == 'resource') {
 059              return new self($resource, $options);
 060          }
 061   
 062          if ($resource instanceof StreamInterface) {
 063              return $resource;
 064          }
 065   
 066          if ($type == 'object' && method_exists($resource, '__toString')) {
 067              return self::factory((string) $resource, $options);
 068          }
 069   
 070          if (is_callable($resource)) {
 071              return new PumpStream($resource, $options);
 072          }
 073   
 074          if ($resource instanceof \Iterator) {
 075              return new PumpStream(function () use ($resource) {
 076                  if (!$resource->valid()) {
 077                      return false;
 078                  }
 079                  $result = $resource->current();
 080                  $resource->next();
 081                  return $result;
 082              }, $options);
 083          }
 084   
 085          throw new \InvalidArgumentException('Invalid resource type: ' . $type);
 086      }
 087   
 088      /**
 089       * This constructor accepts an associative array of options.
 090       *
 091       * - size: (int) If a read stream would otherwise have an indeterminate
 092       *   size, but the size is known due to foreknownledge, then you can
 093       *   provide that size, in bytes.
 094       * - metadata: (array) Any additional metadata to return when the metadata
 095       *   of the stream is accessed.
 096       *
 097       * @param resource $stream  Stream resource to wrap.
 098       * @param array    $options Associative array of options.
 099       *
 100       * @throws \InvalidArgumentException if the stream is not a stream resource
 101       */
 102      public function __construct($stream, $options = [])
 103      {
 104          if (!is_resource($stream)) {
 105              throw new \InvalidArgumentException('Stream must be a resource');
 106          }
 107   
 108          if (isset($options['size'])) {
 109              $this->size = $options['size'];
 110          }
 111   
 112          $this->customMetadata = isset($options['metadata'])
 113              ? $options['metadata']
 114              : [];
 115   
 116          $this->attach($stream);
 117      }
 118   
 119      /**
 120       * Closes the stream when the destructed
 121       */
 122      public function __destruct()
 123      {
 124          $this->close();
 125      }
 126   
 127      public function __toString()
 128      {
 129          if (!$this->stream) {
 130              return '';
 131          }
 132   
 133          $this->seek(0);
 134   
 135          return (string) stream_get_contents($this->stream);
 136      }
 137   
 138      public function getContents()
 139      {
 140          return $this->stream ? stream_get_contents($this->stream) : '';
 141      }
 142   
 143      public function close()
 144      {
 145          if (is_resource($this->stream)) {
 146              fclose($this->stream);
 147          }
 148   
 149          $this->detach();
 150      }
 151   
 152      public function detach()
 153      {
 154          $result = $this->stream;
 155          $this->stream = $this->size = $this->uri = null;
 156          $this->readable = $this->writable = $this->seekable = false;
 157   
 158          return $result;
 159      }
 160   
 161      public function attach($stream)
 162      {
 163          $this->stream = $stream;
 164          $meta = stream_get_meta_data($this->stream);
 165          $this->seekable = $meta['seekable'];
 166          $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]);
 167          $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]);
 168          $this->uri = $this->getMetadata('uri');
 169      }
 170   
 171      public function getSize()
 172      {
 173          if ($this->size !== null) {
 174              return $this->size;
 175          }
 176   
 177          if (!$this->stream) {
 178              return null;
 179          }
 180   
 181          // Clear the stat cache if the stream has a URI
 182          if ($this->uri) {
 183              clearstatcache(true, $this->uri);
 184          }
 185   
 186          $stats = fstat($this->stream);
 187          if (isset($stats['size'])) {
 188              $this->size = $stats['size'];
 189              return $this->size;
 190          }
 191   
 192          return null;
 193      }
 194   
 195      public function isReadable()
 196      {
 197          return $this->readable;
 198      }
 199   
 200      public function isWritable()
 201      {
 202          return $this->writable;
 203      }
 204   
 205      public function isSeekable()
 206      {
 207          return $this->seekable;
 208      }
 209   
 210      public function eof()
 211      {
 212          return !$this->stream || feof($this->stream);
 213      }
 214   
 215      public function tell()
 216      {
 217          return $this->stream ? ftell($this->stream) : false;
 218      }
 219   
 220      public function setSize($size)
 221      {
 222          $this->size = $size;
 223   
 224          return $this;
 225      }
 226   
 227      public function seek($offset, $whence = SEEK_SET)
 228      {
 229          return $this->seekable
 230              ? fseek($this->stream, $offset, $whence) === 0
 231              : false;
 232      }
 233   
 234      public function read($length)
 235      {
 236          return $this->readable ? fread($this->stream, $length) : false;
 237      }
 238   
 239      public function write($string)
 240      {
 241          // We can't know the size after writing anything
 242          $this->size = null;
 243   
 244          return $this->writable ? fwrite($this->stream, $string) : false;
 245      }
 246   
 247      public function getMetadata($key = null)
 248      {
 249          if (!$this->stream) {
 250              return $key ? null : [];
 251          } elseif (!$key) {
 252              return $this->customMetadata + stream_get_meta_data($this->stream);
 253          } elseif (isset($this->customMetadata[$key])) {
 254              return $this->customMetadata[$key];
 255          }
 256   
 257          $meta = stream_get_meta_data($this->stream);
 258   
 259          return isset($meta[$key]) ? $meta[$key] : null;
 260      }
 261  }
 262