[frogr] Implemented initial version of deserialization in the model
- From: Mario Sanchez Prada <msanchez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [frogr] Implemented initial version of deserialization in the model
- Date: Sun, 11 Nov 2012 00:09:43 +0000 (UTC)
commit e255b9be0ce2759646d684a81be03df1ace5a8bd
Author: Mario Sanchez Prada <msanchez gnome org>
Date: Fri Nov 9 17:50:44 2012 +0100
Implemented initial version of deserialization in the model
src/frogr-main-view-model.c | 101 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 95 insertions(+), 6 deletions(-)
---
diff --git a/src/frogr-main-view-model.c b/src/frogr-main-view-model.c
index 79df2b0..a6610ee 100644
--- a/src/frogr-main-view-model.c
+++ b/src/frogr-main-view-model.c
@@ -21,6 +21,7 @@
#include "frogr-main-view-model.h"
#include "frogr-account.h"
+#include "frogr-file-loader.h"
#define TAGS_DELIMITER " "
@@ -138,7 +139,7 @@ _compare_photosets (FrogrPhotoSet *photoset1, FrogrPhotoSet *photoset2)
}
static JsonArray *
-serialize_list_to_json_array (GSList *list, GType g_type)
+_serialize_list_to_json_array (GSList *list, GType g_type)
{
JsonArray *json_array = NULL;
JsonNode *json_node = NULL;
@@ -163,6 +164,47 @@ serialize_list_to_json_array (GSList *list, GType g_type)
return json_array;
}
+static GSList *
+_deserialize_list_from_json_array (JsonArray *array, GType g_type)
+{
+ JsonNode *json_node = NULL;
+ GSList *result_list = NULL;
+ gpointer element;
+ guint n_elements = 0;
+ guint i = 0;
+
+ n_elements = json_array_get_length (array);
+ if (!n_elements)
+ return NULL;
+
+ for (i = 0; i < n_elements; i++)
+ {
+ json_node = json_array_get_element (array, i);
+ if (JSON_NODE_HOLDS_OBJECT (json_node))
+ element = json_gobject_deserialize (g_type, json_node);
+ else if (g_type == G_TYPE_STRING)
+ element = json_node_dup_string (json_node);
+
+ if (element)
+ result_list = g_slist_append (result_list, element);
+ }
+
+ return result_list;
+}
+
+static void
+_on_file_loaded (FrogrFileLoader *loader, FrogrPicture *picture, FrogrMainViewModel *self)
+{
+ g_return_if_fail (FROGR_IS_MAIN_VIEW_MODEL (self));
+ frogr_main_view_model_add_picture (self, picture);
+}
+
+static void
+_on_files_loaded (FrogrFileLoader *loader, FrogrMainViewModel *self)
+{
+ g_signal_emit (self, signals[MODEL_DESERIALIZED], 0);
+}
+
static void
_frogr_main_view_model_dispose (GObject* object)
{
@@ -737,19 +779,19 @@ frogr_main_view_model_serialize (FrogrMainViewModel *self)
root_object = json_object_new ();
data_list = frogr_main_view_model_get_pictures (self);
- json_array = serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
+ json_array = _serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
json_object_set_array_member (root_object, "pictures", json_array);
data_list = frogr_main_view_model_get_photosets (self);
- json_array = serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
+ json_array = _serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
json_object_set_array_member (root_object, "photosets", json_array);
data_list = frogr_main_view_model_get_groups (self);
- json_array = serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
+ json_array = _serialize_list_to_json_array (data_list, G_TYPE_OBJECT);
json_object_set_array_member (root_object, "groups", json_array);
data_list = frogr_main_view_model_get_tags (self);
- json_array = serialize_list_to_json_array (data_list, G_TYPE_STRING);
+ json_array = _serialize_list_to_json_array (data_list, G_TYPE_STRING);
json_object_set_array_member (root_object, "tags", json_array);
root_node = json_node_new (JSON_NODE_OBJECT);
@@ -761,5 +803,52 @@ frogr_main_view_model_serialize (FrogrMainViewModel *self)
void
frogr_main_view_model_deserialize (FrogrMainViewModel *self, JsonNode *json_node)
{
- /* TODO */
+ FrogrFileLoader *loader = NULL;
+ JsonObject *root_object = NULL;
+ JsonArray *array_member = NULL;
+ GSList *pictures = NULL;
+ GSList *sets = NULL;
+ GSList *groups = NULL;
+ GSList *tags = NULL;
+
+ g_return_if_fail(FROGR_IS_MAIN_VIEW_MODEL (self));
+
+ /* First we get the different lists with data */
+ root_object = json_node_get_object (json_node);
+
+ array_member = json_object_get_array_member (root_object, "pictures");
+ if (array_member)
+ pictures = _deserialize_list_from_json_array (array_member, FROGR_TYPE_PICTURE);
+
+ array_member = json_object_get_array_member (root_object, "photosets");
+ if (array_member)
+ sets = _deserialize_list_from_json_array (array_member, FROGR_TYPE_PHOTOSET);
+
+ array_member = json_object_get_array_member (root_object, "groups");
+ if (array_member)
+ groups = _deserialize_list_from_json_array (array_member, FROGR_TYPE_GROUP);
+
+ array_member = json_object_get_array_member (root_object, "tags");
+ if (array_member)
+ tags = _deserialize_list_from_json_array (array_member, G_TYPE_STRING);
+
+ /* We set the sets, groups and tags */
+ frogr_main_view_model_set_photosets (self, sets);
+ frogr_main_view_model_set_groups (self, groups);
+ frogr_main_view_model_set_remote_tags (self, tags);
+
+ /* Now we take the list of pictures and carefully ad them into the
+ model as long as the associated thumbnails are being loaded */
+ loader = frogr_file_loader_new_from_pictures (pictures);
+
+ g_signal_connect (G_OBJECT (loader), "file-loaded",
+ G_CALLBACK (_on_file_loaded),
+ self);
+
+ g_signal_connect (G_OBJECT (loader), "files-loaded",
+ G_CALLBACK (_on_files_loaded),
+ self);
+
+ /* Load the pictures! */
+ frogr_file_loader_load (loader);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]