summaryrefslogtreecommitdiff
path: root/json-glib/json-data.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@openedhand.com>2007-09-21 21:07:12 +0100
committerEmmanuele Bassi <ebassi@openedhand.com>2007-09-21 21:07:12 +0100
commitc11ebd32f73a1e21d6097bf9eba8e12f7e35497a (patch)
tree94dee657fce374bb1b44c3362ead937aab7fbb29 /json-glib/json-data.c
parentf661c7e1a04c2fb198279030c9dd812f357240a3 (diff)
downloadjson-glib-c11ebd32f73a1e21d6097bf9eba8e12f7e35497a.tar.gz
Add JsonData, an opaque container for JSON data types
JsonData is like GValue, but it stores JSON data types (objects and arrays) and allows us to retrieve them safely. This way we can actually know the type of the objects returned by the parser and by the other object walking functions.
Diffstat (limited to 'json-glib/json-data.c')
-rw-r--r--json-glib/json-data.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/json-glib/json-data.c b/json-glib/json-data.c
new file mode 100644
index 0000000..ce6f7ab
--- /dev/null
+++ b/json-glib/json-data.c
@@ -0,0 +1,93 @@
+#include "config.h"
+
+#include <glib.h>
+
+#include "json-types.h"
+#include "json-private.h"
+
+JsonData *
+json_data_new (JsonDataType type)
+{
+ JsonData *data;
+
+ data = g_slice_new (JsonData);
+ data->type = type;
+
+ return data;
+}
+
+void
+json_data_set_object (JsonData *data,
+ JsonObject *object)
+{
+ g_return_if_fail (data != NULL);
+ g_return_if_fail (JSON_DATA_TYPE (data) == JSON_DATA_OBJECT);
+ g_return_if_fail (object != NULL);
+
+ data->data.object = object;
+}
+
+/**
+ * json_data_get_object:
+ * @data: a #JsonData
+ *
+ * Retrieves the #JsonObject stored inside a #JsonData
+ *
+ * Return value: the #JsonObject
+ */
+JsonObject *
+json_data_get_object (JsonData *data)
+{
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (JSON_DATA_TYPE (data) == JSON_DATA_OBJECT, NULL);
+
+ return data->data.object;
+}
+
+void
+json_data_set_array (JsonData *data,
+ JsonArray *array)
+{
+ g_return_if_fail (data != NULL);
+ g_return_if_fail (JSON_DATA_TYPE (data) == JSON_DATA_ARRAY);
+ g_return_if_fail (array != NULL);
+
+ data->data.array = array;
+}
+
+/**
+ * json_data_get_array:
+ * @data: a #JsonData
+ *
+ * Retrieves the #JsonArray stored inside a #JsonData
+ *
+ * Return value: the #JsonArray
+ */
+JsonArray *
+json_data_get_array (JsonData *data)
+{
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (JSON_DATA_TYPE (data) == JSON_DATA_ARRAY, NULL);
+
+ return data->data.array;
+}
+
+void
+json_data_free (JsonData *data)
+{
+ if (data)
+ {
+ switch (data->type)
+ {
+ case JSON_DATA_OBJECT:
+ json_object_unref (data->data.object);
+ break;
+
+ case JSON_DATA_ARRAY:
+ json_array_unref (data->data.array);
+ break;
+ }
+
+ g_slice_free (JsonData, data);
+ }
+}