summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/roster/XMPPRosterController.java')
-rw-r--r--src/com/isode/stroke/roster/XMPPRosterController.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/com/isode/stroke/roster/XMPPRosterController.java b/src/com/isode/stroke/roster/XMPPRosterController.java
new file mode 100644
index 0000000..6ad03f2
--- /dev/null
+++ b/src/com/isode/stroke/roster/XMPPRosterController.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2010-2015, Isode Limited, London, England.
+ * All rights reserved.
+ */
+package com.isode.stroke.roster;
+
+import java.util.Collection;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.RosterItemPayload;
+import com.isode.stroke.elements.RosterPayload;
+import com.isode.stroke.roster.GetRosterRequest;
+import com.isode.stroke.queries.IQRouter;
+import com.isode.stroke.signals.Slot1;
+import com.isode.stroke.signals.Slot2;
+
+public class XMPPRosterController {
+ private IQRouter iqRouter_;
+ private RosterPushResponder rosterPushResponder_;
+ private XMPPRosterImpl xmppRoster_;
+ private RosterStorage rosterStorage_;
+ private boolean useVersioning;
+
+
+ /**
+ * The controller does not gain ownership of these parameters.
+ */
+ public XMPPRosterController(IQRouter iqRouter, XMPPRosterImpl xmppRoster, RosterStorage rosterStorage) {
+ iqRouter_ = iqRouter;
+ rosterPushResponder_ = new RosterPushResponder(iqRouter);
+ xmppRoster_ = xmppRoster;
+ rosterStorage_ = rosterStorage;
+ useVersioning = false;
+
+ rosterPushResponder_.onRosterReceived.connect(new Slot1<RosterPayload>() {
+ @Override
+ public void call(RosterPayload p1) {
+ handleRosterReceived(p1, false, new RosterPayload());
+ }
+ });
+ rosterPushResponder_.start();
+ }
+
+ public void delete() {
+ rosterPushResponder_.stop();
+ }
+
+ public void requestRoster() {
+ xmppRoster_.clear();
+
+ final RosterPayload storedRoster = rosterStorage_.getRoster();
+ GetRosterRequest rosterRequest;
+ if (useVersioning) {
+ String version = "";
+ if (storedRoster != null && storedRoster.getVersion() != null) {
+ version = storedRoster.getVersion();
+ }
+ rosterRequest = GetRosterRequest.create(iqRouter_, version);
+ }
+ else {
+ rosterRequest = GetRosterRequest.create(iqRouter_);
+ }
+
+ rosterRequest.onResponse.connect(new Slot2<RosterPayload, ErrorPayload>() {
+ @Override
+ public void call(RosterPayload p1, ErrorPayload p2) {
+ handleRosterReceived(p1, true, storedRoster);
+ }
+ });
+ rosterRequest.send();
+ }
+
+ void handleRosterReceived(RosterPayload rosterPayload, boolean initial, RosterPayload previousRoster) {
+ if (rosterPayload != null) {
+ for (final RosterItemPayload item : rosterPayload.getItems()) {
+ //Don't worry about the updated case, the XMPPRoster sorts that out.
+ if (item.getSubscription() == RosterItemPayload.Subscription.Remove) {
+ xmppRoster_.removeContact(item.getJID());
+ } else {
+ xmppRoster_.addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
+ }
+ }
+ }
+ else if (previousRoster != null) {
+ // The cached version hasn't changed; emit all items
+ for (final RosterItemPayload item : previousRoster.getItems()) {
+ if (item.getSubscription() != RosterItemPayload.Subscription.Remove) {
+ xmppRoster_.addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
+ }
+ else {
+ System.err.println("ERROR: Stored invalid roster item");
+ }
+ }
+ }
+ if (initial) {
+ xmppRoster_.onInitialRosterPopulated.emit();
+ }
+ if (rosterPayload != null && rosterPayload.getVersion() != null && useVersioning) {
+ saveRoster(rosterPayload.getVersion());
+ }
+ }
+
+ void saveRoster(final String version) {
+ Collection<XMPPRosterItem> items = xmppRoster_.getItems();
+ RosterPayload roster = new RosterPayload();
+ roster.setVersion(version);
+ for (final XMPPRosterItem item : items) {
+ roster.addItem(new RosterItemPayload(item.getJID(), item.getName(), item.getSubscription(), item.getGroups()));
+ }
+ rosterStorage_.setRoster(roster);
+ }
+
+ public void setUseVersioning(boolean b) {
+ useVersioning = b;
+ }
+}