aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2018-12-30 13:35:01 +0100
committerfiaxh <git@lightrise.org>2019-01-02 15:59:56 +0100
commitfc1a9a5712b1f46bcd2390e798147f3855042b96 (patch)
treebba4779f4fbaa57e26cdfb7a71c3078a6df3d056
parentcdd4c0b854fd4d27fa1d9bd941df03888301780a (diff)
downloaddino-fc1a9a5712b1f46bcd2390e798147f3855042b96.tar.gz
dino-fc1a9a5712b1f46bcd2390e798147f3855042b96.zip
Improve ping timeouts, add debug output for XmlErrors and ping timeouts
-rw-r--r--libdino/src/service/connection_manager.vala6
-rw-r--r--libdino/src/service/file_manager.vala2
-rw-r--r--xmpp-vala/src/core/stanza_reader.vala59
3 files changed, 39 insertions, 28 deletions
diff --git a/libdino/src/service/connection_manager.vala b/libdino/src/service/connection_manager.vala
index 67763ad3..977fc732 100644
--- a/libdino/src/service/connection_manager.vala
+++ b/libdino/src/service/connection_manager.vala
@@ -232,6 +232,7 @@ public class ConnectionManager : Object {
private void check_reconnect(Account account) {
bool acked = false;
+ DateTime? last_activity_was = connections[account].last_activity != null ? connections[account].last_activity : null;
XmppStream stream = connections[account].stream;
stream.get_module(Xep.Ping.Module.IDENTITY).send_ping(stream, account.bare_jid.domain_jid, () => {
@@ -240,10 +241,13 @@ public class ConnectionManager : Object {
change_connection_state(account, ConnectionState.CONNECTED);
});
- Timeout.add_seconds(5, () => {
+ Timeout.add_seconds(10, () => {
if (connections[account].stream != stream) return false;
if (acked) return false;
+ if (connections[account].last_activity != last_activity_was) return false;
+ // Reconnect. Nothing gets through the stream.
+ print(@"[$(account.bare_jid)] Ping timeouted. Reconnecting\n");
change_connection_state(account, ConnectionState.DISCONNECTED);
try {
connections[account].stream.disconnect();
diff --git a/libdino/src/service/file_manager.vala b/libdino/src/service/file_manager.vala
index 861c51da..241bcebf 100644
--- a/libdino/src/service/file_manager.vala
+++ b/libdino/src/service/file_manager.vala
@@ -144,7 +144,7 @@ public class FileManager : StreamInteractionModule, Object {
if (!is_sender_trustworthy(file_transfer, conversation)) return;
if (file_transfer.size == -1) {
- file_provider.get_meta_info(file_transfer);
+ yield file_provider.get_meta_info(file_transfer);
}
if (file_transfer.size >= 0 && file_transfer.size < 5000000) {
diff --git a/xmpp-vala/src/core/stanza_reader.vala b/xmpp-vala/src/core/stanza_reader.vala
index b8cb1f4c..43c453ff 100644
--- a/xmpp-vala/src/core/stanza_reader.vala
+++ b/xmpp-vala/src/core/stanza_reader.vala
@@ -223,38 +223,45 @@ public class StanzaReader {
}
public async StanzaNode read_stanza_node() throws XmlError {
- ns_state = ns_state.push();
- var res = yield read_node_start();
- if (res.has_nodes) {
- bool finishNodeSeen = false;
- do {
- yield skip_until_non_ws();
- if ((yield peek_single()) == '<') {
- skip_single();
- if ((yield peek_single()) == '/') {
- skip_single();
- string desc = yield read_until_char('>');
+ try {
+ ns_state = ns_state.push();
+ var res = yield read_node_start();
+ if (res.has_nodes) {
+ bool finish_node_seen = false;
+ do {
+ yield skip_until_non_ws();
+ if ((yield peek_single()) == '<') {
skip_single();
- if (desc.contains(":")) {
- var split = desc.split(":");
- if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new XmlError.BAD_XML("");
- if (split[1] != res.name) throw new XmlError.BAD_XML("");
+ if ((yield peek_single()) == '/') {
+ skip_single();
+ string desc = yield read_until_char('>');
+ skip_single();
+ if (desc.contains(":")) {
+ var split = desc.split(":");
+ if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new XmlError.BAD_XML("");
+ if (split[1] != res.name) throw new XmlError.BAD_XML("");
+ } else {
+ if (ns_state.current_ns_uri != res.ns_uri) throw new XmlError.BAD_XML("");
+ if (desc != res.name) throw new XmlError.BAD_XML("");
+ }
+ finish_node_seen = true;
} else {
- if (ns_state.current_ns_uri != res.ns_uri) throw new XmlError.BAD_XML("");
- if (desc != res.name) throw new XmlError.BAD_XML("");
+ res.sub_nodes.add(yield read_stanza_node());
}
- finishNodeSeen = true;
} else {
- res.sub_nodes.add(yield read_stanza_node());
+ res.sub_nodes.add(yield read_text_node());
}
- } else {
- res.sub_nodes.add(yield read_text_node());
- }
- } while (!finishNodeSeen);
- if (res.sub_nodes.size == 0) res.has_nodes = false;
+ } while (!finish_node_seen);
+ if (res.sub_nodes.size == 0) res.has_nodes = false;
+ }
+ ns_state = ns_state.pop();
+ return res;
+ } catch (XmlError e) {
+ uint8[] buffer_cpy = buffer.copy();
+ buffer_cpy += '\0';
+ warning("XmlError at: %s".printf((string)buffer_cpy) + "\n");
+ throw e;
}
- ns_state = ns_state.pop();
- return res;
}
public async StanzaNode read_node() throws XmlError {