code clean up. use Optional to parse SM’s h attribute

This commit is contained in:
Daniel Gultsch 2022-12-30 10:53:49 +01:00
parent f5b7fbc441
commit 01fba162f0
No known key found for this signature in database
GPG key ID: F43D18AD2A0982C2
2 changed files with 49 additions and 43 deletions

View file

@ -1,5 +1,8 @@
package eu.siacs.conversations.xml; package eu.siacs.conversations.xml;
import com.google.common.base.Optional;
import com.google.common.primitives.Ints;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
@ -150,6 +153,14 @@ public class Element {
} }
} }
public Optional<Integer> getOptionalIntAttribute(final String name) {
final String value = getAttribute(name);
if (value == null) {
return Optional.absent();
}
return Optional.fromNullable(Ints.tryParse(value));
}
public Jid getAttributeAsJid(String name) { public Jid getAttributeAsJid(String name) {
final String jid = this.getAttribute(name); final String jid = this.getAttribute(name);
if (jid != null && !jid.isEmpty()) { if (jid != null && !jid.isEmpty()) {

View file

@ -16,6 +16,7 @@ import android.util.SparseArray;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.common.base.Optional;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@ -631,20 +632,21 @@ public class XmppConnection implements Runnable {
} }
final Element ack = tagReader.readElement(nextTag); final Element ack = tagReader.readElement(nextTag);
lastPacketReceived = SystemClock.elapsedRealtime(); lastPacketReceived = SystemClock.elapsedRealtime();
try { final boolean acknowledgedMessages;
final boolean acknowledgedMessages; synchronized (this.mStanzaQueue) {
synchronized (this.mStanzaQueue) { final Optional<Integer> serverSequence = ack.getOptionalIntAttribute("h");
final int serverSequence = Integer.parseInt(ack.getAttribute("h")); if (serverSequence.isPresent()) {
acknowledgedMessages = acknowledgeStanzaUpTo(serverSequence); acknowledgedMessages = acknowledgeStanzaUpTo(serverSequence.get());
} else {
acknowledgedMessages = false;
Log.d(
Config.LOGTAG,
account.getJid().asBareJid()
+ ": server send ack without sequence number");
} }
if (acknowledgedMessages) { }
mXmppConnectionService.updateConversationUi(); if (acknowledgedMessages) {
} mXmppConnectionService.updateConversationUi();
} catch (NumberFormatException | NullPointerException e) {
Log.d(
Config.LOGTAG,
account.getJid().asBareJid()
+ ": server send ack without sequence number");
} }
} else if (nextTag.isStart("failed")) { } else if (nextTag.isStart("failed")) {
final Element failed = tagReader.readElement(nextTag); final Element failed = tagReader.readElement(nextTag);
@ -942,15 +944,11 @@ public class XmppConnection implements Runnable {
this.isBound = true; this.isBound = true;
this.tagWriter.writeStanzaAsync(new RequestPacket()); this.tagWriter.writeStanzaAsync(new RequestPacket());
lastPacketReceived = SystemClock.elapsedRealtime(); lastPacketReceived = SystemClock.elapsedRealtime();
final String h = resumed.getAttribute("h"); final Optional<Integer> h = resumed.getOptionalIntAttribute("h");
if (h == null) {
resetStreamId();
throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER);
}
final int serverCount; final int serverCount;
try { if (h.isPresent()) {
serverCount = Integer.parseInt(h); serverCount = h.get();
} catch (final NumberFormatException e) { } else {
resetStreamId(); resetStreamId();
throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER); throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER);
} }
@ -999,28 +997,22 @@ public class XmppConnection implements Runnable {
} }
private void processFailed(final Element failed, final boolean sendBindRequest) { private void processFailed(final Element failed, final boolean sendBindRequest) {
final int serverCount; final Optional<Integer> serverCount = failed.getOptionalIntAttribute("h");
try { if (serverCount.isPresent()) {
serverCount = Integer.parseInt(failed.getAttribute("h")); Log.d(
} catch (final NumberFormatException | NullPointerException e) { Config.LOGTAG,
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed"); account.getJid().asBareJid()
resetStreamId(); + ": resumption failed but server acknowledged stanza #"
if (sendBindRequest) { + serverCount.get());
sendBindRequest(); final boolean acknowledgedMessages;
synchronized (this.mStanzaQueue) {
acknowledgedMessages = acknowledgeStanzaUpTo(serverCount.get());
} }
return; if (acknowledgedMessages) {
} mXmppConnectionService.updateConversationUi();
Log.d( }
Config.LOGTAG, } else {
account.getJid().asBareJid() Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed");
+ ": resumption failed but server acknowledged stanza #"
+ serverCount);
final boolean acknowledgedMessages;
synchronized (this.mStanzaQueue) {
acknowledgedMessages = acknowledgeStanzaUpTo(serverCount);
}
if (acknowledgedMessages) {
mXmppConnectionService.updateConversationUi();
} }
resetStreamId(); resetStreamId();
if (sendBindRequest) { if (sendBindRequest) {
@ -1028,7 +1020,7 @@ public class XmppConnection implements Runnable {
} }
} }
private boolean acknowledgeStanzaUpTo(int serverCount) { private boolean acknowledgeStanzaUpTo(final int serverCount) {
if (serverCount > stanzasSent) { if (serverCount > stanzasSent) {
Log.e( Log.e(
Config.LOGTAG, Config.LOGTAG,
@ -2277,6 +2269,9 @@ public class XmppConnection implements Runnable {
} }
++stanzasSent; ++stanzasSent;
if (Config.EXTENDED_SM_LOGGING) {
Log.d(Config.LOGTAG, account.getJid().asBareJid()+": counting outbound "+packet.getName()+" as #" + stanzasSent);
}
this.mStanzaQueue.append(stanzasSent, stanza); this.mStanzaQueue.append(stanzasSent, stanza);
if (stanza instanceof MessagePacket && stanza.getId() != null && inSmacksSession) { if (stanza instanceof MessagePacket && stanza.getId() != null && inSmacksSession) {
if (Config.EXTENDED_SM_LOGGING) { if (Config.EXTENDED_SM_LOGGING) {