MimeBodyDecodedStream::isReadable()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Stream;
5
6
use Genkgo\Mail\Mime\PartInterface;
7
use Genkgo\Mail\StreamInterface;
8
9
final class MimeBodyDecodedStream implements StreamInterface
10
{
11
    /**
12
     * @var StreamInterface
13
     */
14
    private $decoratedStream;
15
16
    /**
17
     * @param PartInterface $mimePart
18
     */
19 22
    public function __construct(PartInterface $mimePart)
20
    {
21 22
        $this->decoratedStream = $this->calculateOptimalStream($mimePart);
22 22
    }
23
24
    /**
25
     * @param PartInterface $part
26
     * @return StreamInterface
27
     */
28 22
    private function calculateOptimalStream(PartInterface $part): StreamInterface
29
    {
30 22
        if (!$part->hasHeader('Content-Transfer-Encoding')) {
31
            return $part->getBody();
32
        }
33
34 22
        $encoding = $part->getHeader('Content-Transfer-Encoding')->getValue();
35 22
        switch ($encoding) {
36 22
            case 'quoted-printable':
37 3
                return QuotedPrintableDecodedStream::fromString((string)$part->getBody());
38 20
            case 'base64':
39 7
                return Base64DecodedStream::fromString((string)$part->getBody());
40 13
            case '7bit':
41
            case '8bit':
42 13
                return $part->getBody();
43
            default:
44
                throw new \UnexpectedValueException(
45
                    'Cannot decode body of mime part, unknown transfer encoding ' . $encoding
46
                );
47
        }
48
    }
49
50
    /**
51
     * @return string
52
     */
53 17
    public function __toString(): string
54
    {
55 17
        return $this->decoratedStream->__toString();
56
    }
57
58
    public function close(): void
59
    {
60
        $this->decoratedStream->close();
61
    }
62
63
    /**
64
     * @return mixed
65
     */
66
    public function detach()
67
    {
68
        return $this->decoratedStream->detach();
69
    }
70
71
    /**
72
     * @return int|null
73
     */
74 1
    public function getSize(): ?int
75
    {
76 1
        return $this->decoratedStream->getSize();
77
    }
78
79
    /**
80
     * @return int
81
     * @throws \RuntimeException
82
     */
83 1
    public function tell(): int
84
    {
85 1
        return $this->decoratedStream->tell();
86
    }
87
88
    /**
89
     * @return bool
90
     */
91
    public function eof(): bool
92
    {
93
        return $this->decoratedStream->eof();
94
    }
95
96
    /**
97
     * @return bool
98
     */
99
    public function isSeekable(): bool
100
    {
101
        return $this->decoratedStream->isSeekable();
102
    }
103
104
    /**
105
     * @param int $offset
106
     * @param int $whence
107
     * @return int
108
     */
109 1
    public function seek(int $offset, int $whence = SEEK_SET): int
110
    {
111 1
        return $this->decoratedStream->seek($offset, $whence);
112
    }
113
114
    /**
115
     * @return bool
116
     */
117 1
    public function rewind(): bool
118
    {
119 1
        return $this->decoratedStream->rewind();
120
    }
121
122
    /**
123
     * @return bool
124
     */
125 1
    public function isWritable(): bool
126
    {
127 1
        return $this->decoratedStream->isWritable();
128
    }
129
130
    /**
131
     * @param string $string
132
     * @return int
133
     */
134 1
    public function write($string): int
135
    {
136 1
        return $this->decoratedStream->write($string);
137
    }
138
139
    /**
140
     * @return bool
141
     */
142
    public function isReadable(): bool
143
    {
144
        return $this->decoratedStream->isReadable();
145
    }
146
147
    /**
148
     * @param int $length
149
     * @return string
150
     */
151 1
    public function read(int $length): string
152
    {
153 1
        return $this->decoratedStream->read($length);
154
    }
155
156
    /**
157
     * @return string
158
     */
159 2
    public function getContents(): string
160
    {
161 2
        return $this->decoratedStream->getContents();
162
    }
163
164
    /**
165
     * @param array<int, string> $keys
166
     * @return array<string, mixed>
0 ignored issues
show
Documentation introduced by
The doc-type array<string, could not be parsed: Expected ">" at position 5, but found "end of type". (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
167
     */
168
    public function getMetadata(array $keys = []): array
169
    {
170
        return $this->decoratedStream->getMetadata();
171
    }
172
}
173