[epiphany/wip/sync: 7/31] sync: Replace json_parser_load_from_data() with json_from_string() where parser is not reused



commit 579f4a303e0ed1d6e89cd2c2c0b4d28e89b0db0f
Author: Gabriel Ivascu <ivascu gabriel59 gmail com>
Date:   Wed Apr 5 11:52:21 2017 +0300

    sync: Replace json_parser_load_from_data() with json_from_string() where parser is not reused

 src/prefs-dialog.c             |   15 ++++----
 src/sync/ephy-sync-crypto.c    |   28 ++++++++-------
 src/sync/ephy-sync-secret.c    |   18 +++-------
 src/sync/ephy-sync-service.c   |   72 ++++++++++++++++++----------------------
 src/sync/ephy-synchronizable.c |   19 +++++-----
 5 files changed, 68 insertions(+), 84 deletions(-)
---
diff --git a/src/prefs-dialog.c b/src/prefs-dialog.c
index 44fc19d..b46ec2e 100644
--- a/src/prefs-dialog.c
+++ b/src/prefs-dialog.c
@@ -289,18 +289,17 @@ sync_fxa_server_message_cb (WebKitUserContentManager *manager,
                             WebKitJavascriptResult   *result,
                             PrefsDialog              *dialog)
 {
-  JsonParser *parser;
-  JsonObject *object;
+  JsonNode *node;
+  JsonObject *json;
   JsonObject *detail;
   char *json_string;
   const char *type;
   const char *command;
 
   json_string = ephy_embed_utils_get_js_result_as_string (result);
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, json_string, -1, NULL);
-  object = json_node_get_object (json_parser_get_root (parser));
-  type = json_object_get_string_member (object, "type");
+  node = json_from_string (json_string, NULL);
+  json = json_node_get_object (node);
+  type = json_object_get_string_member (json, "type");
 
   /* The only message type we can receive is FirefoxAccountsCommand. */
   if (g_strcmp0 (type, "FirefoxAccountsCommand") != 0) {
@@ -308,7 +307,7 @@ sync_fxa_server_message_cb (WebKitUserContentManager *manager,
     goto out;
   }
 
-  detail = json_object_get_object_member (object, "detail");
+  detail = json_object_get_object_member (json, "detail");
   command = json_object_get_string_member (detail, "command");
 
   if (g_strcmp0 (command, "loaded") == 0) {
@@ -355,7 +354,7 @@ sync_fxa_server_message_cb (WebKitUserContentManager *manager,
 
 out:
   g_free (json_string);
-  g_object_unref (parser);
+  json_node_unref (node);
 }
 
 static void
diff --git a/src/sync/ephy-sync-crypto.c b/src/sync/ephy-sync-crypto.c
index ec96595..2c7fcde 100644
--- a/src/sync/ephy-sync-crypto.c
+++ b/src/sync/ephy-sync-crypto.c
@@ -884,8 +884,9 @@ char *
 ephy_sync_crypto_decrypt_record (const char          *payload,
                                  SyncCryptoKeyBundle *bundle)
 {
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *json;
+  GError *error = NULL;
   guint8 *aes_key;
   guint8 *hmac_key;
   guint8 *ciphertext;
@@ -901,21 +902,22 @@ ephy_sync_crypto_decrypt_record (const char          *payload,
   g_return_val_if_fail (bundle, NULL);
 
   /* Extract ciphertext, iv and hmac from payload. */
-  parser = json_parser_new ();
-  if (!json_parser_load_from_data (parser, payload, -1, NULL)) {
-    g_warning ("Payload is not a valid JSON");
-    goto free_parser;
+  node = json_from_string (payload, &error);
+  if (error) {
+    g_warning ("Payload is not a valid JSON: %s", error->message);
+    g_error_free (error);
+    goto out;
   }
-  if (!JSON_NODE_HOLDS_OBJECT (json_parser_get_root (parser))) {
+  if (!JSON_NODE_HOLDS_OBJECT (node)) {
     g_warning ("JSON node does not hold a JSON object");
-    goto free_parser;
+    goto free_node;
   }
-  json = json_node_get_object (json_parser_get_root (parser));
+  json = json_node_get_object (node);
   if (!json_object_has_member (json, "ciphertext") ||
       !json_object_has_member (json, "IV") ||
       !json_object_has_member (json, "hmac")) {
     g_warning ("JSON object has missing members");
-    goto free_parser;
+    goto free_node;
   }
   ciphertext_b64 = json_object_get_string_member (json, "ciphertext");
   iv_b64 = json_object_get_string_member (json, "IV");
@@ -926,7 +928,7 @@ ephy_sync_crypto_decrypt_record (const char          *payload,
   hmac_key = ephy_sync_crypto_decode_hex (bundle->hmac_key_hex);
   if (!aes_key || !hmac_key) {
     g_warning ("The key bundle does not hold valid keys");
-    goto free_keys;
+    goto free_node;
   }
 
   /* Under no circumstances should a client try to decrypt a record
@@ -946,9 +948,9 @@ ephy_sync_crypto_decrypt_record (const char          *payload,
 free_keys:
   g_free (aes_key);
   g_free (hmac_key);
-free_parser:
-  g_object_unref (parser);
-
+free_node:
+  json_node_unref (node);
+out:
   return cleartext;
 }
 
diff --git a/src/sync/ephy-sync-secret.c b/src/sync/ephy-sync-secret.c
index 8fa0b15..975baf2 100644
--- a/src/sync/ephy-sync-secret.c
+++ b/src/sync/ephy-sync-secret.c
@@ -82,13 +82,12 @@ load_tokens_cb (SecretService *service,
   SecretItem *item;
   GHashTable *attributes;
   SecretValue *value = NULL;
-  JsonParser *parser = NULL;
+  JsonNode *node = NULL;
   JsonObject *json;
   GList *matches = NULL;
   GList *members = NULL;
   GError *error = NULL;
   GError *ret_error = NULL;
-  const char *tokens;
   const char *email;
   const char *user_email;
 
@@ -137,10 +136,7 @@ load_tokens_cb (SecretService *service,
     goto out;
   }
 
-  parser = json_parser_new ();
-  tokens = secret_value_get_text (value);
-  json_parser_load_from_data (parser, tokens, -1, &error);
-
+  node = json_from_string (secret_value_get_text (value), &error);
   if (error) {
     g_set_error (&ret_error,
                  SYNC_SECRET_ERROR,
@@ -150,7 +146,7 @@ load_tokens_cb (SecretService *service,
     goto out;
   }
 
-  json = json_node_get_object (json_parser_get_root (parser));
+  json = json_node_get_object (node);
   members = json_object_get_members (json);
 
   /* Set the tokens. */
@@ -166,16 +162,12 @@ out:
 
   if (error)
     g_error_free (error);
-
   if (ret_error)
     g_error_free (ret_error);
-
   if (value)
     secret_value_unref (value);
-
-  if (parser)
-    g_object_unref (parser);
-
+  if (node)
+    json_node_unref (node);
   g_list_free (members);
   g_list_free_full (matches, g_object_unref);
 }
diff --git a/src/sync/ephy-sync-service.c b/src/sync/ephy-sync-service.c
index d7194b0..11bb82d 100644
--- a/src/sync/ephy-sync-service.c
+++ b/src/sync/ephy-sync-service.c
@@ -445,7 +445,7 @@ obtain_storage_credentials_cb (SoupSession *session,
                                gpointer     user_data)
 {
   EphySyncService *self;
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *json;
 
   self = ephy_shell_get_sync_service (ephy_shell_get_default ());
@@ -458,10 +458,8 @@ obtain_storage_credentials_cb (SoupSession *session,
     return;
   }
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, msg->response_body->data, -1, NULL);
-  json = json_node_get_object (json_parser_get_root (parser));
-
+  node = json_from_string (msg->response_body->data, NULL);
+  json = json_node_get_object (node);
   self->storage_endpoint = g_strdup (json_object_get_string_member (json, "api_endpoint"));
   self->storage_credentials_id = g_strdup (json_object_get_string_member (json, "id"));
   self->storage_credentials_key = g_strdup (json_object_get_string_member (json, "key"));
@@ -470,7 +468,7 @@ obtain_storage_credentials_cb (SoupSession *session,
   self->locked = FALSE;
   ephy_sync_service_send_next_storage_request (self);
 
-  g_object_unref (parser);
+  json_node_unref (node);
 }
 
 static void
@@ -519,15 +517,14 @@ obtain_signed_certificate_cb (SoupSession *session,
                               gpointer     user_data)
 {
   EphySyncService *self;
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *json;
   const char *certificate;
 
   self = ephy_shell_get_sync_service (ephy_shell_get_default ());
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, msg->response_body->data, -1, NULL);
-  json = json_node_get_object (json_parser_get_root (parser));
+  node = json_from_string (msg->response_body->data, NULL);
+  json = json_node_get_object (node);
 
   /* Since a new Firefox Account password implies new tokens, this will fail
    * with an error code 110 (Invalid authentication token in request signature)
@@ -567,7 +564,7 @@ obtain_signed_certificate_cb (SoupSession *session,
   ephy_sync_service_obtain_storage_credentials (self);
 
 out:
-  g_object_unref (parser);
+  json_node_unref (node);
 }
 
 static void
@@ -1121,14 +1118,13 @@ get_account_keys_cb (SoupSession *session,
 {
   EphySyncService *self;
   SignInAsyncData *data;
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *json;
 
   self = ephy_shell_get_sync_service (ephy_shell_get_default ());
   data = (SignInAsyncData *)user_data;
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, msg->response_body->data, -1, NULL);
-  json = json_node_get_object (json_parser_get_root (parser));
+  node = json_from_string (msg->response_body->data, NULL);
+  json = json_node_get_object (node);
 
   if (msg->status_code == 200) {
     /* Extract the master sync keys from the bundle and save tokens. */
@@ -1149,7 +1145,7 @@ get_account_keys_cb (SoupSession *session,
     sign_in_async_data_free (data);
   }
 
-  g_object_unref (parser);
+  json_node_unref (node);
 }
 
 void
@@ -1263,7 +1259,7 @@ download_synchronizable_cb (SoupSession *session,
   EphySynchronizable *synchronizable;
   SyncCryptoKeyBundle *bundle;
   SyncAsyncData *data;
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *bso;
   GError *error = NULL;
   GType type;
@@ -1279,26 +1275,25 @@ download_synchronizable_cb (SoupSession *session,
     goto out;
   }
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, msg->response_body->data, -1, &error);
+  node = json_from_string (msg->response_body->data, &error);
   if (error) {
     g_warning ("Response is not a valid JSON");
     g_error_free (error);
-    goto free_parser;
+    goto free_node;
   }
-  if (!JSON_NODE_HOLDS_OBJECT (json_parser_get_root (parser))) {
+  if (!JSON_NODE_HOLDS_OBJECT (node)) {
     g_warning ("JSON root does not hold a JSON object");
-    goto free_parser;
+    goto free_node;
   }
 
-  bso = json_node_get_object (json_parser_get_root (parser));
+  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));
   if (!synchronizable) {
     g_warning ("Failed to create synchronizable object from BSO");
-    goto free_parser;
+    goto free_node;
   }
 
   /* Delete the local object and add the remote one if it is not marked as deleted. */
@@ -1311,8 +1306,8 @@ download_synchronizable_cb (SoupSession *session,
   }
 
   g_object_unref (synchronizable);
-free_parser:
-  g_object_unref (parser);
+free_node:
+  json_node_unref (node);
 out:
   sync_async_data_free (data);
   ephy_sync_service_send_next_storage_request (self);
@@ -1421,9 +1416,8 @@ sync_collection_cb (SoupSession *session,
   SyncCollectionAsyncData *data;
   EphySynchronizable *remote;
   SyncCryptoKeyBundle *bundle;
-  JsonParser *parser = NULL;
+  JsonNode *node = NULL;
   JsonArray *array;
-  JsonNode *node;
   JsonObject *object;
   GError *error = NULL;
   GList *remotes_updated = NULL;
@@ -1450,29 +1444,27 @@ sync_collection_cb (SoupSession *session,
     goto out;
   }
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, msg->response_body->data, -1, &error);
+  node = json_from_string (msg->response_body->data, &error);
   if (error) {
     g_warning ("Response is not a valid JSON: %s", error->message);
     g_error_free (error);
-    goto free_parser;
+    goto free_node;
   }
-  if (!JSON_NODE_HOLDS_ARRAY (json_parser_get_root (parser))) {
+  if (!JSON_NODE_HOLDS_ARRAY (node)) {
     g_warning ("JSON root does not hold an array");
-    goto free_parser;
+    goto free_node;
   }
 
   type = ephy_synchronizable_manager_get_synchronizable_type (data->manager);
   bundle = ephy_sync_service_get_key_bundle (self, collection);
-  array = json_node_get_array (json_parser_get_root (parser));
+  array = json_node_get_array (node);
 
   for (guint i = 0; i < json_array_get_length (array); i++) {
-    node = json_array_get_element (array, i);
-    if (!JSON_NODE_HOLDS_OBJECT (node)) {
+    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 (node);
+    object = json_node_get_object (json_array_get_element (array, i));
     remote = EPHY_SYNCHRONIZABLE (ephy_synchronizable_from_bso (object, type, bundle, &is_deleted));
     if (!remote) {
       g_warning ("Failed to create synchronizable object from BSO, skipping...");
@@ -1504,9 +1496,9 @@ merge_remotes:
   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);
+free_node:
+  if (node)
+    json_node_unref (node);
 out:
   if (data->collection_index == data->num_collections)
     g_signal_emit (self, signals[SYNC_FINISHED], 0);
diff --git a/src/sync/ephy-synchronizable.c b/src/sync/ephy-synchronizable.c
index 93fa18f..dbe3e7f 100644
--- a/src/sync/ephy-synchronizable.c
+++ b/src/sync/ephy-synchronizable.c
@@ -210,7 +210,7 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
 {
   GObject *object = NULL;
   GError *error = NULL;
-  JsonParser *parser;
+  JsonNode *node;
   JsonObject *json;
   char *serialized;
   const char *payload;
@@ -235,18 +235,17 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
     goto out;
   }
 
-  parser = json_parser_new ();
-  json_parser_load_from_data (parser, serialized, -1, &error);
+  node = json_from_string (serialized, &error);
   if (error) {
     g_warning ("Decrypted text is not a valid JSON: %s", error->message);
     g_error_free (error);
-    goto free_parser;
+    goto free_node;
   }
-  if (!JSON_NODE_HOLDS_OBJECT (json_parser_get_root (parser))) {
+  if (!JSON_NODE_HOLDS_OBJECT (node)) {
     g_warning ("JSON root does not hold a JSON object");
-    goto free_parser;
+    goto free_node;
   }
-  json = json_node_get_object (json_parser_get_root (parser));
+  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");
@@ -258,14 +257,14 @@ ephy_synchronizable_from_bso (JsonObject          *bso,
   if (error) {
     g_warning ("Failed to create GObject from BSO: %s", error->message);
     g_error_free (error);
-    goto free_parser;
+    goto free_node;
   }
 
   ephy_synchronizable_set_modification_time (EPHY_SYNCHRONIZABLE (object), modified);
   ephy_synchronizable_set_is_uploaded (EPHY_SYNCHRONIZABLE (object), TRUE);
 
-free_parser:
-  g_object_unref (parser);
+free_node:
+  json_node_unref (node);
   g_free (serialized);
 out:
   return object;


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