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 |   84 +++++++++++++++++++++++++++--------------
 1 files changed, 55 insertions(+), 29 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 9137ada..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)
@@ -1699,17 +1718,27 @@
   /**
    * Append a mail message (source) to a specific mailbox
    *
-   * @param string Target mailbox
-   * @param string Message source
+   * @param string   Target mailbox
+   * @param string   The message source string or filename
+   * @param string   Headers string if $message contains only the body
+   * @param boolean  True if $message is a filename
+   *
    * @return boolean True on success, False on error
    */
-  function save_message($mbox_name, &$message)
+  function save_message($mbox_name, &$message, $headers='', $is_file=false)
     {
     $mailbox = $this->mod_mailbox($mbox_name);
 
     // make sure mailbox exists
-    if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes()))
-      $saved = iil_C_Append($this->conn, $mailbox, $message);
+    if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes())) {
+      if ($is_file) {
+        $separator = rcmail::get_instance()->config->header_delimiter();
+        $saved = iil_C_AppendFromFile($this->conn, $mailbox, $message,
+          $headers, $separator.$separator);
+        }
+      else
+        $saved = iil_C_Append($this->conn, $mailbox, $message);
+      }
 
     if ($saved)
       {
@@ -2146,9 +2175,9 @@
     foreach ($this->default_folders as $folder)
       {
       $abs_name = $this->mod_mailbox($folder);
-      if (!in_array_nocase($abs_name, $a_folders))
+      if (!in_array($abs_name, $a_folders))
         $this->create_mailbox($folder, TRUE);
-      else if (!in_array_nocase($abs_name, $a_subscribed))
+      else if (!in_array($abs_name, $a_subscribed))
         $this->subscribe($folder);
       }
     }
@@ -2937,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'));
@@ -3001,15 +3030,12 @@
     {
     if (!$mbox_name)
       $mbox_name = $this->mailbox;
-      
-    $index = array_flip((array)$this->uid_id_map[$mbox_name]);
-    if (isset($index[$id]))
-      $uid = $index[$id];
-    else
-      {
-      $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
-      $this->uid_id_map[$mbox_name][$uid] = $id;
-      }
+
+    if ($uid = array_search($id, (array)$this->uid_id_map[$mbox_name]))
+      return $uid;
+
+    $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
+    $this->uid_id_map[$mbox_name][$uid] = $id;
     
     return $uid;
     }

--
Gitblit v1.9.1