[json-glib] gobject: Recurse in GParamSpecObject properties
- From: Emmanuele Bassi <ebassi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [json-glib] gobject: Recurse in GParamSpecObject properties
- Date: Tue, 27 Oct 2009 10:32:34 +0000 (UTC)
commit 27afed8dc89bf9562c3536f0a053d250e70eea4d
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Tue Oct 27 10:30:27 2009 +0000
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.
json-glib/json-gobject.c | 14 +++++++++-
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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]