diff options
Diffstat (limited to 'program/include/rcube_imap.php')
-rw-r--r-- | program/include/rcube_imap.php | 88 |
1 files changed, 52 insertions, 36 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 332d53029..57a66751c 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -682,17 +682,19 @@ class rcube_imap $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key); } // use SORT command - else if ($this->get_capability('sort') && ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : ''))) + else if ($this->get_capability('sort')) { - list($begin, $end) = $this->_get_message_range(count($msg_index), $page); - $max = max($msg_index); - $msg_index = array_slice($msg_index, $begin, $end-$begin); + if ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')) { + list($begin, $end) = $this->_get_message_range(count($msg_index), $page); + $max = max($msg_index); + $msg_index = array_slice($msg_index, $begin, $end-$begin); - if ($slice) - $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice); + if ($slice) + $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice); - // fetch reqested headers from server - $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key); + // fetch reqested headers from server + $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key); + } } // fetch specified header for all messages and sort else if ($a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted)) @@ -773,7 +775,7 @@ class rcube_imap // get all threads list ($thread_tree, $msg_depth, $has_children) = iil_C_Thread($this->conn, $mailbox, $this->threading, $this->skip_deleted ? 'UNDELETED' : ''); - + // add to internal (fast) cache $this->icache['threads'] = array(); $this->icache['threads']['tree'] = $thread_tree; @@ -1082,25 +1084,25 @@ class rcube_imap // fetch reqested headers from server $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs, false, false, $this->fetch_add_headers); - if (!empty($a_header_index)) - { - // cache is incomplete - $cache_index = $this->get_message_cache_index($cache_key); - - foreach ($a_header_index as $i => $headers) { - if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid) { - // prevent index duplicates - if ($cache_index[$headers->id]) { - $this->remove_message_cache($cache_key, $headers->id, true); - unset($cache_index[$headers->id]); + if (empty($a_header_index)) + return 0; + + // cache is incomplete + $cache_index = $this->get_message_cache_index($cache_key); + + foreach ($a_header_index as $i => $headers) { + if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid) { + // prevent index duplicates + if ($cache_index[$headers->id]) { + $this->remove_message_cache($cache_key, $headers->id, true); + unset($cache_index[$headers->id]); } - // add message to cache - $this->add_message_cache($cache_key, $headers->id, $headers, NULL, - !in_array($headers->uid, $cache_index)); + // add message to cache + $this->add_message_cache($cache_key, $headers->id, $headers, NULL, + !in_array($headers->uid, $cache_index)); } - $a_msg_headers[$headers->uid] = $headers; - } + $a_msg_headers[$headers->uid] = $headers; } return count($a_msg_headers); @@ -1223,17 +1225,16 @@ class rcube_imap $this->cache[$key] = $a_index; } // fetch complete message index - else if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : ''))) + else if ($this->get_capability('sort')) { - if ($this->sort_order == 'DESC') - $a_index = array_reverse($a_index); - - $this->cache[$key] = $a_index; + if ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')) { + if ($this->sort_order == 'DESC') + $a_index = array_reverse($a_index); + + $this->cache[$key] = $a_index; + } } - else - { - $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted); - + else if ($a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted)) { if ($this->sort_order=="ASC") asort($a_index); else if ($this->sort_order=="DESC") @@ -1461,6 +1462,9 @@ class rcube_imap else if ($sort_field && $this->get_capability('sort')) { $charset = $charset ? $charset : $this->default_charset; $a_messages = iil_C_Sort($this->conn, $mailbox, $sort_field, $criteria, FALSE, $charset); + + if (!$a_messages) + return array(); } else { if ($orig_criteria == 'ALL') { @@ -1469,7 +1473,10 @@ class rcube_imap } else { $a_messages = iil_C_Search($this->conn, $mailbox, ($charset ? "CHARSET $charset " : '') . $criteria); - + + if (!$a_messages) + return array(); + // I didn't found that SEARCH always returns sorted IDs if (!$this->sort_field) sort($a_messages); @@ -1500,7 +1507,7 @@ class rcube_imap // THREAD=REFS: sorting by the most recent date in each thread // default sorting if (!$this->sort_field || ($this->sort_field == 'date' && $this->threading == 'REFS')) { - return array_keys($thread_tree); + return array_keys((array)$thread_tree); } // here we'll implement REFS sorting, for performance reason else { // ($sort_field == 'date' && $this->threading != 'REFS') @@ -1508,11 +1515,20 @@ class rcube_imap if ($this->get_capability('sort')) { $a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, !empty($ids) ? $ids : ($this->skip_deleted ? 'UNDELETED' : '')); + + // return unsorted tree if we've got no index data + if (!$a_index) + return array_keys((array)$thread_tree); } else { // fetch specified headers for all messages and sort them $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, !empty($ids) ? $ids : "1:*", $this->sort_field, $this->skip_deleted); + + // return unsorted tree if we've got no index data + if (!$a_index) + return array_keys((array)$thread_tree); + asort($a_index); // ASC $a_index = array_values($a_index); } |