[evolution-ews] Bug 764977 - Manual folder Refresh should fully resync with the server



commit f2ee4adb3b333caa1bf8ab4900db889f344c11e7
Author: Milan Crha <mcrha redhat com>
Date:   Thu Apr 14 10:40:31 2016 +0200

    Bug 764977 - Manual folder Refresh should fully resync with the server

 src/camel/camel-ews-folder.c  |   22 +++++++++----
 src/camel/camel-ews-store.c   |    3 ++
 src/camel/camel-ews-summary.c |   66 +++++++++++++++++++++++++++++++++++-----
 src/camel/camel-ews-summary.h |    8 +++--
 4 files changed, 80 insertions(+), 19 deletions(-)
---
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index f707712..9c82222 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -1807,7 +1807,7 @@ ews_refresh_info_sync (CamelFolder *folder,
         * Due to these reasons we just get the item ids and its type in
         * SyncFolderItem request and fetch the item using the
         * GetItem request. */
-       sync_state = ((CamelEwsSummary *) folder->summary)->sync_state;
+       sync_state = camel_ews_summary_dup_sync_state ((CamelEwsSummary *) folder->summary);
        do {
                GSList *items_created = NULL, *items_updated = NULL;
                GSList *items_deleted = NULL;
@@ -1819,8 +1819,8 @@ ews_refresh_info_sync (CamelFolder *folder,
 
                if (g_error_matches (local_error, EWS_CONNECTION_ERROR, 
EWS_CONNECTION_ERROR_INVALIDSYNCSTATEDATA)) {
                        g_clear_error (&local_error);
-                       g_free (((CamelEwsSummary *) folder->summary)->sync_state);
-                       ((CamelEwsSummary *) folder->summary)->sync_state = NULL;
+                       camel_ews_summary_set_sync_state ((CamelEwsSummary *) folder->summary, NULL);
+                       g_free (sync_state);
                        sync_state = NULL;
                        ews_folder_forget_all_mails (ews_folder);
 
@@ -1862,8 +1862,7 @@ ews_refresh_info_sync (CamelFolder *folder,
                camel_ews_store_summary_set_folder_unread (ews_store->summary, id, unread);
                camel_ews_store_summary_save (ews_store->summary, NULL);
 
-               g_free (((CamelEwsSummary *) folder->summary)->sync_state);
-               ((CamelEwsSummary *) folder->summary)->sync_state = sync_state;
+               camel_ews_summary_set_sync_state ((CamelEwsSummary *) folder->summary, sync_state);
 
                camel_folder_summary_touch (folder->summary);
 
@@ -1894,9 +1893,9 @@ ews_refresh_info_sync (CamelFolder *folder,
        g_mutex_lock (&priv->state_lock);
        priv->refreshing = FALSE;
        g_mutex_unlock (&priv->state_lock);
-       if (sync_state != ((CamelEwsSummary *) folder->summary)->sync_state)
-               g_free (sync_state);
+
        g_object_unref (cnc);
+       g_free (sync_state);
        g_free (id);
 
        return !local_error;
@@ -2144,6 +2143,14 @@ ews_transfer_messages_to_sync (CamelFolder *source,
        return !local_error;
 }
 
+static void
+ews_prepare_content_refresh (CamelFolder *folder)
+{
+       g_return_if_fail (CAMEL_IS_EWS_FOLDER (folder));
+
+       camel_ews_summary_set_sync_state (CAMEL_EWS_SUMMARY (folder->summary), NULL);
+}
+
 static gboolean
 ews_delete_messages_from_server (CamelEwsStore *ews_store,
                                 const GSList *deleted_items,
@@ -2529,6 +2536,7 @@ camel_ews_folder_class_init (CamelEwsFolderClass *class)
        folder_class->synchronize_sync = ews_synchronize_sync;
        folder_class->expunge_sync = ews_expunge_sync;
        folder_class->transfer_messages_to_sync = ews_transfer_messages_to_sync;
+       folder_class->prepare_content_refresh = ews_prepare_content_refresh;
        folder_class->get_filename = ews_get_filename;
 }
 
diff --git a/src/camel/camel-ews-store.c b/src/camel/camel-ews-store.c
index d86667a..20b7d1e 100644
--- a/src/camel/camel-ews-store.c
+++ b/src/camel/camel-ews-store.c
@@ -2014,6 +2014,9 @@ ews_get_folder_sync (CamelStore *store,
 
        g_free (folder_dir);
 
+       if ((flags & CAMEL_STORE_FOLDER_INFO_REFRESH) != 0)
+               camel_folder_prepare_content_refresh (folder);
+
        return folder;
 }
 
diff --git a/src/camel/camel-ews-summary.c b/src/camel/camel-ews-summary.c
index 05e14c9..e84f952 100644
--- a/src/camel/camel-ews-summary.c
+++ b/src/camel/camel-ews-summary.c
@@ -55,6 +55,12 @@ static CamelMessageContentInfo * content_info_from_db (CamelFolderSummary *s, Ca
 
 /*End of Prototypes*/
 
+struct _CamelEwsSummaryPrivate {
+       GMutex property_lock;
+       gchar *sync_state;
+       gint32 version;
+};
+
 G_DEFINE_TYPE (CamelEwsSummary, camel_ews_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static CamelMessageInfo *
@@ -88,12 +94,13 @@ ews_message_info_free (CamelFolderSummary *s,
 static void
 ews_summary_finalize (GObject *object)
 {
-       CamelEwsSummary *ews_summary = CAMEL_EWS_SUMMARY (object);
+       CamelEwsSummary *ews_summary = CAMEL_EWS_SUMMARY (object);
 
-       g_free (ews_summary->sync_state);
+       g_free (ews_summary->priv->sync_state);
+       g_mutex_clear (&ews_summary->priv->property_lock);
 
-       /* Chain up to parent's finalize() method. */
-       G_OBJECT_CLASS (camel_ews_summary_parent_class)->finalize (object);
+       /* Chain up to parent's finalize() method. */
+       G_OBJECT_CLASS (camel_ews_summary_parent_class)->finalize (object);
 }
 
 static void
@@ -102,6 +109,8 @@ camel_ews_summary_class_init (CamelEwsSummaryClass *class)
        CamelFolderSummaryClass *folder_summary_class;
        GObjectClass *object_class;
 
+       g_type_class_add_private (class, sizeof (CamelEwsSummaryPrivate));
+
        object_class = G_OBJECT_CLASS (class);
        object_class->finalize = ews_summary_finalize;
 
@@ -122,6 +131,9 @@ camel_ews_summary_class_init (CamelEwsSummaryClass *class)
 static void
 camel_ews_summary_init (CamelEwsSummary *ews_summary)
 {
+       ews_summary->priv = G_TYPE_INSTANCE_GET_PRIVATE (ews_summary, CAMEL_TYPE_EWS_SUMMARY, 
CamelEwsSummaryPrivate);
+
+       g_mutex_init (&ews_summary->priv->property_lock);
 }
 
 /**
@@ -149,7 +161,7 @@ static gboolean
 summary_header_from_db (CamelFolderSummary *s,
                         CamelFIRecord *mir)
 {
-       CamelEwsSummary *gms = CAMEL_EWS_SUMMARY (s);
+       CamelEwsSummary *ews_summary = CAMEL_EWS_SUMMARY (s);
        gchar *part;
 
        if (!CAMEL_FOLDER_SUMMARY_CLASS (camel_ews_summary_parent_class)->summary_header_from_db (s, mir))
@@ -158,10 +170,10 @@ summary_header_from_db (CamelFolderSummary *s,
        part = mir->bdata;
 
        if (part)
-               EXTRACT_FIRST_DIGIT (gms->version);
+               EXTRACT_FIRST_DIGIT (ews_summary->priv->version);
 
        if (part && part++ && strcmp (part, "(null)")) {
-               gms->sync_state = g_strdup (part);
+               camel_ews_summary_set_sync_state (ews_summary, part);
        }
 
        return TRUE;
@@ -171,14 +183,19 @@ static CamelFIRecord *
 summary_header_to_db (CamelFolderSummary *s,
                       GError **error)
 {
-       CamelEwsSummary *ims = CAMEL_EWS_SUMMARY (s);
+       CamelEwsSummary *ews_summary = CAMEL_EWS_SUMMARY (s);
        struct _CamelFIRecord *fir;
+       gchar *sync_state;
 
        fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_ews_summary_parent_class)->summary_header_to_db (s, error);
        if (!fir)
                return NULL;
 
-       fir->bdata = g_strdup_printf ("%d %s", CAMEL_EWS_SUMMARY_VERSION, ims->sync_state);
+       sync_state = camel_ews_summary_dup_sync_state (ews_summary);
+
+       fir->bdata = g_strdup_printf ("%d %s", CAMEL_EWS_SUMMARY_VERSION, sync_state);
+
+       g_free (sync_state);
 
        return fir;
 
@@ -403,3 +420,34 @@ ews_summary_clear (CamelFolderSummary *summary,
        camel_folder_summary_free_array (known_uids);
 }
 
+void
+camel_ews_summary_set_sync_state (CamelEwsSummary *ews_summary,
+                                 const gchar *sync_state)
+{
+       g_return_if_fail (CAMEL_IS_EWS_SUMMARY (ews_summary));
+
+       g_mutex_lock (&ews_summary->priv->property_lock);
+
+       if (g_strcmp0 (ews_summary->priv->sync_state, sync_state) != 0) {
+               g_free (ews_summary->priv->sync_state);
+               ews_summary->priv->sync_state = g_strdup (sync_state);
+       }
+
+       g_mutex_unlock (&ews_summary->priv->property_lock);
+}
+
+gchar *
+camel_ews_summary_dup_sync_state (CamelEwsSummary *ews_summary)
+{
+       gchar *sync_state;
+
+       g_return_val_if_fail (CAMEL_IS_EWS_SUMMARY (ews_summary), NULL);
+
+       g_mutex_lock (&ews_summary->priv->property_lock);
+
+       sync_state = g_strdup (ews_summary->priv->sync_state);
+
+       g_mutex_unlock (&ews_summary->priv->property_lock);
+
+       return sync_state;
+}
diff --git a/src/camel/camel-ews-summary.h b/src/camel/camel-ews-summary.h
index 2d6cee1..b085ab3 100644
--- a/src/camel/camel-ews-summary.h
+++ b/src/camel/camel-ews-summary.h
@@ -47,6 +47,7 @@ G_BEGIN_DECLS
 
 typedef struct _CamelEwsSummary CamelEwsSummary;
 typedef struct _CamelEwsSummaryClass CamelEwsSummaryClass;
+typedef struct _CamelEwsSummaryPrivate CamelEwsSummaryPrivate;
 typedef struct _CamelEwsMessageInfo CamelEwsMessageInfo;
 typedef struct _CamelEwsMessageContentInfo CamelEwsMessageContentInfo;
 
@@ -69,9 +70,7 @@ struct _CamelEwsMessageContentInfo {
 
 struct _CamelEwsSummary {
        CamelFolderSummary parent;
-
-       gchar *sync_state;
-       gint32 version;
+       CamelEwsSummaryPrivate *priv;
 } ;
 
 struct _CamelEwsSummaryClass {
@@ -96,6 +95,9 @@ gboolean
                                         CamelMimeMessage *message);
 void   ews_summary_clear               (CamelFolderSummary *summary,
                                         gboolean uncache);
+void   camel_ews_summary_set_sync_state(CamelEwsSummary *ews_summary,
+                                        const gchar *sync_state);
+gchar *        camel_ews_summary_dup_sync_state(CamelEwsSummary *ews_summary);
 
 G_END_DECLS
 


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