mirror of
https://github.com/brl/mutter.git
synced 2025-06-13 16:59:30 +00:00
[json] Update the internal JSON-GLib copy
There have been changes in JSON-GLib upstream to clean up the data structures, and facilitate introspection. We still not use the updated JsonParser with the (private) JsonScanner code, since it's a fork of GLib's GScanner.
This commit is contained in:
@ -2,26 +2,30 @@
|
||||
*
|
||||
* 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 of the License, or (at your option) any later version.
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author:
|
||||
* Emmanuele Bassi <ebassi@openedhand.com>
|
||||
* Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "json-types.h"
|
||||
#include "json-types-private.h"
|
||||
|
||||
/**
|
||||
* SECTION:json-array
|
||||
@ -40,20 +44,13 @@
|
||||
* To retrieve the length of the array, use json_array_get_length().
|
||||
*/
|
||||
|
||||
struct _JsonArray
|
||||
{
|
||||
GPtrArray *elements;
|
||||
|
||||
volatile gint ref_count;
|
||||
};
|
||||
|
||||
GType
|
||||
json_array_get_type (void)
|
||||
{
|
||||
static GType array_type = 0;
|
||||
|
||||
if (G_UNLIKELY (!array_type))
|
||||
array_type = g_boxed_type_register_static ("JsonArray",
|
||||
array_type = g_boxed_type_register_static (g_intern_static_string ("JsonArray"),
|
||||
(GBoxedCopyFunc) json_array_ref,
|
||||
(GBoxedFreeFunc) json_array_unref);
|
||||
|
||||
@ -142,7 +139,7 @@ json_array_unref (JsonArray *array)
|
||||
g_atomic_int_compare_and_exchange (&array->ref_count, old_ref, old_ref - 1);
|
||||
else
|
||||
{
|
||||
gint i;
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < array->elements->len; i++)
|
||||
json_node_free (g_ptr_array_index (array->elements, i));
|
||||
@ -160,9 +157,9 @@ json_array_unref (JsonArray *array)
|
||||
*
|
||||
* Gets the elements of a #JsonArray as a list of #JsonNode<!-- -->s.
|
||||
*
|
||||
* Return value: (transfer container) (element-type JsonNode): 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
|
||||
* 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 *
|
||||
@ -181,6 +178,35 @@ json_array_get_elements (JsonArray *array)
|
||||
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
|
||||
@ -189,7 +215,7 @@ json_array_get_elements (JsonArray *array)
|
||||
* Retrieves the #JsonNode containing the value of the element at @index_
|
||||
* inside a #JsonArray.
|
||||
*
|
||||
* Return value: (transfer none): a pointer to the #JsonNode at the requested index
|
||||
* Return value: a pointer to the #JsonNode at the requested index
|
||||
*/
|
||||
JsonNode *
|
||||
json_array_get_element (JsonArray *array,
|
||||
@ -201,6 +227,215 @@ json_array_get_element (JsonArray *array,
|
||||
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
|
||||
*/
|
||||
gint
|
||||
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_TYPE (node) == JSON_NODE_VALUE, 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_TYPE (node) == JSON_NODE_ARRAY, 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_TYPE (node) == JSON_NODE_OBJECT, NULL);
|
||||
|
||||
return json_node_get_object (node);
|
||||
}
|
||||
|
||||
/**
|
||||
* json_array_get_length:
|
||||
* @array: a #JsonArray
|
||||
@ -235,6 +470,183 @@ json_array_add_element (JsonArray *array,
|
||||
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,
|
||||
gint 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);
|
||||
|
||||
node = json_node_new (JSON_NODE_VALUE);
|
||||
json_node_set_string (node, value);
|
||||
|
||||
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);
|
||||
|
||||
node = json_node_new (JSON_NODE_ARRAY);
|
||||
json_node_take_array (node, value);
|
||||
|
||||
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);
|
||||
|
||||
node = json_node_new (JSON_NODE_OBJECT);
|
||||
json_node_take_object (node, value);
|
||||
|
||||
g_ptr_array_add (array->elements, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* json_array_remove_element:
|
||||
* @array: a #JsonArray
|
||||
@ -252,3 +664,38 @@ json_array_remove_element (JsonArray *array,
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user