diff options
Diffstat (limited to 'src/com/isode/stroke/presence/SubscriptionManager.java')
-rw-r--r-- | src/com/isode/stroke/presence/SubscriptionManager.java | 68 |
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()); + } + } +} |