Completed
Push — master ( 42b3e6...c7cf7f )
by Zaahid
02:29
created

PartStreamRegistry::attachEncodingFilterToStream()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 17
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 17
rs 9.2
cc 4
eloc 14
nc 4
nop 2
1
<?php
2
/**
3
 * This file is part of the ZBateson\MailMimeParser project.
4
 *
5
 * @license http://opensource.org/licenses/bsd-license.php BSD
6
 */
7
namespace ZBateson\MailMimeParser;
8
9
/**
10
 * Factory class for PartStream objects and registration class for Message
11
 * handles.
12
 * 
13
 * PartStreamRegistry is used for \ZBateson\MailMimeParser\MessageParser to
14
 * register Message stream handles for opening with PartStreams, and to open
15
 * file handles for specific mime parts of a message.  The PartStreamRegistry
16
 * maintains a list of opened resources, closing them either when unregistering
17
 * a Message or on destruction.
18
 *
19
 * @author Zaahid Bateson
20
 */
21
class PartStreamRegistry
22
{
23
    /**
24
     * @var array Array of handles, with message IDs as keys.
25
     */
26
    private $registeredHandles;
27
28
    /**
29
     * @var array Array of PartStream handles with message IDs as keys.
30
     */
31
    private $registeredPartStreamHandles;
32
33
    /**
34
     * Registers an ID for the passed resource handle.
35
     * 
36
     * @param string $id
37
     * @param resource $handle
38
     */
39
    public function register($id, $handle)
40
    {
41
        if (!isset($this->registeredHandles[$id])) {
42
            $this->registeredHandles[$id] = $handle;
43
        }
44
    }
45
46
    /**
47
     * Unregisters the given message ID.
48
     * 
49
     * @param string $id
50
     */
51
    public function unregister($id)
52
    {
53
        unset($this->registeredHandles[$id], $this->registeredPartStreamHandles);
54
    }
55
56
    /**
57
     * Returns the resource handle with the passed $id.
58
     * 
59
     * @param string $id
60
     * @return resource
61
     */
62
    public function get($id)
63
    {
64
        if (!isset($this->registeredHandles[$id])) {
65
            return null;
66
        }
67
        return $this->registeredHandles[$id];
68
    }
69
    
70
    /**
71
     * Attaches a stream filter on the passed resource $handle for the part's
72
     * encoding.
73
     * 
74
     * @param \ZBateson\MailMimeParser\MimePart $part
75
     * @param resource $handle
76
     */
77
    private function attachEncodingFilterToStream(MimePart $part, $handle)
78
    {
79
        $encoding = strtolower($part->getHeaderValue('Content-Transfer-Encoding'));
80
        switch ($encoding) {
81
            case 'quoted-printable':
82
                stream_filter_append($handle, 'convert.quoted-printable-decode', STREAM_FILTER_READ);
83
                break;
84
            case 'base64':
85
                stream_filter_append($handle, 'convert.base64-decode', STREAM_FILTER_READ);
86
                break;
87
            case 'x-uuencode':
88
                stream_filter_append($handle, 'mailmimeparser-uudecode', STREAM_FILTER_READ);
89
                break;
90
            default:
91
                break;
92
        }
93
    }
94
    
95
    /**
96
     * Attaches a mailmimeparser-encode stream filter based on the part's
97
     * defined charset.
98
     * 
99
     * @param \ZBateson\MailMimeParser\MimePart $part
100
     * @param resource $handle
101
     */
102
    private function attachCharsetFilterToStream(MimePart $part, $handle)
103
    {
104
        $contentType = strtolower($part->getHeaderValue('Content-Type', 'text/plain'));
105
        if (strpos($contentType, 'text/') === 0) {
106
            stream_filter_append(
107
                $handle,
108
                'mailmimeparser-encode.' . $part->getHeaderParameter('Content-Type', 'charset')
109
            );
110
        }
111
    }
112
113
    /**
114
     * Creates a part stream handle for the start and end position of the
115
     * message stream, and attaches it to the passed MimePart.
116
     * 
117
     * @param MimePart $part
118
     * @param Message $message
119
     * @param int $start
120
     * @param int $end
121
     */
122
    public function attachPartStreamHandle(MimePart $part, Message $message, $start, $end)
123
    {
124
        $id = $message->getObjectId();
125
        if (empty($this->registeredHandles[$id])) {
126
            return null;
127
        }
128
        $handle = fopen('mmp-mime-message://' . $id . '?start=' .
129
            $start . '&end=' . $end, 'r');
130
        
131
        $this->attachEncodingFilterToStream($part, $handle);
132
        $this->attachCharsetFilterToStream($part, $handle);
133
        $this->registeredPartStreamHandles[$id] = $handle;
134
        $part->attachContentResourceHandle($handle);
135
    }
136
}
137