diff --git a/gxml/BackedNode.vala b/gxml/BackedNode.vala
index 53724c68c2e39a7873c58e083d5f10a76afdc2ec..03f5189b58eae75619cdff15ae14232cf419875a 100644
--- a/gxml/BackedNode.vala
+++ b/gxml/BackedNode.vala
@@ -102,6 +102,7 @@ namespace GXml {
*/
public override bool set_namespace (string uri, string prefix)
{
+ if (node == null) return false;
if (node->ns_def != null) {
for (Xml.Ns *cur = node->ns_def; cur != null; cur = cur->next) {
if ((string) cur->prefix == prefix && (string) cur->href == uri) {
@@ -110,15 +111,26 @@ namespace GXml {
}
}
}
- // Not found in this node, searching on root element
- if (owner_document.document_element.node->ns_def != null) {
- for (Xml.Ns *cur = owner_document.document_element.node->ns_def; cur != null; cur = cur->next) {
+ // Not found search on parent
+ if (node->parent != null) {
+ for (Xml.Ns *cur = node->parent->ns_def; cur != null; cur = cur->next) {
if ((string) cur->prefix == prefix && (string) cur->href == uri) {
this.node->set_ns (cur);
return true;
}
}
}
+ // Not found in this node, searching on root element
+ if (owner_document == null) return false;
+ if (owner_document.document_element == null) return false;
+ if (owner_document.document_element.node == null) return false;
+ if (owner_document.document_element.node->ns_def == null) return false;
+ for (Xml.Ns *cur = owner_document.document_element.node->ns_def; cur != null; cur = cur->next) {
+ if ((string) cur->prefix == prefix && (string) cur->href == uri) {
+ this.node->set_ns (cur);
+ return true;
+ }
+ }
return false;
}
/**
diff --git a/gxml/Serializable.vala b/gxml/Serializable.vala
index e39b2cc770172c5682e723313be1ebc13e1aca8a..854f313945d14a6aed7f3cdb06e82a08d560c1c2 100644
--- a/gxml/Serializable.vala
+++ b/gxml/Serializable.vala
@@ -466,66 +466,67 @@ namespace GXml {
GLib.Value dest2 = Value (t);
bool ret = false;
- if (t == typeof (int64)) {
+ if (t == typeof (int64)
+ || t == typeof (uint64)) {
int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_int64 (val);
- }
+ val = (int64) double.parse (str);
+ dest2.set_int64 (val);
+ ret = true;
} else if (t == typeof (int)) {
- int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_int ((int)val);
- }
+ int val;
+ val = (int) double.parse (str);
+ dest2.set_int (val);
+ ret = true;
} else if (t == typeof (long)) {
- int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_long ((long)val);
- }
+ long val;
+ val = (long) double.parse (str);
+ dest2.set_long (val);
+ ret = true;
} else if (t == typeof (uint)) {
- uint64 val;
- ;
- if (ret = uint64.try_parse (str, out val)) {
- dest2.set_uint ((uint)val);
- }
+ uint val;
+ val = (uint) double.parse (str);
+ dest2.set_uint (val);
+ ret = true;
} else if (t == typeof (ulong)) {
- uint64 val;
- if (ret = uint64.try_parse (str, out val)) {
- dest2.set_ulong ((ulong)val);
- }
+ ulong val;
+ val = (ulong) double.parse (str);
+ dest2.set_ulong (val);
+ ret = true;
} else if (t == typeof (bool)) {
bool val;
if (ret = bool.try_parse (str.down (), out val)) {
dest2.set_boolean (val);
}
} else if (t == typeof (float)) {
- double val;
- if (ret = double.try_parse (str, out val)) {
- dest2.set_float ((float)val);
- }
+ float val;
+ val = (float) double.parse (str);
+ dest2.set_float (val);
+ ret = true;
} else if (t == typeof (double)) {
double val;
- if (ret = double.try_parse (str, out val)) {
- dest2.set_double (val);
- }
+ val = (double) double.parse (str);
+ dest2.set_double (val);
+ ret = true;
} else if (t == typeof (string)) {
dest2.set_string (str);
ret = true;
} else if (t == typeof (char)) {
- int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_char ((char)val);
- }
+ char val;
+ val = (char) double.parse (str);
+ dest2.set_char (val);
+ ret = true;
} else if (t == typeof (uchar)) {
- int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_uchar ((uchar)val);
- }
+ uchar val;
+ val = (uchar) double.parse (str);
+ dest2.set_uchar (val);
+ ret = true;
} else if (t == Type.BOXED) {
+ // TODO: Boxed type transformation
} else if (t.is_enum ()) {
- int64 val;
- if (ret = int64.try_parse (str, out val)) {
- dest2.set_enum ((int)val);
- }
+ int val;
+ val = (int) double.parse (str);
+ dest2.set_enum (val);
+ ret = true;
} else if (t.is_flags ()) {
} else if (t.is_object ()) {
} else {
diff --git a/test/SerializableBasicTypesTest.vala b/test/SerializableBasicTypesTest.vala
index b3655ef9725153f0c2b4b950739fe35db5d0b5de..7ac0ad519036e100f79537638e430bf7c6b64e02 100644
--- a/test/SerializableBasicTypesTest.vala
+++ b/test/SerializableBasicTypesTest.vala
@@ -28,6 +28,9 @@ class SerializableBasicTypeTest : GXmlTest {
public class BasicType : SerializableObjectModel
{
public bool boolean { get; set; }
+ public int integer { get; set; }
+ public float floatval { get; set; }
+ public double doubleval { get; set; }
public override string node_name () { return "basictype"; }
public override string to_string () { return get_type ().name (); }
}
@@ -73,5 +76,43 @@ class SerializableBasicTypeTest : GXmlTest {
assert_not_reached ();
}
});
+ Test.add_func ("/gxml/serializable/basic_types/integer",
+ () => {
+ try {
+ var bt = new BasicType ();
+ bt.boolean = true;
+ var doc = new Document.from_string ("""
+""");
+ bt.deserialize (doc);
+ assert (bt.integer == 156);
+ var doc1 = new Document.from_string ("""
+""");
+ bt.deserialize (doc1);
+ assert (bt.integer == 0);
+ var doc2 = new Document.from_string ("""
+""");
+ bt.deserialize (doc2);
+ assert (bt.integer == 156);
+ var doc3 = new Document.from_string ("""
+""");
+ bt.deserialize (doc3);
+ assert (bt.integer == 156);
+ var doc4 = new Document.from_string ("""
+""");
+ bt.deserialize (doc4);
+ assert (bt.integer == 0);
+ var doc5 = new Document.from_string ("""
+""");
+ bt.deserialize (doc5);
+ assert (bt.integer == 0);
+ var doc6 = new Document.from_string ("""
+""");
+ bt.deserialize (doc6);
+ assert (bt.integer == 156);
+ } catch (GLib.Error e) {
+ stdout.printf (@"ERROR: $(e.message)");
+ assert_not_reached ();
+ }
+ });
}
}