2016-01-10 19:56:55 +00:00
|
|
|
package eu.siacs.conversations.entities;
|
|
|
|
|
2016-01-10 21:25:26 +00:00
|
|
|
import android.content.ContentValues;
|
|
|
|
import android.util.Base64;
|
|
|
|
import java.io.UnsupportedEncodingException;
|
|
|
|
import java.lang.Comparable;
|
|
|
|
import java.security.MessageDigest;
|
|
|
|
import java.security.NoSuchAlgorithmException;
|
2016-01-10 19:56:55 +00:00
|
|
|
import java.util.ArrayList;
|
2016-01-10 21:25:26 +00:00
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
2016-01-10 19:56:55 +00:00
|
|
|
|
|
|
|
import eu.siacs.conversations.xml.Element;
|
|
|
|
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
|
|
|
|
|
|
|
|
public class ServiceDiscoveryResult {
|
2016-01-10 21:25:26 +00:00
|
|
|
|
|
|
|
protected static String blankNull(String s) {
|
|
|
|
return s == null ? "" : s;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Identity implements Comparable {
|
2016-01-10 19:56:55 +00:00
|
|
|
protected final String category;
|
|
|
|
protected final String type;
|
2016-01-10 21:25:26 +00:00
|
|
|
protected final String lang;
|
2016-01-10 19:56:55 +00:00
|
|
|
protected final String name;
|
|
|
|
|
2016-01-10 21:25:26 +00:00
|
|
|
public Identity(final String category, final String type, final String lang, final String name) {
|
2016-01-10 19:56:55 +00:00
|
|
|
this.category = category;
|
|
|
|
this.type = type;
|
2016-01-10 21:25:26 +00:00
|
|
|
this.lang = lang;
|
2016-01-10 19:56:55 +00:00
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Identity(final Element el) {
|
|
|
|
this.category = el.getAttribute("category");
|
|
|
|
this.type = el.getAttribute("type");
|
2016-01-10 21:25:26 +00:00
|
|
|
this.lang = el.getAttribute("xml:lang");
|
2016-01-10 19:56:55 +00:00
|
|
|
this.name = el.getAttribute("name");
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getCategory() {
|
|
|
|
return this.category;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getType() {
|
|
|
|
return this.type;
|
|
|
|
}
|
|
|
|
|
2016-01-10 21:25:26 +00:00
|
|
|
public String getLang() {
|
|
|
|
return this.lang;
|
|
|
|
}
|
|
|
|
|
2016-01-10 19:56:55 +00:00
|
|
|
public String getName() {
|
|
|
|
return this.name;
|
|
|
|
}
|
2016-01-10 21:25:26 +00:00
|
|
|
|
|
|
|
public int compareTo(Object other) {
|
|
|
|
Identity o = (Identity)other;
|
|
|
|
int r = blankNull(this.getCategory()).compareTo(blankNull(o.getCategory()));
|
|
|
|
if(r == 0) {
|
|
|
|
r = blankNull(this.getType()).compareTo(blankNull(o.getType()));
|
|
|
|
}
|
|
|
|
if(r == 0) {
|
|
|
|
r = blankNull(this.getLang()).compareTo(blankNull(o.getLang()));
|
|
|
|
}
|
|
|
|
if(r == 0) {
|
|
|
|
r = blankNull(this.getName()).compareTo(blankNull(o.getName()));
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
2016-01-10 19:56:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected final List<Identity> identities;
|
|
|
|
protected final List<String> features;
|
|
|
|
|
|
|
|
public ServiceDiscoveryResult(final List<Identity> identities, final List<String> features) {
|
|
|
|
this.identities = identities;
|
|
|
|
this.features = features;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ServiceDiscoveryResult(final IqPacket packet) {
|
|
|
|
this.identities = new ArrayList<>();
|
|
|
|
this.features = new ArrayList<>();
|
|
|
|
|
|
|
|
final List<Element> elements = packet.query().getChildren();
|
|
|
|
|
|
|
|
for (final Element element : elements) {
|
|
|
|
if (element.getName().equals("identity")) {
|
|
|
|
Identity id = new Identity(element);
|
|
|
|
if (id.getType() != null && id.getCategory() != null) {
|
|
|
|
identities.add(id);
|
|
|
|
}
|
|
|
|
} else if (element.getName().equals("feature")) {
|
2016-01-10 21:25:26 +00:00
|
|
|
if (element.getAttribute("var") != null) {
|
|
|
|
features.add(element.getAttribute("var"));
|
|
|
|
}
|
2016-01-10 19:56:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<Identity> getIdentities() {
|
|
|
|
return this.identities;
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<String> getFeatures() {
|
|
|
|
return this.features;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasIdentity(String category, String type) {
|
|
|
|
for(Identity id : this.getIdentities()) {
|
|
|
|
if((category == null || id.getCategory().equals(category)) &&
|
|
|
|
(type == null || id.getType().equals(type))) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2016-01-10 21:25:26 +00:00
|
|
|
|
|
|
|
public byte[] getCapHash() {
|
|
|
|
StringBuilder s = new StringBuilder();
|
|
|
|
|
|
|
|
List<Identity> identities = this.getIdentities();
|
|
|
|
Collections.sort(identities);
|
|
|
|
|
|
|
|
for(Identity id : identities) {
|
|
|
|
s.append(
|
|
|
|
blankNull(id.getCategory()) + "/" +
|
|
|
|
blankNull(id.getType()) + "/" +
|
|
|
|
blankNull(id.getLang()) + "/" +
|
|
|
|
blankNull(id.getName()) + "<"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<String> features = this.getFeatures();
|
|
|
|
Collections.sort(features);
|
|
|
|
|
|
|
|
for (String feature : features) {
|
|
|
|
s.append(feature + "<");
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: data forms?
|
|
|
|
|
|
|
|
MessageDigest md;
|
|
|
|
try {
|
|
|
|
md = MessageDigest.getInstance("SHA-1");
|
|
|
|
} catch (NoSuchAlgorithmException e) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
return md.digest(s.toString().getBytes("UTF-8"));
|
|
|
|
} catch(UnsupportedEncodingException e) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-10 19:56:55 +00:00
|
|
|
}
|