summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGurmeen Bindra <gurmeen.bindra@isode.com>2012-04-23 15:06:39 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-04-27 11:06:27 (GMT)
commit19340ddc7dc929aad094eed3f6a3cd7f84d86a4b (patch)
treeb2c7f71c8e32b15c267b7d62b64f77fb5945d3b7 /src/com/isode/stroke/muc/MUCBookmarkManager.java
parente2f24c6930603dbd016a6530f7d12b08c97ea900 (diff)
downloadstroke-19340ddc7dc929aad094eed3f6a3cd7f84d86a4b.zip
stroke-19340ddc7dc929aad094eed3f6a3cd7f84d86a4b.tar.bz2
MUC Administration related classes
This change ports the MUC Administration related classes from Swiften to stroke. Also includes the MUC initialisation code in the CoreClient. Test-information: tested the ported unit tests
Diffstat (limited to 'src/com/isode/stroke/muc/MUCBookmarkManager.java')
-rw-r--r--src/com/isode/stroke/muc/MUCBookmarkManager.java171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/com/isode/stroke/muc/MUCBookmarkManager.java b/src/com/isode/stroke/muc/MUCBookmarkManager.java
new file mode 100644
index 0000000..78bddea
--- /dev/null
+++ b/src/com/isode/stroke/muc/MUCBookmarkManager.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2012, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tronçon.
+ * All rights reserved.
+ */
+package com.isode.stroke.muc;
+
+import java.util.Vector;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.Storage;
+import com.isode.stroke.queries.IQRouter;
+import com.isode.stroke.queries.requests.GetPrivateStorageRequest;
+import com.isode.stroke.queries.requests.SetPrivateStorageRequest;
+import com.isode.stroke.signals.Signal;
+import com.isode.stroke.signals.Signal1;
+import com.isode.stroke.signals.Slot2;
+
+/**
+ * Class representing a manager for MUC Bookmarks
+ *
+ */
+public class MUCBookmarkManager {
+ private boolean ready_;
+ private Vector<MUCBookmark> bookmarks_ = new Vector<MUCBookmark>();
+ private IQRouter iqRouter_;
+ private Storage storage = new Storage();
+
+ /**
+ * Constructor
+ * @param iqRouter IQ router,not null
+ */
+ public MUCBookmarkManager(IQRouter iqRouter) {
+ iqRouter_ = iqRouter;
+ ready_ = false;
+ GetPrivateStorageRequest<Storage> request = GetPrivateStorageRequest.create(storage,iqRouter_);
+ request.onResponse.connect(new Slot2<Storage, ErrorPayload>(){
+ @Override
+ public void call(Storage p1, ErrorPayload p2) {
+ handleBookmarksReceived(p1, p2);
+ }
+ });
+ request.send();
+ }
+
+ /**
+ * Replace the bookmark
+ * @param oldBookmark bookmark to be replaced, not null
+ * @param newBookmark bookmark to replace with
+ */
+ public void replaceBookmark(MUCBookmark oldBookmark, MUCBookmark newBookmark) {
+ if (!ready_) return;
+ for (int i = 0; i < bookmarks_.size(); i++) {
+ if (bookmarks_.get(i).equals(oldBookmark)) {
+ bookmarks_.add(i, newBookmark);
+ flush();
+ onBookmarkRemoved.emit(oldBookmark);
+ onBookmarkAdded.emit(newBookmark);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Add a bookmark
+ * @param bookmark bookmark to be added, not null
+ */
+ public void addBookmark(MUCBookmark bookmark) {
+ if (!ready_) return;
+ bookmarks_.add(bookmark);
+ onBookmarkAdded.emit(bookmark);
+ flush();
+ }
+
+ /**
+ * Remove the given bookmark
+ * @param bookmark bookmark to be removed
+ */
+ public void removeBookmark(MUCBookmark bookmark) {
+ if (!ready_) return;
+ for (MUCBookmark mb : bookmarks_) {
+ if (mb.equals(bookmark)) {
+ bookmarks_.remove(mb);
+ onBookmarkRemoved.emit(bookmark);
+ break;
+ }
+ }
+ flush();
+ }
+
+ /**
+ * Get a list of bookmarks
+ * @return list of bookmarks, can be empty but not null
+ */
+ public Vector<MUCBookmark> getBookmarks() {
+ return bookmarks_;
+ }
+
+ public Signal1<MUCBookmark> onBookmarkAdded = new Signal1<MUCBookmark>();
+ public Signal1<MUCBookmark> onBookmarkRemoved = new Signal1<MUCBookmark>();
+ /**
+ * When server bookmarks are ready to be used (request response has been received).
+ */
+ public Signal onBookmarksReady = new Signal();
+
+ private void handleBookmarksReceived(Storage payload, ErrorPayload error) {
+ if (error != null) {
+ return;
+ }
+
+ ready_ = true;
+ onBookmarksReady.emit();
+ storage = payload;
+
+ Vector<MUCBookmark> receivedBookmarks = new Vector<MUCBookmark>();
+ for (Storage.Room room : payload.getRooms()) {
+ receivedBookmarks.add(new MUCBookmark(room));
+ }
+
+ Vector<MUCBookmark> newBookmarks = new Vector<MUCBookmark>();
+ for (MUCBookmark oldBookmark : bookmarks_) {
+ if (containsEquivalent(receivedBookmarks,oldBookmark)) {
+ newBookmarks.add(oldBookmark);
+ } else {
+ onBookmarkRemoved.emit(oldBookmark);
+ }
+ }
+
+ for (MUCBookmark newBookmark : receivedBookmarks) {
+ if (!containsEquivalent(bookmarks_,newBookmark)) {
+ newBookmarks.add(newBookmark);
+ onBookmarkAdded.emit(newBookmark);
+ }
+ }
+ bookmarks_ = newBookmarks;
+ }
+
+ private boolean containsEquivalent(Vector<MUCBookmark> list, MUCBookmark bookmark) {
+ for(MUCBookmark mb : list) {
+ if(mb.equals(bookmark)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ private void flush() {
+ if (storage == null) {
+ storage = new Storage();
+ }
+ // Update the storage element
+ storage.clearRooms();
+ for(MUCBookmark bookmark :bookmarks_) {
+ storage.addRoom(bookmark.toStorage());
+ }
+
+ // Send an iq to save the storage element
+ SetPrivateStorageRequest<Storage> request = SetPrivateStorageRequest.create(storage, iqRouter_);
+ // FIXME: We should care about the result
+ /*request.onResponse.connect(new Slot1<ErrorPayload>() {
+ @Override
+ public void call(ErrorPayload p1) {
+ }
+ });*/
+ request.send();
+ }
+}