<?php
namespace ZBateson\MailMimeParser\Stream;
use Psr\Http\Message\StreamInterface;
use ZBateson\MailMimeParser\Message\IMessagePart;
use ZBateson\MailMimeParser\Parser\PartBuilder;
use ZBateson\StreamDecorators\Base64Stream;
use ZBateson\StreamDecorators\CharsetStream;
use ZBateson\StreamDecorators\ChunkSplitStream;
use ZBateson\StreamDecorators\DecoratedCachingStream;
use ZBateson\StreamDecorators\NonClosingStream;
use ZBateson\StreamDecorators\PregReplaceFilterStream;
use ZBateson\StreamDecorators\QuotedPrintableStream;
use ZBateson\StreamDecorators\SeekingLimitStream;
use ZBateson\StreamDecorators\UUStream;
class StreamFactory
{
protected bool $throwExceptionReadingPartContentFromUnsupportedCharsets;
public function __construct(bool $throwExceptionReadingPartContentFromUnsupportedCharsets)
{
$this->throwExceptionReadingPartContentFromUnsupportedCharsets = $throwExceptionReadingPartContentFromUnsupportedCharsets;
}
public function getLimitedPartStream(PartBuilder $part) : StreamInterface
{
return $this->newLimitStream(
$part->getStream(),
$part->getStreamPartLength(),
$part->getStreamPartStartPos()
);
}
public function getLimitedContentStream(PartBuilder $part) : ?StreamInterface
{
$length = $part->getStreamContentLength();
if ($length !== 0) {
return $this->newLimitStream(
$part->getStream(),
$part->getStreamContentLength(),
$part->getStreamContentStartPos()
);
}
return null;
}
private function newLimitStream(StreamInterface $stream, int $length, int $start) : StreamInterface
{
return new SeekingLimitStream(
$this->newNonClosingStream($stream),
$length,
$start
);
}
public function newSeekingStream(StreamInterface $stream) : StreamInterface
{
return new SeekingLimitStream($this->newNonClosingStream($stream));
}
public function newNonClosingStream(StreamInterface $stream) : StreamInterface
{
return new NonClosingStream($stream);
}
public function newChunkSplitStream(StreamInterface $stream) : StreamInterface
{
return new ChunkSplitStream($stream);
}
public function newBase64Stream(StreamInterface $stream) : StreamInterface
{
return new Base64Stream(
new PregReplaceFilterStream($stream, '/[^a-zA-Z0-9\/\+=]/', '')
);
}
public function newQuotedPrintableStream(StreamInterface $stream) : StreamInterface
{
return new QuotedPrintableStream($stream);
}
public function newUUStream(StreamInterface $stream) : StreamInterface
{
return new UUStream($stream);
}
public function getTransferEncodingDecoratedStream(StreamInterface $stream, ?string $transferEncoding, ?string $filename = null) : StreamInterface
{
$decorated = null;
switch ($transferEncoding) {
case 'quoted-printable':
$decorated = $this->newQuotedPrintableStream($stream);
break;
case 'base64':
$decorated = $this->newBase64Stream(
$this->newChunkSplitStream($stream)
);
break;
case 'x-uuencode':
$decorated = $this->newUUStream($stream);
if ($filename !== null) {
$decorated->setFilename($filename);
}
break;
default:
return $stream;
}
return $decorated;
}
public function newCharsetStream(StreamInterface $stream, string $streamCharset, string $stringCharset) : StreamInterface
{
return new CharsetStream($stream, $streamCharset, $stringCharset);
}
public function newMessagePartStream(IMessagePart $part) : MessagePartStreamDecorator
{
return new MessagePartStream($this, $part, $this->throwExceptionReadingPartContentFromUnsupportedCharsets);
}
public function newDecoratedCachingStream(StreamInterface $stream, callable $decorator) : StreamInterface
{
return new DecoratedCachingStream($stream, $decorator, 204800);
}
public function newHeaderStream(IMessagePart $part) : StreamInterface
{
return new HeaderStream($part);
}
public function newDecoratedMessagePartStream(IMessagePart $part, StreamInterface $stream) : MessagePartStreamDecorator
{
return new MessagePartStreamDecorator($part, $stream);
}
}