From f4f4354fea8095d0b328707abb83605bbb89d3fb Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 28 Sep 2011 10:41:04 -0400
Subject: [PATCH] This timezone stuff really is a hard one...

---
 program/include/rcube_imap_cache.php |   29 ++++++++++++++++++++++++-----
 1 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php
index d304386..b51bc6d 100644
--- a/program/include/rcube_imap_cache.php
+++ b/program/include/rcube_imap_cache.php
@@ -813,9 +813,16 @@
         }
 
         // Folder is empty but cache isn't
-        if (empty($mbox_data['EXISTS']) && (!empty($index['seq']) || !empty($index['tree']))) {
-            $this->clear($mailbox);
-            $exists = false;
+        if (empty($mbox_data['EXISTS'])) {
+            if (!empty($index['seq']) || !empty($index['tree'])) {
+                $this->clear($mailbox);
+                $exists = false;
+                return false;
+            }
+        }
+        // Folder is not empty but cache is
+        else if (empty($index['seq']) && empty($index['tree'])) {
+            unset($this->icache[$mailbox][$is_thread ? 'thread' : 'index']);
             return false;
         }
 
@@ -846,7 +853,7 @@
         // @TODO: find better validity check for threaded index
         if ($is_thread) {
             // check messages number...
-            if ($mbox_data['EXISTS'] != max(array_keys($index['depth']))) {
+            if ($mbox_data['EXISTS'] != @max(array_keys($index['depth']))) {
                 return false;
             }
             return true;
@@ -880,7 +887,7 @@
                     rcube_imap_generic::compressMessageSet($index['uid']));
 
                 if (!empty($ids)) {
-                    $index = null; // cache invalid
+                    return false;
                 }
             }
         }
@@ -996,12 +1003,22 @@
             !empty($uids) ? $uids : '1:*', true, array('FLAGS'),
             $index['modseq'], $qresync);
 
+        $invalidated = false;
+
         if (!empty($result)) {
             foreach ($result as $id => $msg) {
                 $uid = $msg->uid;
                 // Remove deleted message
                 if ($this->skip_deleted && !empty($msg->flags['DELETED'])) {
                     $this->remove_message($mailbox, $uid);
+
+                    if (!$invalidated) {
+                        $invalidated = true;
+                        // Invalidate thread indexes (?)
+                        $this->remove_thread($mailbox);
+                        // Invalidate index
+                        $index['valid'] = false;
+                    }
                     continue;
                 }
 
@@ -1036,6 +1053,8 @@
 
                     // Invalidate thread indexes (?)
                     $this->remove_thread($mailbox);
+                    // Invalidate index
+                    $index['valid'] = false;
                 }
             }
         }

--
Gitblit v1.9.1