add sm-failed processing

This commit is contained in:
Daniel Gultsch 2022-08-29 19:44:39 +02:00
parent 7ea4f64ce4
commit 8f76084a43

View file

@ -507,8 +507,11 @@ public class XmppConnection implements Runnable {
+ ": SASL 2.0 authorization identifier was " + ": SASL 2.0 authorization identifier was "
+ authorizationIdentifier); + authorizationIdentifier);
final Element resumed = success.findChild("resumed", "urn:xmpp:sm:3"); final Element resumed = success.findChild("resumed", "urn:xmpp:sm:3");
final Element failed = success.findChild("failed", "urn:xmpp:sm:3");
if (resumed != null && streamId != null) { if (resumed != null && streamId != null) {
processResumed(resumed); processResumed(resumed);
} else if (failed != null) {
processFailed(failed, false); // wait for new stream features
} }
} }
if (version == SaslMechanism.Version.SASL) { if (version == SaslMechanism.Version.SASL) {
@ -660,26 +663,8 @@ public class XmppConnection implements Runnable {
+ ": server send ack without sequence number"); + ": server send ack without sequence number");
} }
} else if (nextTag.isStart("failed")) { } else if (nextTag.isStart("failed")) {
Element failed = tagReader.readElement(nextTag); final Element failed = tagReader.readElement(nextTag);
try { processFailed(failed, true);
final int serverCount = Integer.parseInt(failed.getAttribute("h"));
Log.d(
Config.LOGTAG,
account.getJid().asBareJid()
+ ": resumption failed but server acknowledged stanza #"
+ serverCount);
final boolean acknowledgedMessages;
synchronized (this.mStanzaQueue) {
acknowledgedMessages = acknowledgeStanzaUpTo(serverCount);
}
if (acknowledgedMessages) {
mXmppConnectionService.updateConversationUi();
}
} catch (NumberFormatException | NullPointerException e) {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed");
}
resetStreamId();
sendBindRequest();
} else if (nextTag.isStart("iq")) { } else if (nextTag.isStart("iq")) {
processIq(nextTag); processIq(nextTag);
} else if (nextTag.isStart("message")) { } else if (nextTag.isStart("message")) {
@ -751,6 +736,36 @@ public class XmppConnection implements Runnable {
changeStatus(Account.State.ONLINE); changeStatus(Account.State.ONLINE);
} }
private void processFailed(final Element failed, final boolean sendBindRequest) {
final int serverCount;
try {
serverCount = Integer.parseInt(failed.getAttribute("h"));
} catch (final NumberFormatException | NullPointerException e) {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed");
resetStreamId();
if (sendBindRequest) {
sendBindRequest();
}
return;
}
Log.d(
Config.LOGTAG,
account.getJid().asBareJid()
+ ": resumption failed but server acknowledged stanza #"
+ serverCount);
final boolean acknowledgedMessages;
synchronized (this.mStanzaQueue) {
acknowledgedMessages = acknowledgeStanzaUpTo(serverCount);
}
if (acknowledgedMessages) {
mXmppConnectionService.updateConversationUi();
}
resetStreamId();
if (sendBindRequest) {
sendBindRequest();
}
}
private boolean acknowledgeStanzaUpTo(int serverCount) { private boolean acknowledgeStanzaUpTo(int serverCount) {
if (serverCount > stanzasSent) { if (serverCount > stanzasSent) {
Log.e(Config.LOGTAG, "server acknowledged more stanzas than we sent. serverCount=" + serverCount + ", ourCount=" + stanzasSent); Log.e(Config.LOGTAG, "server acknowledged more stanzas than we sent. serverCount=" + serverCount + ", ourCount=" + stanzasSent);