refactor getServerIdentity() to parse disco result directly

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 55 +---
1 file changed, 21 insertions(+), 34 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -178,8 +178,6 @@ public class XmppConnection implements Runnable {
 		}
 	}
 
-	private Identity mServerIdentity = Identity.UNKNOWN;
-
 	public final OnIqPacketReceived registrationResponseListener =  new OnIqPacketReceived() {
 		@Override
 		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");
 		features.encryptionEnabled = false;
 		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 {
 			Socket localSocket;
 			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());
 					// Packets to the server should have responses from the server
 					if (packetCallbackDuple.first.toServer(account)) {
-						if (packet.fromServer(account) || mServerIdentity == Identity.FACEBOOK) {
+						if (packet.fromServer(account)) {
 							callback = packetCallbackDuple.second;
 							packetCallbacks.remove(packet.getId());
 						} else {
@@ -1099,7 +1086,7 @@ public class XmppConnection implements Runnable {
 			this.disco.clear();
 		}
 		mPendingServiceDiscoveries.set(0);
-		mWaitForDisco.set(mServerIdentity != Identity.NIMBUZZ && smVersion != 0);
+		mWaitForDisco.set(smVersion != 0 && !account.getJid().getDomainpart().equalsIgnoreCase("nimbuzz.com"));
 		lastDiscoStarted = SystemClock.elapsedRealtime();
 		Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": starting service discovery");
 		mXmppConnectionService.scheduleWakeUpCall(Config.CONNECT_DISCO_TIMEOUT, account.getUuid().hashCode());
@@ -1138,24 +1125,6 @@ public class XmppConnection implements Runnable {
 					boolean advancedStreamFeaturesLoaded;
 					synchronized (XmppConnection.this.disco) {
 						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())) {
 							mXmppConnectionService.databaseBackend.insertDiscoveryResult(result);
 						}
@@ -1540,7 +1509,25 @@ public class XmppConnection implements Runnable {
 	}
 
 	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 {