summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/com')
-rw-r--r--src/com/isode/stroke/client/Client.java4
-rw-r--r--src/com/isode/stroke/presence/PresenceOracle.java58
2 files changed, 45 insertions, 17 deletions
diff --git a/src/com/isode/stroke/client/Client.java b/src/com/isode/stroke/client/Client.java
index 07ac885..88022e3 100644
--- a/src/com/isode/stroke/client/Client.java
+++ b/src/com/isode/stroke/client/Client.java
@@ -1,3 +1,3 @@
/*
- * Copyright (c) 2010-2015, Isode Limited, London, England.
+ * Copyright (c) 2010-2016, Isode Limited, London, England.
* All rights reserved.
@@ -103,3 +103,3 @@ public class Client extends CoreClient {
- presenceOracle = new PresenceOracle(getStanzaChannel());
+ presenceOracle = new PresenceOracle(getStanzaChannel(),roster);
presenceOracle.onPresenceChange.connect(onPresenceChange);
diff --git a/src/com/isode/stroke/presence/PresenceOracle.java b/src/com/isode/stroke/presence/PresenceOracle.java
index e3e68cb..7ac5b9d 100644
--- a/src/com/isode/stroke/presence/PresenceOracle.java
+++ b/src/com/isode/stroke/presence/PresenceOracle.java
@@ -1,3 +1,3 @@
/*
- * Copyright (c) 2010-2015, Isode Limited, London, England.
+ * Copyright (c) 2010-2016, Isode Limited, London, England.
* All rights reserved.
@@ -15,2 +15,3 @@ import com.isode.stroke.elements.StatusShow;
import com.isode.stroke.jid.JID;
+import com.isode.stroke.roster.XMPPRoster;
import com.isode.stroke.signals.Signal1;
@@ -24,2 +25,3 @@ public class PresenceOracle {
private final SignalConnection onAvailableChangedSignal;
+ private final XMPPRoster xmppRoster_;
@@ -27,17 +29,27 @@ public class PresenceOracle {
public final Signal1<Presence> onPresenceChange = new Signal1<Presence>();
+ private final SignalConnection onJIDRemovedConnection;
- public PresenceOracle(StanzaChannel stanzaChannel) {
- stanzaChannel_ = stanzaChannel;
- onPresenceReceivedSignal = stanzaChannel_.onPresenceReceived.connect(new Slot1<Presence>() {
- @Override
- public void call(Presence p1) {
- handleIncomingPresence(p1);
- }
- });
- onAvailableChangedSignal = stanzaChannel_.onAvailableChanged.connect(new Slot1<Boolean>() {
- @Override
- public void call(Boolean p1) {
- handleStanzaChannelAvailableChanged(p1);
- }
- });
+ public PresenceOracle(StanzaChannel stanzaChannel, XMPPRoster xmppRoster) {
+ stanzaChannel_ = stanzaChannel;
+ xmppRoster_ = xmppRoster;
+ onPresenceReceivedSignal = stanzaChannel_.onPresenceReceived.connect(new Slot1<Presence>() {
+ @Override
+ public void call(Presence p1) {
+ handleIncomingPresence(p1);
+ }
+ });
+ onAvailableChangedSignal = stanzaChannel_.onAvailableChanged.connect(new Slot1<Boolean>() {
+ @Override
+ public void call(Boolean p1) {
+ handleStanzaChannelAvailableChanged(p1);
+ }
+ });
+ onJIDRemovedConnection = xmppRoster_.onJIDRemoved.connect(new Slot1<JID>() {
+
+ @Override
+ public void call(JID removedJID) {
+ handleJIDRemoved(removedJID);
+ }
+
+ });
}
@@ -47,2 +59,3 @@ public class PresenceOracle {
onAvailableChangedSignal.disconnect();
+ onJIDRemovedConnection.disconnect();
}
@@ -87,2 +100,17 @@ public class PresenceOracle {
}
+
+ private void handleJIDRemoved(JID removedJID) {
+ // 3921bis says that we don't follow up with an unavailable, so simulate this ourselves
+ Presence unavailablePresence = new Presence();
+ unavailablePresence.setType(Presence.Type.Unavailable);
+ unavailablePresence.setFrom(removedJID);
+
+ if (entries_.containsKey(removedJID.toBare())) {
+ Map<JID,Presence> presenceMap = entries_.get(removedJID.toBare());
+ presenceMap.clear();
+ presenceMap.put(removedJID, unavailablePresence);
+ }
+
+ onPresenceChange.emit(unavailablePresence);
+ }