Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
103 - 1
<?php
2
namespace GuzzleHttp\Psr7;
3
 
4
use Psr\Http\Message\StreamInterface;
5
 
6
/**
7
 * Stream decorator trait
8
 * @property StreamInterface stream
9
 */
10
trait StreamDecoratorTrait
11
{
12
    /**
13
     * @param StreamInterface $stream Stream to decorate
14
     */
15
    public function __construct(StreamInterface $stream)
16
    {
17
        $this->stream = $stream;
18
    }
19
 
20
    /**
21
     * Magic method used to create a new stream if streams are not added in
22
     * the constructor of a decorator (e.g., LazyOpenStream).
23
     *
24
     * @param string $name Name of the property (allows "stream" only).
25
     *
26
     * @return StreamInterface
27
     */
28
    public function __get($name)
29
    {
30
        if ($name == 'stream') {
31
            $this->stream = $this->createStream();
32
            return $this->stream;
33
        }
34
 
35
        throw new \UnexpectedValueException("$name not found on class");
36
    }
37
 
38
    public function __toString()
39
    {
40
        try {
41
            if ($this->isSeekable()) {
42
                $this->seek(0);
43
            }
44
            return $this->getContents();
45
        } catch (\Exception $e) {
46
            // Really, PHP? https://bugs.php.net/bug.php?id=53648
47
            trigger_error('StreamDecorator::__toString exception: '
48
                . (string) $e, E_USER_ERROR);
49
            return '';
50
        }
51
    }
52
 
53
    public function getContents()
54
    {
55
        return copy_to_string($this);
56
    }
57
 
58
    /**
59
     * Allow decorators to implement custom methods
60
     *
61
     * @param string $method Missing method name
62
     * @param array  $args   Method arguments
63
     *
64
     * @return mixed
65
     */
66
    public function __call($method, array $args)
67
    {
68
        $result = call_user_func_array([$this->stream, $method], $args);
69
 
70
        // Always return the wrapped object if the result is a return $this
71
        return $result === $this->stream ? $this : $result;
72
    }
73
 
74
    public function close()
75
    {
76
        $this->stream->close();
77
    }
78
 
79
    public function getMetadata($key = null)
80
    {
81
        return $this->stream->getMetadata($key);
82
    }
83
 
84
    public function detach()
85
    {
86
        return $this->stream->detach();
87
    }
88
 
89
    public function getSize()
90
    {
91
        return $this->stream->getSize();
92
    }
93
 
94
    public function eof()
95
    {
96
        return $this->stream->eof();
97
    }
98
 
99
    public function tell()
100
    {
101
        return $this->stream->tell();
102
    }
103
 
104
    public function isReadable()
105
    {
106
        return $this->stream->isReadable();
107
    }
108
 
109
    public function isWritable()
110
    {
111
        return $this->stream->isWritable();
112
    }
113
 
114
    public function isSeekable()
115
    {
116
        return $this->stream->isSeekable();
117
    }
118
 
119
    public function rewind()
120
    {
121
        $this->seek(0);
122
    }
123
 
124
    public function seek($offset, $whence = SEEK_SET)
125
    {
126
        $this->stream->seek($offset, $whence);
127
    }
128
 
129
    public function read($length)
130
    {
131
        return $this->stream->read($length);
132
    }
133
 
134
    public function write($string)
135
    {
136
        return $this->stream->write($string);
137
    }
138
 
139
    /**
140
     * Implement in subclasses to dynamically create streams when requested.
141
     *
142
     * @return StreamInterface
143
     * @throws \BadMethodCallException
144
     */
145
    protected function createStream()
146
    {
147
        throw new \BadMethodCallException('Not implemented');
148
    }
149
}