[gxml] Element: added new parse_buffer()



commit 9a77bd4697cb82be0bca9bdb84e90569e25b20d8
Author: Daniel Espinosa <esodan gmail com>
Date:   Tue Jul 23 14:20:07 2019 -0500

    Element: added new parse_buffer()
    
    Async method to read async all unparsed child nodes

 gxml/Element.vala          | 23 +++++++++++++++++------
 test/StreamReaderTest.vala | 26 ++++++++++++++++++++++++++
 test/meson.build           | 15 ++++++++++++++-
 3 files changed, 57 insertions(+), 7 deletions(-)
---
diff --git a/gxml/Element.vala b/gxml/Element.vala
index 75bc133..3f74d21 100644
--- a/gxml/Element.vala
+++ b/gxml/Element.vala
@@ -790,21 +790,32 @@ public class GXml.Element : GXml.Node,
    * Once it finish, sets {@link unparsed} to null.
    */
   public void read_unparsed () throws GLib.Error {
-    var parser = new XParser (this);
     if (unparsed != null) {
+      var parser = new XParser (this);
       parser.read_child_nodes_string (unparsed);
       unparsed = null;
     }
-    if (read_buffer != null) {
-      parser.read_child_nodes_string ((string) read_buffer.data);
-      read_buffer = null;
-    }
   }
   /**
-   * On memory {@link MemoryOutputStream} with the unparsed
+   * On memory {@link GLib.MemoryOutputStream} with the unparsed
    * string of the element
    */
   public MemoryOutputStream read_buffer { get; set; }
+  /**
+   * Asynchronically parse {@link read_buffer}
+   */
+  public async void parse_buffer () throws GLib.Error {
+    if (read_buffer == null) {
+      return;
+    }
+    read_from_string ((string) read_buffer.data);
+    read_buffer = null;
+    foreach (DomNode n in child_nodes) {
+      if (n is GXml.Element) {
+        ((GXml.Element) n).parse_buffer.begin ();
+      }
+    }
+  }
 }
 
 
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index 4520867..e04a17e 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -93,6 +93,32 @@ class GXmlTest {
                                warning ("Error: %s", e.message);
                        }
                });
+               Test.add_func ("/gxml/stream-reader/child-multiple/read-unparsed", () => {
+      var loop = new GLib.MainLoop (null);
+      Idle.add (()=>{
+                               string str = """<root p1="a" p2="b" ><child k="p" y="9"><code/><code 
u="3">TestC</code><Tek/><Tex y="456"/></child></root>""";
+                               var istream = new MemoryInputStream.from_data (str.data, null);
+                               var sr = new StreamReader (istream);
+                               try {
+                                       var doc = sr.read ();
+                                       (doc.document_element as GXml.Element).parse_buffer.begin ((obj, 
res)=>{
+                                               try {
+                                                               (doc.document_element as 
GXml.Element).parse_buffer.end (res);
+                                                               message (doc.write_string ());
+                                                               assert ((doc.document_element as 
GXml.Element).read_buffer == null);
+                                                               assert 
((doc.document_element.child_nodes.item (0) as GXml.Element).read_buffer == null);
+                                                               loop.quit ();
+                                               } catch (GLib.Error e) {
+                                                       warning ("Error: %s", e.message);
+                                               }
+                                       });
+                               } catch (GLib.Error e) {
+                                       warning ("Error while reading stream: %s", e.message);
+                               }
+                               return Source.REMOVE;
+      });
+      loop.run ();
+               });
                Test.run ();
 
                return 0;
diff --git a/test/meson.build b/test/meson.build
index 88b14ff..be2d0b7 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -128,4 +128,17 @@ stream_reader_performance_iterate = executable('stream-reader-performance-iterat
 )
 
 benchmark ('stream-reader-performance-iterate', stream_reader_performance_iterate)
-               
+
+
+files_stream_reader_performance_iterate_read = files ([
+               'StreamReaderPerformanceIterateReadUnparsedTest.vala'
+       ])
+
+stream_reader_performance_iterate = executable('stream-reader-performance-iterate-read-unparsed', 
files_stream_reader_performance_iterate_read + configvapi + configtestvapi,
+       vala_args : [],
+       dependencies : [ libgxml_deps, inc_libh_dep, testdirs_dep, inc_rooth_dep],
+       link_with: libgxml
+)
+
+benchmark ('stream-reader-performance-iterate-read-unparsed', stream_reader_performance_iterate)
+


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