[gxml/gxml-0.8] TwDocument.save_to() now makes a backup by default
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml/gxml-0.8] TwDocument.save_to() now makes a backup by default
- Date: Wed, 13 Jan 2016 04:43:13 +0000 (UTC)
commit 9230874cb0afd736a7909622c5622365d18cea2a
Author: Daniel Espinosa <esodan gmail com>
Date: Tue Jan 12 14:40:32 2016 -0600
TwDocument.save_to() now makes a backup by default
* Added asserts to Xmlx methods
gxml/TwDocument.vala | 29 +++++++++++++++++++++++-
gxml/xlibxml.c | 16 +++++++++++++
gxml/xlibxml.h | 3 ++
test/TwDocumentTest.vala | 56 ++++++++++++++++++++++++++++++++++++++++-----
vapi/xlibxml-1.0.vapi | 2 +
5 files changed, 98 insertions(+), 8 deletions(-)
---
diff --git a/gxml/TwDocument.vala b/gxml/TwDocument.vala
index 5fe699e..987bf93 100644
--- a/gxml/TwDocument.vala
+++ b/gxml/TwDocument.vala
@@ -31,6 +31,7 @@ using Xml;
public class GXml.TwDocument : GXml.TwNode, GXml.Document
{
GXml.Element _root = null;
+ Xml.Buffer _buffer;
construct {
_name = "#document";
}
@@ -117,8 +118,34 @@ public class GXml.TwDocument : GXml.TwNode, GXml.Document
}
public bool save_to (GLib.File f, GLib.Cancellable? cancellable = null)
{
- var tw = new Xml.TextWriter.filename (f.get_path ());
+ file = f;
+ var buf = new Xml.Buffer ();
+ var tw = Xmlx.new_text_writer_memory (buf, 0);
+ GLib.Test.message ("Writing down to buffer");
write_document (tw);
+ GLib.Test.message ("Writing down to file");
+ GLib.Test.message ("TextWriter buffer:\n"+buf.content ());
+ var s = new GLib.StringBuilder ();
+ s.append (buf.content ());
+ try {
+ GLib.Test.message ("Writing down to file: Creating input stream");
+ var b = new GLib.MemoryInputStream.from_data (s.data, null);
+ GLib.OutputStream ostream;
+ if (file.query_exists ()) {
+ GLib.Test.message ("Writing down to file: Replacing with backup");
+ ostream = file.replace (null, true, GLib.FileCreateFlags.NONE, cancellable);
+ ostream.splice (b, GLib.OutputStreamSpliceFlags.NONE);
+ ostream.close ();
+ } else {
+ GLib.Test.message ("Writing down to file: Creating a new File");
+ ostream = file.create (GLib.FileCreateFlags.NONE, cancellable);
+ ostream.splice (b, GLib.OutputStreamSpliceFlags.NONE);
+ ostream.close ();
+ }
+ } catch (GLib.Error e) {
+ GLib.warning ("Error on Save to file: "+e.message);
+ return false;
+ }
return true;
}
public virtual void write_document (Xml.TextWriter tw)
diff --git a/gxml/xlibxml.c b/gxml/xlibxml.c
index 1365580..887338a 100644
--- a/gxml/xlibxml.c
+++ b/gxml/xlibxml.c
@@ -23,11 +23,13 @@
void* gxml_doc_get_intsubset_entities (xmlDoc *doc)
{
+ g_return_if_fail (doc != NULL);
return doc->intSubset->entities;
}
int gxml_validate_name (xmlChar* name, int space)
{
+ g_return_if_fail (name != NULL);
return xmlValidateName (name, space);
}
@@ -43,20 +45,34 @@ xmlErrorPtr gxml_get_last_error ()
xmlNsPtr* gxml_doc_get_ns_list (xmlDoc* doc, xmlNode* node)
{
+ g_return_if_fail (doc != NULL);
+ g_return_if_fail (node != NULL);
return xmlGetNsList (doc, node);
}
xmlTextWriterPtr gxml_new_text_writer_doc (xmlDoc** doc)
{
+ g_return_if_fail (doc != NULL);
return xmlNewTextWriterDoc (doc, 0);
}
+xmlTextWriterPtr gxml_new_text_writer_memory (xmlBufferPtr buffer, gint compression)
+{
+ g_return_if_fail (buffer != NULL);
+ return xmlNewTextWriterMemory (buffer, compression);
+}
+
int gxml_text_writer_write_cdata (xmlTextWriterPtr tw, const xmlChar* text)
{
+ g_return_if_fail (tw != NULL);
+ g_return_if_fail (text != NULL);
return xmlTextWriterWriteCDATA (tw, text);
}
int gxml_text_writer_write_pi (xmlTextWriterPtr tw, const xmlChar* target, const xmlChar* data)
{
+ g_return_if_fail (tw != NULL);
+ g_return_if_fail (target != NULL);
+ g_return_if_fail (data != NULL);
return xmlTextWriterWritePI (tw, target, data);
}
diff --git a/gxml/xlibxml.h b/gxml/xlibxml.h
index 6ec601c..ea173e7 100644
--- a/gxml/xlibxml.h
+++ b/gxml/xlibxml.h
@@ -24,12 +24,15 @@
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xmlwriter.h>
+#include <glib.h>
void* gxml_doc_get_intsubset_entities (xmlDoc *doc);
int gxml_validate_name (xmlChar* name, int space);
xmlErrorPtr gxml_parser_context_get_last_error (void* ctx);
xmlErrorPtr gxml_get_last_error ();
xmlNsPtr* gxml_doc_get_ns_list (xmlDoc* doc, xmlNode* node);
+xmlTextWriterPtr gxml_new_text_writer_doc (xmlDoc** doc);
+xmlTextWriterPtr gxml_new_text_writer_memory (xmlBufferPtr buffer, gint compression);
int gxml_text_writer_write_cdata (xmlTextWriter* tw, const xmlChar* text);
int gxml_text_writer_write_pi (xmlTextWriter* tw, const xmlChar* target, const xmlChar*
data);
diff --git a/test/TwDocumentTest.vala b/test/TwDocumentTest.vala
index 0d70907..4be9429 100644
--- a/test/TwDocumentTest.vala
+++ b/test/TwDocumentTest.vala
@@ -23,6 +23,12 @@
using GXml;
class TwDocumentTest : GXmlTest {
+ public class TwTestObject : SerializableObjectModel
+ {
+ public string name { get; set; }
+ public override string node_name () { return "Test"; }
+ public override string to_string () { return "TestNode"; }
+ }
public static void add_tests () {
Test.add_func ("/gxml/tw-document", () => {
try {
@@ -71,13 +77,15 @@ class TwDocumentTest : GXmlTest {
assert (d.root != null);
assert (d.root.name == "root");
assert (d.root.value == "");
- d.save ();
+ GLib.Test.message ("Saving document to: "+f.get_path ());
+ assert (d.save ());
+ GLib.Test.message ("Reading saved document to: "+f.get_path ());
+ assert (f.query_exists ());
var istream = f.read ();
- uint8[] buffer = new uint8[2048];
- istream.read_all (buffer, null);
- istream.close ();
- assert ("<?xml version=\"1.0\"?>" in ((string)buffer));
- assert ("<root/>" in ((string)buffer));
+ var ostream = new MemoryOutputStream.resizable ();
+ ostream.splice (istream, 0);
+ assert ("<?xml version=\"1.0\"?>" in ((string)ostream.data));
+ assert ("<root/>" in ((string)ostream.data));
}
catch (GLib.Error e) {
#if DEBUG
@@ -326,7 +334,41 @@ class TwDocumentTest : GXmlTest {
assert_not_reached ();
}
});
-
+ Test.add_func ("/gxml/tw-document/save/backup", () => {
+ try {
+ var f = GLib.File.new_for_path
(GXmlTestConfig.TEST_SAVE_DIR+"/tw-test.xml");
+ if (f.query_exists ()) f.delete ();
+ var ot = new TwTestObject ();
+ ot.name = "test1";
+ var dt = new TwDocument ();
+ ot.serialize (dt);
+ dt.save_to (f);
+ var d = new TwDocument ();
+ var e = d.create_element ("root");
+ d.childs.add (e);
+ assert (d.childs.size == 1);
+ assert (d.root != null);
+ assert (d.root.name == "root");
+ assert (d.root.value == "");
+ d.save_to (f);
+ assert (f.query_exists ());
+ var bf = GLib.File.new_for_path
(GXmlTestConfig.TEST_SAVE_DIR+"/tw-test.xml~");
+ assert (bf.query_exists ());
+ var istream = f.read ();
+ var b = new MemoryOutputStream.resizable ();
+ b.splice (istream, 0);
+ assert ("<?xml version=\"1.0\"?>" in ((string)b.data));
+ assert ("<root/>" in ((string)b.data));
+ f.delete ();
+ bf.delete ();
+ }
+ catch (GLib.Error e) {
+#if DEBUG
+ GLib.message (@"ERROR: $(e.message)");
+#endif
+ assert_not_reached ();
+ }
+ });
Test.add_func ("/gxml/tw-document/to_string", () => {
var doc = new TwDocument ();
var r = doc.create_element ("root");
diff --git a/vapi/xlibxml-1.0.vapi b/vapi/xlibxml-1.0.vapi
index 17fa24d..282a962 100644
--- a/vapi/xlibxml-1.0.vapi
+++ b/vapi/xlibxml-1.0.vapi
@@ -38,6 +38,8 @@ namespace Xmlx {
public static Xml.Ns*[] doc_get_ns_list (Xml.Doc* doc, Xml.Node* node);
[CCode (cname = "gxml_new_text_writer_doc", cheader_filename = "gxml/xlibxml.h")]
public static Xml.TextWriter new_text_writer_doc (ref Xml.Doc doc);
+ [CCode (cname = "gxml_new_text_writer_memory", cheader_filename = "gxml/xlibxml.h")]
+ public static Xml.TextWriter new_text_writer_memory (Xml.Buffer buffer, int compression);
[CCode (cname = "gxml_text_writer_write_cdata", cheader_filename = "gxml/xlibxml.h")]
public static int text_writer_write_cdata (Xml.TextWriter tw, string text);
[CCode (cname = "gxml_text_writer_write_pi", cheader_filename = "gxml/xlibxml.h")]
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]