[evolution-data-server] camel_store_get_folder_info_sync: Connect first unless offline.



commit 3e28be9b199dc89a13003e1d10fe4a57123f80e0
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Aug 17 07:58:34 2013 -0400

    camel_store_get_folder_info_sync: Connect first unless offline.

 camel/camel-imapx-store.c               |    6 ----
 camel/camel-store.c                     |   40 +++++++++++++++++++++++++++++++
 camel/providers/nntp/camel-nntp-store.c |   13 +--------
 3 files changed, 42 insertions(+), 17 deletions(-)
---
diff --git a/camel/camel-imapx-store.c b/camel/camel-imapx-store.c
index 140650d..18bab78 100644
--- a/camel/camel-imapx-store.c
+++ b/camel/camel-imapx-store.c
@@ -1619,12 +1619,6 @@ imapx_store_get_folder_info_sync (CamelStore *store,
                return fi;
        }
 
-       if (!camel_service_connect_sync (
-               CAMEL_SERVICE (store), cancellable, error)) {
-               g_mutex_unlock (&imapx_store->get_finfo_lock);
-               return NULL;
-       }
-
        if (*top && flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST) {
                fi = get_folder_info_offline (store, top, flags, error);
                g_mutex_unlock (&imapx_store->get_finfo_lock);
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 647c2e5..e95999b 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -37,6 +37,7 @@
 #include "camel-db.h"
 #include "camel-debug.h"
 #include "camel-folder.h"
+#include "camel-offline-store.h"
 #include "camel-session.h"
 #include "camel-store.h"
 #include "camel-store-settings.h"
@@ -300,6 +301,39 @@ store_get_special (CamelStore *store,
        return folder;
 }
 
+static gboolean
+store_maybe_connect_sync (CamelStore *store,
+                          GCancellable *cancellable,
+                          GError **error)
+{
+       CamelService *service;
+       CamelServiceConnectionStatus status;
+       gboolean connect = FALSE;
+       gboolean success = TRUE;
+
+       /* This is meant to recover from dropped connections
+        * when the CamelService is online but disconnected. */
+
+       service = CAMEL_SERVICE (store);
+       status = camel_service_get_connection_status (service);
+       connect = (status != CAMEL_SERVICE_CONNECTED);
+
+       if (CAMEL_IS_OFFLINE_STORE (store)) {
+               CamelOfflineStore *offline_store;
+
+               offline_store = CAMEL_OFFLINE_STORE (store);
+               if (!camel_offline_store_get_online (offline_store))
+                       connect = FALSE;
+       }
+
+       if (connect) {
+               success = camel_service_connect_sync (
+                       service, cancellable, error);
+       }
+
+       return success;
+}
+
 static void
 store_finalize (GObject *object)
 {
@@ -2196,6 +2230,12 @@ camel_store_get_folder_info_sync (CamelStore *store,
                cancellable, _("Scanning folders in '%s'"), name);
        g_free (name);
 
+       /* Recover from a dropped connection, unless we're offline. */
+       if (!store_maybe_connect_sync (store, cancellable, error)) {
+               camel_operation_pop_message (cancellable);
+               return NULL;
+       }
+
        info = class->get_folder_info_sync (
                store, top, flags, cancellable, error);
        if ((flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED) == 0)
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 395f7e6..0cd8647 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -1307,17 +1307,8 @@ nntp_get_folder_info_online (CamelStore *store,
                              GCancellable *cancellable,
                              GError **error)
 {
-       CamelService *service;
-       CamelFolderInfo *info = NULL;
-
-       service = CAMEL_SERVICE (store);
-
-       /* Reconnect if necessary. */
-       if (camel_service_connect_sync (service, cancellable, error))
-               info = nntp_get_folder_info (
-                       store, top, flags, TRUE, cancellable, error);
-
-       return info;
+       return nntp_get_folder_info (
+               store, top, flags, TRUE, cancellable, error);
 }
 
 static CamelFolderInfo *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]