summaryrefslogtreecommitdiff
path: root/json-glib/json-reader.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@linux.intel.com>2010-08-12 16:09:45 +0100
committerEmmanuele Bassi <ebassi@linux.intel.com>2010-08-12 16:09:45 +0100
commit0281176789b38973b1723f752070cb0e7340055d (patch)
tree3d4d72d221e88a9b3883865acdbf85d8dc8e7110 /json-glib/json-reader.c
parent149d2f3925ca798886f2137ae73488f7e2e6386b (diff)
downloadjson-glib-0281176789b38973b1723f752070cb0e7340055d.tar.gz
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.
Diffstat (limited to 'json-glib/json-reader.c')
-rw-r--r--json-glib/json-reader.c90
1 files changed, 29 insertions, 61 deletions
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;
}
/*