[evolution-ews] Clean up resync code path in ews_update_items_thread()



commit c3c88442d41cf3accd935db2e2b72217075e6c24
Author: David Woodhouse <David Woodhouse intel com>
Date:   Tue Sep 9 15:40:53 2014 +0100

    Clean up resync code path in ews_update_items_thread()
    
    Stop it being so much of a special case; just populate an 'items to be
    deleted' list with everything that's currently known, set the sync_state
    to NULL and loop again.

 src/addressbook/e-book-backend-ews.c |   66 +++++++++------------------------
 1 files changed, 18 insertions(+), 48 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c
index 432bd41..d1075e5 100644
--- a/src/addressbook/e-book-backend-ews.c
+++ b/src/addressbook/e-book-backend-ews.c
@@ -3102,30 +3102,6 @@ cleanup:
        return ret;
 }
 
-static void
-ebews_forget_all_contacts (EBookBackendEws *ebews)
-{
-       EBookBackend *backend;
-       GSList *ids = NULL;
-
-       g_return_if_fail (E_IS_BOOK_BACKEND_EWS (ebews));
-
-       backend = E_BOOK_BACKEND (ebews);
-       g_return_if_fail (backend != NULL);
-
-       e_book_sqlite_search_uids (ebews->priv->summary, NULL, &ids, ebews->priv->cancellable, NULL);
-       if (ids) {
-               GSList *id;
-
-               e_book_sqlite_remove_contacts (ebews->priv->summary, ids, ebews->priv->cancellable, NULL);
-               for (id = ids; id; id = id->next) {
-                       e_book_backend_notify_remove (backend, id->data);
-               }
-
-               g_slist_free_full (ids, g_free);
-       }
-}
-
 static gboolean
 ebews_start_sync (gpointer data)
 {
@@ -3722,6 +3698,7 @@ ews_update_items_thread (gpointer data)
        GSList *items_created = NULL;
        GSList *items_updated = NULL;
        GSList *items_deleted = NULL;
+       GSList *items_deleted_resync = NULL;
        GSList *contacts_created = NULL;
        GSList *contacts_updated = NULL;
 
@@ -3755,32 +3732,20 @@ ews_update_items_thread (gpointer data)
                if (error != NULL) {
                        if (g_error_matches (error, EWS_CONNECTION_ERROR, 
EWS_CONNECTION_ERROR_INVALIDSYNCSTATEDATA)) {
                                g_clear_error (&error);
-                               e_book_sqlite_set_key_value (priv->summary, E_BOOK_SQL_SYNC_DATA_KEY, NULL, 
&error);
-                               if (error != NULL)
-                                       break;
-                               ebews_bump_revision (ebews, &error);
-
-                               ebews_forget_all_contacts (ebews);
-
-                               if (!e_ews_connection_sync_folder_items_sync (
-                                               priv->cnc,
-                                               EWS_PRIORITY_MEDIUM,
-                                               NULL,
-                                               priv->folder_id,
-                                               "IdOnly",
-                                               NULL,
-                                               EWS_MAX_FETCH_COUNT,
-                                               &sync_state,
-                                               &includes_last_item,
-                                               &items_created,
-                                               &items_updated,
-                                               &items_deleted,
-                                               priv->cancellable,
-                                               &error))
-                                       break;
-                       } else {
+
+                               if (!e_book_sqlite_search_uids (priv->summary, NULL, &items_deleted_resync,
+                                                               priv->cancellable, &error))
                                        break;
+
+                               /* This should be the case anyway, but make sure */
+                               sync_state = NULL;
+
+                               /* Ensure we go round the loop again */
+                               includes_last_item = FALSE;
+                               continue;
                        }
+                       /* Other error */
+                       break;
                }
 
                if (items_created) {
@@ -3808,6 +3773,10 @@ ews_update_items_thread (gpointer data)
                }
 
                /* Network traffic is done, and database access starts here */
+               if (items_deleted_resync &&
+                   !ebews_sync_deleted_items (ebews, &items_deleted_resync, priv->cancellable, &error))
+                       break;
+
                if (items_deleted &&
                    !ebews_sync_deleted_items (ebews, &items_deleted, priv->cancellable, &error))
                        break;
@@ -3835,6 +3804,7 @@ ews_update_items_thread (gpointer data)
        g_slist_free_full (items_created, g_object_unref);
        g_slist_free_full (items_updated, g_object_unref);
        g_slist_free_full (items_deleted, g_object_unref);
+       g_slist_free_full (items_deleted_resync, g_object_unref);
        g_slist_free_full (contacts_created, g_object_unref);
        g_slist_free_full (contacts_updated, g_object_unref);
 


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