[evolution-ews] Bug 764977 - Manual folder Refresh should fully resync with the server
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug 764977 - Manual folder Refresh should fully resync with the server
- Date: Thu, 14 Apr 2016 08:40:56 +0000 (UTC)
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]