[json-glib] build: Split out GBoxed and Serializable
- From: Emmanuele Bassi <ebassi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [json-glib] build: Split out GBoxed and Serializable
- Date: Tue, 27 Oct 2009 20:59:40 +0000 (UTC)
commit c176f70e593c9cfb4901cd9f27ce54b8aa7152f2
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Tue Oct 27 20:49:09 2009 +0000
build: Split out GBoxed and Serializable
The json-gobject.c is getting pretty crowded; we should split out
the JsonBoxed API and the JsonSerialized implementation into their
separate source files.
json-glib/Makefile.am | 4 +
json-glib/json-gboxed.c | 275 ++++++++++++++++++++++++++++
json-glib/json-gobject-private.h | 39 ++++
json-glib/json-gobject.c | 371 +-------------------------------------
json-glib/json-serializable.c | 154 ++++++++++++++++
5 files changed, 476 insertions(+), 367 deletions(-)
---
diff --git a/json-glib/Makefile.am b/json-glib/Makefile.am
index 887eb5c..bfe0e64 100644
--- a/json-glib/Makefile.am
+++ b/json-glib/Makefile.am
@@ -42,17 +42,20 @@ source_h = \
source_h_private = \
$(top_srcdir)/json-glib/json-scanner.h \
+ $(top_srcdir)/json-glib/json-gobject-private.h \
$(top_srcdir)/json-glib/json-types-private.h \
$(NULL)
source_c = \
$(srcdir)/json-array.c \
+ $(srcdir)/json-gboxed.c \
$(srcdir)/json-generator.c \
$(srcdir)/json-gobject.c \
$(srcdir)/json-node.c \
$(srcdir)/json-object.c \
$(srcdir)/json-parser.c \
$(srcdir)/json-scanner.c \
+ $(srcdir)/json-serializable.c \
$(NULL)
# glib-mkenums rules
@@ -88,6 +91,7 @@ jsoninclude_DATA = \
EXTRA_DIST += \
json-version.h.in \
json-types-private.h \
+ json-gobject-private.h \
json-scanner.h \
json-glib.h \
$(NULL)
diff --git a/json-glib/json-gboxed.c b/json-glib/json-gboxed.c
new file mode 100644
index 0000000..6dd85c4
--- /dev/null
+++ b/json-glib/json-gboxed.c
@@ -0,0 +1,275 @@
+/* json-gboxed.c - JSON GBoxed integration
+ *
+ * This file is part of JSON-GLib
+ *
+ * Copyright (C) 2007 OpenedHand Ltd.
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Author:
+ * Emmanuele Bassi <ebassi linux intel com>
+ */
+
+/**
+ * SECTION:json-gboxed
+ * @short_description: Serialize and deserialize GBoxed types
+ *
+ * FIXME
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "json-types-private.h"
+#include "json-gobject.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;
+}
diff --git a/json-glib/json-gobject-private.h b/json-glib/json-gobject-private.h
new file mode 100644
index 0000000..5369ebf
--- /dev/null
+++ b/json-glib/json-gobject-private.h
@@ -0,0 +1,39 @@
+/* json-gobject-private.h - GObject private
+ *
+ * This file is part of JSON-GLib
+ * Copyright (C) 2007 OpenedHand Ltd
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Emmanuele Bassi <ebassi linux intel com>
+ */
+
+#ifndef __JSON_GOBJECT_PRIVATE_H__
+#define __JSON_GOBJECT_PRIVATE_H__
+
+#include "json-gobject.h"
+
+G_BEGIN_DECLS
+
+JsonNode *json_serialize_pspec (const GValue *real_value,
+ GParamSpec *pspec);
+gboolean json_deserialize_pspec (GValue *value,
+ GParamSpec *pspec,
+ JsonNode *node);
+
+G_END_DECLS
+
+#endif /* __JSON_GOBJECT_PRIVATE_H__ */
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
diff --git a/json-glib/json-serializable.c b/json-glib/json-serializable.c
new file mode 100644
index 0000000..277677b
--- /dev/null
+++ b/json-glib/json-serializable.c
@@ -0,0 +1,154 @@
+/* json-gobject.c - JSON GObject integration
+ *
+ * This file is part of JSON-GLib
+ * Copyright (C) 2007 OpenedHand Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Author:
+ * Emmanuele Bassi <ebassi openedhand com>
+ */
+
+/**
+ * SECTION:json-serializable
+ * @short_description: Interface for serialize and deserialize special GObjects
+ *
+ * FIXME
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "json-types-private.h"
+#include "json-gobject-private.h"
+
+/**
+ * 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;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]