From 66b0c1969c72ad49482befb3136b3e8478b07c58 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 22 Sep 2010 12:56:33 +0100 Subject: [PATCH] Remove the internal copy of JSON-GLib The internal copy of JSON-GLib was meant to go away right after the 1.0 release, given that JSON-GLib was still young and relatively unknown. Nowadays, many projects started depending on this little library, and distributions ship it and keep it up to date. Keeping a copy of JSON-GLib means keeping it up to date; unfortunately, this would also imply updating the code not just for the API but for the internal implementations. Starting with the 1.2 release, Clutter preferably dependend on the system copy; with the 1.4 release we stopped falling back automatically. The 1.6 cycle finally removes the internal copy and requires a copy of JSON-GLib installed on the target system in order to compile Clutter. --- README | 15 +- clutter/Makefile.am | 66 +- clutter/clutter-json.h.in | 11 - clutter/clutter-script-private.h | 3 +- clutter/clutter-script.c | 2 - clutter/clutter-scriptable.h | 2 +- clutter/json/json-array.c | 725 ------------------- clutter/json/json-generator.c | 646 ----------------- clutter/json/json-generator.h | 83 --- clutter/json/json-glib.h | 12 - clutter/json/json-marshal.c | 130 ---- clutter/json/json-marshal.h | 37 - clutter/json/json-node.c | 770 -------------------- clutter/json/json-object.c | 888 ----------------------- clutter/json/json-parser.c | 1124 ----------------------------- clutter/json/json-parser.h | 147 ---- clutter/json/json-types-private.h | 61 -- clutter/json/json-types.h | 288 -------- configure.ac | 90 +-- doc/reference/clutter/Makefile.am | 2 - 20 files changed, 13 insertions(+), 5089 deletions(-) delete mode 100644 clutter/clutter-json.h.in delete mode 100644 clutter/json/json-array.c delete mode 100644 clutter/json/json-generator.c delete mode 100644 clutter/json/json-generator.h delete mode 100644 clutter/json/json-glib.h delete mode 100644 clutter/json/json-marshal.c delete mode 100644 clutter/json/json-marshal.h delete mode 100644 clutter/json/json-node.c delete mode 100644 clutter/json/json-object.c delete mode 100644 clutter/json/json-parser.c delete mode 100644 clutter/json/json-parser.h delete mode 100644 clutter/json/json-types-private.h delete mode 100644 clutter/json/json-types.h diff --git a/README b/README index 5497c6ffd..7b8ad0863 100644 --- a/README +++ b/README @@ -10,6 +10,7 @@ REQUIREMENTS Clutter currently requires: • GLib >= 2.18.0 + • JSON-GLib >= 0.10 • Atk >= 1.17 • Cairo >= 1.6 • PangoCairo >= 1.20 @@ -18,7 +19,6 @@ Clutter currently requires: 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 @@ -197,19 +197,6 @@ Clutter has additional command line options for the configure script: --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 ------------------------------------------------------------------------------- diff --git a/clutter/Makefile.am b/clutter/Makefile.am index 898742c32..ad1836295 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -474,36 +474,6 @@ cally_include_HEADERS = $(cally_sources_h) 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 @@ -530,7 +500,6 @@ DISTCLEANFILES += $(pc_files) 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) @@ -558,9 +527,6 @@ libclutter_@CLUTTER_SONAME_INFIX@_@CLUTTER_API_VERSION@_la_SOURCES = \ $(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 = \ @@ -573,7 +539,7 @@ libclutter_@CLUTTER_SONAME_INFIX@_@CLUTTER_API_VERSION@_la_LDFLAGS = \ $(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) @@ -584,24 +550,23 @@ libclutter_@CLUTTER_SONAME_INFIX@_@CLUTTER_API_VERSION@_la_LDFLAGS = \ 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 @@ -626,29 +591,11 @@ Cally_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \ --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 @@ -656,7 +603,6 @@ ClutterX11_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \ --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 diff --git a/clutter/clutter-json.h.in b/clutter/clutter-json.h.in deleted file mode 100644 index 2f5879683..000000000 --- a/clutter/clutter-json.h.in +++ /dev/null @@ -1,11 +0,0 @@ -#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__ */ diff --git a/clutter/clutter-script-private.h b/clutter/clutter-script-private.h index f69410c66..b86a000e1 100644 --- a/clutter/clutter-script-private.h +++ b/clutter/clutter-script-private.h @@ -27,7 +27,8 @@ #define __CLUTTER_SCRIPT_PRIVATE_H__ #include -#include "clutter-json.h" +#include + #include "clutter-color.h" #include "clutter-types.h" #include "clutter-script.h" diff --git a/clutter/clutter-script.c b/clutter/clutter-script.c index 024439098..a88691c4c 100644 --- a/clutter/clutter-script.c +++ b/clutter/clutter-script.c @@ -210,8 +210,6 @@ #include "clutter-private.h" #include "clutter-debug.h" -#include "json/json-parser.h" - enum { PROP_0, diff --git a/clutter/clutter-scriptable.h b/clutter/clutter-scriptable.h index b7fb1980e..6ad24ab5a 100644 --- a/clutter/clutter-scriptable.h +++ b/clutter/clutter-scriptable.h @@ -30,8 +30,8 @@ #define __CLUTTER_SCRIPTABLE_H__ #include +#include #include -#include G_BEGIN_DECLS diff --git a/clutter/json/json-array.c b/clutter/json/json-array.c deleted file mode 100644 index f1e677e61..000000000 --- a/clutter/json/json-array.c +++ /dev/null @@ -1,725 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -#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 - * #JsonNodes, 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 #JsonNodes. - * - * 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); - } -} diff --git a/clutter/json/json-generator.c b/clutter/json/json-generator.c deleted file mode 100644 index 0766df34b..000000000 --- a/clutter/json/json-generator.c +++ /dev/null @@ -1,646 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -/* - * 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 -#include - -#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 - * #JsonNodes. - * - * 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. - * - * The node is copied by the generator object, so it can be safely - * freed after calling this function. - */ -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); -} diff --git a/clutter/json/json-generator.h b/clutter/json/json-generator.h deleted file mode 100644 index 893325bee..000000000 --- a/clutter/json/json-generator.h +++ /dev/null @@ -1,83 +0,0 @@ -/* 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 - */ - -#ifndef __JSON_GENERATOR_H__ -#define __JSON_GENERATOR_H__ - -#include -#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__ */ diff --git a/clutter/json/json-glib.h b/clutter/json/json-glib.h deleted file mode 100644 index 3e750804b..000000000 --- a/clutter/json/json-glib.h +++ /dev/null @@ -1,12 +0,0 @@ -#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__ */ diff --git a/clutter/json/json-marshal.c b/clutter/json/json-marshal.c deleted file mode 100644 index 9588d29cd..000000000 --- a/clutter/json/json-marshal.c +++ /dev/null @@ -1,130 +0,0 @@ -#include "json-marshal.h" - -#include - - -#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) */ - diff --git a/clutter/json/json-marshal.h b/clutter/json/json-marshal.h deleted file mode 100644 index f4f7658c8..000000000 --- a/clutter/json/json-marshal.h +++ /dev/null @@ -1,37 +0,0 @@ - -#ifndef ___json_marshal_MARSHAL_H__ -#define ___json_marshal_MARSHAL_H__ - -#include - -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__ */ - diff --git a/clutter/json/json-node.c b/clutter/json/json-node.c deleted file mode 100644 index a56fc7493..000000000 --- a/clutter/json/json-node.c +++ /dev/null @@ -1,770 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#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 - * - * A null node is not the same as a %NULL #JsonNode - * - * 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; -} diff --git a/clutter/json/json-object.c b/clutter/json/json-object.c deleted file mode 100644 index b60b37b99..000000000 --- a/clutter/json/json-object.c +++ /dev/null @@ -1,888 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#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 - * #JsonNodes, 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 #JsonNodes. 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); -} diff --git a/clutter/json/json-parser.c b/clutter/json/json-parser.c deleted file mode 100644 index 0cd2f64e4..000000000 --- a/clutter/json/json-parser.c +++ /dev/null @@ -1,1124 +0,0 @@ -/* 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 - */ - -/* - * 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 - -#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; -} diff --git a/clutter/json/json-parser.h b/clutter/json/json-parser.h deleted file mode 100644 index 11638a634..000000000 --- a/clutter/json/json-parser.h +++ /dev/null @@ -1,147 +0,0 @@ -/* 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 - */ - -#ifndef __JSON_PARSER_H__ -#define __JSON_PARSER_H__ - -#include -#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__ */ diff --git a/clutter/json/json-types-private.h b/clutter/json/json-types-private.h deleted file mode 100644 index 728b36713..000000000 --- a/clutter/json/json-types-private.h +++ /dev/null @@ -1,61 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -#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__ */ diff --git a/clutter/json/json-types.h b/clutter/json/json-types.h deleted file mode 100644 index 588241238..000000000 --- a/clutter/json/json-types.h +++ /dev/null @@ -1,288 +0,0 @@ -/* 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 . - * - * Author: - * Emmanuele Bassi - */ - -#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __JSON_TYPES_H__ -#define __JSON_TYPES_H__ - -#include - -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__ */ diff --git a/configure.ac b/configure.ac index 95b7df42a..b6d5a98ae 100644 --- a/configure.ac +++ b/configure.ac @@ -795,80 +795,6 @@ AS_IF([test "x$SUPPORT_XLIB" = "x1"], 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])]) @@ -1020,15 +946,12 @@ AS_IF([test "x$enable_maintainer_flags" = "xyes" && test "x$GCC" = "xyes"], 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) @@ -1117,7 +1040,6 @@ AC_CONFIG_FILES([ 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 @@ -1193,12 +1115,6 @@ echo " • Extra:" 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:" @@ -1239,8 +1155,8 @@ echo "" # 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*" diff --git a/doc/reference/clutter/Makefile.am b/doc/reference/clutter/Makefile.am index e2509bb63..1abc8d52d 100644 --- a/doc/reference/clutter/Makefile.am +++ b/doc/reference/clutter/Makefile.am @@ -71,7 +71,6 @@ IGNORE_HFILES=\ 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 \ @@ -88,7 +87,6 @@ IGNORE_HFILES=\ egl \ fruity \ glx \ - json \ osx \ x11 \ win32