diff options
| author | Emmanuele Bassi <ebassi@linux.intel.com> | 2009-10-27 10:30:27 +0000 |
|---|---|---|
| committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2009-10-27 10:30:27 +0000 |
| commit | 27afed8dc89bf9562c3536f0a053d250e70eea4d (patch) | |
| tree | 2c6025e8353fe58d0690f28343f7a979e61629b9 | |
| parent | 317447b52455c56b0123168ab127ce026d7d0c22 (diff) | |
| download | json-glib-27afed8dc89bf9562c3536f0a053d250e70eea4d.tar.gz | |
gobject: Recurse in GParamSpecObject properties
Use the newly added json_gobject_new() internal function to
recurse into properties defined using GParamSpecObject.
The same rules used by json_construct_gobject() apply to the
properties storing a GObject - including JsonSerializable
support.
The test case for serialization and deserialization of a
GObject has been updated to include a property holding a
GObject.
| -rw-r--r-- | json-glib/json-gobject.c | 14 | ||||
| -rw-r--r-- | tests/test-serialize-full.c | 58 |
2 files changed, 64 insertions, 8 deletions
diff --git a/json-glib/json-gobject.c b/json-glib/json-gobject.c index 1def054..a8b8843 100644 --- a/json-glib/json-gobject.c +++ b/json-glib/json-gobject.c @@ -266,7 +266,19 @@ json_deserialize_pspec (GValue *value, switch (JSON_NODE_TYPE (node)) { case JSON_NODE_OBJECT: - return FALSE; + if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_OBJECT)) + { + GObject *object; + + object = json_gobject_new (G_VALUE_TYPE (value), json_node_get_object (node)); + if (object != NULL) + g_value_take_object (value, object); + else + g_value_set_object (value, NULL); + + retval = TRUE; + } + break; case JSON_NODE_ARRAY: if (G_VALUE_HOLDS (value, G_TYPE_STRV)) diff --git a/tests/test-serialize-full.c b/tests/test-serialize-full.c index 6144954..443b41f 100644 --- a/tests/test-serialize-full.c +++ b/tests/test-serialize-full.c @@ -42,6 +42,8 @@ struct _TestObject TestBoxed blah; TestEnum meh; gchar **mah; + + TestObject *test; }; struct _TestObjectClass @@ -114,7 +116,8 @@ enum PROP_BAZ, PROP_BLAH, PROP_MEH, - PROP_MAH + PROP_MAH, + PROP_TEST }; static void json_serializable_iface_init (gpointer g_iface); @@ -191,6 +194,9 @@ test_object_finalize (GObject *gobject) g_free (TEST_OBJECT (gobject)->baz); g_strfreev (TEST_OBJECT (gobject)->mah); + if (TEST_OBJECT (gobject)->test != NULL) + g_object_unref (TEST_OBJECT (gobject)->test); + G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); } @@ -205,19 +211,28 @@ test_object_set_property (GObject *gobject, case PROP_FOO: TEST_OBJECT (gobject)->foo = g_value_get_int (value); break; + case PROP_BAR: TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); break; + case PROP_BAZ: g_free (TEST_OBJECT (gobject)->baz); TEST_OBJECT (gobject)->baz = g_value_dup_string (value); break; + case PROP_MEH: TEST_OBJECT (gobject)->meh = g_value_get_enum (value); break; + case PROP_MAH: TEST_OBJECT (gobject)->mah = g_strdupv (g_value_get_boxed (value)); break; + + case PROP_TEST: + TEST_OBJECT (gobject)->test = g_value_dup_object (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -234,21 +249,31 @@ test_object_get_property (GObject *gobject, case PROP_FOO: g_value_set_int (value, TEST_OBJECT (gobject)->foo); break; + case PROP_BAR: g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); break; + case PROP_BAZ: g_value_set_string (value, TEST_OBJECT (gobject)->baz); break; + case PROP_BLAH: g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); break; + case PROP_MEH: g_value_set_enum (value, TEST_OBJECT (gobject)->meh); break; + case PROP_MAH: g_value_set_boxed (value, TEST_OBJECT (gobject)->mah); break; + + case PROP_TEST: + g_value_set_object (value, TEST_OBJECT (gobject)->test); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -294,6 +319,11 @@ test_object_class_init (TestObjectClass *klass) g_param_spec_boxed ("mah", "Mah", "Mah", G_TYPE_STRV, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_TEST, + g_param_spec_object ("test", "Test", "Test", + TEST_TYPE_OBJECT, + G_PARAM_READWRITE)); } static void @@ -309,20 +339,28 @@ test_object_init (TestObject *object) object->meh = TEST_ENUM_BAR; object->mah = NULL; + + object->test = NULL; } static const gchar *var_test = "{\n" -" \"foo\" : 42,\n" -" \"bar\" : false,\n" -" \"baz\" : \"hello\",\n" -" \"meh\" : \"baz\",\n" -" \"mah\" : [ \"hello\", \", \", \"world\", \"!\" ]\n" +" \"foo\" : 42,\n" +" \"bar\" : false,\n" +" \"baz\" : \"hello\",\n" +" \"meh\" : \"baz\",\n" +" \"mah\" : [ \"hello\", \", \", \"world\", \"!\" ],\n" +" \"test\" : {\n" +" \"bar\" : true,\n" +" \"baz\" : \"world\",\n" +" \"meh\" : \"foo\"\n" +" }\n" "}"; static void test_deserialize (void) { + TestObject *test; GObject *object; GError *error; gchar *str; @@ -353,8 +391,14 @@ test_deserialize (void) str = g_strjoinv (NULL, TEST_OBJECT (object)->mah); g_assert_cmpstr (str, ==, "hello, world!"); - g_free (str); + + g_assert (TEST_IS_OBJECT (TEST_OBJECT (object)->test)); + test = TEST_OBJECT (TEST_OBJECT (object)->test); + g_assert (test->bar); + g_assert_cmpstr (test->baz, ==, "world"); + g_assert_cmpint (test->meh, ==, TEST_ENUM_FOO); + g_object_unref (object); } |
