123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- <?php
-
- /**
- +-----------------------------------------------------------------------+
- | This file is part of the Roundcube Webmail client |
- | Copyright (C) 2005-2012, The Roundcube Dev Team |
- | Copyright (C) 2011-2012, Kolab Systems AG |
- | |
- | Licensed under the GNU General Public License version 3 or |
- | any later version with exceptions for skins & plugins. |
- | See the README file for a full license statement. |
- | |
- | PURPOSE: |
- | E-mail message headers representation |
- +-----------------------------------------------------------------------+
- | Author: Aleksander Machniak <alec@alec.pl> |
- +-----------------------------------------------------------------------+
- */
-
- /**
- * Struct representing an e-mail message header
- *
- * @package Framework
- * @subpackage Storage
- * @author Aleksander Machniak <alec@alec.pl>
- */
- class rcube_message_header
- {
- /**
- * Message sequence number
- *
- * @var int
- */
- public $id;
-
- /**
- * Message unique identifier
- *
- * @var int
- */
- public $uid;
-
- /**
- * Message subject
- *
- * @var string
- */
- public $subject;
-
- /**
- * Message sender (From)
- *
- * @var string
- */
- public $from;
-
- /**
- * Message recipient (To)
- *
- * @var string
- */
- public $to;
-
- /**
- * Message additional recipients (Cc)
- *
- * @var string
- */
- public $cc;
-
- /**
- * Message Reply-To header
- *
- * @var string
- */
- public $replyto;
-
- /**
- * Message In-Reply-To header
- *
- * @var string
- */
- public $in_reply_to;
-
- /**
- * Message date (Date)
- *
- * @var string
- */
- public $date;
-
- /**
- * Message identifier (Message-ID)
- *
- * @var string
- */
- public $messageID;
-
- /**
- * Message size
- *
- * @var int
- */
- public $size;
-
- /**
- * Message encoding
- *
- * @var string
- */
- public $encoding;
-
- /**
- * Message charset
- *
- * @var string
- */
- public $charset;
-
- /**
- * Message Content-type
- *
- * @var string
- */
- public $ctype;
-
- /**
- * Message timestamp (based on message date)
- *
- * @var int
- */
- public $timestamp;
-
- /**
- * IMAP bodystructure string
- *
- * @var string
- */
- public $bodystructure;
-
- /**
- * IMAP internal date
- *
- * @var string
- */
- public $internaldate;
-
- /**
- * Message References header
- *
- * @var string
- */
- public $references;
-
- /**
- * Message priority (X-Priority)
- *
- * @var int
- */
- public $priority;
-
- /**
- * Message receipt recipient
- *
- * @var string
- */
- public $mdn_to;
-
- /**
- * IMAP folder this message is stored in
- *
- * @var string
- */
- public $folder;
-
- /**
- * Other message headers
- *
- * @var array
- */
- public $others = array();
-
- /**
- * Message flags
- *
- * @var array
- */
- public $flags = array();
-
- // map header to rcube_message_header object property
- private $obj_headers = array(
- 'date' => 'date',
- 'from' => 'from',
- 'to' => 'to',
- 'subject' => 'subject',
- 'reply-to' => 'replyto',
- 'cc' => 'cc',
- 'bcc' => 'bcc',
- 'mbox' => 'folder',
- 'folder' => 'folder',
- 'content-transfer-encoding' => 'encoding',
- 'in-reply-to' => 'in_reply_to',
- 'content-type' => 'ctype',
- 'charset' => 'charset',
- 'references' => 'references',
- 'return-receipt-to' => 'mdn_to',
- 'disposition-notification-to' => 'mdn_to',
- 'x-confirm-reading-to' => 'mdn_to',
- 'message-id' => 'messageID',
- 'x-priority' => 'priority',
- );
-
- /**
- * Returns header value
- */
- public function get($name, $decode = true)
- {
- $name = strtolower($name);
-
- if (isset($this->obj_headers[$name])) {
- $value = $this->{$this->obj_headers[$name]};
- }
- else {
- $value = $this->others[$name];
- }
-
- if ($decode) {
- if (is_array($value)) {
- foreach ($value as $key => $val) {
- $val = rcube_mime::decode_header($val, $this->charset);
- $value[$key] = rcube_charset::clean($val);
- }
- }
- else {
- $value = rcube_mime::decode_header($value, $this->charset);
- $value = rcube_charset::clean($value);
- }
- }
-
- return $value;
- }
-
- /**
- * Sets header value
- */
- public function set($name, $value)
- {
- $name = strtolower($name);
-
- if (isset($this->obj_headers[$name])) {
- $this->{$this->obj_headers[$name]} = $value;
- }
- else {
- $this->others[$name] = $value;
- }
- }
-
-
- /**
- * Factory method to instantiate headers from a data array
- *
- * @param array Hash array with header values
- * @return object rcube_message_header instance filled with headers values
- */
- public static function from_array($arr)
- {
- $obj = new rcube_message_header;
- foreach ($arr as $k => $v)
- $obj->set($k, $v);
-
- return $obj;
- }
- }
-
-
- /**
- * Class for sorting an array of rcube_message_header objects in a predetermined order.
- *
- * @package Framework
- * @subpackage Storage
- * @author Aleksander Machniak <alec@alec.pl>
- */
- class rcube_message_header_sorter
- {
- private $uids = array();
-
-
- /**
- * Set the predetermined sort order.
- *
- * @param array $index Numerically indexed array of IMAP UIDs
- */
- function set_index($index)
- {
- $index = array_flip($index);
-
- $this->uids = $index;
- }
-
- /**
- * Sort the array of header objects
- *
- * @param array $headers Array of rcube_message_header objects indexed by UID
- */
- function sort_headers(&$headers)
- {
- uksort($headers, array($this, "compare_uids"));
- }
-
- /**
- * Sort method called by uksort()
- *
- * @param int $a Array key (UID)
- * @param int $b Array key (UID)
- */
- function compare_uids($a, $b)
- {
- // then find each sequence number in my ordered list
- $posa = isset($this->uids[$a]) ? intval($this->uids[$a]) : -1;
- $posb = isset($this->uids[$b]) ? intval($this->uids[$b]) : -1;
-
- // return the relative position as the comparison value
- return $posa - $posb;
- }
- }
|