aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/core')
-rw-r--r--xmpp-vala/src/core/stanza_attribute.vala16
-rw-r--r--xmpp-vala/src/core/stanza_node.vala92
-rw-r--r--xmpp-vala/src/core/stream_connect.vala10
3 files changed, 72 insertions, 46 deletions
diff --git a/xmpp-vala/src/core/stanza_attribute.vala b/xmpp-vala/src/core/stanza_attribute.vala
index 6c6ac579..ba1616a5 100644
--- a/xmpp-vala/src/core/stanza_attribute.vala
+++ b/xmpp-vala/src/core/stanza_attribute.vala
@@ -56,7 +56,13 @@ public class StanzaAttribute : StanzaEntry {
if (ns_uri == state.current_ns_uri || (ns_uri == XMLNS_URI && name == "xmlns")) {
return printf(ATTRIBUTE_XML_NO_NS_FORMAT, true);
} else {
- return printf(ATTRIBUTE_XML_FORMAT, false, state.find_name((!)ns_uri));
+ string ns_name = "_";
+ try {
+ ns_name = state.find_name((!)ns_uri);
+ } catch (IOError e) {
+ warning("Error finding name: %s", e.message);
+ }
+ return printf(ATTRIBUTE_XML_FORMAT, false, ns_name);
}
}
@@ -65,7 +71,13 @@ public class StanzaAttribute : StanzaEntry {
if (ns_uri == state.current_ns_uri || (ns_uri == XMLNS_URI && name == "xmlns")) {
return printf(ATTRIBUTE_XML_ANSI_NO_NS_FORMAT, true);
} else {
- return printf(ATTRIBUTE_XML_ANSI_FORMAT, false, state.find_name((!)ns_uri));
+ string ns_name = "_";
+ try {
+ ns_name = state.find_name((!)ns_uri);
+ } catch (IOError e) {
+ warning("Error finding name: %s", e.message);
+ }
+ return printf(ATTRIBUTE_XML_ANSI_FORMAT, false, ns_name);
}
}
}
diff --git a/xmpp-vala/src/core/stanza_node.vala b/xmpp-vala/src/core/stanza_node.vala
index f44657f1..7a68da62 100644
--- a/xmpp-vala/src/core/stanza_node.vala
+++ b/xmpp-vala/src/core/stanza_node.vala
@@ -18,54 +18,62 @@ public abstract class StanzaEntry {
public string? encoded_val {
owned get {
if (val == null) return null;
- return ENCODABLE_VALUE_CHARS.replace_eval(val, -1, 0, 0, (match_info, result_builder) => {
- int start;
- match_info.fetch_pos(0, out start, null);
- unowned string src = match_info.get_string();
- switch (src[start]) {
- case '&': result_builder.append("&"); break;
- case '"': result_builder.append("""); break;
- case '\'': result_builder.append("'"); break;
- case '<': result_builder.append("&lt;"); break;
- case '>': result_builder.append("&gt;"); break;
- default: error("Unreachable"); break;
- }
- return false;
- });
+ try {
+ return ENCODABLE_VALUE_CHARS.replace_eval(val, -1, 0, 0, (match_info, result_builder) => {
+ int start;
+ match_info.fetch_pos(0, out start, null);
+ unowned string src = match_info.get_string();
+ switch (src[start]) {
+ case '&': result_builder.append("&amp;"); break;
+ case '"': result_builder.append("&quot;"); break;
+ case '\'': result_builder.append("&apos;"); break;
+ case '<': result_builder.append("&lt;"); break;
+ case '>': result_builder.append("&gt;"); break;
+ default: error("Unreachable"); break;
+ }
+ return false;
+ });
+ } catch (RegexError e) {
+ error("Error encoding entities in string \"%s\": %s", val, e.message);
+ }
}
set {
if (value == null) {
val = null;
return;
}
- val = DECODABLE_VALUE_SEQUENCES.replace_eval(value, -1, 0, 0, (match_info, result_builder) => {
- int start, end;
- match_info.fetch_pos(0, out start, out end);
- unowned string src = match_info.get_string();
- switch (src[start+1]) {
- case 'g': result_builder.append_c('>'); break;
- case 'l': result_builder.append_c('<'); break;
- case 'q': result_builder.append_c('"'); break;
- case 'a':
- switch (src[start+2]) {
- case 'p': result_builder.append_c('\''); break;
- case 'm': result_builder.append_c('&'); break;
- default: critical("Invalid encoding: %s in %s", match_info.fetch(0), src); break;
- }
- break;
- case '#':
- unichar num = -1;
- if (src[start+2] == 'x') {
- src.substring(start+3, start-end-3).scanf("%x", &num);
- } else {
- num = int.parse(src.substring(start+2, start-end-2));
- }
- result_builder.append_unichar(num);
- break;
- default: critical("Invalid encoding: %s in %s", match_info.fetch(0), src); break;
- }
- return false;
- });
+ try {
+ val = DECODABLE_VALUE_SEQUENCES.replace_eval(value, -1, 0, 0, (match_info, result_builder) => {
+ int start, end;
+ match_info.fetch_pos(0, out start, out end);
+ unowned string src = match_info.get_string();
+ switch (src[start + 1]) {
+ case 'g': result_builder.append_c('>'); break;
+ case 'l': result_builder.append_c('<'); break;
+ case 'q': result_builder.append_c('"'); break;
+ case 'a':
+ switch (src[start + 2]) {
+ case 'p': result_builder.append_c('\''); break;
+ case 'm': result_builder.append_c('&'); break;
+ default: critical("Invalid encoding: %s in %s", match_info.fetch(0), src); break;
+ }
+ break;
+ case '#':
+ unichar num = -1;
+ if (src[start + 2] == 'x') {
+ src.substring(start + 3, start - end - 3).scanf("%x", &num);
+ } else {
+ num = int.parse(src.substring(start + 2, start - end - 2));
+ }
+ result_builder.append_unichar(num);
+ break;
+ default: critical("Invalid encoding: %s in %s", match_info.fetch(0), src); break;
+ }
+ return false;
+ });
+ } catch (RegexError e) {
+ error("Error decoding entities in string \"%s\": %s", value, e.message);
+ }
}
}
diff --git a/xmpp-vala/src/core/stream_connect.vala b/xmpp-vala/src/core/stream_connect.vala
index 7e3843fa..a496fc3c 100644
--- a/xmpp-vala/src/core/stream_connect.vala
+++ b/xmpp-vala/src/core/stream_connect.vala
@@ -15,7 +15,7 @@ namespace Xmpp {
public async XmppStreamResult establish_stream(Jid bare_jid, Gee.List<XmppStreamModule> modules, string? log_options, owned TlsXmppStream.OnInvalidCert on_invalid_cert) {
Jid remote = bare_jid.domain_jid;
- TlsXmppStream.OnInvalidCertWrapper on_invalid_cert_wrapper = new TlsXmppStream.OnInvalidCertWrapper(on_invalid_cert);
+ TlsXmppStream.OnInvalidCertWrapper on_invalid_cert_wrapper = new TlsXmppStream.OnInvalidCertWrapper((owned) on_invalid_cert);
//Lookup xmpp-client and xmpps-client SRV records
GLib.List<SrvTargetInfo>? targets = new GLib.List<SrvTargetInfo>();
@@ -72,7 +72,13 @@ namespace Xmpp {
connection_timeout_id = Timeout.add_seconds(30, () => {
warning("Connection attempt timed out");
- stream.disconnect();
+ stream.disconnect.begin((_, res) => {
+ try {
+ stream.disconnect.end(res);
+ } catch (IOError e) {
+ debug("Error while disconnecting: %s", e.message);
+ }
+ });
connection_timeout_id = 0;
return Source.REMOVE;
});