diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 3d04937fc..17ba91c03 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -113,7 +113,7 @@ class rcube_imap $this->conn = new rcube_imap_generic(); } - + /** * Connect to an IMAP server * @@ -182,7 +182,7 @@ class rcube_imap return false; } - + /** * Close IMAP connection * Usually done on script shutdown @@ -195,7 +195,7 @@ class rcube_imap $this->write_cache(); } - + /** * Close IMAP connection and re-connect * This is used to avoid some strange socket errors when talking to Courier IMAP @@ -233,7 +233,7 @@ class rcube_imap { return ($this->conn) ? $this->conn->error : ''; } - + /** * Set options to be used in rcube_imap_generic::connect() @@ -245,7 +245,7 @@ class rcube_imap $this->options = array_merge($this->options, (array)$opt); } - + /** * Set a root folder for the IMAP connection. * @@ -267,7 +267,7 @@ class rcube_imap $this->get_hierarchy_delimiter(); } - + /** * Set default message charset * @@ -281,7 +281,7 @@ class rcube_imap $this->default_charset = $cs; } - + /** * This list of folders will be listed above all other folders * @@ -299,7 +299,7 @@ class rcube_imap } } - + /** * Set internal mailbox reference. * @@ -321,7 +321,27 @@ class rcube_imap $this->_clear_messagecount($mailbox); } - + + /** + * Forces selection of a mailbox + * + * @param string $mailbox Mailbox/Folder name + * @access public + */ + function select_mailbox($mailbox) + { + $mailbox = $this->mod_mailbox($mailbox); + + $selected = $this->conn->select($mailbox); + + if ($selected && $this->mailbox != $mailbox) { + // clear messagecount cache for this mailbox + $this->_clear_messagecount($mailbox); + $this->mailbox = $mailbox; + } + } + + /** * Set internal list page * @@ -333,7 +353,7 @@ class rcube_imap $this->list_page = (int)$page; } - + /** * Set internal page size * @@ -345,7 +365,7 @@ class rcube_imap $this->page_size = (int)$size; } - + /** * Save a set of message ids for future message listing methods * @@ -372,7 +392,7 @@ class rcube_imap $this->search_sorted = $sorted; } - + /** * Return the saved search set as hash array * @return array Search set @@ -388,7 +408,7 @@ class rcube_imap ); } - + /** * Returns the currently used mailbox name * @@ -400,7 +420,7 @@ class rcube_imap return $this->conn->connected() ? $this->mod_mailbox($this->mailbox, 'out') : ''; } - + /** * Returns the IMAP server's capability * @@ -413,7 +433,7 @@ class rcube_imap return $this->conn->getCapability(strtoupper($cap)); } - + /** * Sets threading flag to the best supported THREAD algorithm * @@ -437,7 +457,7 @@ class rcube_imap return $this->threading; } - + /** * Checks the PERMANENTFLAGS capability of the current mailbox * and returns true if the given flag is supported by the IMAP server @@ -453,7 +473,7 @@ class rcube_imap return (in_array_nocase($imap_flag, $this->conn->data['PERMANENTFLAGS'])); } - + /** * Returns the delimiter that is used by the IMAP server for folder separation * @@ -471,7 +491,7 @@ class rcube_imap return $this->delimiter; } - + /** * Get message count for a specific mailbox * @@ -489,7 +509,7 @@ class rcube_imap return $this->_messagecount($mailbox, $mode, $force, $status); } - + /** * Private method for getting nr of messages * diff --git a/program/steps/mail/pagenav.inc b/program/steps/mail/pagenav.inc index b62520fab..e295114e1 100644 --- a/program/steps/mail/pagenav.inc +++ b/program/steps/mail/pagenav.inc @@ -20,7 +20,13 @@ */ $uid = get_input_value('_uid', RCUBE_INPUT_GET); -$cnt = $IMAP->messagecount(NULL, 'ALL'); // Only messages, no threads here + +// Select mailbox first, for better performance +$mbox_name = $IMAP->get_mailbox_name(); +$IMAP->select_mailbox($mbox_name); + +// Get messages count (only messages, no threads here) +$cnt = $IMAP->messagecount(NULL, 'ALL'); if ($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] != 'DESC' && empty($_REQUEST['_search']) && !$CONFIG['skip_deleted'] && !$IMAP->threading