summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/presence/SubscriptionManager.java')
-rw-r--r--src/com/isode/stroke/presence/SubscriptionManager.java68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/com/isode/stroke/presence/SubscriptionManager.java b/src/com/isode/stroke/presence/SubscriptionManager.java
new file mode 100644
index 0000000..91075fc
--- /dev/null
+++ b/src/com/isode/stroke/presence/SubscriptionManager.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2010-2015, Isode Limited, London, England.
+ * All rights reserved.
+ */
+package com.isode.stroke.presence;
+
+import com.isode.stroke.client.StanzaChannel;
+import com.isode.stroke.elements.Presence;
+import com.isode.stroke.jid.JID;
+import com.isode.stroke.signals.Signal2;
+import com.isode.stroke.signals.Signal3;
+import com.isode.stroke.signals.SignalConnection;
+import com.isode.stroke.signals.Slot1;
+
+public class SubscriptionManager {
+ private StanzaChannel stanzaChannel;
+ private SignalConnection onPresenceReceivedConnection;
+
+ public final Signal3<JID, String, Presence> onPresenceSubscriptionRequest = new Signal3<JID, String, Presence>();
+
+ public final Signal2<JID, String> onPresenceSubscriptionRevoked = new Signal2<JID, String>();
+
+ public SubscriptionManager(StanzaChannel channel) {
+ stanzaChannel = channel;
+ onPresenceReceivedConnection = stanzaChannel.onPresenceReceived.connect(new Slot1<Presence>() {
+ @Override
+ public void call(Presence p1) {
+ handleIncomingPresence(p1);
+ }
+ });
+ }
+
+ void delete() {
+ onPresenceReceivedConnection.disconnect();
+ }
+
+ public void cancelSubscription(final JID jid) {
+ Presence stanza = new Presence();
+ stanza.setType(Presence.Type.Unsubscribed);
+ stanza.setTo(jid);
+ stanzaChannel.sendPresence(stanza);
+ }
+
+ public void confirmSubscription(final JID jid) {
+ Presence stanza = new Presence();
+ stanza.setType(Presence.Type.Subscribed);
+ stanza.setTo(jid);
+ stanzaChannel.sendPresence(stanza);
+ }
+
+
+ public void requestSubscription(final JID jid) {
+ Presence stanza = new Presence();
+ stanza.setType(Presence.Type.Subscribe);
+ stanza.setTo(jid);
+ stanzaChannel.sendPresence(stanza);
+ }
+
+ void handleIncomingPresence(Presence presence) {
+ JID bareJID = presence.getFrom().toBare();
+ if (presence.getType() == Presence.Type.Subscribe) {
+ onPresenceSubscriptionRequest.emit(bareJID, presence.getStatus(), presence);
+ }
+ else if (presence.getType() == Presence.Type.Unsubscribe) {
+ onPresenceSubscriptionRevoked.emit(bareJID, presence.getStatus());
+ }
+ }
+}