Chris@0: source = $source; Chris@0: $this->size = isset($options['size']) ? $options['size'] : null; Chris@0: $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; Chris@0: $this->buffer = new BufferStream(); Chris@0: } Chris@0: Chris@0: public function __toString() Chris@0: { Chris@0: try { Chris@0: return copy_to_string($this); Chris@0: } catch (\Exception $e) { Chris@0: return ''; Chris@0: } Chris@0: } Chris@0: Chris@0: public function close() Chris@0: { Chris@0: $this->detach(); Chris@0: } Chris@0: Chris@0: public function detach() Chris@0: { Chris@0: $this->tellPos = false; Chris@0: $this->source = null; Chris@0: } Chris@0: Chris@0: public function getSize() Chris@0: { Chris@0: return $this->size; Chris@0: } Chris@0: Chris@0: public function tell() Chris@0: { Chris@0: return $this->tellPos; Chris@0: } Chris@0: Chris@0: public function eof() Chris@0: { Chris@0: return !$this->source; Chris@0: } Chris@0: Chris@0: public function isSeekable() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: public function rewind() Chris@0: { Chris@0: $this->seek(0); Chris@0: } Chris@0: Chris@0: public function seek($offset, $whence = SEEK_SET) Chris@0: { Chris@0: throw new \RuntimeException('Cannot seek a PumpStream'); Chris@0: } Chris@0: Chris@0: public function isWritable() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: public function write($string) Chris@0: { Chris@0: throw new \RuntimeException('Cannot write to a PumpStream'); Chris@0: } Chris@0: Chris@0: public function isReadable() Chris@0: { Chris@0: return true; Chris@0: } Chris@0: Chris@0: public function read($length) Chris@0: { Chris@0: $data = $this->buffer->read($length); Chris@0: $readLen = strlen($data); Chris@0: $this->tellPos += $readLen; Chris@0: $remaining = $length - $readLen; Chris@0: Chris@0: if ($remaining) { Chris@0: $this->pump($remaining); Chris@0: $data .= $this->buffer->read($remaining); Chris@0: $this->tellPos += strlen($data) - $readLen; Chris@0: } Chris@0: Chris@0: return $data; Chris@0: } Chris@0: Chris@0: public function getContents() Chris@0: { Chris@0: $result = ''; Chris@0: while (!$this->eof()) { Chris@0: $result .= $this->read(1000000); Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: Chris@0: public function getMetadata($key = null) Chris@0: { Chris@0: if (!$key) { Chris@0: return $this->metadata; Chris@0: } Chris@0: Chris@0: return isset($this->metadata[$key]) ? $this->metadata[$key] : null; Chris@0: } Chris@0: Chris@0: private function pump($length) Chris@0: { Chris@0: if ($this->source) { Chris@0: do { Chris@0: $data = call_user_func($this->source, $length); Chris@0: if ($data === false || $data === null) { Chris@0: $this->source = null; Chris@0: return; Chris@0: } Chris@0: $this->buffer->write($data); Chris@0: $length -= strlen($data); Chris@0: } while ($length > 0); Chris@0: } Chris@0: } Chris@0: }