diff options
author | Emmanuele Bassi <ebassi@linux.intel.com> | 2010-08-12 16:09:45 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2010-08-12 16:09:45 +0100 |
commit | 0281176789b38973b1723f752070cb0e7340055d (patch) | |
tree | 3d4d72d221e88a9b3883865acdbf85d8dc8e7110 /json-glib/json-reader.c | |
parent | 149d2f3925ca798886f2137ae73488f7e2e6386b (diff) | |
download | json-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.c | 90 |
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; } /* |