From 609d3923d7dc674263ddea990387dbf5488fabc6 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sun, 18 Sep 2011 05:02:35 -0400
Subject: [PATCH] - Cache synchronization using QRESYNC/CONDSTORE - Fixed message ID updates in cache - Changed message flags handling + some fixes (e.g. fixed messages listing after delete)

---
 program/include/rcube_imap_generic.php |   55 ++++++++++++++-----------------------------------------
 1 files changed, 14 insertions(+), 41 deletions(-)

diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index be520d3..55eb8fa 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -6,6 +6,7 @@
  |                                                                       |
  | This file is part of the Roundcube Webmail client                     |
  | Copyright (C) 2005-2010, The Roundcube Dev Team                       |
+ | Copyright (C) 2011, Kolab Systems AG                                  |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -54,15 +55,8 @@
     public $references;
     public $priority;
     public $mdn_to;
-
-    public $flags;
-    public $mdnsent = false;
-    public $seen = false;
-    public $deleted = false;
-    public $answered = false;
-    public $forwarded = false;
-    public $flagged = false;
     public $others = array();
+    public $flags = array();
 }
 
 // For backward compatibility with cached messages (#1486602)
@@ -689,7 +683,7 @@
         // initialize connection
         $this->error    = '';
         $this->errornum = self::ERROR_OK;
-        $this->selected = '';
+        $this->selected = null;
         $this->user     = $user;
         $this->host     = $host;
         $this->logged   = false;
@@ -886,7 +880,7 @@
             return false;
         }
 
-        if ($this->selected == $mailbox) {
+        if ($this->selected === $mailbox) {
             return true;
         }
 /*
@@ -1049,7 +1043,7 @@
             $result = $this->execute('EXPUNGE', null, self::COMMAND_NORESPONSE);
 
         if ($result == self::ERROR_OK) {
-            $this->selected = ''; // state has changed, need to reselect
+            $this->selected = null; // state has changed, need to reselect
             return true;
         }
 
@@ -1067,7 +1061,7 @@
         $result = $this->execute('CLOSE', NULL, self::COMMAND_NORESPONSE);
 
         if ($result == self::ERROR_OK) {
-            $this->selected = '';
+            $this->selected = null;
             return true;
         }
 
@@ -1134,7 +1128,7 @@
         }
 
         if ($res) {
-            if ($this->selected == $mailbox)
+            if ($this->selected === $mailbox)
                 $res = $this->close();
             else
                 $res = $this->expunge($mailbox);
@@ -1153,10 +1147,10 @@
     function countMessages($mailbox, $refresh = false)
     {
         if ($refresh) {
-            $this->selected = '';
+            $this->selected = null;
         }
 
-        if ($this->selected == $mailbox) {
+        if ($this->selected === $mailbox) {
             return $this->data['EXISTS'];
         }
 
@@ -1190,7 +1184,7 @@
 
         $this->select($mailbox);
 
-        if ($this->selected == $mailbox) {
+        if ($this->selected === $mailbox) {
             return $this->data['RECENT'];
         }
 
@@ -1676,31 +1670,10 @@
                     else if ($name == 'FLAGS') {
                         if (!empty($value)) {
                             foreach ((array)$value as $flag) {
-                                $flag = str_replace('\\', '', $flag);
+                                $flag = str_replace(array('$', '\\'), '', $flag);
+                                $flag = strtoupper($flag);
 
-                                switch (strtoupper($flag)) {
-                                case 'SEEN':
-                                    $result[$id]->seen = true;
-                                    break;
-                                case 'DELETED':
-                                    $result[$id]->deleted = true;
-                                    break;
-                                case 'ANSWERED':
-                                    $result[$id]->answered = true;
-                                    break;
-                                case '$FORWARDED':
-                                    $result[$id]->forwarded = true;
-                                    break;
-                                case '$MDNSENT':
-                                    $result[$id]->mdnsent = true;
-                                    break;
-                                case 'FLAGGED':
-                                    $result[$id]->flagged = true;
-                                    break;
-                                default:
-                                    $result[$id]->flags[] = $flag;
-                                    break;
-                                }
+                                $result[$id]->flags[$flag] = true;
                             }
                         }
                     }
@@ -1812,7 +1785,7 @@
             // VANISHED response (QRESYNC RFC5162)
             // Sample: * VANISHED (EARLIER) 300:310,405,411
 
-            else if (preg_match('/^\* VANISHED [EARLIER]*/i', $line, $match)) {
+            else if (preg_match('/^\* VANISHED [()EARLIER]*/i', $line, $match)) {
                 $line   = substr($line, strlen($match[0]));
                 $v_data = $this->tokenizeResponse($line, 1);
 

--
Gitblit v1.9.1