summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/disco/EntityCapsManager.java')
-rw-r--r--src/com/isode/stroke/disco/EntityCapsManager.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/com/isode/stroke/disco/EntityCapsManager.java b/src/com/isode/stroke/disco/EntityCapsManager.java
new file mode 100644
index 0000000..a41ec11
--- /dev/null
+++ b/src/com/isode/stroke/disco/EntityCapsManager.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2010-2015, Isode Limited, London, England.
+ * All rights reserved.
+ */
+package com.isode.stroke.disco;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.isode.stroke.client.StanzaChannel;
+import com.isode.stroke.elements.CapsInfo;
+import com.isode.stroke.elements.DiscoInfo;
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.Presence;
+import com.isode.stroke.jid.JID;
+import com.isode.stroke.signals.Slot1;
+
+public class EntityCapsManager extends EntityCapsProvider {
+ private final CapsProvider capsProvider;
+ private final Map<JID, String> caps = new HashMap<JID, String>();
+
+ public EntityCapsManager(CapsProvider capsProvider, StanzaChannel stanzaChannel) {
+ this.capsProvider = capsProvider;
+
+ stanzaChannel.onPresenceReceived.connect(new Slot1<Presence>() {
+ @Override
+ public void call(Presence p1) {
+ handlePresenceReceived(p1);
+ }
+ });
+ stanzaChannel.onAvailableChanged.connect(new Slot1<Boolean>() {
+ @Override
+ public void call(Boolean p1) {
+ handleStanzaChannelAvailableChanged(p1);
+ }
+ });
+ capsProvider.onCapsAvailable.connect(new Slot1<String>() {
+ @Override
+ public void call(String p1) {
+ handleCapsAvailable(p1);
+ }
+ });
+ }
+
+ private void handlePresenceReceived(Presence presence) {
+ JID from = presence.getFrom();
+ if (presence.isAvailable()) {
+ CapsInfo capsInfo = presence.getPayload(new CapsInfo());
+ if (capsInfo == null || !capsInfo.getHash().equals("sha-1") || presence.getPayload(new ErrorPayload()) != null) {
+ return;
+ }
+ String hash = capsInfo.getVersion();
+ String i = caps.get(from);
+ if (!hash.equals(i)) {
+ caps.put(from, hash);
+ DiscoInfo disco = capsProvider.getCaps(hash);
+ if (disco != null || i != null) {
+ onCapsChanged.emit(from);
+ }
+ }
+ }
+ else {
+ if (caps.remove(from) != null) {
+ onCapsChanged.emit(from);
+ }
+ }
+ }
+
+ private void handleStanzaChannelAvailableChanged(boolean available) {
+ if (available) {
+ for (JID i : caps.keySet()) {
+ onCapsChanged.emit(i);
+ }
+ caps.clear();
+ }
+ }
+
+ private void handleCapsAvailable(final String hash) {
+ // TODO: Use Boost.Bimap ?
+ for (JID i : caps.keySet()) {
+ if (caps.get(i).equals(hash)) {
+ onCapsChanged.emit(i);
+ }
+ }
+ }
+
+ public DiscoInfo getCaps(final JID jid) {
+ if (caps.containsKey(jid)) {
+ return capsProvider.getCaps(caps.get(jid));
+ }
+ return new DiscoInfo();
+ }
+}