diff options
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/rcube_imap_cache.php | 123 | ||||
-rw-r--r-- | program/include/rcube_imap_generic.php | 27 |
2 files changed, 82 insertions, 68 deletions
diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php index eb2df165f..530284a58 100644 --- a/program/include/rcube_imap_cache.php +++ b/program/include/rcube_imap_cache.php @@ -516,7 +516,6 @@ class rcube_imap_cache .($uids !== null ? " AND uid IN (".$this->db->array2list((array)$uids, 'integer').")" : ""), $this->userid, $mailbox); } - } @@ -917,18 +916,17 @@ class rcube_imap_cache return; } - // NOTE: make sure the mailbox isn't selected, before - // enabling QRESYNC and invoking SELECT - if ($this->imap->conn->selected !== null) { - $this->imap->conn->close(); - } - // Enable QRESYNC $res = $this->imap->conn->enable($qresync ? 'QRESYNC' : 'CONDSTORE'); - if (!is_array($res)) { + if ($res === false) { return; } + // Close mailbox if already selected to get most recent data + if ($this->imap->conn->selected == $mailbox) { + $this->imap->conn->close(); + } + // Get mailbox data (UIDVALIDITY, HIGHESTMODSEQ, counters, etc.) $mbox_data = $this->imap->folder_data($mailbox); @@ -952,8 +950,10 @@ class rcube_imap_cache return; } - // Get known uids - $uids = array(); + $uids = array(); + $removed = array(); + + // Get known UIDs $sql_result = $this->db->query( "SELECT uid" ." FROM ".$this->db->table_name('cache_messages') @@ -962,74 +962,69 @@ class rcube_imap_cache $this->userid, $mailbox); while ($sql_arr = $this->db->fetch_assoc($sql_result)) { - $uids[] = $sql_arr['uid']; - } - - // No messages in database, nothing to sync - if (empty($uids)) { - return; - } - - // Get modified flags and vanished messages - // UID FETCH 1:* (FLAGS) (CHANGEDSINCE 0123456789 VANISHED) - $result = $this->imap->conn->fetch($mailbox, - !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); + $uids[] = $sql_arr['uid']; + } + + // Synchronize messages data + if (!empty($uids)) { + // Get modified flags and vanished messages + // UID FETCH 1:* (FLAGS) (CHANGEDSINCE 0123456789 VANISHED) + $result = $this->imap->conn->fetch($mailbox, + $uids, true, array('FLAGS'), $index['modseq'], $qresync); + + if (!empty($result)) { + foreach ($result as $id => $msg) { + $uid = $msg->uid; + // Remove deleted message + if ($this->skip_deleted && !empty($msg->flags['DELETED'])) { + $removed[] = $uid; // Invalidate index $index['valid'] = false; + continue; } - continue; - } - $flags = 0; - if (!empty($msg->flags)) { - foreach ($this->flags as $idx => $flag) - if (!empty($msg->flags[$flag])) - $flags += $idx; - } + $flags = 0; + if (!empty($msg->flags)) { + foreach ($this->flags as $idx => $flag) { + if (!empty($msg->flags[$flag])) { + $flags += $idx; + } + } + } - $this->db->query( - "UPDATE ".$this->db->table_name('cache_messages') - ." SET flags = ?, changed = ".$this->db->now() - ." WHERE user_id = ?" - ." AND mailbox = ?" - ." AND uid = ?" - ." AND flags <> ?", - $flags, $this->userid, $mailbox, $uid, $flags); + $this->db->query( + "UPDATE ".$this->db->table_name('cache_messages') + ." SET flags = ?, changed = ".$this->db->now() + ." WHERE user_id = ?" + ." AND mailbox = ?" + ." AND uid = ?" + ." AND flags <> ?", + $flags, $this->userid, $mailbox, $uid, $flags); + } } - } - // Get VANISHED - if ($qresync) { - $mbox_data = $this->imap->folder_data($mailbox); + // VANISHED found? + if ($qresync) { + $mbox_data = $this->imap->folder_data($mailbox); - // Removed messages - if (!empty($mbox_data['VANISHED'])) { + // Removed messages found $uids = rcube_imap_generic::uncompressMessageSet($mbox_data['VANISHED']); if (!empty($uids)) { - // remove messages from database - $this->remove_message($mailbox, $uids); - - // Invalidate thread indexes (?) - $this->remove_thread($mailbox); + $removed = array_merge($removed, $uids); // Invalidate index $index['valid'] = false; } } + + // remove messages from database + if (!empty($removed)) { + $this->remove_message($mailbox, $removed); + } + } + + // Invalidate thread index (?) + if (!$index['valid']) { + $this->remove_thread($mailbox); } $sort_field = $index['sort_field']; diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index 959dd9fd0..197164dfe 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -1472,14 +1472,31 @@ class rcube_imap_generic */ function enable($extension) { - if (empty($extension)) + if (empty($extension)) { return false; + } - if (!$this->hasCapability('ENABLE')) + if (!$this->hasCapability('ENABLE')) { return false; + } - if (!is_array($extension)) + if (!is_array($extension)) { $extension = array($extension); + } + + if (!empty($this->extensions_enabled)) { + // check if all extensions are already enabled + $diff = array_diff($extension, $this->extensions_enabled); + + if (empty($diff)) { + return $extension; + } + + // Make sure the mailbox isn't selected, before enabling extension(s) + if ($this->selected !== null) { + $this->close(); + } + } list($code, $response) = $this->execute('ENABLE', $extension); @@ -1487,7 +1504,9 @@ class rcube_imap_generic $response = substr($response, 10); // remove prefix "* ENABLED " $result = (array) $this->tokenizeResponse($response); - return $result; + $this->extensions_enabled = array_unique(array_merge((array)$this->extensions_enabled, $result)); + + return $this->extensions_enabled; } return false; |