[evolution-data-server] Bug #672899 - Renaming Google book group doesn't propagate to category



commit 0f59394b6173f3f2922f93acea41a416318d3cce
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jul 29 16:00:51 2013 +0200

    Bug #672899 - Renaming Google book group doesn't propagate to category

 .../backends/google/e-book-backend-google.c        |   73 +++++++++++++++++++-
 1 files changed, 71 insertions(+), 2 deletions(-)
---
diff --git a/addressbook/backends/google/e-book-backend-google.c 
b/addressbook/backends/google/e-book-backend-google.c
index 8544900..a0627ff 100644
--- a/addressbook/backends/google/e-book-backend-google.c
+++ b/addressbook/backends/google/e-book-backend-google.c
@@ -77,6 +77,9 @@ struct _EBookBackendGooglePrivate {
 
        /* Map of active opids to GCancellables */
        GHashTable *cancellables;
+
+       /* Did the server-side groups change? If so, re-download the book */
+       gboolean groups_changed;
 };
 
 static void
@@ -384,13 +387,64 @@ cache_set_last_update (EBookBackend *backend,
 
        priv = E_BOOK_BACKEND_GOOGLE_GET_PRIVATE (backend);
 
-       _time = g_time_val_to_iso8601 (tv);
+       if (tv)
+               _time = g_time_val_to_iso8601 (tv);
+       else
+               _time = NULL;
+
        g_mutex_lock (&priv->cache_lock);
-       e_book_backend_cache_set_time (priv->cache, _time);
+       if (tv)
+               e_book_backend_cache_set_time (priv->cache, _time);
+       else
+               e_file_cache_remove_object (E_FILE_CACHE (priv->cache), "last_update_time");
        g_mutex_unlock (&priv->cache_lock);
        g_free (_time);
 }
 
+/* returns whether group changed from the one stored in the cache;
+   returns FALSE, if the group was not in the cache yet;
+   also adds the group into the cache;
+   use group_name = NULL to remove it from the cache.
+ */
+static gboolean
+cache_update_group (EBookBackend *backend,
+                   const gchar *group_id,
+                   const gchar *group_name)
+{
+       EBookBackendGooglePrivate *priv;
+       EFileCache *file_cache;
+       gboolean changed;
+       gchar *key;
+
+       g_return_val_if_fail (E_IS_BOOK_BACKEND_GOOGLE (backend), FALSE);
+       g_return_val_if_fail (group_id != NULL, FALSE);
+
+       priv = E_BOOK_BACKEND_GOOGLE_GET_PRIVATE (backend);
+       key = g_strconcat ("google-group", ":", group_id, NULL);
+
+       g_mutex_lock (&priv->cache_lock);
+
+       file_cache = E_FILE_CACHE (priv->cache);
+
+       if (group_name) {
+               const gchar *old_value;
+
+               old_value = e_file_cache_get_object (file_cache, key);
+               changed = old_value && g_strcmp0 (old_value, group_name) != 0;
+
+               if (!e_file_cache_replace_object (file_cache, key, group_name))
+                       e_file_cache_add_object (file_cache, key, group_name);
+       } else {
+               changed = e_file_cache_remove_object (file_cache, key);
+       }
+
+       g_mutex_unlock (&priv->cache_lock);
+
+       g_free (key);
+
+       return changed;
+}
+
 static gboolean
 backend_is_authorized (EBookBackend *backend)
 {
@@ -850,10 +904,14 @@ process_group (GDataEntry *entry,
                g_debug ("Processing (deleting) group %s, %s", uid, name);
                g_hash_table_remove (priv->groups_by_id, uid);
                g_hash_table_remove (priv->groups_by_name, name);
+
+               priv->groups_changed = cache_update_group (backend, uid, NULL) || priv->groups_changed;
        } else {
                g_debug ("Processing group %s, %s", uid, name);
                g_hash_table_replace (priv->groups_by_id, e_contact_sanitise_google_group_id (uid), g_strdup 
(name));
                g_hash_table_replace (priv->groups_by_name, g_strdup (name), 
e_contact_sanitise_google_group_id (uid));
+
+               priv->groups_changed = cache_update_group (backend, uid, name) || priv->groups_changed;
        }
 
        g_free (name);
@@ -886,6 +944,15 @@ get_groups_cb (GDataService *service,
        }
 
        finish_operation (backend, -2, gdata_error);
+
+       if (priv->groups_changed) {
+               priv->groups_changed = FALSE;
+
+               /* do the update for all contacts, like with an empty cache */
+               cache_set_last_update (backend, NULL);
+               get_new_contacts (backend);
+       }
+
        g_object_unref (backend);
 
        g_clear_error (&gdata_error);
@@ -912,6 +979,8 @@ get_groups (EBookBackend *backend)
 
        g_object_ref (backend);
 
+       priv->groups_changed = FALSE;
+
        /* Run the query asynchronously */
        cancellable = start_operation (backend, -2, NULL, _("Querying for updated groups…"));
        gdata_contacts_service_query_groups_async (


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