[json-glib] reader: Do not wrap JsonParser
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [json-glib] reader: Do not wrap JsonParser
- Date: Thu, 12 Aug 2010 15:11:06 +0000 (UTC)
commit 0281176789b38973b1723f752070cb0e7340055d
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Thu Aug 12 16:09:45 2010 +0100
reader: Do not wrap JsonParser
Since JsonParser has far more methods for parsing a JSON stream we
should just make JsonReader an API for reading an already parsed JSON
tree - in the same way that JsonBuilder does not generate the
stringified version of the JSON tree it builds.
doc/reference/json-glib-sections.txt | 2 +-
json-glib/json-reader.c | 90 +++++++++++-----------------------
json-glib/json-reader.h | 6 +--
json-glib/tests/reader-test.c | 11 +++-
4 files changed, 41 insertions(+), 68 deletions(-)
---
diff --git a/doc/reference/json-glib-sections.txt b/doc/reference/json-glib-sections.txt
index a537ea3..acb86b3 100644
--- a/doc/reference/json-glib-sections.txt
+++ b/doc/reference/json-glib-sections.txt
@@ -299,7 +299,7 @@ json_builder_get_type
JsonReader
JsonReaderClass
json_reader_new
-json_reader_load_from_data
+json_reader_set_root
<SUBSECTION>
json_reader_read_element
json_reader_end_element
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c
index d709336..8bf7990 100644
--- a/json-glib/json-reader.c
+++ b/json-glib/json-reader.c
@@ -75,7 +75,6 @@
#include "json-types-private.h"
#include "json-debug.h"
-#include "json-parser.h"
#define json_reader_return_if_error_set(r) G_STMT_START { \
if (((JsonReader *) (r))->priv->error != NULL) \
@@ -87,8 +86,6 @@
struct _JsonReaderPrivate
{
- JsonParser *parser;
-
JsonNode *root;
JsonNode *current_node;
@@ -104,11 +101,9 @@ json_reader_dispose (GObject *gobject)
{
JsonReaderPrivate *priv = JSON_READER (gobject)->priv;
- if (priv->parser != NULL)
+ if (priv->root != NULL)
{
- g_object_unref (priv->parser);
-
- priv->parser = NULL;
+ json_node_free (priv->root);
priv->root = NULL;
priv->current_node = NULL;
priv->previous_node = NULL;
@@ -135,8 +130,6 @@ json_reader_init (JsonReader *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, JSON_TYPE_READER,
JsonReaderPrivate);
-
- self->priv->parser = json_parser_new ();
}
GQuark
@@ -161,78 +154,53 @@ json_reader_new (void)
return g_object_new (JSON_TYPE_READER, NULL);
}
-/**
- * json_reader_load_from_data:
+/*
+ * json_reader_unset_error:
* @reader: a #JsonReader
- * @data: the data to be parsed
- * @length: the length of @data, or -1
- * @error: return location for a #GError, or %NULL
*
- * Loads a JSON string and parses it.
+ * Unsets the error state of @reader, if set
+ */
+static inline void
+json_reader_unset_error (JsonReader *reader)
+{
+ if (reader->priv->error != NULL)
+ g_clear_error (&(reader->priv->error));
+}
+
+/**
+ * json_reader_set_root:
+ * @reader: a #JsonReader
+ * @root: a #JsonNode
*
- * If @reader already contained a JSON DOM, it will be reset.
+ * Sets the root #JsonNode to be read by @reader. The @reader will take
+ * a copy of @root
*
- * Return value: %TRUE if the data was successfully parsed, and %FALSE
- * otherwise. In case of failure, the #GError will be set accordingly
+ * If another #JsonNode is currently set as root, it will be replaced.
*
* Since: 0.12
*/
-gboolean
-json_reader_load_from_data (JsonReader *reader,
- const gchar *data,
- gssize length,
- GError **error)
+void
+json_reader_set_root (JsonReader *reader,
+ JsonNode *root)
{
JsonReaderPrivate *priv;
- GError *internal_error;
- gboolean retval;
- g_return_val_if_fail (JSON_IS_READER (reader), FALSE);
+ g_return_if_fail (JSON_IS_READER (reader));
+ g_return_if_fail (root != NULL);
priv = reader->priv;
if (priv->root != NULL)
{
+ json_node_free (priv->root);
priv->root = NULL;
-
priv->current_node = NULL;
priv->previous_node = NULL;
}
- if (priv->error != NULL)
- g_clear_error (&priv->error);
-
- internal_error = NULL;
- retval = json_parser_load_from_data (priv->parser, data, length, &internal_error);
- if (retval)
- {
- priv->root = json_parser_get_root (priv->parser);
-
- priv->current_node = priv->root;
- priv->previous_node = NULL;
-
- priv->error = NULL;
- }
- else
- {
- priv->error = g_error_copy (internal_error);
- g_propagate_error (error, internal_error);
- }
-
- return retval;
-}
-
-/*
- * json_reader_unset_error:
- * @reader: a #JsonReader
- *
- * Unsets the error state of @reader, if set
- */
-static inline void
-json_reader_unset_error (JsonReader *reader)
-{
- if (reader->priv->error != NULL)
- g_clear_error (&(reader->priv->error));
+ priv->root = json_node_copy (root);
+ priv->current_node = priv->root;
+ priv->previous_node = NULL;
}
/*
diff --git a/json-glib/json-reader.h b/json-glib/json-reader.h
index 460c52f..126177c 100644
--- a/json-glib/json-reader.h
+++ b/json-glib/json-reader.h
@@ -110,10 +110,8 @@ GType json_reader_get_type (void) G_GNUC_CONST;
JsonReader * json_reader_new (void);
-gboolean json_reader_load_from_data (JsonReader *reader,
- const gchar *data,
- gssize length,
- GError **error);
+void json_reader_set_root (JsonReader *reader,
+ JsonNode *root);
G_CONST_RETURN GError *json_reader_get_error (JsonReader *reader);
diff --git a/json-glib/tests/reader-test.c b/json-glib/tests/reader-test.c
index 64d5fba..91b4783 100644
--- a/json-glib/tests/reader-test.c
+++ b/json-glib/tests/reader-test.c
@@ -14,12 +14,15 @@ static const gchar *test_base_object_data =
static void
test_base_object (void)
{
+ JsonParser *parser = json_parser_new ();
JsonReader *reader = json_reader_new ();
GError *error = NULL;
- json_reader_load_from_data (reader, test_base_object_data, -1, &error);
+ json_parser_load_from_data (parser, test_base_object_data, -1, &error);
g_assert (error == NULL);
+ json_reader_set_root (reader, json_parser_get_root (parser));
+
g_assert (json_reader_is_object (reader));
g_assert_cmpint (json_reader_count_members (reader), ==, 3);
@@ -37,17 +40,21 @@ test_base_object (void)
g_assert (json_reader_get_error (reader) == NULL);
g_object_unref (reader);
+ g_object_unref (parser);
}
static void
test_base_array (void)
{
+ JsonParser *parser = json_parser_new ();
JsonReader *reader = json_reader_new ();
GError *error = NULL;
- json_reader_load_from_data (reader, test_base_array_data, -1, &error);
+ json_parser_load_from_data (parser, test_base_array_data, -1, &error);
g_assert (error == NULL);
+ json_reader_set_root (reader, json_parser_get_root (parser));
+
g_assert (json_reader_is_array (reader));
g_assert_cmpint (json_reader_count_elements (reader), ==, 7);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]