[json-glib] reader: Do not wrap JsonParser



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]