Chris@0: isReadable()) { Chris@0: $mode = $stream->isWritable() ? 'r+' : 'r'; Chris@0: } elseif ($stream->isWritable()) { Chris@0: $mode = 'w'; Chris@0: } else { Chris@0: throw new \InvalidArgumentException('The stream must be readable, ' Chris@0: . 'writable, or both.'); Chris@0: } Chris@0: Chris@17: return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Creates a stream context that can be used to open a stream as a php stream resource. Chris@17: * Chris@17: * @param StreamInterface $stream Chris@17: * Chris@17: * @return resource Chris@17: */ Chris@17: public static function createStreamContext(StreamInterface $stream) Chris@17: { Chris@17: return stream_context_create([ Chris@0: 'guzzle' => ['stream' => $stream] Chris@17: ]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Registers the stream wrapper if needed Chris@0: */ Chris@0: public static function register() Chris@0: { Chris@0: if (!in_array('guzzle', stream_get_wrappers())) { Chris@0: stream_wrapper_register('guzzle', __CLASS__); Chris@0: } Chris@0: } Chris@0: Chris@0: public function stream_open($path, $mode, $options, &$opened_path) Chris@0: { Chris@0: $options = stream_context_get_options($this->context); Chris@0: Chris@0: if (!isset($options['guzzle']['stream'])) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $this->mode = $mode; Chris@0: $this->stream = $options['guzzle']['stream']; Chris@0: Chris@0: return true; Chris@0: } Chris@0: Chris@0: public function stream_read($count) Chris@0: { Chris@0: return $this->stream->read($count); Chris@0: } Chris@0: Chris@0: public function stream_write($data) Chris@0: { Chris@0: return (int) $this->stream->write($data); Chris@0: } Chris@0: Chris@0: public function stream_tell() Chris@0: { Chris@0: return $this->stream->tell(); Chris@0: } Chris@0: Chris@0: public function stream_eof() Chris@0: { Chris@0: return $this->stream->eof(); Chris@0: } Chris@0: Chris@0: public function stream_seek($offset, $whence) Chris@0: { Chris@0: $this->stream->seek($offset, $whence); Chris@0: Chris@0: return true; Chris@0: } Chris@0: Chris@17: public function stream_cast($cast_as) Chris@17: { Chris@17: $stream = clone($this->stream); Chris@17: Chris@17: return $stream->detach(); Chris@17: } Chris@17: Chris@0: public function stream_stat() Chris@0: { Chris@0: static $modeMap = [ Chris@0: 'r' => 33060, Chris@17: 'rb' => 33060, Chris@0: 'r+' => 33206, Chris@17: 'w' => 33188, Chris@17: 'wb' => 33188 Chris@0: ]; Chris@0: Chris@0: return [ Chris@0: 'dev' => 0, Chris@0: 'ino' => 0, Chris@0: 'mode' => $modeMap[$this->mode], Chris@0: 'nlink' => 0, Chris@0: 'uid' => 0, Chris@0: 'gid' => 0, Chris@0: 'rdev' => 0, Chris@0: 'size' => $this->stream->getSize() ?: 0, Chris@0: 'atime' => 0, Chris@0: 'mtime' => 0, Chris@0: 'ctime' => 0, Chris@0: 'blksize' => 0, Chris@0: 'blocks' => 0 Chris@0: ]; Chris@0: } Chris@17: Chris@17: public function url_stat($path, $flags) Chris@17: { Chris@17: return [ Chris@17: 'dev' => 0, Chris@17: 'ino' => 0, Chris@17: 'mode' => 0, Chris@17: 'nlink' => 0, Chris@17: 'uid' => 0, Chris@17: 'gid' => 0, Chris@17: 'rdev' => 0, Chris@17: 'size' => 0, Chris@17: 'atime' => 0, Chris@17: 'mtime' => 0, Chris@17: 'ctime' => 0, Chris@17: 'blksize' => 0, Chris@17: 'blocks' => 0 Chris@17: ]; Chris@17: } Chris@0: }