diff options
| author | Emmanuele Bassi <ebassi@openedhand.com> | 2007-09-21 21:07:12 +0100 |
|---|---|---|
| committer | Emmanuele Bassi <ebassi@openedhand.com> | 2007-09-21 21:07:12 +0100 |
| commit | c11ebd32f73a1e21d6097bf9eba8e12f7e35497a (patch) | |
| tree | 94dee657fce374bb1b44c3362ead937aab7fbb29 | |
| parent | f661c7e1a04c2fb198279030c9dd812f357240a3 (diff) | |
| download | json-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.
| -rw-r--r-- | json-glib/Makefile.am | 1 | ||||
| -rw-r--r-- | json-glib/json-data.c | 93 | ||||
| -rw-r--r-- | json-glib/json-private.h | 7 | ||||
| -rw-r--r-- | json-glib/json-types.h | 53 |
4 files changed, 138 insertions, 16 deletions
diff --git a/json-glib/Makefile.am b/json-glib/Makefile.am index 9af73f5..8ca1d4e 100644 --- a/json-glib/Makefile.am +++ b/json-glib/Makefile.am @@ -46,6 +46,7 @@ source_h_private = json-private.h source_c = \ json-array.c \ + json-data.c \ json-object.c \ json-parser.c \ $(NULL) 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); + } +} diff --git a/json-glib/json-private.h b/json-glib/json-private.h index 962ea7b..76d27d0 100644 --- a/json-glib/json-private.h +++ b/json-glib/json-private.h @@ -6,6 +6,13 @@ G_BEGIN_DECLS +JsonData *json_data_new (JsonDataType type); +void json_data_set_object (JsonData *data, + JsonObject *object); +void json_data_set_array (JsonData *data, + JsonArray *array); +void json_data_free (JsonData *data); + JsonObject *json_object_new (void); void json_object_add_member (JsonObject *object, const gchar *member_name, diff --git a/json-glib/json-types.h b/json-glib/json-types.h index 28e2c33..f8e61a2 100644 --- a/json-glib/json-types.h +++ b/json-glib/json-types.h @@ -5,27 +5,48 @@ G_BEGIN_DECLS +#define JSON_DATA_TYPE(data) (((JsonData *) (data))->type) #define JSON_TYPE_OBJECT (json_object_get_type ()) #define JSON_TYPE_ARRAY (json_array_get_type ()) typedef struct _JsonObject JsonObject; typedef struct _JsonArray JsonArray; - -JsonObject *json_object_ref (JsonObject *object); -void json_object_unref (JsonObject *object); -GList * json_object_get_members (JsonObject *object); -GValue * json_object_get_member (JsonObject *object, - const gchar *member_name); -gboolean json_object_has_member (JsonObject *object, - const gchar *member_name); -guint json_object_get_size (JsonObject *object); - -JsonArray * json_array_ref (JsonArray *array); -void json_array_unref (JsonArray *array); -GList * json_array_get_elements (JsonArray *array); -GValue * json_array_get_element (JsonArray *array, - guint index_); -guint json_array_get_length (JsonArray *array); +typedef struct _JsonData JsonData; + +typedef enum { + JSON_DATA_OBJECT, + JSON_DATA_ARRAY +} JsonDataType; + +struct _JsonData +{ + /*< private >*/ + JsonDataType type; + + union { + JsonObject *object; + JsonArray *array; + } data; +}; + +JsonObject * json_data_get_object (JsonData *data); +JsonArray * json_data_get_array (JsonData *data); + +JsonObject * json_object_ref (JsonObject *object); +void json_object_unref (JsonObject *object); +GList * json_object_get_members (JsonObject *object); +GValue * json_object_get_member (JsonObject *object, + const gchar *member_name); +gboolean json_object_has_member (JsonObject *object, + const gchar *member_name); +guint json_object_get_size (JsonObject *object); + +JsonArray * json_array_ref (JsonArray *array); +void json_array_unref (JsonArray *array); +GList * json_array_get_elements (JsonArray *array); +GValue * json_array_get_element (JsonArray *array, + guint index_); +guint json_array_get_length (JsonArray *array); G_END_DECLS |
