refactor getServerIdentity() to parse disco result directly

This commit is contained in:
Daniel Gultsch 2017-01-12 23:17:52 +01:00
parent c03e3b5965
commit 1876b444fa

View File

@ -178,8 +178,6 @@ public class XmppConnection implements Runnable {
} }
} }
private Identity mServerIdentity = Identity.UNKNOWN;
public final OnIqPacketReceived registrationResponseListener = new OnIqPacketReceived() { public final OnIqPacketReceived registrationResponseListener = new OnIqPacketReceived() {
@Override @Override
public void onIqPacketReceived(Account account, IqPacket packet) { public void onIqPacketReceived(Account account, IqPacket packet) {
@ -253,17 +251,6 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting"); Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting");
features.encryptionEnabled = false; features.encryptionEnabled = false;
this.attempt++; this.attempt++;
switch (account.getJid().getDomainpart()) {
case "chat.facebook.com":
mServerIdentity = Identity.FACEBOOK;
break;
case "nimbuzz.com":
mServerIdentity = Identity.NIMBUZZ;
break;
default:
mServerIdentity = Identity.UNKNOWN;
break;
}
try { try {
Socket localSocket; Socket localSocket;
shouldAuthenticate = needsBinding = !account.isOptionSet(Account.OPTION_REGISTER); shouldAuthenticate = needsBinding = !account.isOptionSet(Account.OPTION_REGISTER);
@ -747,7 +734,7 @@ public class XmppConnection implements Runnable {
final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId()); final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
// Packets to the server should have responses from the server // Packets to the server should have responses from the server
if (packetCallbackDuple.first.toServer(account)) { if (packetCallbackDuple.first.toServer(account)) {
if (packet.fromServer(account) || mServerIdentity == Identity.FACEBOOK) { if (packet.fromServer(account)) {
callback = packetCallbackDuple.second; callback = packetCallbackDuple.second;
packetCallbacks.remove(packet.getId()); packetCallbacks.remove(packet.getId());
} else { } else {
@ -1099,7 +1086,7 @@ public class XmppConnection implements Runnable {
this.disco.clear(); this.disco.clear();
} }
mPendingServiceDiscoveries.set(0); mPendingServiceDiscoveries.set(0);
mWaitForDisco.set(mServerIdentity != Identity.NIMBUZZ && smVersion != 0); mWaitForDisco.set(smVersion != 0 && !account.getJid().getDomainpart().equalsIgnoreCase("nimbuzz.com"));
lastDiscoStarted = SystemClock.elapsedRealtime(); lastDiscoStarted = SystemClock.elapsedRealtime();
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": starting service discovery"); Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": starting service discovery");
mXmppConnectionService.scheduleWakeUpCall(Config.CONNECT_DISCO_TIMEOUT, account.getUuid().hashCode()); mXmppConnectionService.scheduleWakeUpCall(Config.CONNECT_DISCO_TIMEOUT, account.getUuid().hashCode());
@ -1138,24 +1125,6 @@ public class XmppConnection implements Runnable {
boolean advancedStreamFeaturesLoaded; boolean advancedStreamFeaturesLoaded;
synchronized (XmppConnection.this.disco) { synchronized (XmppConnection.this.disco) {
ServiceDiscoveryResult result = new ServiceDiscoveryResult(packet); ServiceDiscoveryResult result = new ServiceDiscoveryResult(packet);
for (final ServiceDiscoveryResult.Identity id : result.getIdentities()) {
if (mServerIdentity == Identity.UNKNOWN && id.getType().equals("im") &&
id.getCategory().equals("server") && id.getName() != null &&
jid.equals(account.getServer())) {
switch (id.getName()) {
case "Prosody":
mServerIdentity = Identity.PROSODY;
break;
case "ejabberd":
mServerIdentity = Identity.EJABBERD;
break;
case "Slack-XMPP":
mServerIdentity = Identity.SLACK;
break;
}
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server name: " + id.getName());
}
}
if (jid.equals(account.getServer())) { if (jid.equals(account.getServer())) {
mXmppConnectionService.databaseBackend.insertDiscoveryResult(result); mXmppConnectionService.databaseBackend.insertDiscoveryResult(result);
} }
@ -1540,7 +1509,25 @@ public class XmppConnection implements Runnable {
} }
public Identity getServerIdentity() { public Identity getServerIdentity() {
return mServerIdentity; synchronized (this.disco) {
ServiceDiscoveryResult result = disco.get(account.getJid().toDomainJid());
if (result == null) {
return Identity.UNKNOWN;
}
for (final ServiceDiscoveryResult.Identity id : result.getIdentities()) {
if (id.getType().equals("im") && id.getCategory().equals("server") && id.getName() != null) {
switch (id.getName()) {
case "Prosody":
return Identity.PROSODY;
case "ejabberd":
return Identity.EJABBERD;
case "Slack-XMPP":
return Identity.SLACK;
}
}
}
}
return Identity.UNKNOWN;
} }
private class UnauthorizedException extends IOException { private class UnauthorizedException extends IOException {