From 6904bda756321c67bea0108342fa9ba859dd66e9 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Sat, 13 May 2017 17:43:51 +0200 Subject: xmpp-vala: improve namespace handling, add some tests --- xmpp-vala/src/core/namespace_state.vala | 43 +++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'xmpp-vala/src/core/namespace_state.vala') diff --git a/xmpp-vala/src/core/namespace_state.vala b/xmpp-vala/src/core/namespace_state.vala index e71607fa..b55812b4 100644 --- a/xmpp-vala/src/core/namespace_state.vala +++ b/xmpp-vala/src/core/namespace_state.vala @@ -1,68 +1,80 @@ using Gee; namespace Xmpp.Core { + public class NamespaceState { private HashMap uri_to_name = new HashMap (); private HashMap name_to_uri = new HashMap (); public string current_ns_uri; - public NamespaceState () { + private NamespaceState parent; + + public NamespaceState() { add_assoc(XMLNS_URI, "xmlns"); - add_assoc("http://www.w3.org/XML/1998/namespace", "xml"); - current_ns_uri = "http://www.w3.org/XML/1998/namespace"; + add_assoc(XML_URI, "xml"); + current_ns_uri = XML_URI; } - public NamespaceState.for_stanza () { + public NamespaceState.for_stanza() { this(); add_assoc("http://etherx.jabber.org/streams", "stream"); current_ns_uri = "jabber:client"; } - public NamespaceState.copy (NamespaceState old) { + private NamespaceState.copy(NamespaceState old) { foreach (string key in old.uri_to_name.keys) { add_assoc(key, old.uri_to_name[key]); } set_current(old.current_ns_uri); } - public NamespaceState.with_assoc (NamespaceState old, string ns_uri, string name) { + private NamespaceState.with_parent(NamespaceState parent) { + this.copy(parent); + this.parent = parent; + } + + public NamespaceState.with_assoc(NamespaceState old, string ns_uri, string name) { this.copy(old); add_assoc(ns_uri, name); } - public NamespaceState.with_current (NamespaceState old, string current_ns_uri) { + public NamespaceState.with_current(NamespaceState old, string current_ns_uri) { this.copy(old); set_current(current_ns_uri); } - public void add_assoc (string ns_uri, string name) { + public void add_assoc(string ns_uri, string name) { name_to_uri[name] = ns_uri; uri_to_name[ns_uri] = name; } - public void set_current (string current_ns_uri) { + public void set_current(string current_ns_uri) { this.current_ns_uri = current_ns_uri; } - public string find_name (string ns_uri) throws XmlError { + public string find_name(string ns_uri) throws XmlError { if (uri_to_name.has_key(ns_uri)) { return uri_to_name[ns_uri]; } throw new XmlError.NS_DICT_ERROR(@"NS URI $ns_uri not found."); } - public string find_uri (string name) throws XmlError { + public string find_uri(string name) throws XmlError { if (name_to_uri.has_key(name)) { return name_to_uri[name]; } throw new XmlError.NS_DICT_ERROR(@"NS name $name not found."); } - public NamespaceState clone() { - return new NamespaceState.copy(this); + public NamespaceState push() { + return new NamespaceState.with_parent(this); } - public string to_string () { + public NamespaceState pop() { + return parent; + } + + public string to_string() { StringBuilder sb = new StringBuilder (); sb.append ("NamespaceState{"); foreach (string key in uri_to_name.keys) { @@ -77,4 +89,5 @@ public class NamespaceState { return sb.str; } } -} \ No newline at end of file + +} -- cgit v1.2.3-54-g00ecf