cache server caps
This commit is contained in:
parent
0911669b07
commit
1d572c61d0
|
@ -9,12 +9,14 @@ import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
|
import eu.siacs.conversations.xmpp.forms.Data;
|
||||||
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
|
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
|
||||||
|
|
||||||
public class ServiceDiscoveryResult {
|
public class ServiceDiscoveryResult {
|
||||||
|
@ -108,10 +110,12 @@ public class ServiceDiscoveryResult {
|
||||||
protected final byte[] ver;
|
protected final byte[] ver;
|
||||||
protected final List<Identity> identities;
|
protected final List<Identity> identities;
|
||||||
protected final List<String> features;
|
protected final List<String> features;
|
||||||
|
protected final List<Data> forms;
|
||||||
|
|
||||||
public ServiceDiscoveryResult(final IqPacket packet) {
|
public ServiceDiscoveryResult(final IqPacket packet) {
|
||||||
this.identities = new ArrayList<>();
|
this.identities = new ArrayList<>();
|
||||||
this.features = new ArrayList<>();
|
this.features = new ArrayList<>();
|
||||||
|
this.forms = new ArrayList<>();
|
||||||
this.hash = "sha-1"; // We only support sha-1 for now
|
this.hash = "sha-1"; // We only support sha-1 for now
|
||||||
|
|
||||||
final List<Element> elements = packet.query().getChildren();
|
final List<Element> elements = packet.query().getChildren();
|
||||||
|
@ -126,6 +130,8 @@ public class ServiceDiscoveryResult {
|
||||||
if (element.getAttribute("var") != null) {
|
if (element.getAttribute("var") != null) {
|
||||||
features.add(element.getAttribute("var"));
|
features.add(element.getAttribute("var"));
|
||||||
}
|
}
|
||||||
|
} else if (element.getName().equals("x") && "jabber:x:data".equals(element.getAttribute("xmlns"))) {
|
||||||
|
forms.add(Data.parse(element));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.ver = this.mkCapHash();
|
this.ver = this.mkCapHash();
|
||||||
|
@ -134,6 +140,7 @@ public class ServiceDiscoveryResult {
|
||||||
public ServiceDiscoveryResult(String hash, byte[] ver, JSONObject o) throws JSONException {
|
public ServiceDiscoveryResult(String hash, byte[] ver, JSONObject o) throws JSONException {
|
||||||
this.identities = new ArrayList<>();
|
this.identities = new ArrayList<>();
|
||||||
this.features = new ArrayList<>();
|
this.features = new ArrayList<>();
|
||||||
|
this.forms = new ArrayList<>();
|
||||||
this.hash = hash;
|
this.hash = hash;
|
||||||
this.ver = ver;
|
this.ver = ver;
|
||||||
|
|
||||||
|
@ -204,7 +211,17 @@ public class ServiceDiscoveryResult {
|
||||||
s.append(feature + "<");
|
s.append(feature + "<");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: data forms?
|
Collections.sort(forms, new Comparator<Data>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Data lhs, Data rhs) {
|
||||||
|
return lhs.getFormType().compareTo(rhs.getFormType());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for(Data form : forms) {
|
||||||
|
s.append(form.getFormType()+"<");
|
||||||
|
//TODO append fields and values
|
||||||
|
}
|
||||||
|
|
||||||
MessageDigest md;
|
MessageDigest md;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1022,7 +1022,19 @@ public class XmppConnection implements Runnable {
|
||||||
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());
|
||||||
sendServiceDiscoveryItems(account.getServer());
|
sendServiceDiscoveryItems(account.getServer());
|
||||||
|
Element caps = streamFeatures.findChild("c");
|
||||||
|
final String hash = caps == null ? null : caps.getAttribute("hash");
|
||||||
|
final String ver = caps == null ? null : caps.getAttribute("ver");
|
||||||
|
ServiceDiscoveryResult discoveryResult = null;
|
||||||
|
if (hash != null && ver != null) {
|
||||||
|
discoveryResult = mXmppConnectionService.databaseBackend.findDiscoveryResult(hash, ver);
|
||||||
|
}
|
||||||
|
if (discoveryResult == null) {
|
||||||
sendServiceDiscoveryInfo(account.getServer());
|
sendServiceDiscoveryInfo(account.getServer());
|
||||||
|
} else {
|
||||||
|
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": server caps came from cache");
|
||||||
|
disco.put(account.getServer(), discoveryResult);
|
||||||
|
}
|
||||||
sendServiceDiscoveryInfo(account.getJid().toBareJid());
|
sendServiceDiscoveryInfo(account.getJid().toBareJid());
|
||||||
this.lastSessionStarted = SystemClock.elapsedRealtime();
|
this.lastSessionStarted = SystemClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
@ -1060,6 +1072,9 @@ public class XmppConnection implements Runnable {
|
||||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server name: " + id.getName());
|
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server name: " + id.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (jid.equals(account.getServer())) {
|
||||||
|
mXmppConnectionService.databaseBackend.insertDiscoveryResult(result);
|
||||||
|
}
|
||||||
disco.put(jid, result);
|
disco.put(jid, result);
|
||||||
advancedStreamFeaturesLoaded = disco.containsKey(account.getServer())
|
advancedStreamFeaturesLoaded = disco.containsKey(account.getServer())
|
||||||
&& disco.containsKey(account.getJid().toBareJid());
|
&& disco.containsKey(account.getJid().toBareJid());
|
||||||
|
|
|
@ -80,7 +80,8 @@ public class Data extends Element {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFormType() {
|
public String getFormType() {
|
||||||
return this.getAttribute("FORM_TYPE");
|
Field typeFiled = this.getFieldByName("FORM_TYPE");
|
||||||
|
return typeFiled == null ? "" : typeFiled.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTitle() {
|
public String getTitle() {
|
||||||
|
|
Loading…
Reference in a new issue