[epiphany/wip/sync: 16/31] synchronizable: Use JsonNode * in _to/from_bso()
- From: Gabriel Ivașcu <gabrielivascu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/wip/sync: 16/31] synchronizable: Use JsonNode * in _to/from_bso()
- Date: Fri, 14 Apr 2017 15:52:54 +0000 (UTC)
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]