[epiphany/wip/sync: 16/31] synchronizable: Use JsonNode * in _to/from_bso()



commit bb1af562a27cdf30047e343a11ff3fbf2a2be47f
Author: Gabriel Ivascu <ivascu gabriel59 gmail com>
Date:   Wed Apr 12 16:38:57 2017 +0300

    synchronizable: Use JsonNode * in _to/from_bso()

 src/bookmarks/ephy-bookmark.c  |   11 ++++-------
 src/sync/ephy-sync-service.c   |   32 +++++++++-----------------------
 src/sync/ephy-synchronizable.c |   34 ++++++++++++++++++++--------------
 src/sync/ephy-synchronizable.h |    6 +++---
 4 files changed, 36 insertions(+), 47 deletions(-)
---
diff --git a/src/bookmarks/ephy-bookmark.c b/src/bookmarks/ephy-bookmark.c
index 262cf8d..50bef8c 100644
--- a/src/bookmarks/ephy-bookmark.c
+++ b/src/bookmarks/ephy-bookmark.c
@@ -414,28 +414,25 @@ ephy_bookmark_synchronizable_set_is_uploaded (EphySynchronizable *synchronizable
   bookmark->uploaded = uploaded;
 }
 
-static char *
+static JsonNode *
 ephy_bookmark_synchronizable_to_bso (EphySynchronizable  *synchronizable,
                                      SyncCryptoKeyBundle *bundle)
 {
   EphyBookmark *bookmark = EPHY_BOOKMARK (synchronizable);
-  JsonNode *node;
+  JsonNode *bso;
   JsonObject *object;
-  char *bso;
   char *serialized;
   char *payload;
 
   serialized = json_gobject_to_data (G_OBJECT (bookmark), NULL);
   payload = ephy_sync_crypto_encrypt_record (serialized, bundle);
-  node = json_node_new (JSON_NODE_OBJECT);
+  bso = json_node_new (JSON_NODE_OBJECT);
   object = json_object_new ();
   json_object_set_string_member (object, "id", bookmark->id);
   json_object_set_string_member (object, "payload", payload);
-  json_node_set_object (node, object);
-  bso = json_to_string (node, FALSE);
+  json_node_set_object (bso, object);
 
   json_object_unref (object);
-  json_node_unref (node);
   g_free (payload);
   g_free (serialized);
 
diff --git a/src/sync/ephy-sync-service.c b/src/sync/ephy-sync-service.c
index 85a0124..8d03f70 100644
--- a/src/sync/ephy-sync-service.c
+++ b/src/sync/ephy-sync-service.c
@@ -1471,7 +1471,6 @@ download_synchronizable_cb (SoupSession *session,
   SyncCryptoKeyBundle *bundle;
   SyncAsyncData *data;
   JsonNode *node;
-  JsonObject *bso;
   GError *error = NULL;
   GType type;
   const char *collection;
@@ -1492,16 +1491,11 @@ download_synchronizable_cb (SoupSession *session,
     g_error_free (error);
     goto free_node;
   }
-  if (!JSON_NODE_HOLDS_OBJECT (node)) {
-    g_warning ("JSON root does not hold a JSON object");
-    goto free_node;
-  }
 
-  bso = json_node_get_object (node);
   type = ephy_synchronizable_manager_get_synchronizable_type (data->manager);
   collection = ephy_synchronizable_manager_get_collection_name (data->manager);
   bundle = ephy_sync_service_get_key_bundle (self, collection);
-  synchronizable = EPHY_SYNCHRONIZABLE (ephy_synchronizable_from_bso (bso, type, bundle, &is_deleted));
+  synchronizable = EPHY_SYNCHRONIZABLE (ephy_synchronizable_from_bso (node, type, bundle, &is_deleted));
   if (!synchronizable) {
     g_warning ("Failed to create synchronizable object from BSO");
     goto free_bundle;
@@ -1591,8 +1585,9 @@ ephy_sync_service_upload_synchronizable (EphySyncService           *self,
 {
   SyncCryptoKeyBundle *bundle;
   SyncAsyncData *data;
-  char *bso;
+  JsonNode *bso;
   char *endpoint;
+  char *body;
   const char *collection;
   const char *id;
 
@@ -1603,23 +1598,19 @@ ephy_sync_service_upload_synchronizable (EphySyncService           *self,
   collection = ephy_synchronizable_manager_get_collection_name (manager);
   bundle = ephy_sync_service_get_key_bundle (self, collection);
   bso = ephy_synchronizable_to_bso (synchronizable, bundle);
-  if (!bso) {
-    g_warning ("Failed to convert synchronizable to BSO");
-    goto out;
-  }
-
   id = ephy_synchronizable_get_id (synchronizable);
   endpoint = g_strdup_printf ("storage/%s/%s", collection, id);
   data = sync_async_data_new (manager, synchronizable);
+  body = json_to_string (bso, FALSE);
 
   LOG ("Uploading object with id %s...", id);
-  ephy_sync_service_queue_storage_request (self, endpoint, SOUP_METHOD_PUT, bso, -1,
+  ephy_sync_service_queue_storage_request (self, endpoint, SOUP_METHOD_PUT, body, -1,
                                            ephy_synchronizable_get_modification_time (synchronizable),
                                            upload_synchronizable_cb, data);
 
+  g_free (body);
   g_free (endpoint);
-  g_free (bso);
-out:
+  json_node_unref (bso);
   ephy_sync_crypto_key_bundle_free (bundle);
 }
 
@@ -1634,7 +1625,6 @@ sync_collection_cb (SoupSession *session,
   SyncCryptoKeyBundle *bundle;
   JsonNode *node = NULL;
   JsonArray *array;
-  JsonObject *object;
   GError *error = NULL;
   GList *remotes_updated = NULL;
   GList *remotes_deleted = NULL;
@@ -1676,12 +1666,8 @@ sync_collection_cb (SoupSession *session,
   array = json_node_get_array (node);
 
   for (guint i = 0; i < json_array_get_length (array); i++) {
-    if (!JSON_NODE_HOLDS_OBJECT (json_array_get_element (array, i))) {
-      g_warning ("Array member does not hold a JSON object, skipping...");
-      continue;
-    }
-    object = json_node_get_object (json_array_get_element (array, i));
-    remote = EPHY_SYNCHRONIZABLE (ephy_synchronizable_from_bso (object, type, bundle, &is_deleted));
+    remote = EPHY_SYNCHRONIZABLE (ephy_synchronizable_from_bso (json_array_get_element (array, i),
+                                                                type, bundle, &is_deleted));
     if (!remote) {
       g_warning ("Failed to create synchronizable object from BSO, skipping...");
       continue;
diff --git a/src/sync/ephy-synchronizable.c b/src/sync/ephy-synchronizable.c
index dbe3e7f..c002687 100644
--- a/src/sync/ephy-synchronizable.c
+++ b/src/sync/ephy-synchronizable.c
@@ -167,9 +167,9 @@ ephy_synchronizable_set_is_uploaded (EphySynchronizable *synchronizable,
  * (https://docs.services.mozilla.com/storage/apis-1.5.html#basic-storage-object)
  * for more details.
  *
- * Return value: (transfer full): @synchronizable's BSO's JSON string representation
+ * Return value: (transfer full): @synchronizable's BSO representation as a #JsonNode
  **/
-char *
+JsonNode *
 ephy_synchronizable_to_bso (EphySynchronizable  *synchronizable,
                             SyncCryptoKeyBundle *bundle)
 {
@@ -184,7 +184,7 @@ ephy_synchronizable_to_bso (EphySynchronizable  *synchronizable,
 
 /**
  * ephy_synchronizable_from_bso:
- * @bso: a JSON object representing the Basic Storage Object
+ * @bso: a #JsonNode representing the Basic Storage Object
  * @gtype: the #GType of object to construct
  * @bundle: a %SyncCryptoKeyBundle holding the encryption key and the HMAC key
  *          used to validate and decrypt the Basic Storage Object
@@ -203,7 +203,7 @@ ephy_synchronizable_to_bso (EphySynchronizable  *synchronizable,
  *  Return value: (transfer full): a #GObject or %NULL
  **/
 GObject *
-ephy_synchronizable_from_bso (JsonObject          *bso,
+ephy_synchronizable_from_bso (JsonNode            *bso,
                               GType                gtype,
                               SyncCryptoKeyBundle *bundle,
                               gboolean            *is_deleted)
@@ -212,6 +212,7 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
   GError *error = NULL;
   JsonNode *node;
   JsonObject *json;
+  JsonObject *record;
   char *serialized;
   const char *payload;
   double modified;
@@ -220,15 +221,19 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
   g_return_val_if_fail (bundle, NULL);
   g_return_val_if_fail (is_deleted, NULL);
 
-  if (!json_object_has_member (bso, "id") ||
-      !json_object_has_member (bso, "payload") ||
-      !json_object_has_member (bso, "modified")) {
+  if (!JSON_NODE_HOLDS_OBJECT (bso))
+    goto out;
+
+  json = json_node_get_object (bso);
+  if (!json_object_has_member (json, "id") ||
+      !json_object_has_member (json, "payload") ||
+      !json_object_has_member (json, "modified")) {
     g_warning ("BSO has missing members");
     goto out;
   }
 
-  payload = json_object_get_string_member (bso, "payload");
-  modified = json_object_get_double_member (bso, "modified");
+  payload = json_object_get_string_member (json, "payload");
+  modified = json_object_get_double_member (json, "modified");
   serialized = ephy_sync_crypto_decrypt_record (payload, bundle);
   if (!serialized) {
     g_warning ("Failed to decrypt the BSO payload");
@@ -239,16 +244,16 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
   if (error) {
     g_warning ("Decrypted text is not a valid JSON: %s", error->message);
     g_error_free (error);
-    goto free_node;
+    goto free_serialized;
   }
   if (!JSON_NODE_HOLDS_OBJECT (node)) {
     g_warning ("JSON root does not hold a JSON object");
     goto free_node;
   }
-  json = json_node_get_object (node);
-  if (json_object_has_member (json, "deleted")) {
-    if (JSON_NODE_HOLDS_VALUE (json_object_get_member (json, "deleted")))
-      *is_deleted = json_object_get_boolean_member (json, "deleted");
+  record = json_node_get_object (node);
+  if (json_object_has_member (record, "deleted")) {
+    if (JSON_NODE_HOLDS_VALUE (json_object_get_member (record, "deleted")))
+      *is_deleted = json_object_get_boolean_member (record, "deleted");
   } else {
     *is_deleted = FALSE;
   }
@@ -265,6 +270,7 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
 
 free_node:
   json_node_unref (node);
+free_serialized:
   g_free (serialized);
 out:
   return object;
diff --git a/src/sync/ephy-synchronizable.h b/src/sync/ephy-synchronizable.h
index 20ad4d6..cac6b04 100644
--- a/src/sync/ephy-synchronizable.h
+++ b/src/sync/ephy-synchronizable.h
@@ -50,7 +50,7 @@ struct _EphySynchronizableInterface {
   void         (*set_is_uploaded)         (EphySynchronizable  *synchronizable,
                                            gboolean             uploaded);
 
-  char *       (*to_bso)                  (EphySynchronizable  *synchronizable,
+  JsonNode *   (*to_bso)                  (EphySynchronizable  *synchronizable,
                                            SyncCryptoKeyBundle *bundle);
 };
 
@@ -63,11 +63,11 @@ void                 ephy_synchronizable_set_modification_time  (EphySynchroniza
 gboolean             ephy_synchronizable_is_uploaded            (EphySynchronizable  *synchronizable);
 void                 ephy_synchronizable_set_is_uploaded        (EphySynchronizable  *synchronizable,
                                                                  gboolean             uploaded);
-char                *ephy_synchronizable_to_bso                 (EphySynchronizable  *synchronizable,
+JsonNode            *ephy_synchronizable_to_bso                 (EphySynchronizable  *synchronizable,
                                                                  SyncCryptoKeyBundle *bundle);
 /* This can't be an interface method because we lack the EphySynchronizable object.
  * Think of it as more of an utility function. */
-GObject             *ephy_synchronizable_from_bso               (JsonObject          *bso,
+GObject             *ephy_synchronizable_from_bso               (JsonNode            *bso,
                                                                  GType                gtype,
                                                                  SyncCryptoKeyBundle *bundle,
                                                                  gboolean            *is_deleted);


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