fixed some disco / carbon related bugs

This commit is contained in:
iNPUTmice 2014-11-15 17:24:06 +01:00
parent 35bf13f5ef
commit 7ba9854c22

View file

@ -88,8 +88,10 @@ public class XmppConnection implements Runnable {
private int smVersion = 3; private int smVersion = 3;
private SparseArray<String> messageReceipts = new SparseArray<>(); private SparseArray<String> messageReceipts = new SparseArray<>();
private boolean usingCompression = false; private boolean enabledCompression = false;
private boolean usingEncryption = false; private boolean enabledEncryption = false;
private boolean enabledCarbons = false;
private int stanzasReceived = 0; private int stanzasReceived = 0;
private int stanzasSent = 0; private int stanzasSent = 0;
private long lastPaketReceived = 0; private long lastPaketReceived = 0;
@ -138,8 +140,8 @@ public class XmppConnection implements Runnable {
protected void connect() { protected void connect() {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting"); Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting");
usingCompression = false; enabledCompression = false;
usingEncryption = false; enabledEncryption = false;
lastConnect = SystemClock.elapsedRealtime(); lastConnect = SystemClock.elapsedRealtime();
lastPingSent = SystemClock.elapsedRealtime(); lastPingSent = SystemClock.elapsedRealtime();
this.attempt++; this.attempt++;
@ -351,8 +353,9 @@ public class XmppConnection implements Runnable {
} catch (final NumberFormatException ignored) { } catch (final NumberFormatException ignored) {
} }
sendServiceDiscoveryInfo(account.getServer());
sendServiceDiscoveryItems(account.getServer());
sendInitialPing(); sendInitialPing();
} else if (nextTag.isStart("r")) { } else if (nextTag.isStart("r")) {
tagReader.readElement(nextTag); tagReader.readElement(nextTag);
AckPacket ack = new AckPacket(this.stanzasReceived, smVersion); AckPacket ack = new AckPacket(this.stanzasReceived, smVersion);
@ -532,7 +535,7 @@ public class XmppConnection implements Runnable {
sendStartStream(); sendStartStream();
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": compression enabled"); Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": compression enabled");
usingCompression = true; enabledCompression = true;
processStream(tagReader.readTag()); processStream(tagReader.readTag());
} }
@ -600,7 +603,7 @@ public class XmppConnection implements Runnable {
sendStartStream(); sendStartStream();
Log.d(Config.LOGTAG, account.getJid().toBareJid() Log.d(Config.LOGTAG, account.getJid().toBareJid()
+ ": TLS connection established"); + ": TLS connection established");
usingEncryption = true; enabledEncryption = true;
processStream(tagReader.readTag()); processStream(tagReader.readTag());
sslSocket.close(); sslSocket.close();
} catch (final NoSuchAlgorithmException | KeyManagementException e1) { } catch (final NoSuchAlgorithmException | KeyManagementException e1) {
@ -611,20 +614,20 @@ public class XmppConnection implements Runnable {
private void processStreamFeatures(Tag currentTag) private void processStreamFeatures(Tag currentTag)
throws XmlPullParserException, IOException { throws XmlPullParserException, IOException {
this.streamFeatures = tagReader.readElement(currentTag); this.streamFeatures = tagReader.readElement(currentTag);
if (this.streamFeatures.hasChild("starttls") && !usingEncryption) { if (this.streamFeatures.hasChild("starttls") && !enabledEncryption) {
sendStartTLS(); sendStartTLS();
} else if (compressionAvailable()) { } else if (compressionAvailable()) {
sendCompressionZlib(); sendCompressionZlib();
} else if (this.streamFeatures.hasChild("register") } else if (this.streamFeatures.hasChild("register")
&& account.isOptionSet(Account.OPTION_REGISTER) && account.isOptionSet(Account.OPTION_REGISTER)
&& usingEncryption) { && enabledEncryption) {
sendRegistryRequest(); sendRegistryRequest();
} else if (!this.streamFeatures.hasChild("register") } else if (!this.streamFeatures.hasChild("register")
&& account.isOptionSet(Account.OPTION_REGISTER)) { && account.isOptionSet(Account.OPTION_REGISTER)) {
changeStatus(Account.STATUS_REGISTRATION_NOT_SUPPORTED); changeStatus(Account.STATUS_REGISTRATION_NOT_SUPPORTED);
disconnect(true); disconnect(true);
} else if (this.streamFeatures.hasChild("mechanisms") } else if (this.streamFeatures.hasChild("mechanisms")
&& shouldAuthenticate && usingEncryption) { && shouldAuthenticate && enabledEncryption) {
final List<String> mechanisms = extractMechanisms(streamFeatures final List<String> mechanisms = extractMechanisms(streamFeatures
.findChild("mechanisms")); .findChild("mechanisms"));
final Element auth = new Element("auth"); final Element auth = new Element("auth");
@ -771,6 +774,8 @@ public class XmppConnection implements Runnable {
stanzasSent = 0; stanzasSent = 0;
messageReceipts.clear(); messageReceipts.clear();
} }
enabledCarbons = false;
disco.clear();
sendServiceDiscoveryInfo(account.getServer()); sendServiceDiscoveryInfo(account.getServer());
sendServiceDiscoveryItems(account.getServer()); sendServiceDiscoveryItems(account.getServer());
if (bindListener != null) { if (bindListener != null) {
@ -796,32 +801,40 @@ public class XmppConnection implements Runnable {
} }
private void sendServiceDiscoveryInfo(final Jid server) { private void sendServiceDiscoveryInfo(final Jid server) {
final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); if (disco.containsKey(server.toDomainJid().toString())) {
iq.setTo(server.toDomainJid()); if (account.getServer().equals(server.toDomainJid())) {
iq.query("http://jabber.org/protocol/disco#info"); enableAdvancedStreamFeatures();
this.sendIqPacket(iq, new OnIqPacketReceived() { }
} else {
final IqPacket iq = new IqPacket(IqPacket.TYPE_GET);
iq.setTo(server.toDomainJid());
iq.query("http://jabber.org/protocol/disco#info");
this.sendIqPacket(iq, new OnIqPacketReceived() {
@Override @Override
public void onIqPacketReceived(Account account, IqPacket packet) { public void onIqPacketReceived(Account account, IqPacket packet) {
final List<Element> elements = packet.query().getChildren(); final List<Element> elements = packet.query().getChildren();
final List<String> features = new ArrayList<>(); final List<String> features = new ArrayList<>();
for (Element element : elements) { for (Element element : elements) {
if (element.getName().equals("feature")) { if (element.getName().equals("feature")) {
features.add(element.getAttribute("var")); features.add(element.getAttribute("var"));
}
}
disco.put(server.toDomainJid().toString(), features);
if (account.getServer().equals(server.toDomainJid())) {
enableAdvancedStreamFeatures();
} }
} }
disco.put(server.toDomainJid().toString(), features); });
}
if (account.getServer().equals(server.toDomainJid())) {
enableAdvancedStreamFeatures();
}
}
});
} }
private void enableAdvancedStreamFeatures() { private void enableAdvancedStreamFeatures() {
if (getFeatures().carbons()) { if (getFeatures().carbons()) {
sendEnableCarbons(); if (!enabledCarbons) {
sendEnableCarbons();
}
} }
} }
@ -858,6 +871,7 @@ public class XmppConnection implements Runnable {
if (!packet.hasChild("error")) { if (!packet.hasChild("error")) {
Log.d(Config.LOGTAG, account.getJid().toBareJid() Log.d(Config.LOGTAG, account.getJid().toBareJid()
+ ": successfully enabled carbons"); + ": successfully enabled carbons");
enabledCarbons = true;
} else { } else {
Log.d(Config.LOGTAG, account.getJid().toBareJid() Log.d(Config.LOGTAG, account.getJid().toBareJid()
+ ": error enableing carbons " + packet.toString()); + ": error enableing carbons " + packet.toString());
@ -1131,7 +1145,7 @@ public class XmppConnection implements Runnable {
} }
public boolean compression() { public boolean compression() {
return connection.usingCompression; return connection.enabledCompression;
} }
} }
} }