From 170b72ab78c4fd0275fb55d62099ce7e99ff4028 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 08 Oct 2009 14:18:04 -0400
Subject: [PATCH] - fix for skip_deleted

---
 program/include/rcube_imap.php |   56 +++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 96a4a65..9ca1167 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -485,7 +485,6 @@
    */
   private function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
     {
-    $a_mailbox_cache = FALSE;
     $mode = strtoupper($mode);
 
     if (empty($mailbox))
@@ -603,7 +602,8 @@
     if ($this->index_sort && $this->sort_field == 'date')
       {
         if ($this->skip_deleted) {
-          $msg_index = $this->_search_index($mailbox, 'ALL');
+          // @TODO: this could be cached
+	  $msg_index = $this->_search_index($mailbox, 'ALL UNDELETED');
           $max = max($msg_index);
           list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
           $msg_index = array_slice($msg_index, $begin, $end-$begin);
@@ -1226,6 +1226,18 @@
       else
         $this->struct_charset = $this->_structure_charset($structure);
 
+      /*
+        @TODO: here we can recognize malformed BODYSTRUCTURE and parse
+	the message in other way to create our own message structure.
+	Example of structure for malformed MIME message:
+	("text" "plain" ("charset" "us-ascii") NIL NIL "7bit" 2154 70 NIL NIL NIL)
+
+	if ($headers->ctype != 'text/plain'
+	  && !is_array($structure[0]) && $structure[0] == 'text' 
+	  && !is_array($structure[1]) && $structure[1] == 'plain') 
+	  { }
+      */
+
       $struct = &$this->_structure_part($structure);
       $struct->headers = get_object_vars($headers);
 
@@ -1543,7 +1555,7 @@
     // convert charset (if text or message part)
     if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') {
       // assume default if no charset specified
-      if (empty($o_part->charset))
+      if (empty($o_part->charset) || strtolower($o_part->charset) == 'us-ascii')
         $o_part->charset = $this->default_charset;
 
       $body = rcube_charset_convert($body, $o_part->charset);
@@ -2140,8 +2152,8 @@
    */
   function get_cache($key)
     {
-    // read cache
-    if (!isset($this->cache[$key]) && $this->caching_enabled)
+    // read cache (if it was not read before)
+    if (!count($this->cache) && $this->caching_enabled)
       {
       return $this->_read_cache_record($key);
       }
@@ -2218,7 +2230,8 @@
         {
 	$sql_key = preg_replace('/^IMAP\./', '', $sql_arr['cache_key']);
         $this->cache_keys[$sql_key] = $sql_arr['cache_id'];
-	$this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE;
+	if (!isset($this->cache[$sql_key]))
+	  $this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE;
         }
       }
 
@@ -2232,23 +2245,6 @@
     {
     if (!$this->db)
       return FALSE;
-
-    // check if we already have a cache entry for this key
-    if (!isset($this->cache_keys[$key]))
-      {
-      $sql_result = $this->db->query(
-        "SELECT cache_id
-         FROM ".get_table_name('cache')."
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $_SESSION['user_id'],
-        'IMAP.'.$key);
-                                     
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        $this->cache_keys[$key] = $sql_arr['cache_id'];
-      else
-        $this->cache_keys[$key] = FALSE;
-      }
 
     // update existing cache record
     if ($this->cache_keys[$key])
@@ -2272,6 +2268,18 @@
         $_SESSION['user_id'],
         'IMAP.'.$key,
         $data);
+
+      // get cache entry ID for this key
+      $sql_result = $this->db->query(
+        "SELECT cache_id
+         FROM ".get_table_name('cache')."
+         WHERE  user_id=?
+         AND    cache_key=?",
+        $_SESSION['user_id'],
+        'IMAP.'.$key);
+                                     
+        if ($sql_arr = $this->db->fetch_assoc($sql_result))
+          $this->cache_keys[$key] = $sql_arr['cache_id'];
       }
     }
 
@@ -2286,6 +2294,8 @@
        AND    cache_key=?",
       $_SESSION['user_id'],
       'IMAP.'.$key);
+      
+    unset($this->cache_keys[$key]);
     }
 
 

--
Gitblit v1.9.1