Clutter currently requires:
• GLib >= 2.18.0
+ • JSON-GLib >= 0.10
• Atk >= 1.17
• Cairo >= 1.6
• PangoCairo >= 1.20
Clutter also has optional dependencies:
- • JSON-GLib >= 0.10 (optional, see --with-json below)
• GDK-Pixbuf >= 2.0 (optional, see --with-imagebackend below)
On X11, Clutter depends on the following extensions
--with-gles=[1.1/2.0]
Select the GLES version (for EGL backends) (default=1.1)
- --with-json=[internal/check/system]
- Select the JSON-GLib copy to use (default=check)
-
- internal:
- Use the internal copy of JSON-GLib for ClutterScript
-
- check:
- Check for the existence of a system copy of JSON-GLib
- and if it is available, make Clutter depend on it
-
- system:
- Only use the system copy of JSON-GLib and warn if not found
-
VERSIONING
-------------------------------------------------------------------------------
pc_files += cally/cally-$(CLUTTER_API_VERSION).pc
EXTRA_DIST += cally/cally.pc.in
-# json
-if LOCAL_JSON_GLIB
-json_gir = ClutterJson-@CLUTTER_API_VERSION@.gir
-json_gir_include = --include-uninstalled=$(top_builddir)/clutter/ClutterJson-@CLUTTER_API_VERSION@.gir
-
-json_sources_h = \
- $(srcdir)/json/json-generator.h \
- $(srcdir)/json/json-glib.h \
- $(srcdir)/json/json-parser.h \
- $(srcdir)/json/json-types.h \
- $(NULL)
-
-json_sources_c = \
- $(srcdir)/json/json-array.c \
- $(srcdir)/json/json-node.c \
- $(srcdir)/json/json-object.c \
- $(srcdir)/json/json-parser.c \
- $(NULL)
-
-json_sources_priv = \
- $(srcdir)/json/json-marshal.c \
- $(srcdir)/json/json-marshal.h \
- $(srcdir)/json/json-types-private.h \
- $(NULL)
-
-INCLUDES += $(top_srcdir)/clutter/json
-else
-json_gir_include=--include=Json-1.0
-endif # LOCAL_JSON_GLIB
-
# general build rules:
# you should not need to modify anything below this point
clutter_include_HEADERS = $(source_h) $(top_srcdir)/clutter/clutter.h
nodist_clutter_include_HEADERS = \
- $(top_builddir)/clutter/clutter-json.h \
$(top_builddir)/clutter/clutter-version.h \
$(built_source_h)
$(cally_sources_c) \
$(cally_sources_h) \
$(cally_sources_private) \
- $(json_sources_c) \
- $(json_sources_h) \
- $(json_sources_priv) \
$(NULL)
nodist_libclutter_@CLUTTER_SONAME_INFIX@_@CLUTTER_API_VERSION@_la_SOURCES = \
$(CLUTTER_LT_LDFLAGS) \
$(GCOV_LDFLAGS) \
-export-dynamic \
- -export-symbols-regex "^(clutter|cogl|cally|json).*" \
+ -export-symbols-regex "^(clutter|cogl|cally).*" \
-rpath $(libdir) \
$(win32_resources_ldflag) \
$(NULL)
if HAVE_INTROSPECTION
INTROSPECTION_GIRS += Clutter-@CLUTTER_API_VERSION@.gir
-Clutter-@CLUTTER_API_VERSION@.gir: libclutter-@CLUTTER_SONAME_INFIX@-@CLUTTER_API_VERSION@.la $(clutter_json_gir) Makefile
+Clutter-@CLUTTER_API_VERSION@.gir: libclutter-@CLUTTER_SONAME_INFIX@-@CLUTTER_API_VERSION@.la Makefile
Clutter_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Clutter
Clutter_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
Clutter_@CLUTTER_API_VERSION_AM@_gir_LIBS = libclutter-@CLUTTER_SONAME_INFIX@-@CLUTTER_API_VERSION@.la
Clutter_@CLUTTER_API_VERSION_AM@_gir_FILES = $(clutter_HEADERS) $(nodist_clutter_HEADERS) $(source_c) $(built_source_c)
Clutter_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(INCLUDES) $(CLUTTER_CFLAGS) $(AM_CPPFLAGS) -UCLUTTER_DISABLE_DEPRECATED
-Clutter_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = GL-1.0 GObject-2.0 Atk-1.0 Pango-1.0 PangoCairo-1.0
+Clutter_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = GL-1.0 GObject-2.0 Atk-1.0 Pango-1.0 PangoCairo-1.0 Json-1.0
Clutter_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
--warn-all \
--c-include='clutter/clutter.h' \
--pkg-export clutter-@CLUTTER_API_VERSION@ \
- $(json_gir_include) \
--include-uninstalled=$(top_builddir)/clutter/cogl/cogl/Cogl-@CLUTTER_API_VERSION@.gir
-# ClutterJson.gir and Cogl.gir are used included into Clutter.gir, so they
-# need to be built before the typelib is generated
-Clutter-@CLUTTER_API_VERSION@.typelib: $(json_gir) Cogl-@CLUTTER_API_VERSION@.gir
+# Cogl.gir is used included into Clutter.gir, so it needs to be built
+# before the typelib is generated
+Clutter-@CLUTTER_API_VERSION@.typelib: Cogl-@CLUTTER_API_VERSION@.gir
# We build Cogl.gir in the cogl/ subdir, but it needs to reference the shared
# library that it's built into, so we delay compiling the gir into typelib
--warn-all \
--c-include='cally/cally.h' \
--pkg-export=cally-@CLUTTER_API_VERSION@ \
- $(json_gir_include) \
--include-uninstalled $(top_builddir)/clutter/Cogl-@CLUTTER_API_VERSION@.gir \
--include-uninstalled $(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
INTROSPECTION_GIRS += Cally-@CLUTTER_API_VERSION@.gir
-if LOCAL_JSON_GLIB
-ClutterJson-@CLUTTER_API_VERSION@.gir: libclutter-@CLUTTER_SONAME_INFIX@-@CLUTTER_API_VERSION@.la
-
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = ClutterJson
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_LIBS = libclutter-@CLUTTER_SONAME_INFIX@-@CLUTTER_API_VERSION@.la
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_FILES = $(json_sources_c) $(json_sources_h)
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(INCLUDES) $(CLUTTER_CFLAGS) $(AM_CPPFLAGS)
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = GObject-2.0
-ClutterJson_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
- --warn-all \
- --identifier-prefix=Json \
- --symbol-prefix=json
-
-INTROSPECTION_GIRS += ClutterJson-@CLUTTER_API_VERSION@.gir
-endif # LOCAL_JSON_GLIB
-
if SUPPORT_X11
ClutterX11-@CLUTTER_API_VERSION@.gir: Makefile Clutter-@CLUTTER_API_VERSION@.gir Cogl-@CLUTTER_API_VERSION@.gir
--warn-all \
--identifier-prefix=ClutterX11 \
--symbol-prefix=clutter_x11 \
- $(json_gir_include) \
--include-uninstalled=$(top_builddir)/clutter/Cogl-@CLUTTER_API_VERSION@.gir \
--include-uninstalled=$(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = xlib-2.0
+++ /dev/null
-#ifndef __CLUTTER_JSON_H__
-#define __CLUTTER_JSON_H__
-
-/* Include json-glib types opaquely, so that we can swap out
- * the internal copy of JSON-GLib with the installed one
- * without changing the other headers.
- */
-
-#include "@JSON_PREFIX@/json-glib.h"
-
-#endif /* __CLUTTER_JSON_H__ */
#define __CLUTTER_SCRIPT_PRIVATE_H__
#include <glib-object.h>
-#include "clutter-json.h"
+#include <json-glib/json-glib.h>
+
#include "clutter-color.h"
#include "clutter-types.h"
#include "clutter-script.h"
#include "clutter-private.h"
#include "clutter-debug.h"
-#include "json/json-parser.h"
-
enum
{
PROP_0,
#define __CLUTTER_SCRIPTABLE_H__
#include <glib-object.h>
+#include <json-glib/json-glib.h>
#include <clutter/clutter-script.h>
-#include <clutter/clutter-json.h>
G_BEGIN_DECLS
+++ /dev/null
-/* json-array.c - JSON array implementation
- *
- * 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>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "json-types-private.h"
-
-/*
- * SECTION:json-array
- * @short_description: a JSON array representation
- *
- * #JsonArray is the representation of the array type inside JSON. It contains
- * #JsonNode<!-- -->s, which may contain fundamental types, other arrays or
- * objects.
- *
- * Since arrays can be expensive, they are reference counted. You can control
- * the lifetime of a #JsonArray using json_array_ref() and json_array_unref().
- *
- * To append an element, use json_array_add_element().
- * To extract an element at a given index, use json_array_get_element().
- * To retrieve the entire array in list form, use json_array_get_elements().
- * To retrieve the length of the array, use json_array_get_length().
- */
-
-GType
-json_array_get_type (void)
-{
- static GType array_type = 0;
-
- if (G_UNLIKELY (!array_type))
- array_type = g_boxed_type_register_static (g_intern_static_string ("JsonArray"),
- (GBoxedCopyFunc) json_array_ref,
- (GBoxedFreeFunc) json_array_unref);
-
- return array_type;
-}
-
-/*
- * json_array_new:
- *
- * Creates a new #JsonArray.
- *
- * Return value: the newly created #JsonArray
- */
-JsonArray *
-json_array_new (void)
-{
- JsonArray *array;
-
- array = g_slice_new (JsonArray);
-
- array->ref_count = 1;
- array->elements = g_ptr_array_new ();
-
- return array;
-}
-
-/*
- * json_array_sized_new:
- * @n_elements: number of slots to pre-allocate
- *
- * Creates a new #JsonArray with @n_elements slots already allocated.
- *
- * Return value: the newly created #JsonArray
- */
-JsonArray *
-json_array_sized_new (guint n_elements)
-{
- JsonArray *array;
-
- array = g_slice_new (JsonArray);
-
- array->ref_count = 1;
- array->elements = g_ptr_array_sized_new (n_elements);
-
- return array;
-}
-
-/*
- * json_array_ref:
- * @array: a #JsonArray
- *
- * Increase by one the reference count of a #JsonArray.
- *
- * Return value: the passed #JsonArray, with the reference count
- * increased by one.
- */
-JsonArray *
-json_array_ref (JsonArray *array)
-{
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (array->ref_count > 0, NULL);
-
- g_atomic_int_exchange_and_add (&array->ref_count, 1);
-
- return array;
-}
-
-/*
- * json_array_unref:
- * @array: a #JsonArray
- *
- * Decreases by one the reference count of a #JsonArray. If the
- * reference count reaches zero, the array is destroyed and all
- * its allocated resources are freed.
- */
-void
-json_array_unref (JsonArray *array)
-{
- gint old_ref;
-
- g_return_if_fail (array != NULL);
- g_return_if_fail (array->ref_count > 0);
-
- old_ref = g_atomic_int_get (&array->ref_count);
- if (old_ref > 1)
- g_atomic_int_compare_and_exchange (&array->ref_count, old_ref, old_ref - 1);
- else
- {
- guint i;
-
- for (i = 0; i < array->elements->len; i++)
- json_node_free (g_ptr_array_index (array->elements, i));
-
- g_ptr_array_free (array->elements, TRUE);
- array->elements = NULL;
-
- g_slice_free (JsonArray, array);
- }
-}
-
-/*
- * json_array_get_elements:
- * @array: a #JsonArray
- *
- * Gets the elements of a #JsonArray as a list of #JsonNode<!-- -->s.
- *
- * Return value: a #GList containing the elements of the array. The
- * contents of the list are owned by the array and should never be
- * modified or freed. Use g_list_free() on the returned list when
- * done using it
- */
-GList *
-json_array_get_elements (JsonArray *array)
-{
- GList *retval;
- guint i;
-
- g_return_val_if_fail (array != NULL, NULL);
-
- retval = NULL;
- for (i = 0; i < array->elements->len; i++)
- retval = g_list_prepend (retval,
- g_ptr_array_index (array->elements, i));
-
- return g_list_reverse (retval);
-}
-
-/*
- * json_array_dup_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Retrieves a copy of the #JsonNode containing the value of the
- * element at @index_ inside a #JsonArray
- *
- * Return value: a copy of the #JsonNode at the requested index.
- * Use json_node_free() when done.
- *
- * Since: 0.6
- */
-JsonNode *
-json_array_dup_element (JsonArray *array,
- guint index_)
-{
- JsonNode *retval;
-
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (index_ < array->elements->len, NULL);
-
- retval = json_array_get_element (array, index_);
- if (!retval)
- return NULL;
-
- return json_node_copy (retval);
-}
-
-/*
- * json_array_get_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Retrieves the #JsonNode containing the value of the element at @index_
- * inside a #JsonArray.
- *
- * Return value: a pointer to the #JsonNode at the requested index
- */
-JsonNode *
-json_array_get_element (JsonArray *array,
- guint index_)
-{
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (index_ < array->elements->len, NULL);
-
- return g_ptr_array_index (array->elements, index_);
-}
-
-/*
- * json_array_get_int_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the integer value of the element at @index_
- * inside @array
- *
- * See also: json_array_get_element(), json_node_get_int()
- *
- * Return value: the integer value
- *
- * Since: 0.8
- */
-gint64
-json_array_get_int_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, 0);
- g_return_val_if_fail (index_ < array->elements->len, 0);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, 0);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0);
-
- return json_node_get_int (node);
-}
-
-/*
- * json_array_get_double_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the floating point value of the element at
- * @index_ inside @array
- *
- * See also: json_array_get_element(), json_node_get_double()
- *
- * Return value: the floating point value
- *
- * Since: 0.8
- */
-gdouble
-json_array_get_double_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, 0.0);
- g_return_val_if_fail (index_ < array->elements->len, 0.0);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, 0.0);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0.0);
-
- return json_node_get_double (node);
-}
-
-/*
- * json_array_get_boolean_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the boolean value of the element at @index_
- * inside @array
- *
- * See also: json_array_get_element(), json_node_get_boolean()
- *
- * Return value: the integer value
- *
- * Since: 0.8
- */
-gboolean
-json_array_get_boolean_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, FALSE);
- g_return_val_if_fail (index_ < array->elements->len, FALSE);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, FALSE);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, FALSE);
-
- return json_node_get_boolean (node);
-}
-
-/*
- * json_array_get_string_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the string value of the element at @index_
- * inside @array
- *
- * See also: json_array_get_element(), json_node_get_string()
- *
- * Return value: the string value; the returned string is owned by
- * the #JsonArray and should not be modified or freed
- *
- * Since: 0.8
- */
-G_CONST_RETURN gchar *
-json_array_get_string_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (index_ < array->elements->len, NULL);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_VALUE (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_string (node);
-}
-
-/*
- * json_array_get_null_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves whether the element at @index_ is set to null
- *
- * See also: json_array_get_element(), JSON_NODE_TYPE(), %JSON_NODE_NULL
- *
- * Return value: %TRUE if the element is null
- *
- * Since: 0.8
- */
-gboolean
-json_array_get_null_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, FALSE);
- g_return_val_if_fail (index_ < array->elements->len, FALSE);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, FALSE);
-
- return JSON_NODE_TYPE (node) == JSON_NODE_NULL;
-}
-
-/*
- * json_array_get_array_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the array from the element at @index_
- * inside @array
- *
- * See also: json_array_get_element(), json_node_get_array()
- *
- * Return value: the array
- *
- * Since: 0.8
- */
-JsonArray *
-json_array_get_array_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (index_ < array->elements->len, NULL);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_ARRAY (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_array (node);
-}
-
-/*
- * json_array_get_object_element:
- * @array: a #JsonArray
- * @index_: the index of the element to retrieve
- *
- * Conveniently retrieves the object from the element at @index_
- * inside @array
- *
- * See also: json_array_get_element(), json_node_get_object()
- *
- * Return value: the object
- *
- * Since: 0.8
- */
-JsonObject *
-json_array_get_object_element (JsonArray *array,
- guint index_)
-{
- JsonNode *node;
-
- g_return_val_if_fail (array != NULL, NULL);
- g_return_val_if_fail (index_ < array->elements->len, NULL);
-
- node = g_ptr_array_index (array->elements, index_);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_object (node);
-}
-
-/*
- * json_array_get_length:
- * @array: a #JsonArray
- *
- * Retrieves the length of a #JsonArray
- *
- * Return value: the length of the array
- */
-guint
-json_array_get_length (JsonArray *array)
-{
- g_return_val_if_fail (array != NULL, 0);
-
- return array->elements->len;
-}
-
-/*
- * json_array_add_element:
- * @array: a #JsonArray
- * @node: a #JsonNode
- *
- * Appends @node inside @array. The array will take ownership of the
- * #JsonNode.
- */
-void
-json_array_add_element (JsonArray *array,
- JsonNode *node)
-{
- g_return_if_fail (array != NULL);
- g_return_if_fail (node != NULL);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_int_element:
- * @array: a #JsonArray
- * @value: an integer value
- *
- * Conveniently adds an integer @value into @array
- *
- * See also: json_array_add_element(), json_node_set_int()
- *
- * Since: 0.8
- */
-void
-json_array_add_int_element (JsonArray *array,
- gint64 value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_int (node, value);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_double_element:
- * @array: a #JsonArray
- * @value: a floating point value
- *
- * Conveniently adds a floating point @value into @array
- *
- * See also: json_array_add_element(), json_node_set_double()
- *
- * Since: 0.8
- */
-void
-json_array_add_double_element (JsonArray *array,
- gdouble value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_double (node, value);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_boolean_element:
- * @array: a #JsonArray
- * @value: a boolean value
- *
- * Conveniently adds a boolean @value into @array
- *
- * See also: json_array_add_element(), json_node_set_boolean()
- *
- * Since: 0.8
- */
-void
-json_array_add_boolean_element (JsonArray *array,
- gboolean value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_boolean (node, value);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_string_element:
- * @array: a #JsonArray
- * @value: a string value
- *
- * Conveniently adds a string @value into @array
- *
- * See also: json_array_add_element(), json_node_set_string()
- *
- * Since: 0.8
- */
-void
-json_array_add_string_element (JsonArray *array,
- const gchar *value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
- g_return_if_fail (value != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_string (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_null_element:
- * @array: a #JsonArray
- *
- * Conveniently adds a null element into @array
- *
- * See also: json_array_add_element(), %JSON_NODE_NULL
- *
- * Since: 0.8
- */
-void
-json_array_add_null_element (JsonArray *array)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
-
- node = json_node_new (JSON_NODE_NULL);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_array_element:
- * @array: a #JsonArray
- * @value: a #JsonArray
- *
- * Conveniently adds an array into @array. The @array takes ownership
- * of the newly added #JsonArray
- *
- * See also: json_array_add_element(), json_node_take_array()
- *
- * Since: 0.8
- */
-void
-json_array_add_array_element (JsonArray *array,
- JsonArray *value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
- g_return_if_fail (value != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_ARRAY);
- json_node_take_array (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_add_object_element:
- * @array: a #JsonArray
- * @value: a #JsonObject
- *
- * Conveniently adds an object into @array. The @array takes ownership
- * of the newly added #JsonObject
- *
- * See also: json_array_add_element(), json_node_take_object()
- *
- * Since: 0.8
- */
-void
-json_array_add_object_element (JsonArray *array,
- JsonObject *value)
-{
- JsonNode *node;
-
- g_return_if_fail (array != NULL);
- g_return_if_fail (value != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_OBJECT);
- json_node_take_object (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- g_ptr_array_add (array->elements, node);
-}
-
-/*
- * json_array_remove_element:
- * @array: a #JsonArray
- * @index_: the position of the element to be removed
- *
- * Removes the #JsonNode inside @array at @index_ freeing its allocated
- * resources.
- */
-void
-json_array_remove_element (JsonArray *array,
- guint index_)
-{
- g_return_if_fail (array != NULL);
- g_return_if_fail (index_ < array->elements->len);
-
- json_node_free (g_ptr_array_remove_index (array->elements, index_));
-}
-
-/*
- * json_array_foreach_element:
- * @array: a #JsonArray
- * @func: the function to be called on each element
- * @data: data to be passed to the function
- *
- * Iterates over all elements of @array and calls @func on
- * each one of them.
- *
- * It is safe to change the value of a #JsonNode of the @array
- * from within the iterator @func, but it is not safe to add or
- * remove elements from the @array.
- *
- * Since: 0.8
- */
-void
-json_array_foreach_element (JsonArray *array,
- JsonArrayForeach func,
- gpointer data)
-{
- gint i;
-
- g_return_if_fail (array != NULL);
- g_return_if_fail (func != NULL);
-
- for (i = 0; i < array->elements->len; i++)
- {
- JsonNode *element_node;
-
- element_node = g_ptr_array_index (array->elements, i);
-
- (* func) (array, i, element_node, data);
- }
-}
+++ /dev/null
-/* json-generator.c - JSON streams generator
- *
- * 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>
- */
-
-/*
- * SECTION:json-generator
- * @short_description: Generates JSON data streams
- *
- * #JsonGenerator provides an object for generating a JSON data stream and
- * put it into a buffer or a file.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "json-types-private.h"
-
-#include "json-marshal.h"
-#include "json-generator.h"
-
-#define JSON_GENERATOR_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((obj), JSON_TYPE_GENERATOR, JsonGeneratorPrivate))
-
-struct _JsonGeneratorPrivate
-{
- JsonNode *root;
-
- guint indent;
- gunichar indent_char;
-
- guint pretty : 1;
-};
-
-enum
-{
- PROP_0,
-
- PROP_PRETTY,
- PROP_INDENT,
- PROP_ROOT,
- PROP_INDENT_CHAR
-};
-
-static gchar *dump_value (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonNode *node);
-static gchar *dump_array (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonArray *array,
- gsize *length);
-static gchar *dump_object (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonObject *object,
- gsize *length);
-
-/* non-ASCII characters can't be escaped, otherwise UTF-8
- * chars will break, so we just pregenerate this table of
- * high characters and then we feed it to g_strescape()
- */
-static const char json_exceptions[] = {
- 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
- 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e,
- 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
- 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
- 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
- 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
- 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
- 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
- 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
- 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
- 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
- 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
- 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
- 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,
- 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
- 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe,
- 0xff,
- '\0' /* g_strescape() expects a NUL-terminated string */
-};
-
-G_DEFINE_TYPE (JsonGenerator, json_generator, G_TYPE_OBJECT);
-
-static gchar *
-json_strescape (const gchar *str)
-{
- return g_strescape (str, json_exceptions);
-}
-
-static void
-json_generator_finalize (GObject *gobject)
-{
- JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject);
-
- if (priv->root)
- json_node_free (priv->root);
-
- G_OBJECT_CLASS (json_generator_parent_class)->finalize (gobject);
-}
-
-static void
-json_generator_set_property (GObject *gobject,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject);
-
- switch (prop_id)
- {
- case PROP_PRETTY:
- priv->pretty = g_value_get_boolean (value);
- break;
- case PROP_INDENT:
- priv->indent = g_value_get_uint (value);
- break;
- case PROP_INDENT_CHAR:
- priv->indent_char = g_value_get_uint (value);
- break;
- case PROP_ROOT:
- json_generator_set_root (JSON_GENERATOR (gobject),
- g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
- break;
- }
-}
-
-static void
-json_generator_get_property (GObject *gobject,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject);
-
- switch (prop_id)
- {
- case PROP_PRETTY:
- g_value_set_boolean (value, priv->pretty);
- break;
- case PROP_INDENT:
- g_value_set_uint (value, priv->indent);
- break;
- case PROP_INDENT_CHAR:
- g_value_set_uint (value, priv->indent_char);
- break;
- case PROP_ROOT:
- g_value_set_boxed (value, priv->root);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
- break;
- }
-}
-
-static void
-json_generator_class_init (JsonGeneratorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (JsonGeneratorPrivate));
-
- gobject_class->set_property = json_generator_set_property;
- gobject_class->get_property = json_generator_get_property;
- gobject_class->finalize = json_generator_finalize;
-
- /*
- * JsonGenerator:pretty:
- *
- * Whether the output should be "pretty-printed", with indentation and
- * newlines. The indentation level can be controlled by using the
- * JsonGenerator:indent property
- */
- g_object_class_install_property (gobject_class,
- PROP_PRETTY,
- g_param_spec_boolean ("pretty",
- "Pretty",
- "Pretty-print the output",
- FALSE,
- G_PARAM_READWRITE));
- /*
- * JsonGenerator:indent:
- *
- * Number of spaces to be used to indent when pretty printing.
- */
- g_object_class_install_property (gobject_class,
- PROP_INDENT,
- g_param_spec_uint ("indent",
- "Indent",
- "Number of indentation spaces",
- 0, G_MAXUINT,
- 2,
- G_PARAM_READWRITE));
- /*
- * JsonGenerator:root:
- *
- * The root #JsonNode to be used when constructing a JSON data
- * stream.
- *
- * Since: 0.4
- */
- g_object_class_install_property (gobject_class,
- PROP_ROOT,
- g_param_spec_boxed ("root",
- "Root",
- "Root of the JSON data tree",
- JSON_TYPE_NODE,
- G_PARAM_READWRITE));
- /*
- * JsonGenerator:indent-char:
- *
- * The character that should be used when indenting in pretty print.
- *
- * Since: 0.6
- */
- g_object_class_install_property (gobject_class,
- PROP_INDENT_CHAR,
- g_param_spec_unichar ("indent-char",
- "Indent Char",
- "Character that should be used when indenting",
- ' ',
- G_PARAM_READWRITE));
-}
-
-static void
-json_generator_init (JsonGenerator *generator)
-{
- JsonGeneratorPrivate *priv;
-
- generator->priv = priv = JSON_GENERATOR_GET_PRIVATE (generator);
-
- priv->pretty = FALSE;
- priv->indent = 2;
- priv->indent_char = ' ';
-}
-
-static gchar *
-dump_value (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonNode *node)
-{
- JsonGeneratorPrivate *priv = generator->priv;
- gboolean pretty = priv->pretty;
- guint indent = priv->indent;
- GValue value = { 0, };
- GString *buffer;
-
- buffer = g_string_new ("");
-
- if (pretty)
- {
- guint i;
-
- for (i = 0; i < (level * indent); i++)
- g_string_append_c (buffer, priv->indent_char);
- }
-
- if (name && name[0] != '\0')
- g_string_append_printf (buffer, "\"%s\" : ", name);
-
- json_node_get_value (node, &value);
-
- switch (G_VALUE_TYPE (&value))
- {
- case G_TYPE_INT64:
- g_string_append_printf (buffer, "%" G_GINT64_FORMAT, g_value_get_int64 (&value));
- break;
-
- case G_TYPE_STRING:
- {
- gchar *tmp;
-
- tmp = json_strescape (g_value_get_string (&value));
- g_string_append_printf (buffer, "\"%s\"", tmp);
-
- g_free (tmp);
- }
- break;
-
- case G_TYPE_DOUBLE:
- {
- gchar buf[65];
-
- g_ascii_formatd (buf, 65, "%g", g_value_get_double (&value));
- g_string_append (buffer, buf);
- }
- break;
-
- case G_TYPE_BOOLEAN:
- g_string_append_printf (buffer, "%s",
- g_value_get_boolean (&value) ? "true" : "false");
- break;
-
- default:
- break;
- }
-
- g_value_unset (&value);
-
- return g_string_free (buffer, FALSE);
-}
-
-static gchar *
-dump_array (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonArray *array,
- gsize *length)
-{
- JsonGeneratorPrivate *priv = generator->priv;
- guint array_len = json_array_get_length (array);
- guint i;
- GString *buffer;
- gboolean pretty = priv->pretty;
- guint indent = priv->indent;
-
- buffer = g_string_new ("");
-
- if (pretty)
- {
- for (i = 0; i < (level * indent); i++)
- g_string_append_c (buffer, priv->indent_char);
- }
-
- if (name && name[0] != '\0')
- g_string_append_printf (buffer, "\"%s\" : ", name);
-
- g_string_append_c (buffer, '[');
-
- if (pretty)
- g_string_append_c (buffer, '\n');
- else
- g_string_append_c (buffer, ' ');
-
- for (i = 0; i < array_len; i++)
- {
- JsonNode *cur = json_array_get_element (array, i);
- guint sub_level = level + 1;
- guint j;
- gchar *value;
-
- switch (JSON_NODE_TYPE (cur))
- {
- case JSON_NODE_NULL:
- if (pretty)
- {
- for (j = 0; j < (sub_level * indent); j++)
- g_string_append_c (buffer, priv->indent_char);
- }
- g_string_append (buffer, "null");
- break;
-
- case JSON_NODE_VALUE:
- value = dump_value (generator, sub_level, NULL, cur);
- g_string_append (buffer, value);
- g_free (value);
- break;
-
- case JSON_NODE_ARRAY:
- value = dump_array (generator, sub_level, NULL, json_node_get_array (cur), NULL);
- g_string_append (buffer, value);
- g_free (value);
- break;
-
- case JSON_NODE_OBJECT:
- value = dump_object (generator, sub_level, NULL, json_node_get_object (cur), NULL);
- g_string_append (buffer, value);
- g_free (value);
- break;
- }
-
- if ((i + 1) != array_len)
- g_string_append_c (buffer, ',');
-
- if (pretty)
- g_string_append_c (buffer, '\n');
- else
- g_string_append_c (buffer, ' ');
- }
-
- if (pretty)
- {
- for (i = 0; i < (level * indent); i++)
- g_string_append_c (buffer, priv->indent_char);
- }
-
- g_string_append_c (buffer, ']');
-
- if (length)
- *length = buffer->len;
-
- return g_string_free (buffer, FALSE);
-}
-
-static gchar *
-dump_object (JsonGenerator *generator,
- gint level,
- const gchar *name,
- JsonObject *object,
- gsize *length)
-{
- JsonGeneratorPrivate *priv = generator->priv;
- GList *members, *l;
- GString *buffer;
- gboolean pretty = priv->pretty;
- guint indent = priv->indent;
- guint i;
-
- buffer = g_string_new ("");
-
- if (pretty)
- {
- for (i = 0; i < (level * indent); i++)
- g_string_append_c (buffer, priv->indent_char);
- }
-
- if (name && name[0] != '\0')
- g_string_append_printf (buffer, "\"%s\" : ", name);
-
- g_string_append_c (buffer, '{');
-
- if (pretty)
- g_string_append_c (buffer, '\n');
- else
- g_string_append_c (buffer, ' ');
-
- members = json_object_get_members (object);
-
- for (l = members; l != NULL; l = l->next)
- {
- const gchar *member_name = l->data;
- JsonNode *cur = json_object_get_member (object, member_name);
- guint sub_level = level + 1;
- guint j;
- gchar *value;
-
- switch (JSON_NODE_TYPE (cur))
- {
- case JSON_NODE_NULL:
- if (pretty)
- {
- for (j = 0; j < (sub_level * indent); j++)
- g_string_append_c (buffer, priv->indent_char);
- }
- g_string_append_printf (buffer, "\"%s\" : null", member_name);
- break;
-
- case JSON_NODE_VALUE:
- value = dump_value (generator, sub_level, member_name, cur);
- g_string_append (buffer, value);
- g_free (value);
- break;
-
- case JSON_NODE_ARRAY:
- value = dump_array (generator, sub_level, member_name,
- json_node_get_array (cur), NULL);
- g_string_append (buffer, value);
- g_free (value);
- break;
-
- case JSON_NODE_OBJECT:
- value = dump_object (generator, sub_level, member_name,
- json_node_get_object (cur), NULL);
- g_string_append (buffer, value);
- g_free (value);
- break;
- }
-
- if (l->next != NULL)
- g_string_append_c (buffer, ',');
-
- if (pretty)
- g_string_append_c (buffer, '\n');
- else
- g_string_append_c (buffer, ' ');
- }
-
- g_list_free (members);
-
- if (pretty)
- {
- for (i = 0; i < (level * indent); i++)
- g_string_append_c (buffer, priv->indent_char);
- }
-
- g_string_append_c (buffer, '}');
-
- if (length)
- *length = buffer->len;
-
- return g_string_free (buffer, FALSE);
-}
-
-/*
- * json_generator_new:
- *
- * Creates a new #JsonGenerator. You can use this object to generate a
- * JSON data stream starting from a data object model composed by
- * #JsonNode<!-- -->s.
- *
- * Return value: the newly created #JsonGenerator instance
- */
-JsonGenerator *
-json_generator_new (void)
-{
- return g_object_new (JSON_TYPE_GENERATOR, NULL);
-}
-
-/*
- * json_generator_to_data:
- * @generator: a #JsonGenerator
- * @length: (out): return location for the length of the returned
- * buffer, or %NULL
- *
- * Generates a JSON data stream from @generator and returns it as a
- * buffer.
- *
- * Return value: a newly allocated buffer holding a JSON data stream.
- * Use g_free() to free the allocated resources.
- */
-gchar *
-json_generator_to_data (JsonGenerator *generator,
- gsize *length)
-{
- JsonNode *root;
- gchar *retval = NULL;
-
- g_return_val_if_fail (JSON_IS_GENERATOR (generator), NULL);
-
- root = generator->priv->root;
- if (!root)
- {
- if (length)
- *length = 0;
-
- return NULL;
- }
-
- switch (JSON_NODE_TYPE (root))
- {
- case JSON_NODE_ARRAY:
- retval = dump_array (generator, 0, NULL, json_node_get_array (root), length);
- break;
-
- case JSON_NODE_OBJECT:
- retval = dump_object (generator, 0, NULL, json_node_get_object (root), length);
- break;
-
- case JSON_NODE_NULL:
- retval = g_strdup ("null");
- if (length)
- *length = 4;
- break;
-
- case JSON_NODE_VALUE:
- retval = NULL;
- break;
- }
-
- return retval;
-}
-
-/*
- * json_generator_to_file:
- * @generator: a #JsonGenerator
- * @filename: path to the target file
- * @error: return location for a #GError, or %NULL
- *
- * Creates a JSON data stream and puts it inside @filename, overwriting the
- * current file contents. This operation is atomic.
- *
- * Return value: %TRUE if saving was successful.
- */
-gboolean
-json_generator_to_file (JsonGenerator *generator,
- const gchar *filename,
- GError **error)
-{
- gchar *buffer;
- gsize len;
- gboolean retval;
-
- g_return_val_if_fail (JSON_IS_GENERATOR (generator), FALSE);
- g_return_val_if_fail (filename != NULL, FALSE);
-
- buffer = json_generator_to_data (generator, &len);
- retval = g_file_set_contents (filename, buffer, len, error);
- g_free (buffer);
-
- return retval;
-}
-
-/*
- * json_generator_set_root:
- * @generator: a #JsonGenerator
- * @node: a #JsonNode
- *
- * Sets @node as the root of the JSON data stream to be serialized by
- * the #JsonGenerator.
- *
- * <note>The node is copied by the generator object, so it can be safely
- * freed after calling this function.</note>
- */
-void
-json_generator_set_root (JsonGenerator *generator,
- JsonNode *node)
-{
- g_return_if_fail (JSON_IS_GENERATOR (generator));
-
- if (generator->priv->root)
- {
- json_node_free (generator->priv->root);
- generator->priv->root = NULL;
- }
-
- if (node)
- generator->priv->root = json_node_copy (node);
-}
+++ /dev/null
-/* json-generator.h - JSON streams generator
- *
- * 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>
- */
-
-#ifndef __JSON_GENERATOR_H__
-#define __JSON_GENERATOR_H__
-
-#include <glib-object.h>
-#include "json-types.h"
-
-G_BEGIN_DECLS
-
-#define JSON_TYPE_GENERATOR (json_generator_get_type ())
-#define JSON_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_GENERATOR, JsonGenerator))
-#define JSON_IS_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_GENERATOR))
-#define JSON_GENERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), JSON_TYPE_GENERATOR, JsonGeneratorClass))
-#define JSON_IS_GENERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), JSON_TYPE_GENERATOR))
-#define JSON_GENERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), JSON_TYPE_GENERATOR, JsonGeneratorClass))
-
-typedef struct _JsonGenerator JsonGenerator;
-typedef struct _JsonGeneratorPrivate JsonGeneratorPrivate;
-typedef struct _JsonGeneratorClass JsonGeneratorClass;
-
-/**
- * JsonGenerator:
- *
- * JSON data streams generator. The contents of the #JsonGenerator structure
- * are private and should only be accessed via the provided API.
- */
-struct _JsonGenerator
-{
- /*< private >*/
- GObject parent_instance;
-
- JsonGeneratorPrivate *priv;
-};
-
-/**
- * JsonGeneratorClass:
- *
- * #JsonGenerator class
- */
-struct _JsonGeneratorClass
-{
- /*< private >*/
- GObjectClass parent_class;
-
- /* padding, for future expansion */
- void (* _json_reserved1) (void);
- void (* _json_reserved2) (void);
- void (* _json_reserved3) (void);
- void (* _json_reserved4) (void);
-};
-
-GType json_generator_get_type (void) G_GNUC_CONST;
-
-JsonGenerator *json_generator_new (void);
-gchar * json_generator_to_data (JsonGenerator *generator,
- gsize *length);
-gboolean json_generator_to_file (JsonGenerator *generator,
- const gchar *filename,
- GError **error);
-void json_generator_set_root (JsonGenerator *generator,
- JsonNode *node);
-
-G_END_DECLS
-
-#endif /* __JSON_GENERATOR_H__ */
+++ /dev/null
-#ifndef __JSON_GLIB_H__
-#define __JSON_GLIB_H__
-
-#define __JSON_GLIB_INSIDE__
-
-#include "json-types.h"
-#include "json-generator.h"
-#include "json-parser.h"
-
-#undef __JSON_GLIB_INSIDE__
-
-#endif /* __JSON_GLIB_H__ */
+++ /dev/null
-#include "json-marshal.h"
-
-#include <glib-object.h>
-
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v) g_value_get_char (v)
-#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v) g_value_get_int (v)
-#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
-#define g_marshal_value_peek_long(v) g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
-#define g_marshal_value_peek_float(v) g_value_get_float (v)
-#define g_marshal_value_peek_double(v) g_value_get_double (v)
-#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v) g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v) g_value_get_object (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- * Do not access GValues directly in your code. Instead, use the
- * g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
-#define g_marshal_value_peek_char(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v) (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v) (v)->data[0].v_float
-#define g_marshal_value_peek_double(v) (v)->data[0].v_double
-#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
-#endif /* !G_ENABLE_DEBUG */
-
-
-/* VOID:VOID (./json-marshal.list:1) */
-
-/* VOID:BOXED (./json-marshal.list:2) */
-
-/* VOID:BOXED,STRING (./json-marshal.list:3) */
-void
-_json_marshal_VOID__BOXED_STRING (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__BOXED_STRING) (gpointer data1,
- gpointer arg_1,
- gpointer arg_2,
- gpointer data2);
- register GMarshalFunc_VOID__BOXED_STRING callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 3);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__BOXED_STRING) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_marshal_value_peek_boxed (param_values + 1),
- g_marshal_value_peek_string (param_values + 2),
- data2);
-}
-
-/* VOID:BOXED,INT (./json-marshal.list:4) */
-void
-_json_marshal_VOID__BOXED_INT (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__BOXED_INT) (gpointer data1,
- gpointer arg_1,
- gint arg_2,
- gpointer data2);
- register GMarshalFunc_VOID__BOXED_INT callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 3);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__BOXED_INT) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_marshal_value_peek_boxed (param_values + 1),
- g_marshal_value_peek_int (param_values + 2),
- data2);
-}
-
-/* VOID:POINTER (./json-marshal.list:5) */
-
+++ /dev/null
-
-#ifndef ___json_marshal_MARSHAL_H__
-#define ___json_marshal_MARSHAL_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-/* VOID:VOID (./json-marshal.list:1) */
-#define _json_marshal_VOID__VOID g_cclosure_marshal_VOID__VOID
-
-/* VOID:BOXED (./json-marshal.list:2) */
-#define _json_marshal_VOID__BOXED g_cclosure_marshal_VOID__BOXED
-
-/* VOID:BOXED,STRING (./json-marshal.list:3) */
-extern void _json_marshal_VOID__BOXED_STRING (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data);
-
-/* VOID:BOXED,INT (./json-marshal.list:4) */
-extern void _json_marshal_VOID__BOXED_INT (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data);
-
-/* VOID:POINTER (./json-marshal.list:5) */
-#define _json_marshal_VOID__POINTER g_cclosure_marshal_VOID__POINTER
-
-G_END_DECLS
-
-#endif /* ___json_marshal_MARSHAL_H__ */
-
+++ /dev/null
-/* json-node.c - JSON object model node
- *
- * 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>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-
-#include "json-types-private.h"
-
-/*
- * SECTION:json-node
- * @short_description: Node in a JSON object model
- *
- * A #JsonNode is a generic container of elements inside a JSON stream.
- * It can contain fundamental types (integers, booleans, floating point
- * numbers, strings) and complex types (arrays and objects).
- *
- * When parsing a JSON data stream you extract the root node and walk
- * the node tree by retrieving the type of data contained inside the
- * node with the %JSON_NODE_TYPE macro. If the node contains a fundamental
- * type you can retrieve a copy of the #GValue holding it with the
- * json_node_get_value() function, and then use the #GValue API to extract
- * the data; if the node contains a complex type you can retrieve the
- * #JsonObject or the #JsonArray using json_node_get_object() or
- * json_node_get_array() respectively, and then retrieve the nodes
- * they contain.
- */
-
-GType
-json_node_get_type (void)
-{
- static GType node_type = 0;
-
- if (G_UNLIKELY (node_type == 0))
- node_type = g_boxed_type_register_static (g_intern_static_string ("JsonNode"),
- (GBoxedCopyFunc) json_node_copy,
- (GBoxedFreeFunc) json_node_free);
-
- return node_type;
-}
-
-/*
- * json_node_get_value_type:
- * @node: a #JsonNode
- *
- * Returns the #GType of the payload of the node.
- *
- * Return value: a #GType for the payload.
- *
- * Since: 0.4
- */
-GType
-json_node_get_value_type (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, G_TYPE_INVALID);
-
- switch (node->type)
- {
- case JSON_NODE_OBJECT:
- return JSON_TYPE_OBJECT;
-
- case JSON_NODE_ARRAY:
- return JSON_TYPE_ARRAY;
-
- case JSON_NODE_NULL:
- return G_TYPE_INVALID;
-
- case JSON_NODE_VALUE:
- return G_VALUE_TYPE (&(node->data.value));
-
- default:
- g_assert_not_reached ();
- return G_TYPE_INVALID;
- }
-}
-
-/*
- * json_node_new:
- * @type: a #JsonNodeType
- *
- * Creates a new #JsonNode of @type.
- *
- * Return value: the newly created #JsonNode
- */
-JsonNode *
-json_node_new (JsonNodeType type)
-{
- JsonNode *data;
-
- g_return_val_if_fail (type >= JSON_NODE_OBJECT &&
- type <= JSON_NODE_NULL, NULL);
-
- data = g_slice_new0 (JsonNode);
- data->type = type;
-
- return data;
-}
-
-/*
- * json_node_copy:
- * @node: a #JsonNode
- *
- * Copies @node. If the node contains complex data types then the reference
- * count of the objects is increased.
- *
- * Return value: the copied #JsonNode
- */
-JsonNode *
-json_node_copy (JsonNode *node)
-{
- JsonNode *copy;
-
- g_return_val_if_fail (node != NULL, NULL);
-
- copy = g_slice_new0 (JsonNode);
- copy->type = node->type;
-
- switch (copy->type)
- {
- case JSON_NODE_OBJECT:
- if (node->data.object)
- copy->data.object = json_object_ref (node->data.object);
- break;
-
- case JSON_NODE_ARRAY:
- if (node->data.array)
- copy->data.array = json_array_ref (node->data.array);
- break;
-
- case JSON_NODE_VALUE:
- if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID)
- {
- g_value_init (&(copy->data.value), G_VALUE_TYPE (&(node->data.value)));
- g_value_copy (&(node->data.value), &(copy->data.value));
- }
- break;
-
- case JSON_NODE_NULL:
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- return copy;
-}
-
-/*
- * json_node_set_object:
- * @node: a #JsonNode
- * @object: a #JsonObject
- *
- * Sets @objects inside @node. The reference count of @object is increased.
- */
-void
-json_node_set_object (JsonNode *node,
- JsonObject *object)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT);
-
- if (node->data.object)
- json_object_unref (node->data.object);
-
- if (object)
- node->data.object = json_object_ref (object);
- else
- node->data.object = NULL;
-}
-
-/*
- * json_node_take_object:
- * @node: a #JsonNode
- * @object: a #JsonObject
- *
- * Sets @object inside @node. The reference count of @object is not increased.
- */
-void
-json_node_take_object (JsonNode *node,
- JsonObject *object)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT);
-
- if (node->data.object)
- {
- json_object_unref (node->data.object);
- node->data.object = NULL;
- }
-
- if (object)
- node->data.object = object;
-}
-
-/*
- * json_node_get_object:
- * @node: a #JsonNode
- *
- * Retrieves the #JsonObject stored inside a #JsonNode
- *
- * Return value: the #JsonObject
- */
-JsonObject *
-json_node_get_object (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT, NULL);
-
- return node->data.object;
-}
-
-/*
- * json_node_dup_object:
- * @node: a #JsonNode
- *
- * Retrieves the #JsonObject inside @node. The reference count of
- * the returned object is increased.
- *
- * Return value: the #JsonObject
- */
-JsonObject *
-json_node_dup_object (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT, NULL);
-
- if (node->data.object)
- return json_object_ref (node->data.object);
-
- return NULL;
-}
-
-/*
- * json_node_set_array:
- * @node: a #JsonNode
- * @array: a #JsonArray
- *
- * Sets @array inside @node and increases the #JsonArray reference count
- */
-void
-json_node_set_array (JsonNode *node,
- JsonArray *array)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY);
-
- if (node->data.array)
- json_array_unref (node->data.array);
-
- if (array)
- node->data.array = json_array_ref (array);
- else
- node->data.array = NULL;
-}
-
-/*
- * json_node_take_array:
- * @node: a #JsonNode
- * @array: a #JsonArray
- *
- * Sets @array into @node without increasing the #JsonArray reference count.
- */
-void
-json_node_take_array (JsonNode *node,
- JsonArray *array)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY);
-
- if (node->data.array)
- {
- json_array_unref (node->data.array);
- node->data.array = NULL;
- }
-
- if (array)
- node->data.array = array;
-}
-
-/*
- * json_node_get_array:
- * @node: a #JsonNode
- *
- * Retrieves the #JsonArray stored inside a #JsonNode
- *
- * Return value: the #JsonArray
- */
-JsonArray *
-json_node_get_array (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY, NULL);
-
- return node->data.array;
-}
-
-/*
- * json_node_dup_array
- * @node: a #JsonNode
- *
- * Retrieves the #JsonArray stored inside a #JsonNode and returns it
- * with its reference count increased by one.
- *
- * Return value: the #JsonArray with its reference count increased.
- */
-JsonArray *
-json_node_dup_array (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY, NULL);
-
- if (node->data.array)
- return json_array_ref (node->data.array);
-
- return NULL;
-}
-
-/*
- * json_node_get_value:
- * @node: a #JsonNode
- * @value: return location for an uninitialized value
- *
- * Retrieves a value from a #JsonNode and copies into @value. When done
- * using it, call g_value_unset() on the #GValue.
- */
-void
-json_node_get_value (JsonNode *node,
- GValue *value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
-
- if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID)
- {
- g_value_init (value, G_VALUE_TYPE (&(node->data.value)));
- g_value_copy (&(node->data.value), value);
- }
-}
-
-static void inline
-node_value_unset (JsonNode *node)
-{
- if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID)
- g_value_unset (&(node->data.value));
-}
-
-/*
- * json_node_set_value:
- * @node: a #JsonNode
- * @value: the #GValue to set
- *
- * Sets @value inside @node. The passed #GValue is copied into the #JsonNode
- */
-void
-json_node_set_value (JsonNode *node,
- const GValue *value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
- g_return_if_fail (G_VALUE_TYPE (value) != G_TYPE_INVALID);
-
- switch (G_VALUE_TYPE (value))
- {
- /* direct copy for the types we use */
- case G_TYPE_INT64:
- case G_TYPE_BOOLEAN:
- case G_TYPE_DOUBLE:
- case G_TYPE_STRING:
- node_value_unset (node);
- g_value_init (&(node->data.value), G_VALUE_TYPE (value));
- g_value_copy (value, &(node->data.value));
- break;
-
- /* auto-promote ints to long longs */
- case G_TYPE_INT:
- node_value_unset (node);
- g_value_init (&(node->data.value), G_TYPE_INT64);
- g_value_set_int64 (&(node->data.value),
- g_value_get_int (value));
- break;
-
- /* auto-promote single precision to double precision */
- case G_TYPE_FLOAT:
- node_value_unset (node);
- g_value_init (&(node->data.value), G_TYPE_DOUBLE);
- g_value_set_double (&(node->data.value),
- g_value_get_float (value));
- break;
-
- default:
- g_warning ("Invalid value of type '%s'",
- g_type_name (G_VALUE_TYPE (value)));
- return;
- }
-
-}
-
-/*
- * json_node_free:
- * @node: a #JsonNode
- *
- * Frees the resources allocated by @node.
- */
-void
-json_node_free (JsonNode *node)
-{
- if (G_LIKELY (node))
- {
- switch (node->type)
- {
- case JSON_NODE_OBJECT:
- if (node->data.object)
- json_object_unref (node->data.object);
- break;
-
- case JSON_NODE_ARRAY:
- if (node->data.array)
- json_array_unref (node->data.array);
- break;
-
- case JSON_NODE_VALUE:
- g_value_unset (&(node->data.value));
- break;
-
- case JSON_NODE_NULL:
- break;
- }
-
- g_slice_free (JsonNode, node);
- }
-}
-
-/*
- * json_node_type_name:
- * @node: a #JsonNode
- *
- * Retrieves the user readable name of the data type contained by @node.
- *
- * Return value: a string containing the name of the type. The returned string
- * is owned by the node and should never be modified or freed
- */
-G_CONST_RETURN gchar *
-json_node_type_name (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, "(null)");
-
- switch (node->type)
- {
- case JSON_NODE_OBJECT:
- return "JsonObject";
-
- case JSON_NODE_ARRAY:
- return "JsonArray";
-
- case JSON_NODE_NULL:
- return "NULL";
-
- case JSON_NODE_VALUE:
- return g_type_name (G_VALUE_TYPE (&(node->data.value)));
- }
-
- return "unknown";
-}
-
-/*
- * json_node_get_parent:
- * @node: a #JsonNode
- *
- * Retrieves the parent #JsonNode of @node.
- *
- * Return value: the parent node, or %NULL if @node is the root node
- */
-JsonNode *
-json_node_get_parent (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
-
- return node->parent;
-}
-
-/*
- * json_node_set_string:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- * @value: a string value
- *
- * Sets @value as the string content of the @node, replacing any existing
- * content.
- */
-void
-json_node_set_string (JsonNode *node,
- const gchar *value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING)
- g_value_set_string (&(node->data.value), value);
- else
- {
- GValue copy = { 0, };
-
- g_value_init (©, G_TYPE_STRING);
- g_value_set_string (©, value);
-
- json_node_set_value (node, ©);
-
- g_value_unset (©);
- }
-}
-
-/*
- * json_node_get_string:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- *
- * Gets the string value stored inside a #JsonNode
- *
- * Return value: a string value.
- */
-G_CONST_RETURN gchar *
-json_node_get_string (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
-
- if (JSON_NODE_TYPE (node) == JSON_NODE_NULL)
- return NULL;
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING)
- return g_value_get_string (&(node->data.value));
-
- return NULL;
-}
-
-/*
- * json_node_dup_string:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- *
- * Gets a copy of the string value stored inside a #JsonNode
- *
- * Return value: a newly allocated string containing a copy of
- * the #JsonNode contents
- */
-gchar *
-json_node_dup_string (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
-
- if (JSON_NODE_TYPE (node) == JSON_NODE_NULL)
- return NULL;
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING)
- return g_value_dup_string (&(node->data.value));
-
- return NULL;
-}
-
-/*
- * json_node_set_int:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- * @value: an integer value
- *
- * Sets @value as the integer content of the @node, replacing any existing
- * content.
- */
-void
-json_node_set_int (JsonNode *node,
- gint64 value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_INT64)
- g_value_set_int64 (&(node->data.value), value);
- else
- {
- GValue copy = { 0, };
-
- g_value_init (©, G_TYPE_INT64);
- g_value_set_int64 (©, value);
-
- json_node_set_value (node, ©);
-
- g_value_unset (©);
- }
-}
-
-/*
- * json_node_get_int:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- *
- * Gets the integer value stored inside a #JsonNode
- *
- * Return value: an integer value.
- */
-gint64
-json_node_get_int (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, 0);
-
- if (JSON_NODE_TYPE (node) == JSON_NODE_NULL)
- return 0;
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_INT64)
- return g_value_get_int64 (&(node->data.value));
-
- return 0;
-}
-
-/*
- * json_node_set_double:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- * @value: a double value
- *
- * Sets @value as the double content of the @node, replacing any existing
- * content.
- */
-void
-json_node_set_double (JsonNode *node,
- gdouble value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_DOUBLE)
- g_value_set_double (&(node->data.value), value);
- else
- {
- GValue copy = { 0, };
-
- g_value_init (©, G_TYPE_DOUBLE);
- g_value_set_double (©, value);
-
- json_node_set_value (node, ©);
-
- g_value_unset (©);
- }
-}
-
-/*
- * json_node_get_double:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- *
- * Gets the double value stored inside a #JsonNode
- *
- * Return value: a double value.
- */
-gdouble
-json_node_get_double (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, 0.0);
-
- if (JSON_NODE_TYPE (node) == JSON_NODE_NULL)
- return 0;
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_DOUBLE)
- return g_value_get_double (&(node->data.value));
-
- return 0.0;
-}
-
-/*
- * json_node_set_boolean:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- * @value: a boolean value
- *
- * Sets @value as the boolean content of the @node, replacing any existing
- * content.
- */
-void
-json_node_set_boolean (JsonNode *node,
- gboolean value)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE);
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_BOOLEAN)
- g_value_set_boolean (&(node->data.value), value);
- else
- {
- GValue copy = { 0, };
-
- g_value_init (©, G_TYPE_BOOLEAN);
- g_value_set_boolean (©, value);
-
- json_node_set_value (node, ©);
-
- g_value_unset (©);
- }
-}
-
-/*
- * json_node_get_boolean:
- * @node: a #JsonNode of type %JSON_NODE_VALUE
- *
- * Gets the boolean value stored inside a #JsonNode
- *
- * Return value: a boolean value.
- */
-gboolean
-json_node_get_boolean (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, FALSE);
-
- if (JSON_NODE_TYPE (node) == JSON_NODE_NULL)
- return FALSE;
-
- if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_BOOLEAN)
- return g_value_get_boolean (&(node->data.value));
-
- return FALSE;
-}
-
-/*
- * json_node_get_node_type:
- * @node: a #JsonNode
- *
- * Retrieves the #JsonNodeType of @node
- *
- * Return value: the type of the node
- *
- * Since: 0.8
- */
-JsonNodeType
-json_node_get_node_type (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, JSON_NODE_NULL);
-
- return node->type;
-}
-
-/*
- * json_node_is_null:
- * @node: a #JsonNode
- *
- * Checks whether @node is a %JSON_NODE_NULL
- *
- * <note>A null node is not the same as a %NULL #JsonNode</note>
- *
- * Return value: %TRUE if the node is null
- *
- * Since: 0.8
- */
-gboolean
-json_node_is_null (JsonNode *node)
-{
- g_return_val_if_fail (node != NULL, TRUE);
-
- return node->type == JSON_NODE_NULL;
-}
+++ /dev/null
-/* json-object.c - JSON object implementation
- *
- * 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>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-
-#include "json-types-private.h"
-
-/*
- * SECTION:json-object
- * @short_description: a JSON object representation
- *
- * #JsonArray is the representation of the object type inside JSON. It contains
- * #JsonNode<!-- -->s, which may contain fundamental types, arrays or other
- * objects. Each member of an object is accessed using its name. Please note
- * that the member names are normalized internally before being used; every
- * delimiter matching the %G_STR_DELIMITER macro will be transformed into an
- * underscore, so for instance "member-name" and "member_name" are equivalent
- * for a #JsonObject.
- *
- * Since objects can be expensive, they are reference counted. You can control
- * the lifetime of a #JsonObject using json_object_ref() and json_object_unref().
- *
- * To add or overwrite a member with a given name, use json_object_set_member().
- * To extract a member with a given name, use json_object_get_member().
- * To retrieve the list of members, use json_object_get_members().
- * To retrieve the size of the object (that is, the number of members it has),
- * use json_object_get_size().
- */
-
-GType
-json_object_get_type (void)
-{
- static GType object_type = 0;
-
- if (G_UNLIKELY (!object_type))
- object_type = g_boxed_type_register_static (g_intern_static_string ("JsonObject"),
- (GBoxedCopyFunc) json_object_ref,
- (GBoxedFreeFunc) json_object_unref);
-
- return object_type;
-}
-
-/*
- * json_object_new:
- *
- * Creates a new #JsonObject, an JSON object type representation.
- *
- * Return value: the newly created #JsonObject
- */
-JsonObject *
-json_object_new (void)
-{
- JsonObject *object;
-
- object = g_slice_new (JsonObject);
-
- object->ref_count = 1;
- object->members = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free,
- (GDestroyNotify) json_node_free);
-
- return object;
-}
-
-/*
- * json_object_ref:
- * @object: a #JsonObject
- *
- * Increase by one the reference count of a #JsonObject.
- *
- * Return value: the passed #JsonObject, with the reference count
- * increased by one.
- */
-JsonObject *
-json_object_ref (JsonObject *object)
-{
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (object->ref_count > 0, NULL);
-
- g_atomic_int_exchange_and_add (&object->ref_count, 1);
-
- return object;
-}
-
-/*
- * json_object_unref:
- * @object: a #JsonObject
- *
- * Decreases by one the reference count of a #JsonObject. If the
- * reference count reaches zero, the object is destroyed and all
- * its allocated resources are freed.
- */
-void
-json_object_unref (JsonObject *object)
-{
- gint old_ref;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (object->ref_count > 0);
-
- old_ref = g_atomic_int_get (&object->ref_count);
- if (old_ref > 1)
- g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1);
- else
- {
- g_hash_table_destroy (object->members);
- object->members = NULL;
-
- g_slice_free (JsonObject, object);
- }
-}
-
-static inline void
-object_set_member_internal (JsonObject *object,
- const gchar *member_name,
- JsonNode *node)
-{
- g_hash_table_replace (object->members,
- g_strdup (member_name),
- node);
-}
-
-/*
- * json_object_add_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @node: the value of the member
- *
- * Adds a member named @member_name and containing @node into a #JsonObject.
- * The object will take ownership of the #JsonNode.
- *
- * This function will return if the @object already contains a member
- * @member_name.
- *
- * Deprecated: 0.8: Use json_object_set_member() instead
- */
-void
-json_object_add_member (JsonObject *object,
- const gchar *member_name,
- JsonNode *node)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
- g_return_if_fail (node != NULL);
-
- if (json_object_has_member (object, member_name))
- {
- g_warning ("JsonObject already has a `%s' member of type `%s'",
- member_name,
- json_node_type_name (node));
- return;
- }
-
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @node: the value of the member
- *
- * Sets @node as the value of @member_name inside @object.
- *
- * If @object already contains a member called @member_name then
- * the member's current value is overwritten. Otherwise, a new
- * member is added to @object.
- *
- * Since: 0.8
- */
-void
-json_object_set_member (JsonObject *object,
- const gchar *member_name,
- JsonNode *node)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
- g_return_if_fail (node != NULL);
-
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_int_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting an integer @value of
- * @member_name inside @object.
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_int_member (JsonObject *object,
- const gchar *member_name,
- gint64 value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_int (node, value);
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_double_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting a floating point @value
- * of @member_name inside @object.
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_double_member (JsonObject *object,
- const gchar *member_name,
- gdouble value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_double (node, value);
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_boolean_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting a boolean @value of
- * @member_name inside @object.
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_boolean_member (JsonObject *object,
- const gchar *member_name,
- gboolean value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_boolean (node, value);
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_string_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting a string @value of
- * @member_name inside @object.
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_string_member (JsonObject *object,
- const gchar *member_name,
- const gchar *value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_string (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_null_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function for setting a null @value of
- * @member_name inside @object.
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_null_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- node = json_node_new (JSON_NODE_NULL);
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_array_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting an array @value of
- * @member_name inside @object.
- *
- * The @object will take ownership of the passed #JsonArray
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_array_member (JsonObject *object,
- const gchar *member_name,
- JsonArray *value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_ARRAY);
- json_node_take_array (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- object_set_member_internal (object, member_name, node);
-}
-
-/*
- * json_object_set_object_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- * @value: the value of the member
- *
- * Convenience function for setting an object @value of
- * @member_name inside @object.
- *
- * The @object will take ownership of the passed #JsonObject
- *
- * See also: json_object_set_member()
- *
- * Since: 0.8
- */
-void
-json_object_set_object_member (JsonObject *object,
- const gchar *member_name,
- JsonObject *value)
-{
- JsonNode *node;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- if (value != NULL)
- {
- node = json_node_new (JSON_NODE_OBJECT);
- json_node_take_object (node, value);
- }
- else
- node = json_node_new (JSON_NODE_NULL);
-
- object_set_member_internal (object, member_name, node);
-}
-
-/* FIXME: yuck */
-#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 14
-static void
-get_keys (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- GList **keys = user_data;
-
- *keys = g_list_prepend (*keys, key);
-}
-
-static void
-get_values (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- GList **values = user_data;
-
- *values = g_list_prepend (*values, value);
-}
-
-static GList *
-g_hash_table_get_keys (GHashTable *hash_table)
-{
- GList *retval = NULL;
-
- g_return_val_if_fail (hash_table != NULL, NULL);
-
- g_hash_table_foreach (hash_table, get_keys, &retval);
-
- return retval;
-}
-
-static GList *
-g_hash_table_get_values (GHashTable *hash_table)
-{
- GList *retval = NULL;
-
- g_return_val_if_fail (hash_table != NULL, NULL);
-
- g_hash_table_foreach (hash_table, get_values, &retval);
-
- return retval;
-}
-#endif /* GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 14 */
-
-/*
- * json_object_get_members:
- * @object: a #JsonObject
- *
- * Retrieves all the names of the members of a #JsonObject. You can
- * obtain the value for each member using json_object_get_member().
- *
- * Return value: a #GList of member names. The content of the list
- * is owned by the #JsonObject and should never be modified or
- * freed. When you have finished using the returned list, use
- * g_list_free() to free the resources it has allocated.
- */
-GList *
-json_object_get_members (JsonObject *object)
-{
- g_return_val_if_fail (object != NULL, NULL);
-
- return g_hash_table_get_keys (object->members);
-}
-
-/*
- * json_object_get_values:
- * @object: a #JsonObject
- *
- * Retrieves all the values of the members of a #JsonObject.
- *
- * Return value: a #GList of #JsonNode<!-- -->s. The content of the
- * list is owned by the #JsonObject and should never be modified
- * or freed. When you have finished using the returned list, use
- * g_list_free() to free the resources it has allocated.
- */
-GList *
-json_object_get_values (JsonObject *object)
-{
- g_return_val_if_fail (object != NULL, NULL);
-
- return g_hash_table_get_values (object->members);
-}
-
-/*
- * json_object_dup_member:
- * @object: a #JsonObject
- * @member_name: the name of the JSON object member to access
- *
- * Retrieves a copy of the #JsonNode containing the value of @member_name
- * inside a #JsonObject
- *
- * Return value: a copy of the node for the requested object member
- * or %NULL. Use json_node_free() when done.
- *
- * Since: 0.6
- */
-JsonNode *
-json_object_dup_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *retval;
-
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (member_name != NULL, NULL);
-
- retval = json_object_get_member (object, member_name);
- if (!retval)
- return NULL;
-
- return json_node_copy (retval);
-}
-
-static inline JsonNode *
-object_get_member_internal (JsonObject *object,
- const gchar *member_name)
-{
- return g_hash_table_lookup (object->members, member_name);
-}
-
-/*
- * json_object_get_member:
- * @object: a #JsonObject
- * @member_name: the name of the JSON object member to access
- *
- * Retrieves the #JsonNode containing the value of @member_name inside
- * a #JsonObject.
- *
- * Return value: a pointer to the node for the requested object
- * member, or %NULL
- */
-JsonNode *
-json_object_get_member (JsonObject *object,
- const gchar *member_name)
-{
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (member_name != NULL, NULL);
-
- return object_get_member_internal (object, member_name);
-}
-
-/*
- * json_object_get_int_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the integer value
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the integer value of the object's member
- *
- * Since: 0.8
- */
-gint64
-json_object_get_int_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, 0);
- g_return_val_if_fail (member_name != NULL, 0);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, 0);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0);
-
- return json_node_get_int (node);
-}
-
-/*
- * json_object_get_double_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the floating point value
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the floating point value of the object's member
- *
- * Since: 0.8
- */
-gdouble
-json_object_get_double_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, 0.0);
- g_return_val_if_fail (member_name != NULL, 0.0);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, 0.0);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0.0);
-
- return json_node_get_double (node);
-}
-
-/*
- * json_object_get_boolean_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the boolean value
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the boolean value of the object's member
- *
- * Since: 0.8
- */
-gboolean
-json_object_get_boolean_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, FALSE);
- g_return_val_if_fail (member_name != NULL, FALSE);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, FALSE);
- g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, FALSE);
-
- return json_node_get_boolean (node);
-}
-
-/*
- * json_object_get_null_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that checks whether the value
- * stored in @member_name of @object is null
- *
- * See also: json_object_get_member()
- *
- * Return value: %TRUE if the value is null
- *
- * Since: 0.8
- */
-gboolean
-json_object_get_null_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, FALSE);
- g_return_val_if_fail (member_name != NULL, FALSE);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, FALSE);
-
- return JSON_NODE_TYPE (node) == JSON_NODE_NULL;
-}
-
-/*
- * json_object_get_string_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the string value
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the string value of the object's member
- *
- * Since: 0.8
- */
-G_CONST_RETURN gchar *
-json_object_get_string_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (member_name != NULL, NULL);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_VALUE (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_string (node);
-}
-
-/*
- * json_object_get_array_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the array
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the array inside the object's member
- *
- * Since: 0.8
- */
-JsonArray *
-json_object_get_array_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (member_name != NULL, NULL);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_ARRAY (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_array (node);
-}
-
-/*
- * json_object_get_object_member:
- * @object: a #JsonObject
- * @member_name: the name of the member
- *
- * Convenience function that retrieves the object
- * stored in @member_name of @object
- *
- * See also: json_object_get_member()
- *
- * Return value: the object inside the object's member
- *
- * Since: 0.8
- */
-JsonObject *
-json_object_get_object_member (JsonObject *object,
- const gchar *member_name)
-{
- JsonNode *node;
-
- g_return_val_if_fail (object != NULL, NULL);
- g_return_val_if_fail (member_name != NULL, NULL);
-
- node = object_get_member_internal (object, member_name);
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (node) || JSON_NODE_HOLDS_NULL (node), NULL);
-
- if (JSON_NODE_HOLDS_NULL (node))
- return NULL;
-
- return json_node_get_object (node);
-}
-
-/*
- * json_object_has_member:
- * @object: a #JsonObject
- * @member_name: the name of a JSON object member
- *
- * Checks whether @object has a member named @member_name.
- *
- * Return value: %TRUE if the JSON object has the requested member
- */
-gboolean
-json_object_has_member (JsonObject *object,
- const gchar *member_name)
-{
- g_return_val_if_fail (object != NULL, FALSE);
- g_return_val_if_fail (member_name != NULL, FALSE);
-
- return (g_hash_table_lookup (object->members, member_name) != NULL);
-}
-
-/*
- * json_object_get_size:
- * @object: a #JsonObject
- *
- * Retrieves the number of members of a #JsonObject.
- *
- * Return value: the number of members
- */
-guint
-json_object_get_size (JsonObject *object)
-{
- g_return_val_if_fail (object != NULL, 0);
-
- return g_hash_table_size (object->members);
-}
-
-/*
- * json_object_remove_member:
- * @object: a #JsonObject
- * @member_name: the name of the member to remove
- *
- * Removes @member_name from @object, freeing its allocated resources.
- */
-void
-json_object_remove_member (JsonObject *object,
- const gchar *member_name)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (member_name != NULL);
-
- g_hash_table_remove (object->members, member_name);
-}
-
-typedef struct _ForeachClosure ForeachClosure;
-
-struct _ForeachClosure
-{
- JsonObject *object;
-
- JsonObjectForeach func;
- gpointer data;
-};
-
-static void
-json_object_foreach_internal (gpointer key,
- gpointer value,
- gpointer data)
-{
- ForeachClosure *clos = data;
- const gchar *member_name = key;
- JsonNode *member_node = value;
-
- clos->func (clos->object, member_name, member_node, clos->data);
-}
-
-/*
- * json_object_foreach_member:
- * @object: a #JsonObject
- * @func: the function to be called on each member
- * @data: data to be passed to the function
- *
- * Iterates over all members of @object and calls @func on
- * each one of them.
- *
- * It is safe to change the value of a #JsonNode of the @object
- * from within the iterator @func, but it is not safe to add or
- * remove members from the @object.
- *
- * Since: 0.8
- */
-void
-json_object_foreach_member (JsonObject *object,
- JsonObjectForeach func,
- gpointer data)
-{
- ForeachClosure clos;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (func != NULL);
-
- clos.object = object;
- clos.func = func;
- clos.data = data;
- g_hash_table_foreach (object->members,
- json_object_foreach_internal,
- &clos);
-}
+++ /dev/null
-/* json-parser.c - JSON streams parser
- *
- * 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-parser
- * @short_description: Parse JSON data streams
- *
- * #JsonParser provides an object for parsing a JSON data stream, either
- * inside a file or inside a static buffer.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-
-#include "json-types-private.h"
-
-#include "json-marshal.h"
-#include "json-parser.h"
-
-GQuark
-json_parser_error_quark (void)
-{
- return g_quark_from_static_string ("json-parser-error");
-}
-
-#define JSON_PARSER_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((obj), JSON_TYPE_PARSER, JsonParserPrivate))
-
-struct _JsonParserPrivate
-{
- JsonNode *root;
- JsonNode *current_node;
-
- GScanner *scanner;
-
- GError *last_error;
-};
-
-static const GScannerConfig json_scanner_config =
-{
- ( " \t\r\n" ) /* cset_skip_characters */,
- (
- "_"
- G_CSET_a_2_z
- G_CSET_A_2_Z
- ) /* cset_identifier_first */,
- (
- G_CSET_DIGITS
- "-_"
- G_CSET_a_2_z
- G_CSET_A_2_Z
- ) /* cset_identifier_nth */,
- ( "#\n" ) /* cpair_comment_single */,
- TRUE /* case_sensitive */,
- TRUE /* skip_comment_multi */,
- TRUE /* skip_comment_single */,
- FALSE /* scan_comment_multi */,
- TRUE /* scan_identifier */,
- TRUE /* scan_identifier_1char */,
- FALSE /* scan_identifier_NULL */,
- TRUE /* scan_symbols */,
- TRUE /* scan_binary */,
- TRUE /* scan_octal */,
- TRUE /* scan_float */,
- TRUE /* scan_hex */,
- TRUE /* scan_hex_dollar */,
- TRUE /* scan_string_sq */,
- TRUE /* scan_string_dq */,
- TRUE /* numbers_2_int */,
- FALSE /* int_2_float */,
- FALSE /* identifier_2_string */,
- TRUE /* char_2_token */,
- TRUE /* symbol_2_token */,
- FALSE /* scope_0_fallback */,
- TRUE /* store_int64 */
-};
-
-
-static const gchar symbol_names[] =
- "true\0"
- "false\0"
- "null\0";
-
-static const struct
-{
- guint name_offset;
- guint token;
-} symbols[] = {
- { 0, JSON_TOKEN_TRUE },
- { 5, JSON_TOKEN_FALSE },
- { 11, JSON_TOKEN_NULL }
-};
-
-static const guint n_symbols = G_N_ELEMENTS (symbols);
-
-enum
-{
- PARSE_START,
- OBJECT_START,
- OBJECT_MEMBER,
- OBJECT_END,
- ARRAY_START,
- ARRAY_ELEMENT,
- ARRAY_END,
- PARSE_END,
- ERROR,
-
- LAST_SIGNAL
-};
-
-static guint parser_signals[LAST_SIGNAL] = { 0, };
-
-G_DEFINE_TYPE (JsonParser, json_parser, G_TYPE_OBJECT);
-
-static guint json_parse_array (JsonParser *parser,
- GScanner *scanner,
- gboolean nested);
-static guint json_parse_object (JsonParser *parser,
- GScanner *scanner,
- gboolean nested);
-
-static void
-json_parser_dispose (GObject *gobject)
-{
- JsonParserPrivate *priv = JSON_PARSER_GET_PRIVATE (gobject);
-
- if (priv->root)
- {
- json_node_free (priv->root);
- priv->root = NULL;
- }
-
- if (priv->last_error)
- {
- g_error_free (priv->last_error);
- priv->last_error = NULL;
- }
-
- G_OBJECT_CLASS (json_parser_parent_class)->dispose (gobject);
-}
-
-static void
-json_parser_class_init (JsonParserClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (JsonParserPrivate));
-
- gobject_class->dispose = json_parser_dispose;
-
- /*
- * JsonParser::parse-start:
- * @parser: the #JsonParser that received the signal
- *
- * The ::parse-start signal is emitted when the parser began parsing
- * a JSON data stream.
- */
- parser_signals[PARSE_START] =
- g_signal_new ("parse-start",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, parse_start),
- NULL, NULL,
- _json_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- /*
- * JsonParser::parse-end:
- * @parser: the #JsonParser that received the signal
- *
- * The ::parse-end signal is emitted when the parser successfully
- * finished parsing a JSON data stream
- */
- parser_signals[PARSE_END] =
- g_signal_new ("parse-end",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, parse_end),
- NULL, NULL,
- _json_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- /*
- * JsonParser::object-start:
- * @parser: the #JsonParser that received the signal
- *
- * The ::object-start signal is emitted each time the #JsonParser
- * starts parsing a #JsonObject.
- */
- parser_signals[OBJECT_START] =
- g_signal_new ("object-start",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, object_start),
- NULL, NULL,
- _json_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- /*
- * JsonParser::object-member:
- * @parser: the #JsonParser that received the signal
- * @object: a #JsonObject
- * @member_name: the name of the newly parsed member
- *
- * The ::object-member signal is emitted each time the #JsonParser
- * has successfully parsed a single member of a #JsonObject. The
- * object and member are passed to the signal handlers.
- */
- parser_signals[OBJECT_MEMBER] =
- g_signal_new ("object-member",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, object_member),
- NULL, NULL,
- _json_marshal_VOID__BOXED_STRING,
- G_TYPE_NONE, 2,
- JSON_TYPE_OBJECT,
- G_TYPE_STRING);
- /*
- * JsonParser::object-end:
- * @parser: the #JsonParser that received the signal
- * @object: the parsed #JsonObject
- *
- * The ::object-end signal is emitted each time the #JsonParser
- * has successfully parsed an entire #JsonObject.
- */
- parser_signals[OBJECT_END] =
- g_signal_new ("object-end",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, object_end),
- NULL, NULL,
- _json_marshal_VOID__BOXED,
- G_TYPE_NONE, 1,
- JSON_TYPE_OBJECT);
- /*
- * JsonParser::array-start:
- * @parser: the #JsonParser that received the signal
- *
- * The ::array-start signal is emitted each time the #JsonParser
- * starts parsing a #JsonArray
- */
- parser_signals[ARRAY_START] =
- g_signal_new ("array-start",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, array_start),
- NULL, NULL,
- _json_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- /*
- * JsonParser::array-element:
- * @parser: the #JsonParser that received the signal
- * @array: a #JsonArray
- * @index_: the index of the newly parsed element
- *
- * The ::array-element signal is emitted each time the #JsonParser
- * has successfully parsed a single element of a #JsonArray. The
- * array and element index are passed to the signal handlers.
- */
- parser_signals[ARRAY_ELEMENT] =
- g_signal_new ("array-element",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, array_element),
- NULL, NULL,
- _json_marshal_VOID__BOXED_INT,
- G_TYPE_NONE, 2,
- JSON_TYPE_ARRAY,
- G_TYPE_INT);
- /*
- * JsonParser::array-end:
- * @parser: the #JsonParser that received the signal
- * @array: the parsed #JsonArrary
- *
- * The ::array-end signal is emitted each time the #JsonParser
- * has successfully parsed an entire #JsonArray
- */
- parser_signals[ARRAY_END] =
- g_signal_new ("array-end",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, array_end),
- NULL, NULL,
- _json_marshal_VOID__BOXED,
- G_TYPE_NONE, 1,
- JSON_TYPE_ARRAY);
- /*
- * JsonParser::error:
- * @parser: the parser instance that received the signal
- * @error: a pointer to the #GError
- *
- * The ::error signal is emitted each time a #JsonParser encounters
- * an error in a JSON stream.
- */
- parser_signals[ERROR] =
- g_signal_new ("error",
- G_OBJECT_CLASS_TYPE (gobject_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (JsonParserClass, error),
- NULL, NULL,
- _json_marshal_VOID__POINTER,
- G_TYPE_NONE, 1,
- G_TYPE_POINTER);
-}
-
-static void
-json_parser_init (JsonParser *parser)
-{
- JsonParserPrivate *priv;
-
- parser->priv = priv = JSON_PARSER_GET_PRIVATE (parser);
-
- priv->root = NULL;
- priv->current_node = NULL;
-}
-
-static guint
-json_parse_array (JsonParser *parser,
- GScanner *scanner,
- gboolean nested)
-{
- JsonParserPrivate *priv = parser->priv;
- JsonArray *array;
- guint token;
-
- if (!nested)
- {
- /* the caller already swallowed the opening '[' */
- token = g_scanner_get_next_token (scanner);
- if (token != G_TOKEN_LEFT_BRACE)
- return G_TOKEN_LEFT_BRACE;
- }
-
- g_signal_emit (parser, parser_signals[ARRAY_START], 0);
-
- array = json_array_new ();
-
- token = g_scanner_get_next_token (scanner);
- while (token != G_TOKEN_RIGHT_BRACE)
- {
- JsonNode *node = NULL;
- gboolean negative = FALSE;
-
- /* nested object */
- if (token == G_TOKEN_LEFT_CURLY)
- {
- JsonNode *old_node = priv->current_node;
-
- priv->current_node = json_node_new (JSON_NODE_OBJECT);
-
- token = json_parse_object (parser, scanner, TRUE);
-
- node = priv->current_node;
- priv->current_node = old_node;
-
- if (token != G_TOKEN_NONE)
- {
- json_node_free (node);
- json_array_unref (array);
-
- return token;
- }
-
- json_array_add_element (array, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[ARRAY_ELEMENT], 0,
- array,
- json_array_get_length (array));
-
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_BRACE)
- break;
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_BRACE)
- return G_TOKEN_SYMBOL;
-
- continue;
- }
-
- json_array_unref (array);
-
- return G_TOKEN_RIGHT_BRACE;
- }
-
- /* nested array */
- if (token == G_TOKEN_LEFT_BRACE)
- {
- JsonNode *old_node = priv->current_node;
-
- priv->current_node = json_node_new (JSON_NODE_ARRAY);
-
- token = json_parse_array (parser, scanner, TRUE);
-
- node = priv->current_node;
- priv->current_node = old_node;
-
- if (token != G_TOKEN_NONE)
- {
- json_node_free (node);
- json_array_unref (array);
-
- return token;
- }
-
- json_array_add_element (array, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[ARRAY_ELEMENT], 0,
- array,
- json_array_get_length (array));
-
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_BRACE)
- break;
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_BRACE)
- return G_TOKEN_SYMBOL;
-
- continue;
- }
-
- json_array_unref (array);
-
- return G_TOKEN_RIGHT_BRACE;
- }
-
- if (token == '-')
- {
- guint next_token = g_scanner_peek_next_token (scanner);
-
- if (next_token == G_TOKEN_INT ||
- next_token == G_TOKEN_FLOAT)
- {
- negative = TRUE;
- token = g_scanner_get_next_token (scanner);
- }
- else
- {
- json_array_unref (array);
-
- return G_TOKEN_INT;
- }
- }
-
- switch (token)
- {
- case G_TOKEN_INT:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_int (node, negative ? scanner->value.v_int64 * -1
- : scanner->value.v_int64);
- break;
-
- case G_TOKEN_FLOAT:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_double (node, negative ? scanner->value.v_float * -1.0
- : scanner->value.v_float);
- break;
-
- case G_TOKEN_STRING:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_string (node, scanner->value.v_string);
- break;
-
- case JSON_TOKEN_TRUE:
- case JSON_TOKEN_FALSE:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_boolean (node, token == JSON_TOKEN_TRUE ? TRUE
- : FALSE);
- break;
-
- case JSON_TOKEN_NULL:
- node = json_node_new (JSON_NODE_NULL);
- break;
-
- default:
- json_array_unref (array);
- return G_TOKEN_RIGHT_BRACE;
- }
-
- if (node)
- {
- json_array_add_element (array, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[ARRAY_ELEMENT], 0,
- array,
- json_array_get_length (array));
- }
-
- token = g_scanner_get_next_token (scanner);
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_BRACE)
- return G_TOKEN_SYMBOL;
- }
- else if (token != G_TOKEN_RIGHT_BRACE)
- {
- json_array_unref (array);
-
- return G_TOKEN_RIGHT_BRACE;
- }
- }
-
- json_node_take_array (priv->current_node, array);
-
- g_signal_emit (parser, parser_signals[ARRAY_END], 0, array);
-
- return G_TOKEN_NONE;
-}
-
-static guint
-json_parse_object (JsonParser *parser,
- GScanner *scanner,
- gboolean nested)
-{
- JsonParserPrivate *priv = parser->priv;
- JsonObject *object;
- guint token;
-
- if (!nested)
- {
- /* the caller already swallowed the opening '{' */
- token = g_scanner_get_next_token (scanner);
- if (token != G_TOKEN_LEFT_CURLY)
- return G_TOKEN_LEFT_CURLY;
- }
-
- g_signal_emit (parser, parser_signals[OBJECT_START], 0);
-
- object = json_object_new ();
-
- token = g_scanner_get_next_token (scanner);
- while (token != G_TOKEN_RIGHT_CURLY)
- {
- JsonNode *node = NULL;
- gchar *name = NULL;
- gboolean negative = FALSE;
-
- if (token == G_TOKEN_STRING)
- {
- name = g_strdup (scanner->value.v_string);
-
- token = g_scanner_get_next_token (scanner);
- if (token != ':')
- {
- g_free (name);
- json_object_unref (object);
-
- return ':';
- }
- else
- {
- /* swallow the colon */
- token = g_scanner_get_next_token (scanner);
- }
- }
-
- if (!name)
- {
- json_object_unref (object);
-
- return G_TOKEN_STRING;
- }
-
- /* nested object */
- if (token == G_TOKEN_LEFT_CURLY)
- {
- JsonNode *old_node = priv->current_node;
-
- priv->current_node = json_node_new (JSON_NODE_OBJECT);
-
- token = json_parse_object (parser, scanner, TRUE);
-
- node = priv->current_node;
- priv->current_node = old_node;
-
- if (token != G_TOKEN_NONE)
- {
- g_free (name);
-
- if (node)
- json_node_free (node);
-
- json_object_unref (object);
-
- return token;
- }
-
- json_object_set_member (object, name, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[OBJECT_MEMBER], 0,
- object,
- name);
-
- g_free (name);
-
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_CURLY)
- break;
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_CURLY)
- return G_TOKEN_SYMBOL;
-
- continue;
- }
-
- json_object_unref (object);
-
- return G_TOKEN_RIGHT_CURLY;
- }
-
- /* nested array */
- if (token == G_TOKEN_LEFT_BRACE)
- {
- JsonNode *old_node = priv->current_node;
-
- priv->current_node = json_node_new (JSON_NODE_ARRAY);
-
- token = json_parse_array (parser, scanner, TRUE);
-
- node = priv->current_node;
- priv->current_node = old_node;
-
- if (token != G_TOKEN_NONE)
- {
- g_free (name);
- json_node_free (node);
- json_object_unref (object);
-
- return token;
- }
-
- json_object_set_member (object, name, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[OBJECT_MEMBER], 0,
- object,
- name);
-
- g_free (name);
-
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_CURLY)
- break;
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_CURLY)
- return G_TOKEN_SYMBOL;
-
- continue;
- }
-
- json_object_unref (object);
-
- return G_TOKEN_RIGHT_CURLY;
- }
-
- if (token == '-')
- {
- guint next_token = g_scanner_peek_next_token (scanner);
-
- if (next_token == G_TOKEN_INT || next_token == G_TOKEN_FLOAT)
- {
- negative = TRUE;
- token = g_scanner_get_next_token (scanner);
- }
- else
- {
- json_object_unref (object);
-
- return G_TOKEN_INT;
- }
- }
-
- switch (token)
- {
- case G_TOKEN_INT:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_int (node, negative ? scanner->value.v_int64 * -1
- : scanner->value.v_int64);
- break;
-
- case G_TOKEN_FLOAT:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_double (node, negative ? scanner->value.v_float * -1.0
- : scanner->value.v_float);
- break;
-
- case G_TOKEN_STRING:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_string (node, scanner->value.v_string);
- break;
-
- case JSON_TOKEN_TRUE:
- case JSON_TOKEN_FALSE:
- node = json_node_new (JSON_NODE_VALUE);
- json_node_set_boolean (node, token == JSON_TOKEN_TRUE ? TRUE
- : FALSE);
- break;
-
- case JSON_TOKEN_NULL:
- node = json_node_new (JSON_NODE_NULL);
- break;
-
- default:
- json_object_unref (object);
- return G_TOKEN_SYMBOL;
- }
-
- if (node)
- {
- json_object_set_member (object, name, node);
- node->parent = priv->current_node;
-
- g_signal_emit (parser, parser_signals[OBJECT_MEMBER], 0,
- object,
- name);
- }
-
- g_free (name);
-
- token = g_scanner_get_next_token (scanner);
-
- if (token == G_TOKEN_COMMA)
- {
- token = g_scanner_get_next_token (scanner);
- if (token == G_TOKEN_RIGHT_CURLY)
- return G_TOKEN_SYMBOL;
- }
- else if (token != G_TOKEN_RIGHT_CURLY)
- {
- json_object_unref (object);
-
- return G_TOKEN_RIGHT_CURLY;
- }
- }
-
- json_node_take_object (priv->current_node, object);
-
- g_signal_emit (parser, parser_signals[OBJECT_END], 0, object);
-
- return G_TOKEN_NONE;
-}
-
-static guint
-json_parse_statement (JsonParser *parser,
- GScanner *scanner)
-{
- JsonParserPrivate *priv = parser->priv;
- guint token;
-
- token = g_scanner_peek_next_token (scanner);
- switch (token)
- {
- case G_TOKEN_LEFT_CURLY:
- priv->root = priv->current_node = json_node_new (JSON_NODE_OBJECT);
- return json_parse_object (parser, scanner, FALSE);
-
- case G_TOKEN_LEFT_BRACE:
- priv->root = priv->current_node = json_node_new (JSON_NODE_ARRAY);
- return json_parse_array (parser, scanner, FALSE);
-
- case JSON_TOKEN_NULL:
- priv->root = priv->current_node = json_node_new (JSON_NODE_NULL);
- return G_TOKEN_NONE;
-
- case JSON_TOKEN_TRUE:
- case JSON_TOKEN_FALSE:
- priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
- json_node_set_boolean (priv->current_node,
- token == JSON_TOKEN_TRUE ? TRUE : FALSE);
- return G_TOKEN_NONE;
-
- case '-':
- {
- guint next_token = g_scanner_peek_next_token (scanner);
-
- if (next_token == G_TOKEN_INT || next_token == G_TOKEN_FLOAT)
- {
- priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
-
- token = g_scanner_get_next_token (scanner);
- switch (token)
- {
- case G_TOKEN_INT:
- json_node_set_int (priv->current_node, scanner->value.v_int64);
- break;
- case G_TOKEN_FLOAT:
- json_node_set_double (priv->current_node, scanner->value.v_float);
- break;
- default:
- break;
- }
-
- return G_TOKEN_NONE;
- }
- else
- return G_TOKEN_INT;
- }
- break;
-
- case G_TOKEN_INT:
- case G_TOKEN_FLOAT:
- case G_TOKEN_STRING:
- priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
- if (token == G_TOKEN_INT)
- json_node_set_int (priv->current_node, scanner->value.v_int64);
- else if (token == G_TOKEN_FLOAT)
- json_node_set_double (priv->current_node, scanner->value.v_float);
- else
- json_node_set_string (priv->current_node, scanner->value.v_string);
- return G_TOKEN_NONE;
-
- default:
- g_scanner_get_next_token (scanner);
- return G_TOKEN_SYMBOL;
- }
-}
-
-static void
-json_scanner_msg_handler (GScanner *scanner,
- gchar *message,
- gboolean is_error)
-{
- JsonParser *parser = scanner->user_data;
-
- if (is_error)
- {
- GError *error = NULL;
-
- g_set_error (&error, JSON_PARSER_ERROR,
- JSON_PARSER_ERROR_PARSE,
- "Parse error on line %d: %s",
- scanner->line,
- message);
-
- parser->priv->last_error = error;
- g_signal_emit (parser, parser_signals[ERROR], 0, error);
- }
- else
- g_warning ("Line %d: %s", scanner->line, message);
-}
-
-static GScanner *
-json_scanner_new (JsonParser *parser)
-{
- GScanner *scanner;
-
- scanner = g_scanner_new (&json_scanner_config);
- scanner->msg_handler = json_scanner_msg_handler;
- scanner->user_data = parser;
-
- return scanner;
-}
-
-/*
- * json_parser_new:
- *
- * Creates a new #JsonParser instance. You can use the #JsonParser to
- * load a JSON stream from either a file or a buffer and then walk the
- * hierarchy using the data types API.
- *
- * Return value: the newly created #JsonParser. Use g_object_unref()
- * to release all the memory it allocates.
- */
-JsonParser *
-json_parser_new (void)
-{
- return g_object_new (JSON_TYPE_PARSER, NULL);
-}
-
-/*
- * json_parser_load_from_file:
- * @parser: a #JsonParser
- * @filename: the path for the file to parse
- * @error: return location for a #GError, or %NULL
- *
- * Loads a JSON stream from the content of @filename and parses it. See
- * json_parser_load_from_data().
- *
- * Return value: %TRUE if the file was successfully loaded and parsed.
- * In case of error, @error is set accordingly and %FALSE is returned
- */
-gboolean
-json_parser_load_from_file (JsonParser *parser,
- const gchar *filename,
- GError **error)
-{
- GError *internal_error;
- gchar *data;
- gsize length;
- gboolean retval = TRUE;
-
- g_return_val_if_fail (JSON_IS_PARSER (parser), FALSE);
- g_return_val_if_fail (filename != NULL, FALSE);
-
- internal_error = NULL;
- if (!g_file_get_contents (filename, &data, &length, &internal_error))
- {
- g_propagate_error (error, internal_error);
- return FALSE;
- }
-
- if (!json_parser_load_from_data (parser, data, length, &internal_error))
- {
- g_propagate_error (error, internal_error);
- retval = FALSE;
- }
-
- g_free (data);
-
- return retval;
-}
-
-/*
- * json_parser_load_from_data:
- * @parser: a #JsonParser
- * @data: the buffer to parse
- * @length: the length of the buffer, or -1
- * @error: return location for a #GError, or %NULL
- *
- * Loads a JSON stream from a buffer and parses it. You can call this function
- * multiple times with the same #JsonParser object, but the contents of the
- * parser will be destroyed each time.
- *
- * Return value: %TRUE if the buffer was succesfully parser. In case
- * of error, @error is set accordingly and %FALSE is returned
- */
-gboolean
-json_parser_load_from_data (JsonParser *parser,
- const gchar *data,
- gssize length,
- GError **error)
-{
- GScanner *scanner;
- gboolean done;
- gboolean retval = TRUE;
- gint i;
-
- g_return_val_if_fail (JSON_IS_PARSER (parser), FALSE);
- g_return_val_if_fail (data != NULL, FALSE);
-
- if (length < 0)
- length = strlen (data);
-
- if (parser->priv->root)
- {
- json_node_free (parser->priv->root);
- parser->priv->root = NULL;
- }
-
- scanner = json_scanner_new (parser);
- g_scanner_input_text (scanner, data, length);
-
- for (i = 0; i < n_symbols; i++)
- {
- g_scanner_scope_add_symbol (scanner, 0,
- symbol_names + symbols[i].name_offset,
- GINT_TO_POINTER (symbols[i].token));
- }
-
- parser->priv->scanner = scanner;
-
- g_signal_emit (parser, parser_signals[PARSE_START], 0);
-
- done = FALSE;
- while (!done)
- {
- if (g_scanner_peek_next_token (scanner) == G_TOKEN_EOF)
- done = TRUE;
- else
- {
- guint expected_token;
-
- expected_token = json_parse_statement (parser, scanner);
- if (expected_token != G_TOKEN_NONE)
- {
- const gchar *symbol_name;
- gchar *msg;
-
- msg = NULL;
- symbol_name = NULL;
- if (scanner->scope_id == 0)
- {
- if (expected_token > JSON_TOKEN_INVALID &&
- expected_token < JSON_TOKEN_LAST)
- {
- for (i = 0; i < n_symbols; i++)
- if (symbols[i].token == expected_token)
- symbol_name = symbol_names + symbols[i].name_offset;
-
- if (!msg)
- msg = g_strconcat ("e.g. '", symbol_name, "'", NULL);
- }
-
- if (scanner->token > JSON_TOKEN_INVALID &&
- scanner->token < JSON_TOKEN_LAST)
- {
- symbol_name = "???";
-
- for (i = 0; i < n_symbols; i++)
- if (symbols[i].token == scanner->token)
- symbol_name = symbol_names + symbols[i].name_offset;
- }
- }
-
- /* this will emit the ::error signal via the custom
- * message handler we install
- */
- g_scanner_unexp_token (scanner, expected_token,
- NULL, "keyword",
- symbol_name, msg,
- TRUE);
-
- if (parser->priv->last_error)
- {
- g_propagate_error (error, parser->priv->last_error);
- parser->priv->last_error = NULL;
- }
-
- retval = FALSE;
-
- g_free (msg);
- done = TRUE;
- }
- }
- }
-
- g_scanner_destroy (scanner);
- parser->priv->scanner = NULL;
- parser->priv->current_node = NULL;
-
- g_signal_emit (parser, parser_signals[PARSE_END], 0);
-
- return retval;
-}
-
-/*
- * json_parser_get_root:
- * @parser: a #JsonParser
- *
- * Retrieves the top level node from the parsed JSON stream.
- *
- * Return value: (transfer none): the root #JsonNode . The returned node
- * is owned by the #JsonParser and should never be modified or freed.
- */
-JsonNode *
-json_parser_get_root (JsonParser *parser)
-{
- g_return_val_if_fail (JSON_IS_PARSER (parser), NULL);
-
- return parser->priv->root;
-}
-
-/*
- * json_parser_get_current_line:
- * @parser: a #JsonParser
- *
- * Retrieves the line currently parsed, starting from 1.
- *
- * Return value: the currently parsed line.
- */
-guint
-json_parser_get_current_line (JsonParser *parser)
-{
- g_return_val_if_fail (JSON_IS_PARSER (parser), 0);
-
- if (parser->priv->scanner)
- return g_scanner_cur_line (parser->priv->scanner);
-
- return 0;
-}
-
-/*
- * json_parser_get_current_pos:
- * @parser: a #JsonParser
- *
- * Retrieves the current position inside the current line, starting
- * from 0.
- *
- * Return value: the position in the current line
- */
-guint
-json_parser_get_current_pos (JsonParser *parser)
-{
- g_return_val_if_fail (JSON_IS_PARSER (parser), 0);
-
- if (parser->priv->scanner)
- return g_scanner_cur_line (parser->priv->scanner);
-
- return 0;
-}
+++ /dev/null
-/* json-parser.h - JSON streams parser
- *
- * 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>
- */
-
-#ifndef __JSON_PARSER_H__
-#define __JSON_PARSER_H__
-
-#include <glib-object.h>
-#include "json-types.h"
-
-G_BEGIN_DECLS
-
-#define JSON_TYPE_PARSER (json_parser_get_type ())
-#define JSON_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_PARSER, JsonParser))
-#define JSON_IS_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_PARSER))
-#define JSON_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), JSON_TYPE_PARSER, JsonParserClass))
-#define JSON_IS_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), JSON_TYPE_PARSER))
-#define JSON_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), JSON_TYPE_PARSER, JsonParserClass))
-
-#define JSON_PARSER_ERROR (json_parser_error_quark ())
-
-typedef struct _JsonParser JsonParser;
-typedef struct _JsonParserPrivate JsonParserPrivate;
-typedef struct _JsonParserClass JsonParserClass;
-
-/**
- * JsonParserError:
- * @JSON_PARSER_ERROR_PARSE: parse error
- * @JSON_PARSER_ERROR_UNKNOWN: unknown error
- *
- * Error enumeration for #JsonParser
- */
-typedef enum {
- JSON_PARSER_ERROR_PARSE,
-
- JSON_PARSER_ERROR_UNKNOWN
-} JsonParserError;
-
-typedef enum {
- JSON_TOKEN_INVALID = G_TOKEN_LAST,
- JSON_TOKEN_TRUE,
- JSON_TOKEN_FALSE,
- JSON_TOKEN_NULL,
- JSON_TOKEN_LAST
-} JsonTokenType;
-
-/**
- * JsonParser:
- *
- * JSON data streams parser. The contents of the #JsonParser structure are
- * private and should only be accessed via the provided API.
- */
-struct _JsonParser
-{
- /*< private >*/
- GObject parent_instance;
-
- JsonParserPrivate *priv;
-};
-
-/**
- * JsonParserClass:
- * @parse_start: class handler for the JsonParser::parse-start signal
- * @object_start: class handler for the JsonParser::object-start signal
- * @object_member: class handler for the JsonParser::object-member signal
- * @object_end: class handler for the JsonParser::object-end signal
- * @array_start: class handler for the JsonParser::array-start signal
- * @array_element: class handler for the JsonParser::array-element signal
- * @array_end: class handler for the JsonParser::array-end signal
- * @parse_end: class handler for the JsonParser::parse-end signal
- * @error: class handler for the JsonParser::error signal
- *
- * #JsonParser class.
- */
-struct _JsonParserClass
-{
- /*< private >*/
- GObjectClass parent_class;
-
- /*< public >*/
- void (* parse_start) (JsonParser *parser);
-
- void (* object_start) (JsonParser *parser);
- void (* object_member) (JsonParser *parser,
- JsonObject *object,
- const gchar *member_name);
- void (* object_end) (JsonParser *parser,
- JsonObject *object);
-
- void (* array_start) (JsonParser *parser);
- void (* array_element) (JsonParser *parser,
- JsonArray *array,
- gint index_);
- void (* array_end) (JsonParser *parser,
- JsonArray *array);
-
- void (* parse_end) (JsonParser *parser);
-
- void (* error) (JsonParser *parser,
- const GError *error);
-
- /*< private >*/
- /* padding for future expansion */
- void (* _json_reserved1) (void);
- void (* _json_reserved2) (void);
- void (* _json_reserved3) (void);
- void (* _json_reserved4) (void);
- void (* _json_reserved5) (void);
- void (* _json_reserved6) (void);
- void (* _json_reserved7) (void);
- void (* _json_reserved8) (void);
-};
-
-GQuark json_parser_error_quark (void);
-GType json_parser_get_type (void) G_GNUC_CONST;
-
-JsonParser *json_parser_new (void);
-gboolean json_parser_load_from_file (JsonParser *parser,
- const gchar *filename,
- GError **error);
-gboolean json_parser_load_from_data (JsonParser *parser,
- const gchar *data,
- gssize length,
- GError **error);
-JsonNode * json_parser_get_root (JsonParser *parser);
-
-guint json_parser_get_current_line (JsonParser *parser);
-guint json_parser_get_current_pos (JsonParser *parser);
-
-G_END_DECLS
-
-#endif /* __JSON_PARSER_H__ */
+++ /dev/null
-/* json-types-private.h - JSON data types private header
- *
- * 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_TYPES_PRIVATE_H__
-#define __JSON_TYPES_PRIVATE_H__
-
-#include "json-types.h"
-
-G_BEGIN_DECLS
-
-struct _JsonNode
-{
- /*< private >*/
- JsonNodeType type;
-
- union {
- JsonObject *object;
- JsonArray *array;
- GValue value;
- } data;
-
- JsonNode *parent;
-};
-
-struct _JsonArray
-{
- GPtrArray *elements;
-
- volatile gint ref_count;
-};
-
-struct _JsonObject
-{
- GHashTable *members;
-
- volatile gint ref_count;
-};
-
-G_END_DECLS
-
-#endif /* __JSON_TYPES_PRIVATE_H__ */
+++ /dev/null
-/* json-types.h - JSON data types
- *
- * 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>
- */
-
-#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION)
-#error "Only <json-glib/json-glib.h> can be included directly."
-#endif
-
-#ifndef __JSON_TYPES_H__
-#define __JSON_TYPES_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-/**
- * JSON_NODE_TYPE:
- * @node: a #JsonNode
- *
- * Evaluates to the #JsonNodeType contained by @node
- */
-#define JSON_NODE_TYPE(node) (json_node_get_node_type ((node)))
-
-#define JSON_TYPE_NODE (json_node_get_type ())
-#define JSON_TYPE_OBJECT (json_object_get_type ())
-#define JSON_TYPE_ARRAY (json_array_get_type ())
-
-#define JSON_NODE_HOLDS(node,type) (JSON_NODE_TYPE (node) == (type))
-#define JSON_NODE_HOLDS_VALUE(node) (JSON_NODE_HOLDS (node, JSON_NODE_VALUE))
-#define JSON_NODE_HOLDS_ARRAY(node) (JSON_NODE_HOLDS (node, JSON_NODE_ARRAY))
-#define JSON_NODE_HOLDS_OBJECT(node) (JSON_NODE_HOLDS (node, JSON_NODE_OBJECT))
-#define JSON_NODE_HOLDS_NULL(node) (JSON_NODE_HOLDS (node, JSON_NODE_NULL))
-
-/**
- * JsonNode:
- * @type: the type of node
- *
- * A generic container of JSON data types. The contents of the #JsonNode
- * structure are private and should only be accessed via the provided
- * functions and never directly.
- */
-typedef struct _JsonNode JsonNode;
-
-/**
- * JsonObject:
- *
- * A JSON object type. The contents of the #JsonObject structure are private
- * and should only be accessed by the provided API
- */
-typedef struct _JsonObject JsonObject;
-
-/**
- * JsonArray:
- *
- * A JSON array type. The contents of the #JsonArray structure are private
- * and should only be accessed by the provided API
- */
-typedef struct _JsonArray JsonArray;
-
-/**
- * JsonNodeType:
- * @JSON_NODE_OBJECT: The node contains a #JsonObject
- * @JSON_NODE_ARRAY: The node contains a #JsonArray
- * @JSON_NODE_VALUE: The node contains a fundamental type
- * @JSON_NODE_NULL: Special type, for nodes containing null
- *
- * Indicates the content of a #JsonNode.
- */
-typedef enum {
- JSON_NODE_OBJECT,
- JSON_NODE_ARRAY,
- JSON_NODE_VALUE,
- JSON_NODE_NULL
-} JsonNodeType;
-
-/**
- * JsonObjectForeach:
- * @object: the iterated #JsonObject
- * @member_name: the name of the member
- * @member_node: a #JsonNode containing the @member_name value
- * @user_data: data passed to the function
- *
- * The function to be passed to json_object_foreach_member(). You
- * should not add or remove members to and from @object within
- * this function. It is safe to change the value of @member_node.
- *
- * Since: 0.8
- */
-typedef void (* JsonObjectForeach) (JsonObject *object,
- const gchar *member_name,
- JsonNode *member_node,
- gpointer user_data);
-
-/**
- * JsonArrayForeach:
- * @array: the iterated #JsonArray
- * @index_: the index of the element
- * @element_node: a #JsonNode containing the value at @index_
- * @user_data: data passed to the function
- *
- * The function to be passed to json_array_foreach_element(). You
- * should not add or remove elements to and from @array within
- * this function. It is safe to change the value of @element_node.
- *
- * Since: 0.8
- */
-typedef void (* JsonArrayForeach) (JsonArray *array,
- guint index_,
- JsonNode *element_node,
- gpointer user_data);
-
-/*
- * JsonNode
- */
-GType json_node_get_type (void) G_GNUC_CONST;
-JsonNode * json_node_new (JsonNodeType type);
-JsonNode * json_node_copy (JsonNode *node);
-void json_node_free (JsonNode *node);
-JsonNodeType json_node_get_node_type (JsonNode *node);
-GType json_node_get_value_type (JsonNode *node);
-JsonNode * json_node_get_parent (JsonNode *node);
-G_CONST_RETURN gchar *json_node_type_name (JsonNode *node);
-
-void json_node_set_object (JsonNode *node,
- JsonObject *object);
-void json_node_take_object (JsonNode *node,
- JsonObject *object);
-JsonObject * json_node_get_object (JsonNode *node);
-JsonObject * json_node_dup_object (JsonNode *node);
-void json_node_set_array (JsonNode *node,
- JsonArray *array);
-void json_node_take_array (JsonNode *node,
- JsonArray *array);
-JsonArray * json_node_get_array (JsonNode *node);
-JsonArray * json_node_dup_array (JsonNode *node);
-void json_node_set_value (JsonNode *node,
- const GValue *value);
-void json_node_get_value (JsonNode *node,
- GValue *value);
-void json_node_set_string (JsonNode *node,
- const gchar *value);
-G_CONST_RETURN gchar *json_node_get_string (JsonNode *node);
-gchar * json_node_dup_string (JsonNode *node);
-void json_node_set_int (JsonNode *node,
- gint64 value);
-gint64 json_node_get_int (JsonNode *node);
-void json_node_set_double (JsonNode *node,
- gdouble value);
-gdouble json_node_get_double (JsonNode *node);
-void json_node_set_boolean (JsonNode *node,
- gboolean value);
-gboolean json_node_get_boolean (JsonNode *node);
-gboolean json_node_is_null (JsonNode *node);
-
-/*
- * JsonObject
- */
-GType json_object_get_type (void) G_GNUC_CONST;
-JsonObject * json_object_new (void);
-JsonObject * json_object_ref (JsonObject *object);
-void json_object_unref (JsonObject *object);
-
-#ifndef JSON_DISABLE_DEPRECATED
-void json_object_add_member (JsonObject *object,
- const gchar *member_name,
- JsonNode *node) G_GNUC_DEPRECATED;
-#endif /* JSON_DISABLE_DEPRECATED */
-
-void json_object_set_member (JsonObject *object,
- const gchar *member_name,
- JsonNode *node);
-void json_object_set_int_member (JsonObject *object,
- const gchar *member_name,
- gint64 value);
-void json_object_set_double_member (JsonObject *object,
- const gchar *member_name,
- gdouble value);
-void json_object_set_boolean_member (JsonObject *object,
- const gchar *member_name,
- gboolean value);
-void json_object_set_string_member (JsonObject *object,
- const gchar *member_name,
- const gchar *value);
-void json_object_set_null_member (JsonObject *object,
- const gchar *member_name);
-void json_object_set_array_member (JsonObject *object,
- const gchar *member_name,
- JsonArray *value);
-void json_object_set_object_member (JsonObject *object,
- const gchar *member_name,
- JsonObject *value);
-GList * json_object_get_members (JsonObject *object);
-JsonNode * json_object_get_member (JsonObject *object,
- const gchar *member_name);
-JsonNode * json_object_dup_member (JsonObject *object,
- const gchar *member_name);
-gint64 json_object_get_int_member (JsonObject *object,
- const gchar *member_name);
-gdouble json_object_get_double_member (JsonObject *object,
- const gchar *member_name);
-gboolean json_object_get_boolean_member (JsonObject *object,
- const gchar *member_name);
-G_CONST_RETURN gchar *json_object_get_string_member (JsonObject *object,
- const gchar *member_name);
-gboolean json_object_get_null_member (JsonObject *object,
- const gchar *member_name);
-JsonArray * json_object_get_array_member (JsonObject *object,
- const gchar *member_name);
-JsonObject * json_object_get_object_member (JsonObject *object,
- const gchar *member_name);
-gboolean json_object_has_member (JsonObject *object,
- const gchar *member_name);
-void json_object_remove_member (JsonObject *object,
- const gchar *member_name);
-GList * json_object_get_values (JsonObject *object);
-guint json_object_get_size (JsonObject *object);
-void json_object_foreach_member (JsonObject *object,
- JsonObjectForeach func,
- gpointer data);
-
-GType json_array_get_type (void) G_GNUC_CONST;
-JsonArray * json_array_new (void);
-JsonArray * json_array_sized_new (guint n_elements);
-JsonArray * json_array_ref (JsonArray *array);
-void json_array_unref (JsonArray *array);
-void json_array_add_element (JsonArray *array,
- JsonNode *node);
-void json_array_add_int_element (JsonArray *array,
- gint64 value);
-void json_array_add_double_element (JsonArray *array,
- gdouble value);
-void json_array_add_boolean_element (JsonArray *array,
- gboolean value);
-void json_array_add_string_element (JsonArray *array,
- const gchar *value);
-void json_array_add_null_element (JsonArray *array);
-void json_array_add_array_element (JsonArray *array,
- JsonArray *value);
-void json_array_add_object_element (JsonArray *array,
- JsonObject *value);
-GList * json_array_get_elements (JsonArray *array);
-JsonNode * json_array_get_element (JsonArray *array,
- guint index_);
-gint64 json_array_get_int_element (JsonArray *array,
- guint index_);
-gdouble json_array_get_double_element (JsonArray *array,
- guint index_);
-gboolean json_array_get_boolean_element (JsonArray *array,
- guint index_);
-G_CONST_RETURN gchar *json_array_get_string_element (JsonArray *array,
- guint index_);
-gboolean json_array_get_null_element (JsonArray *array,
- guint index_);
-JsonArray * json_array_get_array_element (JsonArray *array,
- guint index_);
-JsonObject * json_array_get_object_element (JsonArray *array,
- guint index_);
-JsonNode * json_array_dup_element (JsonArray *array,
- guint index_);
-void json_array_remove_element (JsonArray *array,
- guint index_);
-guint json_array_get_length (JsonArray *array);
-void json_array_foreach_element (JsonArray *array,
- JsonArrayForeach func,
- gpointer data);
-
-G_END_DECLS
-
-#endif /* __JSON_TYPES_H__ */
AM_CONDITIONAL(X11_TESTS, [test "x$x11_tests" = "xyes"])
-dnl === JSON parser check =====================================================
-
-# we allow building clutter with the internal copy of json-glib
-# for platforms without it, but by default we depend on the
-# system copy
-m4_define([default_json], [system])
-AC_ARG_WITH([json],
- AC_HELP_STRING([--with-json=@<:@internal/check/system@:>@],
- [Select the JSON-GLib copy to use @<:@default=default_json@:>@]),
- [],
- [with_json=default_json])
-
-experimental_json=no
-AS_CASE([$with_json],
-
- [internal],
- [
- JSON_PREFIX=json
- experimental_json=yes
- have_json=no
- ],
-
- [system],
- [
- AC_MSG_CHECKING([for installed JSON-GLib])
- PKG_CHECK_EXISTS([json-glib-1.0 >= 0.10],
- [have_json=yes],
- [have_json=no])
- AS_IF([test "x$have_json" = "xyes"],
- [
- JSON_PREFIX=json-glib
- JSON_GLIB_PC="json-glib-1.0 >= 0.10"
-
- AC_DEFINE([HAVE_JSON_GLIB],
- [1],
- [Have the JSON-GLib library installed])
-
- AC_MSG_RESULT([found])
- ],
- [AC_MSG_ERROR([not found])]
- )
- ],
-
- [check],
- [
- AC_MSG_CHECKING([for installed JSON-GLib])
- PKG_CHECK_EXISTS([json-glib-1.0 >= 0.8],
- [have_json=yes],
- [have_json=no])
- AS_IF([test "x$have_json" = "xyes"],
- [
- JSON_PREFIX=json-glib
- JSON_GLIB_PC="json-glib-1.0 >= 0.8"
-
- AC_DEFINE([HAVE_JSON_GLIB],
- [1],
- [Have the JSON-GLib library installed])
-
- AC_MSG_RESULT([found])
- ],
- [
- JSON_PREFIX=json
- experimental_json=yes
- AC_MSG_RESULT([not found, using internal copy])
- ]
- )
- ],
-
- [AC_MSG_ERROR([Unknown argument for --with-json])]
-)
-
-AC_SUBST(JSON_PREFIX)
-AM_CONDITIONAL(LOCAL_JSON_GLIB, test "x$have_json" = "xno")
-
dnl === Enable debug level ====================================================
m4_define([debug_default], [m4_if(m4_eval(clutter_minor_version % 2), [1], [yes], [minimum])])
AC_SUBST(MAINTAINER_CFLAGS)
dnl === Dependencies, compiler flags and linker libraries =====================
-CLUTTER_REQUIRES="cairo >= 1.4 atk >= 1.7 pangocairo >= 1.20 $IMAGE_PC_FILES $BACKEND_PC_FILES $JSON_GLIB_PC"
-
+CLUTTER_REQUIRES="cairo >= 1.8 atk >= 1.7 pangocairo >= 1.20 json-glib-1.0 >= 0.10 $IMAGE_PC_FILES $BACKEND_PC_FILES"
PKG_CHECK_MODULES(CLUTTER_DEPS, [$CLUTTER_REQUIRES])
-
AC_SUBST(CLUTTER_REQUIRES)
CLUTTER_CFLAGS="$FLAVOUR_CFLAGS $CLUTTER_DEPS_CFLAGS $CLUTTER_PROFILE_CFLAGS $GLIB_CFLAGS"
CLUTTER_LIBS="$FLAVOUR_LIBS $CLUTTER_DEPS_LIBS $CLUTTER_PROFILE_LDFLAGS $GLIB_LIBS"
-
AC_SUBST(CLUTTER_CFLAGS)
AC_SUBST(CLUTTER_LIBS)
clutter/Makefile
clutter/clutter-version.h
- clutter/clutter-json.h
clutter/clutter-$CLUTTER_API_VERSION.pc:clutter/clutter.pc.in
clutter/cally/cally-$CLUTTER_API_VERSION.pc:clutter/cally/cally.pc.in
echo " Build introspection data: ${enable_introspection}"
echo " Build conformance test suite: ${enable_conformance}"
-if test "x$have_json" = "xyes"; then
-echo " JSON-GLib: system"
-else
-echo " JSON-GLib: internal (WARNING: Experimental)"
-fi
-
# COGL flags
echo ""
echo " • COGL Backend:"
# General warning about experimental features
if test "x$experimental_backend" = "xyes" ||
- test "x$experimental_image" = "xyes" ||
- test "x$experimental_json" = "xyes"; then
+ test "x$experimental_image" = "xyes"
+then
echo ""
echo "☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠"
echo " *WARNING*"
clutter-deprecated.h \
clutter-enum-types.h \
clutter-id-pool.h \
- clutter-json.h \
clutter-keysyms.h \
clutter-keysyms-compat.h \
clutter-keysyms-table.h \
egl \
fruity \
glx \
- json \
osx \
x11 \
win32