[evolution-ews] I#154 - Add an option to reset sync tags



commit 5eb42559badff9f140dca6c71d154ee4c71ac6ea
Author: Milan Crha <mcrha redhat com>
Date:   Wed Jun 9 18:56:08 2021 +0200

    I#154 - Add an option to reset sync tags
    
    Closes https://gitlab.gnome.org/GNOME/evolution-ews/-/issues/154

 src/EWS/addressbook/e-book-backend-ews.c           |  55 ++++++++++
 src/EWS/calendar/e-cal-backend-ews.c               |  55 ++++++++++
 src/EWS/camel/camel-ews-folder.c                   |  12 ++-
 src/EWS/camel/camel-ews-summary.c                  |  40 ++++++-
 src/EWS/camel/camel-ews-summary.h                  |   7 +-
 src/EWS/common/camel-ews-settings.c                |  77 +++++++++++++-
 src/EWS/common/camel-ews-settings.h                |   8 +-
 .../e-mail-config-ews-folder-sizes-page.c          | 115 ++++++++++++++++++++-
 .../e-mail-config-ews-folder-sizes-page.h          |   3 +
 src/EWS/evolution/e-mail-config-ews-notebook.c     |   1 +
 10 files changed, 363 insertions(+), 10 deletions(-)
---
diff --git a/src/EWS/addressbook/e-book-backend-ews.c b/src/EWS/addressbook/e-book-backend-ews.c
index a72ed5b1..f9622028 100644
--- a/src/EWS/addressbook/e-book-backend-ews.c
+++ b/src/EWS/addressbook/e-book-backend-ews.c
@@ -56,6 +56,8 @@
 #define EBB_EWS_DATA_VERSION 1
 #define EBB_EWS_DATA_VERSION_KEY "ews-data-version"
 
+#define EBB_EWS_SYNC_TAG_STAMP_KEY "ews-sync-tag-stamp"
+
 #define X_EWS_ORIGINAL_VCARD "X-EWS-ORIGINAL-VCARD"
 #define X_EWS_CHANGEKEY "X-EWS-CHANGEKEY"
 #define X_EWS_GAL_SHA1 "X-EWS-GAL-SHA1"
@@ -260,6 +262,51 @@ ebb_ews_get_collection_settings (EBookBackendEws *bbews)
        return CAMEL_EWS_SETTINGS (settings);
 }
 
+static gboolean
+ebb_ews_get_sync_tag_stamp_changed (EBookBackendEws *bbews)
+{
+       CamelEwsSettings *settings;
+       EBookCache *book_cache;
+       guint sync_tag_stamp;
+
+       settings = ebb_ews_get_collection_settings (bbews);
+       g_return_val_if_fail (settings != NULL, FALSE);
+
+       book_cache = e_book_meta_backend_ref_cache (E_BOOK_META_BACKEND (bbews));
+       if (!book_cache)
+               return FALSE;
+
+       sync_tag_stamp = e_cache_get_key_int (E_CACHE (book_cache), EBB_EWS_SYNC_TAG_STAMP_KEY, NULL);
+       if (sync_tag_stamp == (guint) -1)
+               sync_tag_stamp = 0;
+
+       g_clear_object (&book_cache);
+
+       return sync_tag_stamp != camel_ews_settings_get_sync_tag_stamp (settings);
+}
+
+static void
+ebb_ews_update_sync_tag_stamp (EBookBackendEws *bbews)
+{
+       CamelEwsSettings *settings;
+       EBookCache *book_cache;
+       guint sync_tag_stamp;
+
+       settings = ebb_ews_get_collection_settings (bbews);
+       g_return_if_fail (settings != NULL);
+
+       book_cache = e_book_meta_backend_ref_cache (E_BOOK_META_BACKEND (bbews));
+       if (!book_cache)
+               return;
+
+       sync_tag_stamp = e_cache_get_key_int (E_CACHE (book_cache), EBB_EWS_SYNC_TAG_STAMP_KEY, NULL);
+
+       if (sync_tag_stamp != camel_ews_settings_get_sync_tag_stamp (settings))
+               e_cache_set_key_int (E_CACHE (book_cache), EBB_EWS_SYNC_TAG_STAMP_KEY, 
camel_ews_settings_get_sync_tag_stamp (settings), NULL);
+
+       g_clear_object (&book_cache);
+}
+
 static void
 ebb_ews_convert_error_to_client_error (GError **perror)
 {
@@ -3371,6 +3418,7 @@ ebb_ews_get_changes_sync (EBookMetaBackend *meta_backend,
 {
        EBookBackendEws *bbews;
        EBookCache *book_cache;
+       gboolean sync_tag_stamp_changed;
        gboolean success = TRUE;
        GError *local_error = NULL;
 
@@ -3390,6 +3438,10 @@ ebb_ews_get_changes_sync (EBookMetaBackend *meta_backend,
        book_cache = e_book_meta_backend_ref_cache (meta_backend);
        g_return_val_if_fail (E_IS_BOOK_CACHE (book_cache), FALSE);
 
+       sync_tag_stamp_changed = ebb_ews_get_sync_tag_stamp_changed (bbews);
+       if (sync_tag_stamp_changed)
+               last_sync_tag = NULL;
+
        g_rec_mutex_lock (&bbews->priv->cnc_lock);
 
        if (bbews->priv->is_gal) {
@@ -3583,6 +3635,9 @@ ebb_ews_get_changes_sync (EBookMetaBackend *meta_backend,
 
        g_clear_object (&book_cache);
 
+       if (success && sync_tag_stamp_changed)
+               ebb_ews_update_sync_tag_stamp (bbews);
+
        return success;
 }
 
diff --git a/src/EWS/calendar/e-cal-backend-ews.c b/src/EWS/calendar/e-cal-backend-ews.c
index 002b867f..ea7c1f78 100644
--- a/src/EWS/calendar/e-cal-backend-ews.c
+++ b/src/EWS/calendar/e-cal-backend-ews.c
@@ -68,6 +68,8 @@ struct _ECalBackendEwsPrivate {
        gchar *attachments_dir;
 };
 
+#define ECB_EWS_SYNC_TAG_STAMP_KEY "ews-sync-tag-stamp"
+
 #define X_EWS_ORIGINAL_COMP "X-EWS-ORIGINAL-COMP"
 
 #define EWS_MAX_FETCH_COUNT 100
@@ -144,6 +146,51 @@ ecb_ews_get_collection_settings (ECalBackendEws *cbews)
        return CAMEL_EWS_SETTINGS (settings);
 }
 
+static gboolean
+ecb_ews_get_sync_tag_stamp_changed (ECalBackendEws *cbews)
+{
+       CamelEwsSettings *settings;
+       ECalCache *cal_cache;
+       guint sync_tag_stamp;
+
+       settings = ecb_ews_get_collection_settings (cbews);
+       g_return_val_if_fail (settings != NULL, FALSE);
+
+       cal_cache = e_cal_meta_backend_ref_cache (E_CAL_META_BACKEND (cbews));
+       if (!cal_cache)
+               return FALSE;
+
+       sync_tag_stamp = e_cache_get_key_int (E_CACHE (cal_cache), ECB_EWS_SYNC_TAG_STAMP_KEY, NULL);
+       if (sync_tag_stamp == (guint) -1)
+               sync_tag_stamp = 0;
+
+       g_clear_object (&cal_cache);
+
+       return sync_tag_stamp != camel_ews_settings_get_sync_tag_stamp (settings);
+}
+
+static void
+ecb_ews_update_sync_tag_stamp (ECalBackendEws *cbews)
+{
+       CamelEwsSettings *settings;
+       ECalCache *cal_cache;
+       guint sync_tag_stamp;
+
+       settings = ecb_ews_get_collection_settings (cbews);
+       g_return_if_fail (settings != NULL);
+
+       cal_cache = e_cal_meta_backend_ref_cache (E_CAL_META_BACKEND (cbews));
+       if (!cal_cache)
+               return;
+
+       sync_tag_stamp = e_cache_get_key_int (E_CACHE (cal_cache), ECB_EWS_SYNC_TAG_STAMP_KEY, NULL);
+
+       if (sync_tag_stamp != camel_ews_settings_get_sync_tag_stamp (settings))
+               e_cache_set_key_int (E_CACHE (cal_cache), ECB_EWS_SYNC_TAG_STAMP_KEY, 
camel_ews_settings_get_sync_tag_stamp (settings), NULL);
+
+       g_clear_object (&cal_cache);
+}
+
 static GHashTable *
 ecb_ews_get_mail_aliases (ECalBackendEws *cbews)
 {
@@ -1833,6 +1880,7 @@ ecb_ews_get_changes_sync (ECalMetaBackend *meta_backend,
 {
        ECalBackendEws *cbews;
        ECalCache *cal_cache;
+       gboolean sync_tag_stamp_changed;
        gboolean success = TRUE;
        GError *local_error = NULL;
 
@@ -1852,6 +1900,10 @@ ecb_ews_get_changes_sync (ECalMetaBackend *meta_backend,
        cal_cache = e_cal_meta_backend_ref_cache (meta_backend);
        g_return_val_if_fail (E_IS_CAL_CACHE (cal_cache), FALSE);
 
+       sync_tag_stamp_changed = ecb_ews_get_sync_tag_stamp_changed (cbews);
+       if (sync_tag_stamp_changed)
+               last_sync_tag = NULL;
+
        g_rec_mutex_lock (&cbews->priv->cnc_lock);
 
        if (cbews->priv->is_freebusy_calendar) {
@@ -2146,6 +2198,9 @@ ecb_ews_get_changes_sync (ECalMetaBackend *meta_backend,
        ecb_ews_maybe_disconnect_sync (cbews, error, cancellable);
        g_clear_object (&cal_cache);
 
+       if (success && sync_tag_stamp_changed)
+               ecb_ews_update_sync_tag_stamp (cbews);
+
        return success;
 }
 
diff --git a/src/EWS/camel/camel-ews-folder.c b/src/EWS/camel/camel-ews-folder.c
index 574829d9..126fb36a 100644
--- a/src/EWS/camel/camel-ews-folder.c
+++ b/src/EWS/camel/camel-ews-folder.c
@@ -2308,6 +2308,7 @@ ews_refresh_info_sync (CamelFolder *folder,
        GHashTable *updating_summary_uids = NULL;
        EEwsConnection *cnc;
        CamelEwsStore *ews_store;
+       CamelEwsSettings *settings;
        const gchar *full_name;
        gchar *id;
        gchar *sync_state;
@@ -2356,7 +2357,13 @@ 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 = camel_ews_summary_dup_sync_state (CAMEL_EWS_SUMMARY (folder_summary));
+
+       settings = e_ews_connection_ref_settings (cnc);
+
+       if (settings && camel_ews_summary_get_sync_tag_stamp (CAMEL_EWS_SUMMARY (folder_summary)) != 
camel_ews_settings_get_sync_tag_stamp (settings))
+               sync_state = NULL;
+       else
+               sync_state = camel_ews_summary_dup_sync_state (CAMEL_EWS_SUMMARY (folder_summary));
 
        if (!sync_state ||
            camel_ews_summary_get_version (CAMEL_EWS_SUMMARY (folder_summary)) < CAMEL_EWS_SUMMARY_VERSION) {
@@ -2426,6 +2433,8 @@ ews_refresh_info_sync (CamelFolder *folder,
                camel_ews_store_summary_save (ews_store->summary, NULL);
 
                camel_ews_summary_set_sync_state (CAMEL_EWS_SUMMARY (folder_summary), sync_state);
+               if (settings)
+                       camel_ews_summary_set_sync_tag_stamp (CAMEL_EWS_SUMMARY (folder_summary), 
camel_ews_settings_get_sync_tag_stamp (settings));
 
                camel_folder_summary_touch (folder_summary);
 
@@ -2485,6 +2494,7 @@ ews_refresh_info_sync (CamelFolder *folder,
        priv->refreshing = FALSE;
        g_mutex_unlock (&priv->state_lock);
 
+       g_clear_object (&settings);
        g_object_unref (cnc);
        g_free (sync_state);
        g_free (id);
diff --git a/src/EWS/camel/camel-ews-summary.c b/src/EWS/camel/camel-ews-summary.c
index 07bb187e..f6f5ffd2 100644
--- a/src/EWS/camel/camel-ews-summary.c
+++ b/src/EWS/camel/camel-ews-summary.c
@@ -31,6 +31,7 @@ struct _CamelEwsSummaryPrivate {
        GMutex property_lock;
        gchar *sync_state;
        gint32 version;
+       guint sync_tag_stamp;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (CamelEwsSummary, camel_ews_summary, CAMEL_TYPE_FOLDER_SUMMARY)
@@ -102,13 +103,26 @@ summary_header_load (CamelFolderSummary *s,
                return FALSE;
 
        ews_summary->priv->version = 0;
+       ews_summary->priv->sync_tag_stamp = 0;
 
        part = mir->bdata;
 
-       if (part)
+       if (part) {
                EXTRACT_FIRST_DIGIT (ews_summary->priv->version);
 
-       if (part && part++ && strcmp (part, "(null)") &&
+               if (part && !part++)
+                       part = NULL;
+       }
+
+       if (part && strcmp (part, "(null)") &&
+           ews_summary->priv->version >= CAMEL_EWS_SUMMARY_VERSION) {
+               EXTRACT_FIRST_DIGIT (ews_summary->priv->sync_tag_stamp);
+
+               if (part && !part++)
+                       part = NULL;
+       }
+
+       if (part && strcmp (part, "(null)") &&
            ews_summary->priv->version >= CAMEL_EWS_SUMMARY_VERSION) {
                sync_state = part;
        }
@@ -134,14 +148,16 @@ summary_header_save (CamelFolderSummary *s,
        CamelEwsSummary *ews_summary = CAMEL_EWS_SUMMARY (s);
        struct _CamelFIRecord *fir;
        gchar *sync_state;
+       guint sync_tag_stamp;
 
        fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_ews_summary_parent_class)->summary_header_save (s, error);
        if (!fir)
                return NULL;
 
        sync_state = camel_ews_summary_dup_sync_state (ews_summary);
+       sync_tag_stamp = camel_ews_summary_get_sync_tag_stamp (ews_summary);
 
-       fir->bdata = g_strdup_printf ("%d %s", CAMEL_EWS_SUMMARY_VERSION, sync_state);
+       fir->bdata = g_strdup_printf ("%d %u %s", CAMEL_EWS_SUMMARY_VERSION, sync_tag_stamp, sync_state);
 
        g_free (sync_state);
 
@@ -317,3 +333,21 @@ camel_ews_summary_dup_sync_state (CamelEwsSummary *ews_summary)
 
        return sync_state;
 }
+
+guint
+camel_ews_summary_get_sync_tag_stamp (CamelEwsSummary *ews_summary)
+{
+       g_return_val_if_fail (CAMEL_IS_EWS_SUMMARY (ews_summary), 0);
+
+       return ews_summary->priv->sync_tag_stamp;
+}
+
+void
+camel_ews_summary_set_sync_tag_stamp (CamelEwsSummary *ews_summary,
+                                     guint value)
+{
+       g_return_if_fail (CAMEL_IS_EWS_SUMMARY (ews_summary));
+
+       if (ews_summary->priv->sync_tag_stamp != value)
+               ews_summary->priv->sync_tag_stamp = value;
+}
diff --git a/src/EWS/camel/camel-ews-summary.h b/src/EWS/camel/camel-ews-summary.h
index d101450d..46f5d8b0 100644
--- a/src/EWS/camel/camel-ews-summary.h
+++ b/src/EWS/camel/camel-ews-summary.h
@@ -12,7 +12,7 @@
 
 #include "camel-ews-message-info.h"
 
-#define CAMEL_EWS_SUMMARY_VERSION (2)
+#define CAMEL_EWS_SUMMARY_VERSION (3)
 
 /* Standard GObject macros */
 #define CAMEL_TYPE_EWS_SUMMARY \
@@ -70,6 +70,11 @@ gint32       camel_ews_summary_get_version   (CamelEwsSummary *ews_summary);
 void   camel_ews_summary_set_sync_state(CamelEwsSummary *ews_summary,
                                         const gchar *sync_state);
 gchar *        camel_ews_summary_dup_sync_state(CamelEwsSummary *ews_summary);
+guint  camel_ews_summary_get_sync_tag_stamp
+                                       (CamelEwsSummary *ews_summary);
+void   camel_ews_summary_set_sync_tag_stamp
+                                       (CamelEwsSummary *ews_summary,
+                                        guint value);
 
 G_END_DECLS
 
diff --git a/src/EWS/common/camel-ews-settings.c b/src/EWS/common/camel-ews-settings.c
index a4db2b16..e2cbb8a5 100644
--- a/src/EWS/common/camel-ews-settings.c
+++ b/src/EWS/common/camel-ews-settings.c
@@ -26,6 +26,7 @@ struct _CamelEwsSettingsPrivate {
        gchar *oal_selected;
        guint timeout;
        guint concurrent_connections;
+       guint sync_tag_stamp;
        gchar *impersonate_user;
        gboolean override_user_agent;
        gchar *user_agent;
@@ -66,7 +67,8 @@ enum {
        PROP_OAUTH2_RESOURCE_URI,
        PROP_OAUTH2_ENDPOINT_HOST,
        PROP_SHOW_PUBLIC_FOLDERS,
-       PROP_CONCURRENT_CONNECTIONS
+       PROP_CONCURRENT_CONNECTIONS,
+       PROP_SYNC_TAG_STAMP
 };
 
 G_DEFINE_TYPE_WITH_CODE (CamelEwsSettings, camel_ews_settings, CAMEL_TYPE_OFFLINE_SETTINGS,
@@ -276,6 +278,12 @@ ews_settings_set_property (GObject *object,
                                CAMEL_EWS_SETTINGS (object),
                                g_value_get_uint (value));
                        return;
+
+               case PROP_SYNC_TAG_STAMP:
+                       camel_ews_settings_set_sync_tag_stamp (
+                               CAMEL_EWS_SETTINGS (object),
+                               g_value_get_uint (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -483,6 +491,13 @@ ews_settings_get_property (GObject *object,
                                camel_ews_settings_get_concurrent_connections (
                                CAMEL_EWS_SETTINGS (object)));
                        return;
+
+               case PROP_SYNC_TAG_STAMP:
+                       g_value_set_uint (
+                               value,
+                               camel_ews_settings_get_sync_tag_stamp (
+                               CAMEL_EWS_SETTINGS (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -830,6 +845,21 @@ camel_ews_settings_class_init (CamelEwsSettingsClass *class)
                        G_PARAM_CONSTRUCT |
                        G_PARAM_EXPLICIT_NOTIFY |
                        G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_SYNC_TAG_STAMP,
+               g_param_spec_uint (
+                       "sync-tag-stamp",
+                       "Sync Tag Stamp",
+                       "Stamp for synchronization tag",
+                       0,
+                       G_MAXUINT,
+                       0,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -1792,3 +1822,48 @@ camel_ews_settings_set_concurrent_connections (CamelEwsSettings *settings,
 
        g_object_notify (G_OBJECT (settings), "concurrent-connections");
 }
+
+guint
+camel_ews_settings_get_sync_tag_stamp (CamelEwsSettings *settings)
+{
+       guint res;
+
+       g_return_val_if_fail (CAMEL_IS_EWS_SETTINGS (settings), ~0u);
+
+       g_mutex_lock (&settings->priv->property_lock);
+       res = settings->priv->sync_tag_stamp;
+       g_mutex_unlock (&settings->priv->property_lock);
+
+       return res;
+}
+
+void
+camel_ews_settings_set_sync_tag_stamp (CamelEwsSettings *settings,
+                                      guint value)
+{
+       g_return_if_fail (CAMEL_IS_EWS_SETTINGS (settings));
+
+       g_mutex_lock (&settings->priv->property_lock);
+
+       if (settings->priv->sync_tag_stamp == value) {
+               g_mutex_unlock (&settings->priv->property_lock);
+               return;
+       }
+
+       settings->priv->sync_tag_stamp = value;
+       g_mutex_unlock (&settings->priv->property_lock);
+
+       g_object_notify (G_OBJECT (settings), "sync-tag-stamp");
+}
+
+void
+camel_ews_settings_inc_sync_tag_stamp (CamelEwsSettings *settings)
+{
+       g_return_if_fail (CAMEL_IS_EWS_SETTINGS (settings));
+
+       g_mutex_lock (&settings->priv->property_lock);
+       settings->priv->sync_tag_stamp++;
+       g_mutex_unlock (&settings->priv->property_lock);
+
+       g_object_notify (G_OBJECT (settings), "sync-tag-stamp");
+}
diff --git a/src/EWS/common/camel-ews-settings.h b/src/EWS/common/camel-ews-settings.h
index fa884ea5..192f95db 100644
--- a/src/EWS/common/camel-ews-settings.h
+++ b/src/EWS/common/camel-ews-settings.h
@@ -184,7 +184,13 @@ guint              camel_ews_settings_get_concurrent_connections
 void           camel_ews_settings_set_concurrent_connections
                                                (CamelEwsSettings *settings,
                                                 guint concurrent_connections);
-
+guint          camel_ews_settings_get_sync_tag_stamp
+                                               (CamelEwsSettings *settings);
+void           camel_ews_settings_set_sync_tag_stamp
+                                               (CamelEwsSettings *settings,
+                                                guint value);
+void           camel_ews_settings_inc_sync_tag_stamp
+                                               (CamelEwsSettings *settings);
 G_END_DECLS
 
 #endif /* CAMEL_EWS_SETTINGS_H */
diff --git a/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.c 
b/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.c
index 0448a15a..a711cbb3 100644
--- a/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.c
+++ b/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.c
@@ -22,12 +22,14 @@
 
 struct _EMailConfigEwsFolderSizesPagePrivate {
        ESource *account_source;
+       ESource *collection_source;
        ESourceRegistry *registry;
 };
 
 enum {
        PROP_0,
        PROP_ACCOUNT_SOURCE,
+       PROP_COLLECTION_SOURCE,
        PROP_SOURCE_REGISTRY
 };
 
@@ -67,6 +69,26 @@ folder_sizes_clicked_cb (GtkWidget *button,
        g_object_unref (service);
 }
 
+static void
+reset_sync_tags_clicked_cb (GtkWidget *button,
+                           EMailConfigEwsFolderSizesPage *page)
+{
+       ESource *collection_source;
+       ESourceCamel *extension;
+       CamelSettings *settings;
+       const gchar *extension_name;
+
+       collection_source = e_mail_config_ews_folder_sizes_page_get_collection_source (page);
+
+       extension_name = e_source_camel_get_extension_name ("ews");
+       e_source_camel_generate_subtype ("ews", CAMEL_TYPE_EWS_SETTINGS);
+
+       extension = e_source_get_extension (collection_source, extension_name);
+       settings = e_source_camel_get_settings (extension);
+
+       camel_ews_settings_inc_sync_tag_stamp (CAMEL_EWS_SETTINGS (settings));
+}
+
 static void
 mail_config_ews_folder_sizes_page_set_account_source (EMailConfigEwsFolderSizesPage *page,
                                                      ESource *account_source)
@@ -77,6 +99,16 @@ mail_config_ews_folder_sizes_page_set_account_source (EMailConfigEwsFolderSizesP
        page->priv->account_source = g_object_ref (account_source);
 }
 
+static void
+mail_config_ews_folder_sizes_page_set_collection_source (EMailConfigEwsFolderSizesPage *page,
+                                                        ESource *collection_source)
+{
+       g_return_if_fail (E_IS_SOURCE (collection_source));
+       g_return_if_fail (page->priv->collection_source == NULL);
+
+       page->priv->collection_source = g_object_ref (collection_source);
+}
+
 static void
 mail_config_ews_folder_sizes_page_set_source_registry (EMailConfigEwsFolderSizesPage *page,
                                                       ESourceRegistry *registry)
@@ -100,6 +132,12 @@ mail_config_ews_folder_sizes_page_set_property (GObject *object,
                                g_value_get_object (value));
                        return;
 
+               case PROP_COLLECTION_SOURCE:
+                       mail_config_ews_folder_sizes_page_set_collection_source (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object),
+                               g_value_get_object (value));
+                       return;
+
                case PROP_SOURCE_REGISTRY:
                        mail_config_ews_folder_sizes_page_set_source_registry (
                                E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object),
@@ -124,6 +162,13 @@ mail_config_ews_folder_sizes_page_get_property (GObject *object,
                                E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object)));
                        return;
 
+               case PROP_COLLECTION_SOURCE:
+                       g_value_set_object (
+                               value,
+                               e_mail_config_ews_folder_sizes_page_get_collection_source (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object)));
+                       return;
+
                case PROP_SOURCE_REGISTRY:
                        g_value_set_object (
                                value,
@@ -143,6 +188,7 @@ mail_config_ews_folder_sizes_page_dispose (GObject *object)
        ews_page = E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object);
 
        g_clear_object (&ews_page->priv->account_source);
+       g_clear_object (&ews_page->priv->collection_source);
        g_clear_object (&ews_page->priv->registry);
 
        /* Chain up to parent's dispose() method. */
@@ -175,14 +221,55 @@ mail_config_ews_folder_sizes_page_constructed (GObject *object)
        gtk_grid_attach (content_grid, widget, 0, 0, 2, 1);
        g_free (markup);
 
+       widget = gtk_button_new_with_mnemonic (_("Folder _Sizes"));
+       g_object_set (G_OBJECT (widget),
+               "hexpand", FALSE,
+               "halign", GTK_ALIGN_FILL,
+               "vexpand", FALSE,
+               "valign", GTK_ALIGN_START,
+               NULL);
+       g_signal_connect (widget, "clicked", G_CALLBACK (folder_sizes_clicked_cb), page);
+
+       gtk_grid_attach (content_grid, widget, 0, 1, 1, 1);
+
        widget = gtk_label_new (_("View the size of all Exchange folders"));
        gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
-       gtk_grid_attach (content_grid, widget, 0, 1, 1, 1);
+       g_object_set (G_OBJECT (widget),
+               "hexpand", FALSE,
+               "halign", GTK_ALIGN_START,
+               "vexpand", FALSE,
+               "valign", GTK_ALIGN_CENTER,
+               NULL);
 
-       widget = gtk_button_new_with_mnemonic (_("Folder _Sizes"));
-       g_signal_connect (widget, "clicked", G_CALLBACK (folder_sizes_clicked_cb), page);
        gtk_grid_attach (content_grid, widget, 1, 1, 1, 1);
 
+       widget = gtk_button_new_with_mnemonic (_("_Reset Synchronization Tags"));
+       g_object_set (G_OBJECT (widget),
+               "hexpand", FALSE,
+               "halign", GTK_ALIGN_FILL,
+               "vexpand", FALSE,
+               "valign", GTK_ALIGN_START,
+               NULL);
+       g_signal_connect (widget, "clicked", G_CALLBACK (reset_sync_tags_clicked_cb), page);
+
+       gtk_grid_attach (content_grid, widget, 0, 2, 1, 1);
+
+       widget = gtk_label_new (_("Folders can sometimes get out of synchronization, for example after a long 
time not being connected to the server."
+               " By resetting the synchronization tags the folders are updated completely. This does not 
cause download of any already locally stored"
+               " messages. The change will take effect the next time the folders are refreshed."));
+       gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0);
+       g_object_set (G_OBJECT (widget),
+               "hexpand", FALSE,
+               "halign", GTK_ALIGN_START,
+               "vexpand", FALSE,
+               "valign", GTK_ALIGN_CENTER,
+               "wrap", TRUE,
+               "width-chars", 40,
+               "max-width-chars", 60,
+               NULL);
+
+       gtk_grid_attach (content_grid, widget, 1, 2, 1, 1);
+
        gtk_widget_show_all (GTK_WIDGET (main_box));
 
        e_mail_config_page_set_content (E_MAIL_CONFIG_PAGE (page), main_box);
@@ -210,6 +297,17 @@ e_mail_config_ews_folder_sizes_page_class_init (EMailConfigEwsFolderSizesPageCla
                        G_PARAM_READWRITE |
                        G_PARAM_CONSTRUCT_ONLY));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_COLLECTION_SOURCE,
+               g_param_spec_object (
+                       "collection-source",
+                       "Collection Source",
+                       "Collection source being edited",
+                       E_TYPE_SOURCE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT_ONLY));
+
        g_object_class_install_property (
                object_class,
                PROP_SOURCE_REGISTRY,
@@ -251,14 +349,17 @@ e_mail_config_ews_folder_sizes_page_type_register (GTypeModule *type_module)
 
 EMailConfigPage *
 e_mail_config_ews_folder_sizes_page_new (ESource *account_source,
+                                        ESource *collection_source,
                                         ESourceRegistry *registry)
 {
        EMailConfigPage *page;
 
        g_return_val_if_fail (E_IS_SOURCE (account_source), NULL);
+       g_return_val_if_fail (E_IS_SOURCE (collection_source), NULL);
 
        page = g_object_new (E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE,
                "account-source", account_source,
+               "collection-source", collection_source,
                "source-registry", registry,
                NULL);
 
@@ -273,6 +374,14 @@ e_mail_config_ews_folder_sizes_page_get_account_source (EMailConfigEwsFolderSize
        return page->priv->account_source;
 }
 
+ESource *
+e_mail_config_ews_folder_sizes_page_get_collection_source (EMailConfigEwsFolderSizesPage *page)
+{
+       g_return_val_if_fail (E_IS_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (page), NULL);
+
+       return page->priv->collection_source;
+}
+
 ESourceRegistry *
 e_mail_config_ews_folder_sizes_page_get_source_registry (EMailConfigEwsFolderSizesPage *page)
 {
diff --git a/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.h 
b/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.h
index 115b0c04..2102ec5d 100644
--- a/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.h
+++ b/src/EWS/evolution/e-mail-config-ews-folder-sizes-page.h
@@ -49,9 +49,12 @@ struct _EMailConfigEwsFolderSizesPageClass {
 GType                  e_mail_config_ews_folder_sizes_page_get_type            (void) G_GNUC_CONST;
 void                   e_mail_config_ews_folder_sizes_page_type_register       (GTypeModule *type_module);
 EMailConfigPage *      e_mail_config_ews_folder_sizes_page_new                 (ESource *account_source,
+                                                                                ESource *collection_source,
                                                                                 ESourceRegistry *registry);
 
 ESource *              e_mail_config_ews_folder_sizes_page_get_account_source  
(EMailConfigEwsFolderSizesPage *page);
+ESource *              e_mail_config_ews_folder_sizes_page_get_collection_source
+                                                                               
(EMailConfigEwsFolderSizesPage *page);
 ESourceRegistry *      e_mail_config_ews_folder_sizes_page_get_source_registry 
(EMailConfigEwsFolderSizesPage *page);
 
 G_END_DECLS
diff --git a/src/EWS/evolution/e-mail-config-ews-notebook.c b/src/EWS/evolution/e-mail-config-ews-notebook.c
index 0ed6334e..e7a1c8fe 100644
--- a/src/EWS/evolution/e-mail-config-ews-notebook.c
+++ b/src/EWS/evolution/e-mail-config-ews-notebook.c
@@ -82,6 +82,7 @@ mail_config_ews_notebook_constructed (GObject *object)
 
                page = e_mail_config_ews_folder_sizes_page_new (
                        account_source,
+                       collection_source,
                        registry);
                e_mail_config_notebook_add_page (notebook, page);
        }


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