From 7c9d922b96f9a88b350d6e07f5bde84ccc40f9b0 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 02 Mar 2010 16:27:53 -0500
Subject: [PATCH] New recent check based on UIDs

---
 program/include/rcube_imap.php |   45 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index fdf524d..c9d2454 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -56,7 +56,6 @@
   var $default_charset = 'ISO-8859-1';
   var $struct_charset = NULL;
   var $default_folders = array('INBOX');
-  var $default_folders_lc = array('inbox');
   var $fetch_add_headers = '';
   var $cache = array();
   var $cache_keys = array();  
@@ -242,15 +241,10 @@
     if (is_array($arr))
       {
       $this->default_folders = $arr;
-      $this->default_folders_lc = array();
 
       // add inbox if not included
       if (!in_array_nocase('INBOX', $this->default_folders))
         array_unshift($this->default_folders, 'INBOX');
-
-      // create a second list with lower cased names
-      foreach ($this->default_folders as $mbox)
-        $this->default_folders_lc[] = strtolower($mbox);
       }
     }
 
@@ -501,6 +495,9 @@
     if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode]))
       return $a_mailbox_cache[$mailbox][$mode];
 
+    if (!is_array($a_mailbox_cache[$mailbox]))
+      $a_mailbox_cache[$mailbox] = array();
+
     // RECENT count is fetched a bit different
     if ($mode == 'RECENT')
        $count = iil_C_CheckForRecent($this->conn, $mailbox);
@@ -519,17 +516,15 @@
       $index = $this->_search_index($mailbox, $search_str);
       $count = is_array($index) ? count($index) : 0;
       }
-    else
-      {
+    else {
       if ($mode == 'UNSEEN')
         $count = iil_C_CountUnseen($this->conn, $mailbox);
-      else
+      else {
         $count = iil_C_CountMessages($this->conn, $mailbox);
+        $_SESSION['maxuid'][$mailbox] = $count ? $this->_id2uid($count) : 0;
       }
+    }
 
-    if (!is_array($a_mailbox_cache[$mailbox]))
-      $a_mailbox_cache[$mailbox] = array();
-      
     $a_mailbox_cache[$mailbox][$mode] = (int)$count;
 
     // write back to cache
@@ -869,7 +864,31 @@
 
     return count($a_msg_headers);
     }
+  
+  /**
+   * Fetches IDS of pseudo recent messages.
+   *
+   * We compare the maximum UID to determine the number of
+   * new messages because the RECENT flag is not reliable.
+   *
+   * @param string  Mailbox/folder name
+   * @return array  List of recent message UIDs
+   */
+  function recent_uids($mbox_name = null, $nofetch = false)
+  {
+    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+    $old_maxuid = intval($_SESSION['maxuid'][$mailbox]);
     
+    // refresh message count -> will update $_SESSION['maxuid'][$mailbox]
+    $this->messagecount($mbox_name, 'ALL', true);
+    
+    if ($_SESSION['maxuid'][$mailbox] > $old_maxuid) {
+      $maxuid = max(1, $old_maxuid+1);
+      return array_values((array)iil_C_FetchHeaderIndex($this->conn, $mailbox, "$maxuid:*", 'UID', $this->skip_deleted, true));
+    }
+    
+    return array();
+  }
   
   /**
    * Return sorted array of message IDs (not UIDs)
@@ -2947,7 +2966,7 @@
       if ($folder{0}=='.')
         continue;
 
-      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
+      if (($p = array_search($folder, $this->default_folders)) !== false && !$a_defaults[$p])
         $a_defaults[$p] = $folder;
       else
         $folders[$folder] = mb_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP'));

--
Gitblit v1.9.1