connection_manager.vala: Refactor reconnect stream
This commit is contained in:
parent
0f3d7e27ce
commit
aa39852931
|
@ -252,11 +252,32 @@ public class ConnectionManager : Object {
|
|||
}
|
||||
}
|
||||
|
||||
private void check_ping_reconnect(Xmpp.Xep.Ping.Module identity,
|
||||
XmppStream stream, Account account) {
|
||||
identity.send_ping.begin(stream, account.bare_jid.domain_jid, () => {
|
||||
if (connections[account].stream != stream) return;
|
||||
connections[account].acked = true;
|
||||
change_connection_state(account, ConnectionState.CONNECTED);
|
||||
});
|
||||
|
||||
Timeout.add_seconds(10, () => {
|
||||
if (!connections.has_key(account)) return false;
|
||||
if (connections[account].stream != stream) return false;
|
||||
if (connections[account].acked) return false;
|
||||
|
||||
// Reconnect. Nothing gets through the stream.
|
||||
debug("[%s %p] Ping timeouted. Reconnecting", account.bare_jid.to_string(), stream);
|
||||
change_connection_state(account, ConnectionState.DISCONNECTED);
|
||||
|
||||
connections[account].reset();
|
||||
connect_stream.begin(account);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
private void check_reconnect(Account account, bool directly_reconnect = false) {
|
||||
if (!connections.has_key(account)) return;
|
||||
|
||||
XmppStream? stream = connections[account].stream;
|
||||
|
||||
var cancellable = new Cancellable();
|
||||
debug(@"account.domainpart=$(account.domainpart)");
|
||||
|
||||
|
@ -267,29 +288,23 @@ public class ConnectionManager : Object {
|
|||
debug(@"can-reach: $(reachable)");
|
||||
|
||||
if (reachable) {
|
||||
Xmpp.Xep.Ping.Module? identity = null;
|
||||
if (connections[account].connection_state == ConnectionState.CONNECTING) return;
|
||||
|
||||
XmppStream? stream = connections[account].stream;
|
||||
connections[account].acked = false;
|
||||
change_connection_state(account, ConnectionState.CONNECTING);
|
||||
|
||||
stream.get_module(Xep.Ping.Module.IDENTITY).send_ping.begin(stream, account.bare_jid.domain_jid, () => {
|
||||
connections[account].acked = true;
|
||||
if (connections[account].stream != stream) return;
|
||||
change_connection_state(account, ConnectionState.CONNECTED);
|
||||
});
|
||||
|
||||
Timeout.add_seconds(10, () => {
|
||||
if (!connections.has_key(account)) return false;
|
||||
if (connections[account].stream != stream) return false;
|
||||
if (connections[account].acked) return false;
|
||||
|
||||
// Reconnect. Nothing gets through the stream.
|
||||
debug("[%s %p] Ping timeouted. Reconnecting", account.bare_jid.to_string(), stream);
|
||||
if (stream != null
|
||||
&& (identity = stream.get_module(Xep.Ping.Module.IDENTITY)) != null) {
|
||||
change_connection_state(account, ConnectionState.CONNECTING);
|
||||
check_ping_reconnect(identity, stream, account);
|
||||
}
|
||||
else {
|
||||
change_connection_state(account, ConnectionState.DISCONNECTED);
|
||||
|
||||
connections[account].reset();
|
||||
connect_stream.begin(account);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Error e) {
|
||||
|
|
Loading…
Reference in New Issue