[evolution-data-server] Bug 777042 - [NNTP] Offline access not working when server service unreachable



commit cbc6714d031b9d290e13094e788aae5940894ddb
Author: Milan Crha <mcrha redhat com>
Date:   Mon Apr 10 13:40:54 2017 +0200

    Bug 777042 - [NNTP] Offline access not working when server service unreachable

 src/camel/camel-store.c                      |   16 ++++++-
 src/camel/providers/nntp/camel-nntp-folder.c |   58 +++++++++++++++++++++++++-
 2 files changed, 70 insertions(+), 4 deletions(-)
---
diff --git a/src/camel/camel-store.c b/src/camel/camel-store.c
index 5e0015b..5392bde 100644
--- a/src/camel/camel-store.c
+++ b/src/camel/camel-store.c
@@ -299,8 +299,20 @@ store_maybe_connect_sync (CamelStore *store,
        }
 
        if (connect) {
-               success = camel_service_connect_sync (
-                       service, cancellable, error);
+               GError *local_error = NULL;
+
+               success = camel_service_connect_sync (service, cancellable, &local_error);
+
+               if (local_error) {
+                       if (local_error->domain == G_IO_ERROR ||
+                           g_error_matches (local_error, CAMEL_SERVICE_ERROR, 
CAMEL_SERVICE_ERROR_UNAVAILABLE)) {
+                               /* Ignore I/O errors, treat it as being offline */
+                               success = TRUE;
+                               g_clear_error (&local_error);
+                       } else {
+                               g_propagate_error (error, local_error);
+                       }
+               }
        }
 
        return success;
diff --git a/src/camel/providers/nntp/camel-nntp-folder.c b/src/camel/providers/nntp/camel-nntp-folder.c
index 5453586..51efa8c 100644
--- a/src/camel/providers/nntp/camel-nntp-folder.c
+++ b/src/camel/providers/nntp/camel-nntp-folder.c
@@ -553,6 +553,55 @@ nntp_folder_expunge_sync (CamelFolder *folder,
 }
 
 static CamelMimeMessage *
+nntp_folder_get_message_cached (CamelFolder *folder,
+                               const gchar *uid,
+                               GCancellable *cancellable)
+{
+       CamelMimeMessage *message = NULL;
+       CamelDataCache *nntp_cache;
+       CamelNNTPStore *nntp_store;
+       GIOStream *base_stream;
+       gchar *article, *msgid;
+       gsize article_len;
+
+       g_return_val_if_fail (CAMEL_IS_NNTP_FOLDER (folder), NULL);
+       g_return_val_if_fail (uid != NULL, NULL);
+
+       article_len = strlen (uid) + 1;
+       article = alloca (article_len);
+       g_strlcpy (article, uid, article_len);
+       msgid = strchr (article, ',');
+       if (!msgid)
+               return NULL;
+
+       *msgid++ = 0;
+
+       nntp_store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder));
+
+       /* Lookup in cache, NEWS is global messageid's so use a global cache path */
+       nntp_cache = camel_nntp_store_ref_cache (nntp_store);
+       base_stream = camel_data_cache_get (nntp_cache, "cache", msgid, NULL);
+       g_clear_object (&nntp_cache);
+
+       if (base_stream) {
+               CamelStream *stream;
+
+               stream = camel_stream_new (base_stream);
+               g_object_unref (base_stream);
+
+               message = camel_mime_message_new ();
+               if (!camel_data_wrapper_construct_from_stream_sync (CAMEL_DATA_WRAPPER (message), stream, 
cancellable, NULL)) {
+                       g_object_unref (message);
+                       message = NULL;
+               }
+
+               g_object_unref (stream);
+       }
+
+       return message;
+}
+
+static CamelMimeMessage *
 nntp_folder_get_message_sync (CamelFolder *folder,
                               const gchar *uid,
                               GCancellable *cancellable,
@@ -569,6 +618,9 @@ nntp_folder_get_message_sync (CamelFolder *folder,
        gchar *article, *msgid;
        gsize article_len;
 
+       g_return_val_if_fail (CAMEL_IS_NNTP_FOLDER (folder), NULL);
+       g_return_val_if_fail (uid != NULL, NULL);
+
        parent_store = camel_folder_get_parent_store (folder);
 
        nntp_folder = CAMEL_NNTP_FOLDER (folder);
@@ -740,6 +792,7 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
        folder_class->get_filename = nntp_get_filename;
        folder_class->append_message_sync = nntp_folder_append_message_sync;
        folder_class->expunge_sync = nntp_folder_expunge_sync;
+       folder_class->get_message_cached = nntp_folder_get_message_cached;
        folder_class->get_message_sync = nntp_folder_get_message_sync;
        folder_class->refresh_info_sync = nntp_folder_refresh_info_sync;
        folder_class->synchronize_sync = nntp_folder_synchronize_sync;
@@ -842,8 +895,9 @@ camel_nntp_folder_new (CamelStore *parent,
 
        g_clear_object (&nntp_store_summary);
 
-       if (subscribed && !camel_folder_refresh_info_sync (
-                       folder, cancellable, error)) {
+       if (subscribed &&
+           camel_service_get_connection_status (service) == CAMEL_SERVICE_CONNECTED &&
+           !camel_folder_refresh_info_sync (folder, cancellable, error)) {
                g_object_unref (folder);
                folder = NULL;
        }


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