From fd6e929a54514d5c3f77956429d5ab5fb4271ff2 Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Fri, 26 Mar 2010 11:22:06 +0000 Subject: Starting plumbing for MUC bookmarks diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp index 250f02d..ac03f8a 100644 --- a/Swift/Controllers/Chat/ChatsManager.cpp +++ b/Swift/Controllers/Chat/ChatsManager.cpp @@ -10,6 +10,7 @@ #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h" #include "Swiften/Presence/PresenceSender.h" #include "Swiften/Elements/ChatState.h" +#include "Swiften/MUC/MUCBookmarkManager.h" namespace Swift { @@ -28,6 +29,8 @@ ChatsManager::ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRo serverDiscoInfo_ = serverDiscoInfo; presenceSender_ = presenceSender; uiEventStream_ = uiEventStream; + mucBookmarkManager_ = new MUCBookmarkManager(iqRouter); + mucBookmarkManager_->onBookmarksChanged.connect(boost::bind(&ChatsManager::handleMUCBookmarksChanged, this)); presenceOracle_->onPresenceChange.connect(boost::bind(&ChatsManager::handlePresenceChange, this, _1, _2)); uiEventStream_->onUIEvent.connect(boost::bind(&ChatsManager::handleUIEvent, this, _1)); } @@ -39,7 +42,18 @@ ChatsManager::~ChatsManager() { foreach (JIDMUCControllerPair controllerPair, mucControllers_) { delete controllerPair.second; } + delete mucBookmarkManager_; +} +void ChatsManager::handleMUCBookmarksChanged() { + foreach (boost::shared_ptr bookmark, mucBookmarkManager_->getBookmarks()) { + std::map::iterator it = mucControllers_.find(bookmark->getRoom()); + if (it == mucControllers_.end()) { + //FIXME: need vcard stuff here to get a nick + String nick = bookmark->getNick() ? bookmark->getNick().get() : "Swift user"; + handleJoinMUCRequest(bookmark->getRoom(), nick); + } + } } void ChatsManager::handleUIEvent(boost::shared_ptr event) { diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h index 04d9330..bef766b 100644 --- a/Swift/Controllers/Chat/ChatsManager.h +++ b/Swift/Controllers/Chat/ChatsManager.h @@ -24,6 +24,7 @@ namespace Swift { class StanzaChannel; class IQRouter; class PresenceSender; + class MUCBookmarkManager; class ChatsManager : public MUCRegistry { public: @@ -39,6 +40,7 @@ namespace Swift { void rebindControllerJID(const JID& from, const JID& to); void handlePresenceChange(boost::shared_ptr newPresence, boost::shared_ptr lastPresence); void handleUIEvent(boost::shared_ptr event); + void handleMUCBookmarksChanged(); ChatController* getChatController(const JID &contact); virtual bool isMUC(const JID& muc) const; @@ -55,6 +57,7 @@ namespace Swift { AvatarManager* avatarManager_; PresenceSender* presenceSender_; UIEventStream* uiEventStream_; + MUCBookmarkManager* mucBookmarkManager_; boost::shared_ptr serverDiscoInfo_; }; } diff --git a/Swiften/MUC/MUCBookmark.h b/Swiften/MUC/MUCBookmark.h new file mode 100644 index 0000000..439e716 --- /dev/null +++ b/Swiften/MUC/MUCBookmark.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "Swiften/Base/String.h" +#include "Swiften/JID/JID.h" + +namespace Swift { + class MUCBookmark { + public: + MUCBookmark(const JID& room, const String& bookmarkName) : room_(room), name_(bookmarkName){}; + void setAutojoin(bool enabled) {autojoin_ = enabled;}; + void setNick(const boost::optional& nick) {nick_ = nick;}; + void setPassword(const boost::optional& password) {password_ = password;}; + bool getAutojoin() const {return autojoin_;}; + const boost::optional& getNick() const {return nick_;}; + const boost::optional& getPassword() const {return password_;}; + const String& getName() const {return name_;}; + const JID& getRoom() const {return room_;}; + private: + JID room_; + String name_; + boost::optional nick_; + boost::optional password_; + bool autojoin_; + }; +} + diff --git a/Swiften/MUC/MUCBookmarkManager.cpp b/Swiften/MUC/MUCBookmarkManager.cpp new file mode 100644 index 0000000..f789300 --- /dev/null +++ b/Swiften/MUC/MUCBookmarkManager.cpp @@ -0,0 +1,37 @@ +#include "MUCBookmarkManager.h" + +#include "Swiften/Queries/IQRouter.h" + +namespace Swift { + +MUCBookmarkManager::MUCBookmarkManager(IQRouter* iqRouter) { + iqRouter_ = iqRouter; +} + +void MUCBookmarkManager::addBookmark(boost::shared_ptr bookmark) { + bookmarks_.push_back(bookmark); + flush(); +} + + +void MUCBookmarkManager::removeBookmark(boost::shared_ptr bookmark) { + std::vector >::iterator it; + for (it = bookmarks_.begin(); it != bookmarks_.end(); it++) { + if ((*it).get() == bookmark.get()) { + bookmarks_.erase(it); + return; + } + } + assert(false); + flush(); +} + +void MUCBookmarkManager::flush() { + //FIXME: some code may be useful +} + +const std::vector >& MUCBookmarkManager::getBookmarks() { + return bookmarks_; +} + +} diff --git a/Swiften/MUC/MUCBookmarkManager.h b/Swiften/MUC/MUCBookmarkManager.h new file mode 100644 index 0000000..e1f8708 --- /dev/null +++ b/Swiften/MUC/MUCBookmarkManager.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include +#include + +#include "Swiften/MUC/MUCBookmark.h" + +namespace Swift { + class IQRouter; + class MUCBookmarkManager { + public: + MUCBookmarkManager(IQRouter* iqRouter); + void addBookmark(boost::shared_ptr bookmark); + void removeBookmark(boost::shared_ptr bookmark); + /** Call flush after editing an existing bookmark. */ + void flush(); + /** Returns pointers to the bookmarks. These can be edited, and then flush()ed.*/ + const std::vector >& getBookmarks(); + boost::signal onBookmarksChanged; + private: + + std::vector > bookmarks_; + IQRouter* iqRouter_; + }; +} diff --git a/Swiften/SConscript b/Swiften/SConscript index 3f82bfe..e7a3329 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -33,6 +33,7 @@ sources = [ "MUC/MUC.cpp", "MUC/MUCOccupant.cpp", "MUC/MUCRegistry.cpp", + "MUC/MUCBookmarkManager.cpp", "Notifier/Notifier.cpp", "Presence/PresenceOracle.cpp", "Presence/PresenceSender.cpp", -- cgit v0.10.2-6-g49f6