Added feature #15998: Create a new API to send mails based on SwiftMailer to replace...
[Packages/TYPO3.CMS.git] / typo3 / contrib / swiftmailer / classes / Swift / Mime / SimpleHeaderSet.php
1 <?php
2
3 /*
4 * This file is part of SwiftMailer.
5 * (c) 2004-2009 Chris Corbyn
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11 //@require 'Swift/Mime/HeaderSet.php';
12 //@require 'Swift/Mime/HeaderFactory.php';
13
14 /**
15 * A collection of MIME headers.
16 *
17 * @package Swift
18 * @subpackage Mime
19 *
20 * @author Chris Corbyn
21 */
22 class Swift_Mime_SimpleHeaderSet implements Swift_Mime_HeaderSet
23 {
24
25 /** HeaderFactory */
26 private $_factory;
27
28 /** Collection of set Headers */
29 private $_headers = array();
30
31 /** Field ordering details */
32 private $_order = array();
33
34 /** List of fields which are required to be displayed */
35 private $_required = array();
36
37 /** The charset used by Headers */
38 private $_charset;
39
40 /**
41 * Create a new SimpleHeaderSet with the given $factory.
42 *
43 * @param Swift_Mime_HeaderFactory $factory
44 * @param string $charset
45 */
46 public function __construct(Swift_Mime_HeaderFactory $factory,
47 $charset = null)
48 {
49 $this->_factory = $factory;
50 if (isset($charset))
51 {
52 $this->setCharset($charset);
53 }
54 }
55
56 /**
57 * Set the charset used by these headers.
58 *
59 * @param string $charset
60 */
61 public function setCharset($charset)
62 {
63 $this->_charset = $charset;
64 $this->_factory->charsetChanged($charset);
65 $this->_notifyHeadersOfCharset($charset);
66 }
67
68 /**
69 * Add a new Mailbox Header with a list of $addresses.
70 *
71 * @param string $name
72 * @param array|string $addresses
73 */
74 public function addMailboxHeader($name, $addresses = null)
75 {
76 $this->_storeHeader($name,
77 $this->_factory->createMailboxHeader($name, $addresses));
78 }
79
80 /**
81 * Add a new Date header using $timestamp (UNIX time).
82 *
83 * @param string $name
84 * @param int $timestamp
85 */
86 public function addDateHeader($name, $timestamp = null)
87 {
88 $this->_storeHeader($name,
89 $this->_factory->createDateHeader($name, $timestamp));
90 }
91
92 /**
93 * Add a new basic text header with $name and $value.
94 *
95 * @param string $name
96 * @param string $value
97 */
98 public function addTextHeader($name, $value = null)
99 {
100 $this->_storeHeader($name,
101 $this->_factory->createTextHeader($name, $value));
102 }
103
104 /**
105 * Add a new ParameterizedHeader with $name, $value and $params.
106 *
107 * @param string $name
108 * @param string $value
109 * @param array $params
110 */
111 public function addParameterizedHeader($name, $value = null,
112 $params = array())
113 {
114 $this->_storeHeader($name,
115 $this->_factory->createParameterizedHeader($name, $value,
116 $params));
117 }
118
119 /**
120 * Add a new ID header for Message-ID or Content-ID.
121 *
122 * @param string $name
123 * @param string|array $ids
124 */
125 public function addIdHeader($name, $ids = null)
126 {
127 $this->_storeHeader($name, $this->_factory->createIdHeader($name, $ids));
128 }
129
130 /**
131 * Add a new Path header with an address (path) in it.
132 *
133 * @param string $name
134 * @param string $path
135 */
136 public function addPathHeader($name, $path = null)
137 {
138 $this->_storeHeader($name, $this->_factory->createPathHeader($name, $path));
139 }
140
141 /**
142 * Returns true if at least one header with the given $name exists.
143 *
144 * If multiple headers match, the actual one may be specified by $index.
145 *
146 * @param string $name
147 * @param int $index
148 *
149 * @return boolean
150 */
151 public function has($name, $index = 0)
152 {
153 $lowerName = strtolower($name);
154 return array_key_exists($lowerName, $this->_headers)
155 && array_key_exists($index, $this->_headers[$lowerName]);
156 }
157
158 /**
159 * Set a header in the HeaderSet.
160 *
161 * The header may be a previously fetched header via {@link get()} or it may
162 * be one that has been created separately.
163 *
164 * If $index is specified, the header will be inserted into the set at this
165 * offset.
166 *
167 * @param Swift_Mime_Header $header
168 * @param int $index
169 */
170 public function set(Swift_Mime_Header $header, $index = 0)
171 {
172 $this->_storeHeader($header->getFieldName(), $header, $index);
173 }
174
175 /**
176 * Get the header with the given $name.
177 *
178 * If multiple headers match, the actual one may be specified by $index.
179 * Returns NULL if none present.
180 *
181 * @param string $name
182 * @param int $index
183 *
184 * @return Swift_Mime_Header
185 */
186 public function get($name, $index = 0)
187 {
188 if ($this->has($name, $index))
189 {
190 $lowerName = strtolower($name);
191 return $this->_headers[$lowerName][$index];
192 }
193 }
194
195 /**
196 * Get all headers with the given $name.
197 *
198 * @param string $name
199 *
200 * @return array
201 */
202 public function getAll($name = null)
203 {
204 if (!isset($name))
205 {
206 $headers = array();
207 foreach ($this->_headers as $collection)
208 {
209 $headers = array_merge($headers, $collection);
210 }
211 return $headers;
212 }
213
214 $lowerName = strtolower($name);
215 if (!array_key_exists($lowerName, $this->_headers))
216 {
217 return array();
218 }
219 return $this->_headers[$lowerName];
220 }
221
222 /**
223 * Remove the header with the given $name if it's set.
224 *
225 * If multiple headers match, the actual one may be specified by $index.
226 *
227 * @param string $name
228 * @param int $index
229 */
230 public function remove($name, $index = 0)
231 {
232 $lowerName = strtolower($name);
233 unset($this->_headers[$lowerName][$index]);
234 }
235
236 /**
237 * Remove all headers with the given $name.
238 *
239 * @param string $name
240 */
241 public function removeAll($name)
242 {
243 $lowerName = strtolower($name);
244 unset($this->_headers[$lowerName]);
245 }
246
247 /**
248 * Create a new instance of this HeaderSet.
249 *
250 * @return Swift_Mime_HeaderSet
251 */
252 public function newInstance()
253 {
254 return new self($this->_factory);
255 }
256
257 /**
258 * Define a list of Header names as an array in the correct order.
259 *
260 * These Headers will be output in the given order where present.
261 *
262 * @param array $sequence
263 */
264 public function defineOrdering(array $sequence)
265 {
266 $this->_order = array_flip(array_map('strtolower', $sequence));
267 }
268
269 /**
270 * Set a list of header names which must always be displayed when set.
271 *
272 * Usually headers without a field value won't be output unless set here.
273 *
274 * @param array $names
275 */
276 public function setAlwaysDisplayed(array $names)
277 {
278 $this->_required = array_flip(array_map('strtolower', $names));
279 }
280
281 /**
282 * Notify this observer that the entity's charset has changed.
283 *
284 * @param string $charset
285 */
286 public function charsetChanged($charset)
287 {
288 $this->setCharset($charset);
289 }
290
291 /**
292 * Returns a string with a representation of all headers.
293 *
294 * @return string
295 */
296 public function toString()
297 {
298 $string = '';
299 $headers = $this->_headers;
300 if ($this->_canSort())
301 {
302 uksort($headers, array($this, '_sortHeaders'));
303 }
304 foreach ($headers as $collection)
305 {
306 foreach ($collection as $header)
307 {
308 if ($this->_isDisplayed($header) || $header->getFieldBody() != '')
309 {
310 $string .= $header->toString();
311 }
312 }
313 }
314 return $string;
315 }
316
317 /**
318 * Returns a string representation of this object.
319 *
320 * @return string
321 *
322 * @see toString()
323 */
324 public function __toString()
325 {
326 return $this->toString();
327 }
328
329 // -- Private methods
330
331 /** Save a Header to the internal collection */
332 private function _storeHeader($name, Swift_Mime_Header $header, $offset = null)
333 {
334 if (!isset($this->_headers[strtolower($name)]))
335 {
336 $this->_headers[strtolower($name)] = array();
337 }
338 if (!isset($offset))
339 {
340 $this->_headers[strtolower($name)][] = $header;
341 }
342 else
343 {
344 $this->_headers[strtolower($name)][$offset] = $header;
345 }
346 }
347
348 /** Test if the headers can be sorted */
349 private function _canSort()
350 {
351 return count($this->_order) > 0;
352 }
353
354 /** uksort() algorithm for Header ordering */
355 private function _sortHeaders($a, $b)
356 {
357 $lowerA = strtolower($a);
358 $lowerB = strtolower($b);
359 $aPos = array_key_exists($lowerA, $this->_order)
360 ? $this->_order[$lowerA]
361 : -1;
362 $bPos = array_key_exists($lowerB, $this->_order)
363 ? $this->_order[$lowerB]
364 : -1;
365
366 if ($aPos == -1)
367 {
368 return 1;
369 }
370 elseif ($bPos == -1)
371 {
372 return -1;
373 }
374
375 return ($aPos < $bPos) ? -1 : 1;
376 }
377
378 /** Test if the given Header is always displayed */
379 private function _isDisplayed(Swift_Mime_Header $header)
380 {
381 return array_key_exists(strtolower($header->getFieldName()), $this->_required);
382 }
383
384 /** Notify all Headers of the new charset */
385 private function _notifyHeadersOfCharset($charset)
386 {
387 foreach ($this->_headers as $headerGroup)
388 {
389 foreach ($headerGroup as $header)
390 {
391 $header->setCharset($charset);
392 }
393 }
394 }
395
396 }