From 6204390af16bcf50f82da61a1aefc2ad0c0adf94 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Mon, 01 May 2006 10:47:27 -0400 Subject: [PATCH] Applied patch for requesting receipts by Salvatore Ansani --- program/include/rcube_imap.inc | 214 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 180 insertions(+), 34 deletions(-) diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc index 143b17b..c818fa0 100644 --- a/program/include/rcube_imap.inc +++ b/program/include/rcube_imap.inc @@ -98,7 +98,7 @@ */ function connect($host, $user, $pass, $port=143, $use_ssl=FALSE) { - global $ICL_SSL, $ICL_PORT; + global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE; // check for Open-SSL support in PHP build if ($use_ssl && in_array('openssl', get_loaded_extensions())) @@ -111,6 +111,8 @@ } $ICL_PORT = $port; + $IMAP_USE_INTERNAL_DATE = false; + $this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check')); $this->host = $host; $this->user = $user; @@ -475,7 +477,7 @@ /** - * Private method for listing message header + * Private method for listing message headers * * @access private * @see rcube_imap::list_headers @@ -493,12 +495,15 @@ $max = $this->_messagecount($mailbox); $start_msg = ($this->list_page-1) * $this->page_size; + list($begin, $end) = $this->_get_message_range($max, $page); + + /* if ($page=='all') { $begin = 0; $end = $max; } - else if ($this->sort_order=='DESC') + else if (!$this->get_capability('sort') && $this->sort_order=='DESC') { $begin = $max - $this->page_size - $start_msg; $end = $max - $start_msg; @@ -512,7 +517,8 @@ if ($begin < 0) $begin = 0; if ($end < 0) $end = $max; if ($end > $max) $end = $max; - + */ + //console("fetch headers $start_msg to ".($start_msg+$this->page_size)." (msg $begin to $end)"); $headers_sorted = FALSE; @@ -536,12 +542,7 @@ $msgs = $msg_index[$begin]; for ($i=$begin+1; $i < $end; $i++) - { - //if ($this->sort_order == 'DESC') - // $msgs = $msg_index[$i].','.$msgs; - //else - $msgs = $msgs.','.$msg_index[$i]; - } + $msgs = $msgs.','.$msg_index[$i]; $sorted = TRUE; } @@ -580,19 +581,119 @@ // if not already sorted - if (!$headers_sorted) - $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order); +// if (!$headers_sorted) +// $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order); + + + if (!$headers_sorted && $this->sort_order == 'DESC') + $a_msg_headers = array_reverse($a_msg_headers); + return array_values($a_msg_headers); } + + /** + * Public method for listing a specific set of headers + * convert mailbox name with root dir first + * + * @param string Mailbox/folder name + * @param array List of message ids to list + * @param number Current page to list + * @param string Header field to sort by + * @param string Sort order [ASC|DESC] + * @return array Indexed array with message header objects + * @access public + */ + function list_header_set($mbox='', $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL) + { + $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; + return $this->_list_header_set($mailbox, $msgs, $page, $sort_field, $sort_order); + } + + + /** + * Private method for listing a set of message headers + * + * @access private + * @see rcube_imap::list_header_set + */ + function _list_header_set($mailbox, $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL) + { + // also accept a comma-separated list of message ids + if (is_string($msgs)) + $msgs = split(',', $msgs); + + if (!strlen($mailbox) || empty($msgs)) + return array(); + + if ($sort_field!=NULL) + $this->sort_field = $sort_field; + if ($sort_order!=NULL) + $this->sort_order = strtoupper($sort_order); + + $max = count($msgs); + $start_msg = ($this->list_page-1) * $this->page_size; + + // fetch reuested headers from server + $a_msg_headers = array(); + $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL); + + // return empty array if no messages found + if (!is_array($a_msg_headers) || empty($a_msg_headers)) + return array(); + + // if not already sorted + $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order); + + // only return the requested part of the set + return array_slice(array_values($a_msg_headers), $start_msg, min($max-$start_msg, $this->page_size)); + } + + + /** + * Helper function to get first and last index of the requested set + * + * @param number message count + * @param mixed page number to show, or string 'all' + * @return array array with two values: first index, last index + * @access private + */ + function _get_message_range($max, $page) + { + $start_msg = ($this->list_page-1) * $this->page_size; + + if ($page=='all') + { + $begin = 0; + $end = $max; + } + else if ($this->sort_order=='DESC') + { + $begin = $max - $this->page_size - $start_msg; + $end = $max - $start_msg; + } + else + { + $begin = $start_msg; + $end = $start_msg + $this->page_size; + } + + if ($begin < 0) $begin = 0; + if ($end < 0) $end = $max; + if ($end > $max) $end = $max; + + return array($begin, $end); + } + + /** * Fetches message headers * Used for loop * * @param string Mailbox name - * @param string Message indey to fetch + * @param string Message index to fetch * @param array Reference to message headers array * @param array Array with cache index * @return number Number of deleted messages @@ -602,7 +703,7 @@ { // cache is incomplete $cache_index = $this->get_message_cache_index($cache_key); - + // fetch reuested headers from server $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs); $deleted_count = 0; @@ -632,8 +733,7 @@ return $deleted_count; } - - + // return sorted array of message UIDs function message_index($mbox='', $sort_field=NULL, $sort_order=NULL) { @@ -663,17 +763,13 @@ // fetch complete message index $msg_count = $this->_messagecount($mailbox); - if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field))) + if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, '', TRUE))) { - $a_uids = iil_C_FetchUIDs($this->conn, $mailbox); - if ($this->sort_order == 'DESC') $a_index = array_reverse($a_index); - $i = 0; - $this->cache[$key] = array(); - foreach ($a_index as $index => $value) - $this->cache[$key][$i++] = $a_uids[$value]; + $this->cache[$key] = $a_index; + } else { @@ -746,16 +842,44 @@ } - function search($mbox='', $criteria='ALL') + /** + * Invoke search request to IMAP server + * + * @param string mailbox name to search in + * @param string search criteria (ALL, TO, FROM, SUBJECT, etc) + * @param string search string + * @return array search results as list of message ids + * @access public + */ + function search($mbox='', $criteria='ALL', $str=NULL) { $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; - return $this->_search_index($mailbox, $criteria); - } - - + if ($str && $criteria) + { + $criteria .= " \"$str\""; + return $this->_search_index($mailbox, $criteria); + } + else + return $this->_search_index($mailbox, $criteria); + } + + + /** + * Private search method + * + * @return array search results as list of message ids + * @access private + * @see rcube_imap::search() + */ function _search_index($mailbox, $criteria='ALL') { $a_messages = iil_C_Search($this->conn, $mailbox, $criteria); + + // clean message list (there might be some empty entries) + foreach ($a_messages as $i => $val) + if (empty($val)) + unset($a_messages[$i]); + return $a_messages; } @@ -1070,10 +1194,11 @@ if ($this->get_capability('QUOTA')) { $result = iil_C_GetQuota($this->conn); - return sprintf("%.2fMB / %.2fMB (%.0f%%)", $result["used"] / 1000.0, $result["total"] / 1000.0, $result["percent"]); + if ($result["total"]) + return sprintf("%.2fMB / %.2fMB (%.0f%%)", $result["used"] / 1000.0, $result["total"] / 1000.0, $result["percent"]); } - else - return 'unknown'; + + return FALSE; } @@ -1354,14 +1479,14 @@ $header = iil_C_FetchHeader($this->conn, $mailbox, "$msg_count"); $cache_uid = array_pop($cache_index); - // uids of highes message matches -> cache seems OK + // uids of highest message matches -> cache seems OK if ($cache_uid == $header->uid) return 1; // cache is dirty return -1; } - // if cache count differs less that 10% report as dirty + // if cache count differs less than 10% report as dirty else if (abs($msg_count - $cache_count) < $msg_count/10) return -1; else @@ -1444,6 +1569,10 @@ { static $sa_message_index = array(); + // empty key -> empty array + if (empty($key)) + return array(); + if (!empty($sa_message_index[$key]) && !$force) return $sa_message_index[$key]; @@ -1466,7 +1595,7 @@ function add_message_cache($key, $index, $headers) { - if (!is_object($headers) || empty($headers->uid)) + if (!$key || !is_object($headers) || empty($headers->uid)) return; $this->db->query( @@ -1706,6 +1835,15 @@ return array_merge($a_defaults, $a_out); } + function get_id($uid) + { + return $this->_uid2id($uid); + } + + function get_uid($id) + { + return $this->_id2uid($id); + } function _uid2id($uid, $mbox=NULL) { @@ -1718,6 +1856,14 @@ return $this->uid_id_map[$mbox][$uid]; } + function _id2uid($id, $mbox=NULL) + { + if (!$mbox) + $mbox = $this->mailbox; + + return iil_C_ID2UID($this->conn, $mbox, $id); + } + // parse string or array of server capabilities and put them in internal array function _parse_capability($caps) -- Gitblit v1.9.1