Blob Blame History Raw
diff -up evolution-data-server-3.8.5/camel/camel-imapx-store.c.imapx-connect-store evolution-data-server-3.8.5/camel/camel-imapx-store.c
--- evolution-data-server-3.8.5/camel/camel-imapx-store.c.imapx-connect-store	2013-10-14 17:15:00.129077116 +0200
+++ evolution-data-server-3.8.5/camel/camel-imapx-store.c	2013-10-14 17:16:40.005070287 +0200
@@ -1461,12 +1461,6 @@ imapx_store_get_folder_info_sync (CamelS
 		return fi;
 	}
 
-	if (!camel_service_connect_sync (
-		CAMEL_SERVICE (store), cancellable, error)) {
-		g_mutex_unlock (&istore->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 (&istore->get_finfo_lock);
diff -up evolution-data-server-3.8.5/camel/camel-store.c.imapx-connect-store evolution-data-server-3.8.5/camel/camel-store.c
--- evolution-data-server-3.8.5/camel/camel-store.c.imapx-connect-store	2013-07-23 13:57:42.000000000 +0200
+++ evolution-data-server-3.8.5/camel/camel-store.c	2013-10-14 17:17:46.438065744 +0200
@@ -38,6 +38,7 @@
 #include "camel-debug.h"
 #include "camel-folder.h"
 #include "camel-marshal.h"
+#include "camel-offline-store.h"
 #include "camel-session.h"
 #include "camel-store.h"
 #include "camel-store-settings.h"
@@ -276,6 +277,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)
 {
@@ -2099,6 +2133,12 @@ camel_store_get_folder_info_sync (CamelS
 		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))
diff -up evolution-data-server-3.8.5/camel/providers/nntp/camel-nntp-store.c.imapx-connect-store evolution-data-server-3.8.5/camel/providers/nntp/camel-nntp-store.c
--- evolution-data-server-3.8.5/camel/providers/nntp/camel-nntp-store.c.imapx-connect-store	2013-08-03 09:57:21.000000000 +0200
+++ evolution-data-server-3.8.5/camel/providers/nntp/camel-nntp-store.c	2013-10-14 17:15:00.131077116 +0200
@@ -1292,17 +1292,8 @@ nntp_get_folder_info_online (CamelStore
                              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 *