[epiphany/wip/sync: 3/4] synchronizable-manager: Make _merge_remotes() return a GList



commit fdf3a7b7e4632f30132587342fa0bb56f4b45d42
Author: Gabriel Ivascu <ivascu gabriel59 gmail com>
Date:   Sun Apr 2 22:12:21 2017 +0300

    synchronizable-manager: Make _merge_remotes() return a GList
    
    Also, let the sync service destroy the content of the lists passed to
    ephy_synchronizable_manager_merge_remotes().

 src/bookmarks/ephy-bookmarks-manager.c |   20 ++++-----
 src/sync/ephy-sync-service.c           |   12 +++---
 src/sync/ephy-synchronizable-manager.c |   21 +++++-----
 src/sync/ephy-synchronizable-manager.h |   66 +++++++++++++++----------------
 4 files changed, 57 insertions(+), 62 deletions(-)
---
diff --git a/src/bookmarks/ephy-bookmarks-manager.c b/src/bookmarks/ephy-bookmarks-manager.c
index 97bf7b1..b61c20f 100644
--- a/src/bookmarks/ephy-bookmarks-manager.c
+++ b/src/bookmarks/ephy-bookmarks-manager.c
@@ -307,12 +307,11 @@ synchronizable_manager_remove (EphySynchronizableManager *manager,
   ephy_bookmarks_manager_remove_bookmark (self, bookmark);
 }
 
-static void
+static GList *
 synchronizable_manager_merge_remotes (EphySynchronizableManager  *manager,
                                       gboolean                    is_initial,
                                       GList                      *remotes_deleted,
-                                      GList                      *remotes_updated,
-                                      GList                     **to_upload)
+                                      GList                      *remotes_updated)
 {
   EphyBookmarksManager *self;
   EphyBookmark *remote;
@@ -320,6 +319,7 @@ synchronizable_manager_merge_remotes (EphySynchronizableManager  *manager,
   GSequence *bookmarks;
   GSequenceIter *iter;
   GHashTable *handled;
+  GList *to_upload = NULL;
   char *type;
   char *parent_id;
   const char *id;
@@ -336,13 +336,11 @@ synchronizable_manager_merge_remotes (EphySynchronizableManager  *manager,
     id = ephy_bookmark_get_id (remote);
     local = ephy_bookmarks_manager_get_bookmark_by_id (self, id);
 
-    if (!local) {
-      g_object_unref (remote);
+    if (!local)
       continue;
-    }
 
     if (ephy_bookmark_get_modification_time (local) > ephy_bookmark_get_modification_time (remote)) {
-      *to_upload = g_list_prepend (*to_upload, local);
+      to_upload = g_list_prepend (to_upload, local);
       g_hash_table_add (handled, (char *)id);
     } else {
       ephy_bookmarks_manager_remove_bookmark (self, local);
@@ -378,7 +376,7 @@ handle_updated:
         ephy_bookmarks_manager_create_tags_from_bookmark (self, remote);
       } else if (ephy_bookmark_get_modification_time (local) > ephy_bookmark_get_modification_time (remote)) 
{
         ephy_bookmarks_manager_create_tags_from_bookmark (self, remote);
-        *to_upload = g_list_prepend (*to_upload, local);
+        to_upload = g_list_prepend (to_upload, local);
       }
     }
 
@@ -386,7 +384,6 @@ handle_updated:
 next:
     g_free(type);
     g_free(parent_id);
-    g_object_unref (remote);
   }
 
   /* Upload unhandled bookmarks to server. */
@@ -398,7 +395,7 @@ next:
     id = ephy_bookmark_get_id (local);
     if (!g_hash_table_contains (handled, id)) {
       if (is_initial || (!is_initial && !ephy_bookmark_is_uploaded (local)))
-        *to_upload = g_list_prepend (*to_upload, local);
+        to_upload = g_list_prepend (to_upload, local);
     }
   }
 
@@ -406,8 +403,9 @@ next:
   ephy_bookmarks_manager_save_to_file_async (self, NULL,
                                              
(GAsyncReadyCallback)ephy_bookmarks_manager_save_to_file_warn_on_error_cb,
                                              NULL);
+  g_hash_table_destroy (handled);
 
-  g_hash_table_unref (handled);
+  return to_upload;
 }
 
 static void
diff --git a/src/sync/ephy-sync-service.c b/src/sync/ephy-sync-service.c
index ff86120..4f9606b 100644
--- a/src/sync/ephy-sync-service.c
+++ b/src/sync/ephy-sync-service.c
@@ -1426,7 +1426,7 @@ sync_collection_cb (SoupSession *session,
   GError *error = NULL;
   GList *remotes_updated = NULL;
   GList *remotes_deleted = NULL;
-  GList *to_upload = NULL;
+  GList *to_upload;
   GType type;
   const char *collection;
   const char *timestamp;
@@ -1483,8 +1483,8 @@ sync_collection_cb (SoupSession *session,
   }
 
 merge_remotes:
-  ephy_synchronizable_manager_merge_remotes (data->manager, data->is_initial,
-                                             remotes_deleted, remotes_updated, &to_upload);
+  to_upload = ephy_synchronizable_manager_merge_remotes (data->manager, data->is_initial,
+                                                         remotes_deleted, remotes_updated);
 
   if (to_upload) {
     LOG ("Uploading local objects to server...");
@@ -1499,9 +1499,9 @@ merge_remotes:
   timestamp = soup_message_headers_get_one (msg->response_headers, "X-Weave-Timestamp");
   ephy_synchronizable_manager_set_sync_time (data->manager, g_ascii_strtod (timestamp, NULL));
 
-  g_list_free (to_upload);
-  g_list_free (remotes_updated);
-  g_list_free (remotes_deleted);
+  g_list_free_full (to_upload, g_object_unref);
+  g_list_free_full (remotes_updated, g_object_unref);
+  g_list_free_full (remotes_deleted, g_object_unref);
 free_parser:
   if (parser)
     g_object_unref (parser);
diff --git a/src/sync/ephy-synchronizable-manager.c b/src/sync/ephy-synchronizable-manager.c
index f110587..a114359 100644
--- a/src/sync/ephy-synchronizable-manager.c
+++ b/src/sync/ephy-synchronizable-manager.c
@@ -203,24 +203,23 @@ ephy_synchronizable_manager_remove (EphySynchronizableManager *manager,
  *                   objects that were removed remotely from the server.
  * @remotes_updated: (transfer none): a #GList holding the #EphySynchronizable
  *                   objects that were updated remotely on the server.
- * @to_upload: (transfer full): an address of a #GList where to put the
- *             #EphySynchronizable objects that need to be re-uploaded to server.
  *
  * Merges a list of remote-deleted objects and a list of remote-updated objects
  * with the local objects in @manager's collection.
+ *
+ * Return value: (transfer full): a #GList holding the #EphySynchronizable
+ *               objects that need to be re-uploaded to server.
  **/
-void
-ephy_synchronizable_manager_merge_remotes (EphySynchronizableManager  *manager,
-                                           gboolean                    is_initial,
-                                           GList                      *remotes_deleted,
-                                           GList                      *remotes_updated,
-                                           GList                     **to_upload)
+GList *
+ephy_synchronizable_manager_merge_remotes (EphySynchronizableManager *manager,
+                                           gboolean                   is_initial,
+                                           GList                     *remotes_deleted,
+                                           GList                     *remotes_updated)
 {
   EphySynchronizableManagerInterface *iface;
 
-  g_return_if_fail (EPHY_IS_SYNCHRONIZABLE_MANAGER (manager));
-  g_return_if_fail (to_upload);
+  g_return_val_if_fail (EPHY_IS_SYNCHRONIZABLE_MANAGER (manager), NULL);
 
   iface = EPHY_SYNCHRONIZABLE_MANAGER_GET_IFACE (manager);
-  iface->merge_remotes (manager, is_initial, remotes_deleted, remotes_updated, to_upload);
+  return iface->merge_remotes (manager, is_initial, remotes_deleted, remotes_updated);
 }
diff --git a/src/sync/ephy-synchronizable-manager.h b/src/sync/ephy-synchronizable-manager.h
index 3ae101a..5ab4c05 100644
--- a/src/sync/ephy-synchronizable-manager.h
+++ b/src/sync/ephy-synchronizable-manager.h
@@ -33,45 +33,43 @@ G_DECLARE_INTERFACE (EphySynchronizableManager, ephy_synchronizable_manager, EPH
 struct _EphySynchronizableManagerInterface {
   GTypeInterface parent_iface;
 
-  const char         * (*get_collection_name)     (EphySynchronizableManager  *manager);
-  GType                (*get_synchronizable_type) (EphySynchronizableManager  *manager);
+  const char         * (*get_collection_name)     (EphySynchronizableManager *manager);
+  GType                (*get_synchronizable_type) (EphySynchronizableManager *manager);
 
-  gboolean             (*is_initial_sync)         (EphySynchronizableManager  *manager);
-  void                 (*set_is_initial_sync)     (EphySynchronizableManager  *manager,
-                                                   gboolean                    is_initial);
+  gboolean             (*is_initial_sync)         (EphySynchronizableManager *manager);
+  void                 (*set_is_initial_sync)     (EphySynchronizableManager *manager,
+                                                   gboolean                   is_initial);
 
-  double               (*get_sync_time)           (EphySynchronizableManager  *manager);
-  void                 (*set_sync_time)           (EphySynchronizableManager  *manager,
-                                                   double                      sync_time);
+  double               (*get_sync_time)           (EphySynchronizableManager *manager);
+  void                 (*set_sync_time)           (EphySynchronizableManager *manager,
+                                                   double                     sync_time);
 
-  void                 (*add)                     (EphySynchronizableManager  *manager,
-                                                   EphySynchronizable         *synchronizable);
-  void                 (*remove)                  (EphySynchronizableManager  *manager,
-                                                   EphySynchronizable         *synchronizable);
+  void                 (*add)                     (EphySynchronizableManager *manager,
+                                                   EphySynchronizable        *synchronizable);
+  void                 (*remove)                  (EphySynchronizableManager *manager,
+                                                   EphySynchronizable        *synchronizable);
 
-  void                 (*merge_remotes)           (EphySynchronizableManager  *manager,
-                                                   gboolean                    is_initial,
-                                                   GList                      *remotes_deleted,
-                                                   GList                      *remotes_updated,
-                                                   GList                     **to_upload);
+  GList              * (*merge_remotes)           (EphySynchronizableManager *manager,
+                                                   gboolean                   is_initial,
+                                                   GList                     *remotes_deleted,
+                                                   GList                     *remotes_updated);
 };
 
-const char         *ephy_synchronizable_manager_get_collection_name     (EphySynchronizableManager  
*manager);
-GType               ephy_synchronizable_manager_get_synchronizable_type (EphySynchronizableManager  
*manager);
-gboolean            ephy_synchronizable_manager_is_initial_sync         (EphySynchronizableManager  
*manager);
-void                ephy_synchronizable_manager_set_is_initial_sync     (EphySynchronizableManager  *manager,
-                                                                         gboolean                    
is_initial);
-double              ephy_synchronizable_manager_get_sync_time           (EphySynchronizableManager  
*manager);
-void                ephy_synchronizable_manager_set_sync_time           (EphySynchronizableManager  *manager,
-                                                                         double                      
sync_time);
-void                ephy_synchronizable_manager_add                     (EphySynchronizableManager  *manager,
-                                                                         EphySynchronizable         
*synchronizable);
-void                ephy_synchronizable_manager_remove                  (EphySynchronizableManager  *manager,
-                                                                         EphySynchronizable         
*synchronizable);
-void                ephy_synchronizable_manager_merge_remotes           (EphySynchronizableManager  *manager,
-                                                                         gboolean                    
is_initial,
-                                                                         GList                      
*remotes_deleted,
-                                                                         GList                      
*remotes_updated,
-                                                                         GList                     
**to_upload);
+const char         *ephy_synchronizable_manager_get_collection_name     (EphySynchronizableManager *manager);
+GType               ephy_synchronizable_manager_get_synchronizable_type (EphySynchronizableManager *manager);
+gboolean            ephy_synchronizable_manager_is_initial_sync         (EphySynchronizableManager *manager);
+void                ephy_synchronizable_manager_set_is_initial_sync     (EphySynchronizableManager *manager,
+                                                                         gboolean                   
is_initial);
+double              ephy_synchronizable_manager_get_sync_time           (EphySynchronizableManager *manager);
+void                ephy_synchronizable_manager_set_sync_time           (EphySynchronizableManager *manager,
+                                                                         double                     
sync_time);
+void                ephy_synchronizable_manager_add                     (EphySynchronizableManager *manager,
+                                                                         EphySynchronizable        
*synchronizable);
+void                ephy_synchronizable_manager_remove                  (EphySynchronizableManager *manager,
+                                                                         EphySynchronizable        
*synchronizable);
+GList              *ephy_synchronizable_manager_merge_remotes           (EphySynchronizableManager *manager,
+                                                                         gboolean                   
is_initial,
+                                                                         GList                     
*remotes_deleted,
+                                                                         GList                     
*remotes_updated);
 
 G_END_DECLS


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