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

LimitStream.php

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


001  <?php
002  namespace GuzzleHttp\Stream;
003   
004  use GuzzleHttp\Stream\Exception\SeekException;
005   
006  /**
007   * Decorator used to return only a subset of a stream
008   */
009  class LimitStream implements StreamInterface
010  {
011      use StreamDecoratorTrait;
012   
013      /** @var int Offset to start reading from */
014      private $offset;
015   
016      /** @var int Limit the number of bytes that can be read */
017      private $limit;
018   
019      /**
020       * @param StreamInterface $stream Stream to wrap
021       * @param int             $limit  Total number of bytes to allow to be read
022       *                                from the stream. Pass -1 for no limit.
023       * @param int|null        $offset Position to seek to before reading (only
024       *                                works on seekable streams).
025       */
026      public function __construct(
027          StreamInterface $stream,
028          $limit = -1,
029          $offset = 0
030      ) {
031          $this->stream = $stream;
032          $this->setLimit($limit);
033          $this->setOffset($offset);
034      }
035   
036      public function eof()
037      {
038          // Always return true if the underlying stream is EOF
039          if ($this->stream->eof()) {
040              return true;
041          }
042   
043          // No limit and the underlying stream is not at EOF
044          if ($this->limit == -1) {
045              return false;
046          }
047   
048          $tell = $this->stream->tell();
049          if ($tell === false) {
050              return false;
051          }
052   
053          return $tell >= $this->offset + $this->limit;
054      }
055   
056      /**
057       * Returns the size of the limited subset of data
058       * {@inheritdoc}
059       */
060      public function getSize()
061      {
062          if (null === ($length = $this->stream->getSize())) {
063              return null;
064          } elseif ($this->limit == -1) {
065              return $length - $this->offset;
066          } else {
067              return min($this->limit, $length - $this->offset);
068          }
069      }
070   
071      /**
072       * Allow for a bounded seek on the read limited stream
073       * {@inheritdoc}
074       */
075      public function seek($offset, $whence = SEEK_SET)
076      {
077          if ($whence !== SEEK_SET || $offset < 0) {
078              return false;
079          }
080   
081          $offset += $this->offset;
082   
083          if ($this->limit !== -1) {
084              if ($offset > $this->offset + $this->limit) {
085                  $offset = $this->offset + $this->limit;
086              }
087          }
088   
089          return $this->stream->seek($offset);
090      }
091   
092      /**
093       * Give a relative tell()
094       * {@inheritdoc}
095       */
096      public function tell()
097      {
098          return $this->stream->tell() - $this->offset;
099      }
100   
101      /**
102       * Set the offset to start limiting from
103       *
104       * @param int $offset Offset to seek to and begin byte limiting from
105       *
106       * @return self
107       * @throws SeekException
108       */
109      public function setOffset($offset)
110      {
111          $current = $this->stream->tell();
112   
113          if ($current !== $offset) {
114              // If the stream cannot seek to the offset position, then read to it
115              if (!$this->stream->seek($offset)) {
116                  if ($current > $offset) {
117                      throw new SeekException($this, $offset);
118                  } else {
119                      $this->stream->read($offset - $current);
120                  }
121              }
122          }
123   
124          $this->offset = $offset;
125   
126          return $this;
127      }
128   
129      /**
130       * Set the limit of bytes that the decorator allows to be read from the
131       * stream.
132       *
133       * @param int $limit Number of bytes to allow to be read from the stream.
134       *                   Use -1 for no limit.
135       * @return self
136       */
137      public function setLimit($limit)
138      {
139          $this->limit = $limit;
140   
141          return $this;
142      }
143   
144      public function read($length)
145      {
146          if ($this->limit == -1) {
147              return $this->stream->read($length);
148          }
149   
150          // Check if the current position is less than the total allowed
151          // bytes + original offset
152          $remaining = ($this->offset + $this->limit) - $this->stream->tell();
153          if ($remaining > 0) {
154              // Only return the amount of requested data, ensuring that the byte
155              // limit is not exceeded
156              return $this->stream->read(min($remaining, $length));
157          } else {
158              return false;
159          }
160      }
161  }
162