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

AppendStream.php

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


001  <?php
002  namespace GuzzleHttp\Stream;
003   
004  use GuzzleHttp\Stream\Exception\CannotAttachException;
005   
006  /**
007   * Reads from multiple streams, one after the other.
008   *
009   * This is a read-only stream decorator.
010   */
011  class AppendStream implements StreamInterface
012  {
013      /** @var StreamInterface[] Streams being decorated */
014      private $streams = [];
015   
016      private $seekable = true;
017      private $current = 0;
018      private $pos = 0;
019      private $detached = false;
020   
021      /**
022       * @param StreamInterface[] $streams Streams to decorate. Each stream must
023       *                                   be readable.
024       */
025      public function __construct(array $streams = [])
026      {
027          foreach ($streams as $stream) {
028              $this->addStream($stream);
029          }
030      }
031   
032      public function __toString()
033      {
034          try {
035              $this->seek(0);
036              return $this->getContents();
037          } catch (\Exception $e) {
038              return '';
039          }
040      }
041   
042      /**
043       * Add a stream to the AppendStream
044       *
045       * @param StreamInterface $stream Stream to append. Must be readable.
046       *
047       * @throws \InvalidArgumentException if the stream is not readable
048       */
049      public function addStream(StreamInterface $stream)
050      {
051          if (!$stream->isReadable()) {
052              throw new \InvalidArgumentException('Each stream must be readable');
053          }
054   
055          // The stream is only seekable if all streams are seekable
056          if (!$stream->isSeekable()) {
057              $this->seekable = false;
058          }
059   
060          $this->streams[] = $stream;
061      }
062   
063      public function getContents()
064      {
065          return Utils::copyToString($this);
066      }
067   
068      /**
069       * Closes each attached stream.
070       *
071       * {@inheritdoc}
072       */
073      public function close()
074      {
075          $this->pos = $this->current = 0;
076   
077          foreach ($this->streams as $stream) {
078              $stream->close();
079          }
080   
081          $this->streams = [];
082      }
083   
084      /**
085       * Detaches each attached stream
086       *
087       * {@inheritdoc}
088       */
089      public function detach()
090      {
091          $this->close();
092          $this->detached = true;
093      }
094   
095      public function attach($stream)
096      {
097          throw new CannotAttachException();
098      }
099   
100      public function tell()
101      {
102          return $this->pos;
103      }
104   
105      /**
106       * Tries to calculate the size by adding the size of each stream.
107       *
108       * If any of the streams do not return a valid number, then the size of the
109       * append stream cannot be determined and null is returned.
110       *
111       * {@inheritdoc}
112       */
113      public function getSize()
114      {
115          $size = 0;
116   
117          foreach ($this->streams as $stream) {
118              $s = $stream->getSize();
119              if ($s === null) {
120                  return null;
121              }
122              $size += $s;
123          }
124   
125          return $size;
126      }
127   
128      public function eof()
129      {
130          return !$this->streams ||
131              ($this->current >= count($this->streams) - 1 &&
132               $this->streams[$this->current]->eof());
133      }
134   
135      /**
136       * Attempts to seek to the given position. Only supports SEEK_SET.
137       *
138       * {@inheritdoc}
139       */
140      public function seek($offset, $whence = SEEK_SET)
141      {
142          if (!$this->seekable || $whence !== SEEK_SET) {
143              return false;
144          }
145   
146          $success = true;
147          $this->pos = $this->current = 0;
148   
149          // Rewind each stream
150          foreach ($this->streams as $stream) {
151              if (!$stream->seek(0)) {
152                  $success = false;
153              }
154          }
155   
156          if (!$success) {
157              return false;
158          }
159   
160          // Seek to the actual position by reading from each stream
161          while ($this->pos < $offset && !$this->eof()) {
162              $this->read(min(8096, $offset - $this->pos));
163          }
164   
165          return $this->pos == $offset;
166      }
167   
168      /**
169       * Reads from all of the appended streams until the length is met or EOF.
170       *
171       * {@inheritdoc}
172       */
173      public function read($length)
174      {
175          $buffer = '';
176          $total = count($this->streams) - 1;
177          $remaining = $length;
178   
179          while ($remaining > 0) {
180              // Progress to the next stream if needed.
181              if ($this->streams[$this->current]->eof()) {
182                  if ($this->current == $total) {
183                      break;
184                  }
185                  $this->current++;
186              }
187              $buffer .= $this->streams[$this->current]->read($remaining);
188              $remaining = $length - strlen($buffer);
189          }
190   
191          $this->pos += strlen($buffer);
192   
193          return $buffer;
194      }
195   
196      public function isReadable()
197      {
198          return true;
199      }
200   
201      public function isWritable()
202      {
203          return false;
204      }
205   
206      public function isSeekable()
207      {
208          return $this->seekable;
209      }
210   
211      public function write($string)
212      {
213          return false;
214      }
215   
216      public function getMetadata($key = null)
217      {
218          return $key ? null : [];
219      }
220  }
221