diff options
author | Alan Young <consult.awy@gmail.com> | 2014-11-13 06:42:37 (GMT) |
---|---|---|
committer | Alan Young <consult.awy@gmail.com> | 2015-04-10 06:50:58 (GMT) |
commit | 7d2101b93b6253c3ea15b663f7f3dc385cb21364 (patch) | |
tree | d81338baf0d117e83cdc07f882cbedd9471e834d /src/com/isode/stroke/roster/XMPPRosterController.java | |
parent | a20ca7ba40d837abe228462be0aba5d32d6831e3 (diff) | |
download | stroke-7d2101b93b6253c3ea15b663f7f3dc385cb21364.zip stroke-7d2101b93b6253c3ea15b663f7f3dc385cb21364.tar.bz2 |
Checkpoint - A bunch of initial stuff for Android
MemoryStorages, Storages
NickManager, NickResolver
CryptoProvider, Hash, SafeByteArray, JavaCryptoProvider
CapsInfoGenerator, CapsManager, CapsMemoryStorage, CapsProvider,
CapsStorage, CapsInfo
CapsInfoSerializer, CapsInfoParser
ClientDiscoManager, DiscoInfoResponder, EntityCapsManager,
EntityCapsProvider
GetDiscoInfoRequest
ChatState, Idle
Presence, PayloadAddingPresenceSender, PresenceOracle,
SubscriptionManager
StatusSerializer, StatusShowSerializer, StatusParser, StatusShowParser,
Replace, ReplaceParser, ReplaceSerializer
SecurityLabel, SecurityLabelsCatalog, GetSecurityLabelsCatalogRequest
VCard, GetVCardRequest, SetVCardRequest, VCardManager,
VCardMemoryStorage, VCardStorage
RosterMemoryStorage, RosterPushResponder, RosterStorage,
SetRosterRequest
XMPPRoster, XMPPRosterController, XMPPRosterImpl, XMPPRosterItem
GetRosterRequest, SetResponder
Add parsers and serializers for Idle, VCard, PrivateStorage & Stroage.
Add
parser for Subject.
Add impromptu flag to MUCInvitation.
Update copyrights.
Change-Id: I9949f506b70e60b3a64f1dadde8f9b235b322e1d
Diffstat (limited to 'src/com/isode/stroke/roster/XMPPRosterController.java')
-rw-r--r-- | src/com/isode/stroke/roster/XMPPRosterController.java | 116 |
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; + } +} |