Changeset 3306 in subversion


Ignore:
Timestamp:
Mar 2, 2010 4:27:53 PM (3 years ago)
Author:
thomasb
Message:

New recent check based on UIDs

Location:
trunk/roundcubemail/program
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/program/include/rcube_imap.php

    r3304 r3306  
    496496      return $a_mailbox_cache[$mailbox][$mode]; 
    497497 
     498    if (!is_array($a_mailbox_cache[$mailbox])) 
     499      $a_mailbox_cache[$mailbox] = array(); 
     500 
    498501    // RECENT count is fetched a bit different 
    499502    if ($mode == 'RECENT') 
     
    514517      $count = is_array($index) ? count($index) : 0; 
    515518      } 
    516     else 
    517       { 
     519    else { 
    518520      if ($mode == 'UNSEEN') 
    519521        $count = iil_C_CountUnseen($this->conn, $mailbox); 
    520       else 
     522      else { 
    521523        $count = iil_C_CountMessages($this->conn, $mailbox); 
    522       } 
    523  
    524     if (!is_array($a_mailbox_cache[$mailbox])) 
    525       $a_mailbox_cache[$mailbox] = array(); 
    526        
     524        $_SESSION['maxuid'][$mailbox] = $count ? $this->_id2uid($count) : 0; 
     525      } 
     526    } 
     527 
    527528    $a_mailbox_cache[$mailbox][$mode] = (int)$count; 
    528529 
     
    864865    return count($a_msg_headers); 
    865866    } 
    866      
     867   
     868  /** 
     869   * Fetches IDS of pseudo recent messages. 
     870   * 
     871   * We compare the maximum UID to determine the number of 
     872   * new messages because the RECENT flag is not reliable. 
     873   * 
     874   * @param string  Mailbox/folder name 
     875   * @return array  List of recent message UIDs 
     876   */ 
     877  function recent_uids($mbox_name = null, $nofetch = false) 
     878  { 
     879    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox; 
     880    $old_maxuid = intval($_SESSION['maxuid'][$mailbox]); 
     881     
     882    // refresh message count -> will update $_SESSION['maxuid'][$mailbox] 
     883    $this->messagecount($mbox_name, 'ALL', true); 
     884     
     885    if ($_SESSION['maxuid'][$mailbox] > $old_maxuid) { 
     886      $maxuid = max(1, $old_maxuid+1); 
     887      return array_values((array)iil_C_FetchHeaderIndex($this->conn, $mailbox, "$maxuid:*", 'UID', $this->skip_deleted, true)); 
     888    } 
     889     
     890    return array(); 
     891  } 
    867892   
    868893  /** 
  • trunk/roundcubemail/program/lib/imap.inc

    r3261 r3306  
    916916} 
    917917 
    918 function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true) { 
     918function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true, $uidfetch=false) { 
    919919 
    920920        list($from_idx, $to_idx) = explode(':', $message_set); 
     
    950950        // build FETCH command string 
    951951        $key     = 'fhi0'; 
     952        $cmd     = $uidfetch ? 'UID FETCH' : 'FETCH'; 
    952953        $deleted = $skip_deleted ? ' FLAGS' : ''; 
    953954 
    954955        if ($mode == 1 && $index_field == 'DATE') 
    955                 $request = " FETCH $message_set (INTERNALDATE BODY.PEEK[HEADER.FIELDS (DATE)]$deleted)"; 
     956                $request = " $cmd $message_set (INTERNALDATE BODY.PEEK[HEADER.FIELDS (DATE)]$deleted)"; 
    956957        else if ($mode == 1) 
    957                 $request = " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)"; 
     958                $request = " $cmd $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)"; 
    958959        else if ($mode == 2) { 
    959960                if ($index_field == 'SIZE') 
    960                         $request = " FETCH $message_set (RFC822.SIZE$deleted)"; 
     961                        $request = " $cmd $message_set (RFC822.SIZE$deleted)"; 
    961962                else 
    962                         $request = " FETCH $message_set ($index_field$deleted)"; 
     963                        $request = " $cmd $message_set ($index_field$deleted)"; 
    963964        } else if ($mode == 3) 
    964                 $request = " FETCH $message_set (FLAGS)"; 
     965                $request = " $cmd $message_set (FLAGS)"; 
    965966        else // 4 
    966                 $request = " FETCH $message_set (INTERNALDATE$deleted)"; 
     967                $request = " $cmd $message_set (INTERNALDATE$deleted)"; 
    967968 
    968969        $request = $key . $request; 
  • trunk/roundcubemail/program/steps/mail/check_recent.inc

    r3299 r3306  
    66 |                                                                       | 
    77 | This file is part of the RoundCube Webmail client                     | 
    8  | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 | 
     8 | Copyright (C) 2005-2010, RoundCube Dev. - Switzerland                 | 
    99 | Licensed under the GNU GPL                                            | 
    1010 |                                                                       | 
     
    2121 
    2222$a_mailboxes = $IMAP->list_mailboxes(); 
    23 $check_all = (bool)$RCMAIL->config->get('check_all_folders'); 
    24  
    25 // check if unread count of INBOX changed and refresh message list if so 
    26 if (!empty($_GET['_refresh'])) { 
    27   $unread_count = $IMAP->messagecount('INBOX', 'UNSEEN', TRUE); 
    28   if ($unread_count > $_SESSION['unseen_count']['INBOX']) { 
    29     $OUTPUT->command('set_unread_count', 'INBOX', $unread_count, true); 
    30     $OUTPUT->command('list_mailbox', 'INBOX', 1);  // let the client switch to INBOX and get the message list 
    31     $OUTPUT->send(); 
    32   } 
    33 } 
     23$check_all = !empty($_GET['_refresh']) || (bool)$RCMAIL->config->get('check_all_folders'); 
    3424 
    3525// check recent/unseen counts for all mailboxes 
    3626foreach ($a_mailboxes as $mbox_name) { 
    3727  if ($mbox_name == $IMAP->get_mailbox_name()) { 
    38     if ($recent_count = $IMAP->messagecount(NULL, 'RECENT', TRUE)) { 
     28    if ($recents = $IMAP->recent_uids($mbox_name)) { 
    3929      // refresh saved search set 
    4030      if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && isset($_SESSION['search'][$search_request])) { 
    4131        $_SESSION['search'][$search_request] = $IMAP->refresh_search(); 
    42         $all_count = $IMAP->messagecount(); 
    43       } else { 
    44         $all_count = $IMAP->messagecount(NULL, 'ALL', TRUE); 
    4532      } 
     33       
     34      // get overall message count; allow caching because rcube_imap::recent_uids() did a refresh 
     35      $all_count = $IMAP->messagecount(); 
    4636       
    4737      $unread_count = $IMAP->messagecount(NULL, 'UNSEEN', TRUE); 
     
    5444      $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($all_count)); 
    5545 
    56       if (rcmail::get_instance()->config->get('focus_on_new_message',true)) 
     46      if ($RCMAIL->config->get('focus_on_new_message',true)) 
    5747        $OUTPUT->command('new_message_focus'); 
    5848 
     
    6151 
    6252      // trigger plugin hook 
    63       $RCMAIL->plugins->exec_hook('new_messages', array('mailbox' => $mbox_name, 'count' => $unread_count)); 
     53      $RCMAIL->plugins->exec_hook('new_messages', array('mailbox' => $mbox_name, 'count' => count($recents))); 
    6454 
    6555      // "No-list" mode, don't get messages 
     
    6858 
    6959      // use SEARCH/SORT to find recent messages 
    70       $search_str = 'RECENT'; 
     60      $search_str = 'UID '.min($recents).':'.max($recents); 
    7161      if ($search_request) 
    7262        $search_str .= ' '.$IMAP->search_string; 
    7363 
    74       $result = $IMAP->search($mbox_name, $search_str, NULL, 'date'); 
    75  
    76       if ($result) { 
    77         // get the headers 
     64      if ($IMAP->search($mbox_name, $search_str, NULL, 'date')) { 
     65        // get the headers and add them to the list 
    7866        $result_h = $IMAP->list_headers($mbox_name, 1, 'date', 'DESC'); 
    79         // add to the list 
    8067        rcmail_js_message_list($result_h, true, false); 
    8168      } 
Note: See TracChangeset for help on using the changeset viewer.