summaryrefslogtreecommitdiff
path: root/json-glib/json-gobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'json-glib/json-gobject.c')
-rw-r--r--json-glib/json-gobject.c371
1 files changed, 4 insertions, 367 deletions
diff --git a/json-glib/json-gobject.c b/json-glib/json-gobject.c
index 9e0074a..5fa18b6 100644
--- a/json-glib/json-gobject.c
+++ b/json-glib/json-gobject.c
@@ -1,4 +1,4 @@
-/* json-gobject.h - JSON GObject integration
+/* json-gobject.c - JSON GObject integration
*
* This file is part of JSON-GLib
* Copyright (C) 2007 OpenedHand Ltd.
@@ -40,255 +40,11 @@
#include <stdlib.h>
#include "json-types-private.h"
+#include "json-gobject-private.h"
-#include "json-gobject.h"
#include "json-parser.h"
#include "json-generator.h"
-typedef struct _BoxedTransform BoxedTransform;
-
-struct _BoxedTransform
-{
- GType boxed_type;
- gint node_type;
-
- JsonBoxedSerializeFunc serialize;
- JsonBoxedDeserializeFunc deserialize;
-};
-
-G_LOCK_DEFINE_STATIC (boxed_transforms);
-static GSList *boxed_transforms = NULL;
-
-static gint
-boxed_transforms_cmp (gconstpointer a,
- gconstpointer b)
-{
- const BoxedTransform *ta = a;
- const BoxedTransform *tb = b;
-
- return tb->boxed_type - ta->boxed_type;
-}
-
-static gint
-boxed_transforms_find (gconstpointer a,
- gconstpointer b)
-{
- const BoxedTransform *haystack = a;
- const BoxedTransform *needle = b;
-
- if (needle->node_type != -1)
- return (haystack->boxed_type == needle->boxed_type &&
- haystack->node_type == needle->node_type) ? 0 : 1;
- else
- return (haystack->boxed_type == needle->boxed_type) ? 0 : 1;
-}
-
-static BoxedTransform *
-lookup_boxed_transform (GType gboxed_type,
- JsonNodeType node_type)
-{
- BoxedTransform lookup;
- GSList *t;
-
- lookup.boxed_type = gboxed_type;
- lookup.node_type = node_type;
-
- t = g_slist_find_custom (boxed_transforms, &lookup, boxed_transforms_find);
- if (t == NULL)
- return NULL;
-
- return t->data;
-}
-
-/**
- * json_boxed_register_transform_func:
- * @gboxed_type: a boxed type
- * @node_type: a node type
- * @serialize_func: (allow-none): serialization function for @boxed_type
- * into a #JsonNode of type @node_type; can be %NULL if @deserialize_func
- * is not %NULL
- * @deserialize_func: (allow-none): deserialization function for @boxed_type
- * from a #JsonNode of type @node_type; can be %NULL if @serialize_func
- * is not %NULL
- *
- * Registers a serialization and deserialization functions for a #GBoxed
- * of type @gboxed_type to and from a #JsonNode of type @node_type
- *
- * Since: 0.10
- */
-void
-json_boxed_register_transform_func (GType gboxed_type,
- JsonNodeType node_type,
- JsonBoxedSerializeFunc serialize_func,
- JsonBoxedDeserializeFunc deserialize_func)
-{
- BoxedTransform *t;
-
- g_return_if_fail (G_TYPE_IS_BOXED (gboxed_type));
- g_return_if_fail (G_TYPE_IS_ABSTRACT (gboxed_type) == FALSE);
-
- if (serialize_func == NULL)
- g_return_if_fail (deserialize_func != NULL);
-
- if (deserialize_func == NULL)
- g_return_if_fail (serialize_func != NULL);
-
- G_LOCK (boxed_transforms);
-
- t = lookup_boxed_transform (gboxed_type, node_type);
- if (t == NULL)
- {
- t = g_slice_new (BoxedTransform);
-
- t->boxed_type = gboxed_type;
- t->node_type = node_type;
- t->serialize = serialize_func;
- t->deserialize = deserialize_func;
-
- boxed_transforms = g_slist_insert_sorted (boxed_transforms, t,
- boxed_transforms_cmp);
- }
- else
- g_warning ("A transformation for the boxed type %s into "
- "JSON nodes of type %s already exists",
- g_type_name (gboxed_type),
- json_node_type_get_name (node_type));
-
- G_UNLOCK (boxed_transforms);
-}
-
-/**
- * json_boxed_can_serialize:
- * @gboxed_type: a boxed type
- * @node_type: (out): the #JsonNode type to which the boxed type can be
- * deserialized into
- *
- * Checks whether it is possible to serialize a #GBoxed of
- * type @gboxed_type into a #JsonNode of type @node_type
- *
- * Return value: %TRUE if the type can be serialized, %FALSE otherwise
- *
- * Since: 0.10
- */
-gboolean
-json_boxed_can_serialize (GType gboxed_type,
- JsonNodeType *node_type)
-{
- BoxedTransform *t;
-
- g_return_val_if_fail (G_TYPE_IS_BOXED (gboxed_type), FALSE);
- g_return_val_if_fail (G_TYPE_IS_ABSTRACT (gboxed_type) == FALSE, FALSE);
-
- t = lookup_boxed_transform (gboxed_type, -1);
- if (t != NULL && t->serialize != NULL)
- {
- if (node_type)
- *node_type = t->node_type;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * json_boxed_can_deserialize:
- * @gboxed_type: a boxed type
- * @node_type: a #JsonNode type
- *
- * Checks whether it is possible to deserialize a #GBoxed of
- * type @gboxed_type from a #JsonNode of type @node_type
- *
- * Return value: %TRUE if the type can be deserialized, %FALSE otherwise
- *
- * Since: 0.10
- */
-gboolean
-json_boxed_can_deserialize (GType gboxed_type,
- JsonNodeType node_type)
-{
- BoxedTransform *t;
-
- g_return_val_if_fail (G_TYPE_IS_BOXED (gboxed_type), FALSE);
- g_return_val_if_fail (G_TYPE_IS_ABSTRACT (gboxed_type) == FALSE, FALSE);
-
- t = lookup_boxed_transform (gboxed_type, node_type);
- if (t != NULL && t->deserialize != NULL)
- return TRUE;
-
- return FALSE;
-}
-
-/**
- * json_boxed_serialize:
- * @gboxed_type: a boxed type
- * @node_type: a #JsonNode type
- * @boxed: a pointer to a #GBoxed of type @gboxed_type
- *
- * Serializes @boxed, a pointer to a #GBoxed of type @gboxed_type,
- * into a #JsonNode of type @node_type
- *
- * Return value: a #JsonNode with the serialization of the boxed
- * type, or %NULL if serialization either failed or was not
- * possible
- *
- * Since: 0.10
- */
-JsonNode *
-json_boxed_serialize (GType gboxed_type,
- JsonNodeType node_type,
- gconstpointer boxed)
-{
- BoxedTransform *t;
-
- g_return_val_if_fail (G_TYPE_IS_BOXED (gboxed_type), NULL);
- g_return_val_if_fail (G_TYPE_IS_ABSTRACT (gboxed_type) == FALSE, NULL);
- g_return_val_if_fail (boxed != NULL, NULL);
-
- t = lookup_boxed_transform (gboxed_type, node_type);
- if (t != NULL && t->serialize != NULL)
- return t->serialize (boxed);
-
- return NULL;
-}
-
-/**
- * json_boxed_serialize:
- * @gboxed_type: a boxed type
- * @node: a #JsonNode
- *
- * Deserializes @node into @boxed, a pointer to a #GBoxed of type
- * @gboxed_type
- *
- * Since: 0.10
- */
-gpointer
-json_boxed_deserialize (GType gboxed_type,
- JsonNode *node)
-{
- JsonNodeType node_type;
- BoxedTransform *t;
-
- g_return_val_if_fail (G_TYPE_IS_BOXED (gboxed_type), NULL);
- g_return_val_if_fail (G_TYPE_IS_ABSTRACT (gboxed_type) == FALSE, NULL);
- g_return_val_if_fail (node != NULL, NULL);
-
- node_type = json_node_get_node_type (node);
-
- t = lookup_boxed_transform (gboxed_type, node_type);
- if (t != NULL && t->deserialize != NULL)
- return t->deserialize (node);
-
- return NULL;
-}
-
-/* forward declaration */
-static JsonNode *json_serialize_pspec (const GValue *real_value,
- GParamSpec *pspec);
-static gboolean json_deserialize_pspec (GValue *value,
- GParamSpec *pspec,
- JsonNode *node);
-
static gboolean
enum_from_string (GType type,
const gchar *string,
@@ -651,7 +407,7 @@ json_gobject_dump (GObject *gobject)
return object;
}
-static gboolean
+gboolean
json_deserialize_pspec (GValue *value,
GParamSpec *pspec,
JsonNode *node)
@@ -826,7 +582,7 @@ json_deserialize_pspec (GValue *value,
return retval;
}
-static JsonNode *
+JsonNode *
json_serialize_pspec (const GValue *real_value,
GParamSpec *pspec)
{
@@ -965,125 +721,6 @@ json_serialize_pspec (const GValue *real_value,
}
/**
- * json_serializable_serialize_property:
- * @serializable: a #JsonSerializable object
- * @property_name: the name of the property
- * @value: the value of the property
- * @pspec: a #GParamSpec
- *
- * Asks a #JsonSerializable implementation to serialize a #GObject
- * property into a #JsonNode object.
- *
- * Return value: a #JsonNode containing the serialized property
- */
-JsonNode *
-json_serializable_serialize_property (JsonSerializable *serializable,
- const gchar *property_name,
- const GValue *value,
- GParamSpec *pspec)
-{
- JsonSerializableIface *iface;
-
- g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), NULL);
- g_return_val_if_fail (property_name != NULL, NULL);
- g_return_val_if_fail (value != NULL, NULL);
- g_return_val_if_fail (pspec != NULL, NULL);
-
- iface = JSON_SERIALIZABLE_GET_IFACE (serializable);
-
- return iface->serialize_property (serializable, property_name, value, pspec);
-}
-
-/**
- * json_serializable_deserialize_property:
- * @serializable: a #JsonSerializable
- * @property_name: the name of the property
- * @value: a pointer to an uninitialized #GValue
- * @pspec: a #GParamSpec
- * @property_node: a #JsonNode containing the serialized property
- *
- * Asks a #JsonSerializable implementation to deserialize the
- * property contained inside @property_node into @value.
- *
- * Return value: %TRUE if the property was successfully deserialized.
- */
-gboolean
-json_serializable_deserialize_property (JsonSerializable *serializable,
- const gchar *property_name,
- GValue *value,
- GParamSpec *pspec,
- JsonNode *property_node)
-{
- JsonSerializableIface *iface;
-
- g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), FALSE);
- g_return_val_if_fail (property_name != NULL, FALSE);
- g_return_val_if_fail (value != NULL, FALSE);
- g_return_val_if_fail (pspec != NULL, FALSE);
- g_return_val_if_fail (property_node != NULL, FALSE);
-
- iface = JSON_SERIALIZABLE_GET_IFACE (serializable);
-
- return iface->deserialize_property (serializable,
- property_name,
- value,
- pspec,
- property_node);
-}
-
-static gboolean
-json_serializable_real_deserialize (JsonSerializable *serializable,
- const gchar *name,
- GValue *value,
- GParamSpec *pspec,
- JsonNode *node)
-{
- return json_deserialize_pspec (value, pspec, node);
-}
-
-static JsonNode *
-json_serializable_real_serialize (JsonSerializable *serializable,
- const gchar *name,
- const GValue *value,
- GParamSpec *pspec)
-{
- return json_serialize_pspec (value, pspec);
-}
-
-static void
-json_serializable_base_init (gpointer g_class,
- gpointer data)
-{
- static gboolean is_initialized = FALSE;
-
- if (G_UNLIKELY (!is_initialized))
- {
- JsonSerializableIface *iface = g_class;
-
- iface->serialize_property = json_serializable_real_serialize;
- iface->deserialize_property = json_serializable_real_deserialize;
-
- is_initialized = TRUE;
- }
-}
-
-GType
-json_serializable_get_type (void)
-{
- static GType iface_type = 0;
-
- if (!iface_type)
- iface_type =
- g_type_register_static_simple (G_TYPE_INTERFACE,
- g_intern_static_string ("JsonSerializable"),
- sizeof (JsonSerializableIface),
- json_serializable_base_init,
- 0, NULL, 0);
-
- return iface_type;
-}
-
-/**
* json_construct_gobject:
* @gtype: the #GType of object to construct
* @data: a JSON data stream