aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/entities
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Account.java3
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Presence.java42
-rw-r--r--src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java20
3 files changed, 49 insertions, 16 deletions
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java
index 4abfc801..356b34e5 100644
--- a/src/main/java/eu/siacs/conversations/entities/Account.java
+++ b/src/main/java/eu/siacs/conversations/entities/Account.java
@@ -3,6 +3,7 @@ package eu.siacs.conversations.entities;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.SystemClock;
+import android.util.Pair;
import eu.siacs.conversations.crypto.PgpDecryptionService;
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
@@ -14,6 +15,7 @@ import org.json.JSONObject;
import java.security.PublicKey;
import java.security.interfaces.DSAPublicKey;
import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -48,6 +50,7 @@ public class Account extends AbstractEntity {
public static final int OPTION_DISABLED = 1;
public static final int OPTION_REGISTER = 2;
public static final int OPTION_USECOMPRESSION = 3;
+ public final HashSet<Pair<String, String>> inProgressDiscoFetches = new HashSet<>();
public boolean httpUploadAvailable() {
return xmppConnection != null && xmppConnection.getFeatures().httpUpload();
diff --git a/src/main/java/eu/siacs/conversations/entities/Presence.java b/src/main/java/eu/siacs/conversations/entities/Presence.java
index d31bb69d..69cde832 100644
--- a/src/main/java/eu/siacs/conversations/entities/Presence.java
+++ b/src/main/java/eu/siacs/conversations/entities/Presence.java
@@ -22,23 +22,31 @@ public class Presence implements Comparable {
}
protected final Status status;
- protected final ServiceDiscoveryResult disco;
+ protected ServiceDiscoveryResult disco;
+ protected final String ver;
+ protected final String hash;
- public Presence(Element show, ServiceDiscoveryResult disco) {
- this.disco = disco;
+ private Presence(Status status, String ver, String hash) {
+ this.status = status;
+ this.ver = ver;
+ this.hash = hash;
+ }
+ public static Presence parse(Element show, Element caps) {
+ final String hash = caps == null ? null : caps.getAttribute("hash");
+ final String ver = caps == null ? null : caps.getAttribute("ver");
if ((show == null) || (show.getContent() == null)) {
- this.status = Status.ONLINE;
+ return new Presence(Status.ONLINE, ver, hash);
} else if (show.getContent().equals("away")) {
- this.status = Status.AWAY;
+ return new Presence(Status.AWAY, ver, hash);
} else if (show.getContent().equals("xa")) {
- this.status = Status.XA;
+ return new Presence(Status.XA, ver, hash);
} else if (show.getContent().equals("chat")) {
- this.status = Status.CHAT;
+ return new Presence(Status.CHAT, ver, hash);
} else if (show.getContent().equals("dnd")) {
- this.status = Status.DND;
+ return new Presence(Status.DND, ver, hash);
} else {
- this.status = Status.OFFLINE;
+ return new Presence(Status.OFFLINE, ver, hash);
}
}
@@ -49,4 +57,20 @@ public class Presence implements Comparable {
public Status getStatus() {
return this.status;
}
+
+ public boolean hasCaps() {
+ return ver != null && hash != null;
+ }
+
+ public String getVer() {
+ return this.ver;
+ }
+
+ public String getHash() {
+ return this.hash;
+ }
+
+ public void setServiceDiscoveryResult(ServiceDiscoveryResult disco) {
+ this.disco = disco;
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java b/src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java
index 9d77efab..c50640e1 100644
--- a/src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java
+++ b/src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java
@@ -128,7 +128,6 @@ public class ServiceDiscoveryResult {
}
}
}
-
this.ver = this.mkCapHash();
}
@@ -139,16 +138,23 @@ public class ServiceDiscoveryResult {
this.ver = ver;
JSONArray identities = o.optJSONArray("identities");
- for(int i = 0; i < identities.length(); i++) {
- this.identities.add(new Identity(identities.getJSONObject(i)));
+ if (identities != null) {
+ for (int i = 0; i < identities.length(); i++) {
+ this.identities.add(new Identity(identities.getJSONObject(i)));
+ }
}
-
JSONArray features = o.optJSONArray("features");
- for(int i = 0; i < features.length(); i++) {
- this.features.add(features.getString(i));
+ if (features != null) {
+ for (int i = 0; i < features.length(); i++) {
+ this.features.add(features.getString(i));
+ }
}
}
+ public String getVer() {
+ return new String(Base64.encode(this.ver, Base64.DEFAULT)).trim();
+ }
+
public ServiceDiscoveryResult(Cursor cursor) throws JSONException {
this(
cursor.getString(cursor.getColumnIndex(HASH)),
@@ -235,7 +241,7 @@ public class ServiceDiscoveryResult {
public ContentValues getContentValues() {
final ContentValues values = new ContentValues();
values.put(HASH, this.hash);
- values.put(VER, new String(Base64.encode(this.ver, Base64.DEFAULT)).trim());
+ values.put(VER, getVer());
values.put(RESULT, this.toJSON().toString());
return values;
}