[gxml] StreamBuilder: improve parsing stages



commit 4246af336965e714fa869b119638cb0b19be833a
Author: Daniel Espinosa <esodan gmail com>
Date:   Sun May 15 18:47:01 2022 -0500

    StreamBuilder: improve parsing stages

 gxml/Element.vala          | 10 +++++-----
 gxml/StreamReader.vala     | 16 +++++++++-------
 test/StreamReaderTest.vala |  5 ++++-
 3 files changed, 18 insertions(+), 13 deletions(-)
---
diff --git a/gxml/Element.vala b/gxml/Element.vala
index eb8405f..43a7e48 100644
--- a/gxml/Element.vala
+++ b/gxml/Element.vala
@@ -895,16 +895,16 @@ public class GXml.Element : GXml.Node,
    * Synchronically parse {@link read_buffer}
    */
   public void parse_buffer () throws GLib.Error {
-    if (read_buffer == null) {
-      return;
-    }
     foreach (DomNode n in child_nodes) {
       if (n is GXml.Element) {
         ((GXml.Element) n).parse_buffer ();
       }
     }
-    read_from_string ((string) read_buffer.data);
-    read_buffer = null;
+
+    if (read_buffer != null) {
+      read_from_string ((string) read_buffer.data);
+      read_buffer = null;
+    }
   }
 
   ThreadPool<Element> pool = null;
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index ba5d9a3..0e8dc18 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -163,12 +163,10 @@ public class GXml.StreamReader : GLib.Object {
                     parse_xml_dec ();
                     start = false;
                     read_text_node ();
-                    message ("Stoped at: %c", cur_char ());
                     continue;
                 } else {
                     parse_pi_dec ();
                     read_text_node ();
-                    message ("Stoped at: %c", cur_char ());
                     continue;
                 }
             } else if (cur_char () == '!') {
@@ -191,8 +189,8 @@ public class GXml.StreamReader : GLib.Object {
       }
     }
     GXml.Element e = null;
-    var buf = new MemoryOutputStream.resizable ();
-    var dbuf = new DataOutputStream (buf);
+    var buffer = new MemoryOutputStream.resizable ();
+    var dbuf = new DataOutputStream (buffer);
     var oname_buf = new MemoryOutputStream (new uint8[1024]);
     var name_buf = new DataOutputStream (oname_buf);
 
@@ -211,6 +209,7 @@ public class GXml.StreamReader : GLib.Object {
       if (is_space (cur_char ())) {
         break;
       }
+
       if (cur_char () == '/') {
         dbuf.put_byte (cur_char ());
         string rest = read_upto (">");
@@ -230,19 +229,23 @@ public class GXml.StreamReader : GLib.Object {
 
       dbuf.put_byte (cur_byte ());
     }
+
     name_buf.put_byte ('\0', cancellable);
     if (document.document_element == null) {
       e = ((GXml.Document) document).search_root_element_property ();
     }
+
     if (e == null) {
       e = (GXml.Element) document.create_element ((string) oname_buf.get_data ());
       if (document.document_element == null) {
         document.append_child (e);
       }
     }
+
     if (document.document_element == e && parent == null) {
       foreach (ParamSpec pspec in
-                ((GXml.Object) e).get_property_element_list ()) {
+                ((GXml.Object) e).get_property_element_list ())
+      {
         if (!(pspec.value_type.is_a (typeof (Collection)))) continue;
         Collection col;
         Value vc = Value (pspec.value_type);
@@ -274,12 +277,11 @@ public class GXml.StreamReader : GLib.Object {
         root_collections.set (col.items_name.down (), col);
       }
     }
-    e.read_buffer = buf;
+    e.read_buffer = buffer;
     if (is_empty) {
       return e;
     }
     while (true) {
-
       if (!read_byte ()) {
         break;
       }
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index 7acff4f..ee0b419 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -88,7 +88,7 @@ class Authors : GXml.Element {
 
 class Book : GXml.Element {
        [Description(nick="::year")]
-       public int year { get; set; }
+       public int year { get; set; default = 1999; }
        [Description(nick="::ISBN")]
        public string ISBN { get; set; }
        public Authors authors { get; set; }
@@ -303,6 +303,7 @@ class GXmlTest {
                                                        assert (((GXml.Element) n).read_buffer != null);
                                                }
                                        }
+                                       message ("1st. Read: %s\n", bs.write_string ());
                                        bs.parse_buffer ();
                                        message (doc.write_string ());
                                        assert (bs.read_buffer == null);
@@ -316,6 +317,8 @@ class GXmlTest {
                                        assert (b2 != null);
                                        assert (b2 is Book);
                                        assert (b2.authors != null);
+                                       message ("Year: %d", b2.year);
+                                       assert (b2.year != 1999);
                                        loop.quit ();
                                } catch (GLib.Error e) {
                                        warning ("Error while reading stream: %s", e.message);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]