Better IMAP error handling if connection unexpectedly dies.
authorMichael M Slusarz <slusarz@curecanti.org>
Fri, 16 Oct 2009 09:27:12 +0000 (03:27 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Fri, 16 Oct 2009 09:27:12 +0000 (03:27 -0600)
imp/ajax.php
imp/lib/IMP.php
imp/lib/Mailbox.php

index b37a557..8a543ba 100644 (file)
@@ -52,7 +52,8 @@ function _changed($mbox, $compare, $rw = null)
         try {
             $GLOBALS['imp_imap']->ob()->openMailbox($mbox, $rw ? Horde_Imap_Client::OPEN_READWRITE : Horde_Imap_Client::OPEN_AUTO);
         } catch (Horde_Imap_Client_Exception $e) {
-            return false;
+            $GLOBALS['notification']->push($e, 'horde.error');
+            return null;
         }
     }
 
@@ -336,13 +337,19 @@ case 'Poll':
         }
     }
 
-    if (!empty($mbox) && _changed($mbox, $cacheid)) {
-        $result->ViewPort = _getListMessages($mbox, true);
+    $changed = false;
+    if (!empty($mbox)) {
+        $changed =_changed($mbox, $cacheid);
+        if ($changed) {
+            $result->ViewPort = _getListMessages($mbox, true);
+        }
     }
 
-    $quota = _getQuota();
-    if (!is_null($quota)) {
-        $result->quota = $quota;
+    if (!is_null($changed)) {
+        $quota = _getQuota();
+        if (!is_null($quota)) {
+            $result->quota = $quota;
+        }
     }
     break;
 
@@ -367,12 +374,12 @@ case 'ViewPort':
         IMP::setSort($sortby, $sortdir, $mbox);
     }
 
-    $result = new stdClass;
     $changed = _changed($mbox, $cacheid, false);
 
-    if (Horde_Util::getPost('rangeslice') ||
-        !Horde_Util::getPost('checkcache') ||
-        $changed) {
+    if ($changed ||
+        Horde_Util::getPost('rangeslice') ||
+        !Horde_Util::getPost('checkcache')) {
+        $result = new stdClass;
         $result->ViewPort = _getListMessages($mbox, $changed);
     }
     break;
@@ -384,34 +391,36 @@ case 'CopyMessage':
         break;
     }
 
-    if ($action == 'MoveMessage') {
-        $change = _changed($mbox, $cacheid, true);
-    }
+    $change = ($action == 'MoveMessage')
+        ? _changed($mbox, $cacheid, true)
+        : false;
 
-    $imp_message = IMP_Message::singleton();
+    if (!is_null($change)) {
+        $imp_message = IMP_Message::singleton();
 
-    $result = $imp_message->copy($to, ($action == 'MoveMessage') ? 'move' : 'copy', $indices);
+        $result = $imp_message->copy($to, ($action == 'MoveMessage') ? 'move' : 'copy', $indices);
 
-    if ($result) {
-        if ($action == 'MoveMessage') {
-            $result = _generateDeleteResult($mbox, $indices, $change);
-            // Need to manually set remove to true since we want to remove
-            // message from the list no matter the current pref settings.
-            $result->remove = 1;
-        }
+        if ($result) {
+            if ($action == 'MoveMessage') {
+                $result = _generateDeleteResult($mbox, $indices, $change);
+                // Need to manually set remove to true since we want to remove
+                // message from the list no matter the current pref settings.
+                $result->remove = 1;
+            }
 
-        // Update poll information for destination folder if necessary.
-        // Poll information for current folder will be added by
-        // _generateDeleteResult() call above.
-        $poll = _getPollInformation($to);
-        if (!empty($poll)) {
-            if (!isset($result->poll)) {
-                $result->poll = array();
+            // Update poll information for destination folder if necessary.
+            // Poll information for current folder will be added by
+            // _generateDeleteResult() call above.
+            $poll = _getPollInformation($to);
+            if (!empty($poll)) {
+                if (!isset($result->poll)) {
+                    $result->poll = array();
+                }
+                $result->poll = array_merge($result->poll, $poll);
             }
-            $result->poll = array_merge($result->poll, $poll);
+        } else {
+            $check_uidvalidity = true;
         }
-    } else {
-        $check_uidvalidity = true;
     }
     break;
 
@@ -456,7 +465,7 @@ case 'DeleteMessage':
 
     if ($imp_message->delete($indices)) {
         $result = _generateDeleteResult($mbox, $indices, $change, !$prefs->getValue('hide_deleted') && !$prefs->getValue('use_trash'));
-    } else {
+    } elseif (!is_null($change)) {
         $check_uidvalidity = true;
     }
     break;
@@ -487,7 +496,7 @@ case 'ReportSpam':
         // If result is non-zero, then we know the message has been removed
         // from the current mailbox.
         $result->remove = 1;
-    } else {
+    } elseif (!is_null($change)) {
         $check_uidvalidity = true;
     }
     break;
@@ -500,12 +509,14 @@ case 'Blacklist':
     $imp_filter = new IMP_Filter();
     if (Horde_Util::getPost('blacklist')) {
         $change = _changed($mbox, $cacheid, false);
-        try {
-            if ($imp_filter->blacklistMessage($indices, false)) {
-                $result = _generateDeleteResult($mbox, $indices, $change);
+        if (!is_null($change)) {
+            try {
+                if ($imp_filter->blacklistMessage($indices, false)) {
+                    $result = _generateDeleteResult($mbox, $indices, $change);
+                }
+            } catch (Horde_Exception $e) {
+                $check_uidvalidity = true;
             }
-        } catch (Horde_Exception $e) {
-            $check_uidvalidity = true;
         }
     } else {
         try {
@@ -692,24 +703,26 @@ case 'chunkContent':
 
 case 'PurgeDeleted':
     $change = _changed($mbox, $cacheid, $indices);
-    if (!$change) {
-        $sort = IMP::getSort($mbox);
-        $change = ($sort['by'] == Horde_Imap_Client::SORT_THREAD);
-    }
-    $imp_message = IMP_Message::singleton();
-    $expunged = $imp_message->expungeMailbox(array($mbox => 1), array('list' => true));
-    if (!empty($expunged[$mbox])) {
-        $expunge_count = count($expunged[$mbox]);
-        $display_folder = IMP::displayFolder($mbox);
-        if ($expunge_count == 1) {
-            $notification->push(sprintf(_("1 message was purged from \"%s\"."), $display_folder), 'horde.success');
-        } else {
-            $notification->push(sprintf(_("%s messages were purged from \"%s\"."), $expunge_count, $display_folder), 'horde.success');
+    if (!is_null($change)) {
+        if (!$change) {
+            $sort = IMP::getSort($mbox);
+            $change = ($sort['by'] == Horde_Imap_Client::SORT_THREAD);
+        }
+        $imp_message = IMP_Message::singleton();
+        $expunged = $imp_message->expungeMailbox(array($mbox => 1), array('list' => true));
+        if (!empty($expunged[$mbox])) {
+            $expunge_count = count($expunged[$mbox]);
+            $display_folder = IMP::displayFolder($mbox);
+            if ($expunge_count == 1) {
+                $notification->push(sprintf(_("1 message was purged from \"%s\"."), $display_folder), 'horde.success');
+            } else {
+                $notification->push(sprintf(_("%s messages were purged from \"%s\"."), $expunge_count, $display_folder), 'horde.success');
+            }
+            $result = _generateDeleteResult($mbox, $expunged, $change);
+            // Need to manually set remove to true since we want to remove
+            // message from the list no matter the current pref settings.
+            $result->remove = 1;
         }
-        $result = _generateDeleteResult($mbox, $expunged, $change);
-        // Need to manually set remove to true since we want to remove
-        // message from the list no matter the current pref settings.
-        $result->remove = 1;
     }
     break;
 
index 4d3a76e..372040f 100644 (file)
@@ -1042,7 +1042,8 @@ class IMP
             !empty($GLOBALS['conf']['server']['sort_limit'])) {
             try {
                 $status = $GLOBALS['imp_imap']->ob()->status($mbox, Horde_Imap_Client::STATUS_MESSAGES);
-                if ($status['messages'] > $GLOBALS['conf']['server']['sort_limit']) {
+                if (isset($status['messages']) &&
+                    ($status['messages'] > $GLOBALS['conf']['server']['sort_limit'])) {
                     $ob['limit'] = true;
                     $ob['by'] = Horde_Imap_Client::SORT_ARRIVAL;
                 }
index 42ddcf9..995a777 100644 (file)
@@ -671,6 +671,7 @@ class IMP_Mailbox
                 $this->_threadob = $GLOBALS['imp_imap']->ob()->thread($this->_mailbox);
                 $ref_errcode = null;
             } catch (Horde_Imap_Client_Exception $e) {
+                $error = $e;
                 $ref_errcode = $e->getCode();
             }
 
@@ -681,6 +682,9 @@ class IMP_Mailbox
                     $GLOBALS['notification']->push(_("Server does not support thread sorting."), 'horde.error');
                     return new Horde_Imap_Client_Thread(array(), 'uid');
                 }
+            } elseif (!is_null($ref_errcode)) {
+                $GLOBALS['notification']->push($error, 'horde.error');
+                return new Horde_Imap_Client_Thread(array(), 'uid');
             }
         }