diff options
Diffstat (limited to 'Swift/Controllers/Chat')
| -rw-r--r-- | Swift/Controllers/Chat/ChatsManager.cpp | 16 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/ChatsManager.h | 5 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/MUCController.cpp | 8 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/MUCController.h | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp | 14 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp | 34 | 
6 files changed, 48 insertions, 33 deletions
| diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp index 4a9e164..5a32ced 100644 --- a/Swift/Controllers/Chat/ChatsManager.cpp +++ b/Swift/Controllers/Chat/ChatsManager.cpp @@ -18,6 +18,7 @@  #include "Swift/Controllers/UIEvents/EditMUCBookmarkUIEvent.h"  #include "Swift/Controllers/UIInterfaces/ChatListWindowFactory.h"  #include "Swiften/Presence/PresenceSender.h" +#include "Swiften/MUC/MUCManager.h"  #include "Swiften/Elements/ChatState.h"  #include "Swiften/MUC/MUCBookmarkManager.h" @@ -26,7 +27,7 @@ namespace Swift {  typedef std::pair<JID, ChatController*> JIDChatControllerPair;  typedef std::pair<JID, MUCController*> JIDMUCControllerPair; -ChatsManager::ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsManager* entityCapsManager) : jid_(jid), useDelayForLatency_(useDelayForLatency), mucRegistry_(mucRegistry), entityCapsManager_(entityCapsManager) { +ChatsManager::ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsManager* entityCapsManager, MUCManager* mucManager) : jid_(jid), useDelayForLatency_(useDelayForLatency), mucRegistry_(mucRegistry), entityCapsManager_(entityCapsManager), mucManager(mucManager) {  	timerFactory_ = timerFactory;  	eventController_ = eventController;  	stanzaChannel_ = stanzaChannel; @@ -83,7 +84,6 @@ void ChatsManager::handleUserLeftMUC(MUCController* mucController) {  	std::map<JID, MUCController*>::iterator it;  	for (it = mucControllers_.begin(); it != mucControllers_.end(); it++) {  		if ((*it).second == mucController) { -			mucRegistry_->removeMUC(it->first);  			mucControllers_.erase(it);  			delete mucController;  			return; @@ -214,19 +214,19 @@ void ChatsManager::rebindControllerJID(const JID& from, const JID& to) {  	chatControllers_[to]->setToJID(to);  } -void ChatsManager::handleJoinMUCRequest(const JID &muc, const boost::optional<String>& nickMaybe) { -	std::map<JID, MUCController*>::iterator it = mucControllers_.find(muc); +void ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::optional<String>& nickMaybe) { +	std::map<JID, MUCController*>::iterator it = mucControllers_.find(mucJID);  	if (it != mucControllers_.end()) {  		it->second->rejoin();  	} else {  		String nick = nickMaybe ? nickMaybe.get() : jid_.getNode(); -		MUCController* controller = new MUCController(jid_, muc, nick, stanzaChannel_, presenceSender_, iqRouter_, chatWindowFactory_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory_, eventController_); -		mucControllers_[muc] = controller; +		MUC::ref muc = mucManager->createMUC(mucJID); +		MUCController* controller = new MUCController(jid_, muc, nick, stanzaChannel_, iqRouter_, chatWindowFactory_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory_, eventController_); +		mucControllers_[mucJID] = controller;  		controller->setAvailableServerFeatures(serverDiscoInfo_);  		controller->onUserLeft.connect(boost::bind(&ChatsManager::handleUserLeftMUC, this, controller)); -		mucRegistry_->addMUC(muc);  	} -	mucControllers_[muc]->activateChatWindow(); +	mucControllers_[mucJID]->activateChatWindow();  }  void ChatsManager::handleIncomingMessage(boost::shared_ptr<Message> message) { diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h index 724701c..0880f80 100644 --- a/Swift/Controllers/Chat/ChatsManager.h +++ b/Swift/Controllers/Chat/ChatsManager.h @@ -23,6 +23,7 @@ namespace Swift {  	class EventController;  	class ChatController;  	class MUCController; +	class MUCManager;  	class ChatWindowFactory;  	class NickResolver;  	class PresenceOracle; @@ -35,10 +36,11 @@ namespace Swift {  	class ChatListWindowFactory;  	class TimerFactory;  	class EntityCapsManager; +	class DirectedPresenceSender;  	class ChatsManager {  		public: -			ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsManager* entityCapsManager); +			ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsManager* entityCapsManager, MUCManager* mucManager);  			virtual ~ChatsManager();  			void setAvatarManager(AvatarManager* avatarManager);  			void setOnline(bool enabled); @@ -78,5 +80,6 @@ namespace Swift {  			TimerFactory* timerFactory_;  			MUCRegistry* mucRegistry_;  			EntityCapsManager* entityCapsManager_; +			MUCManager* mucManager;  	};  } diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index ff102e7..259b715 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -36,10 +36,9 @@ namespace Swift {   */  MUCController::MUCController (  		const JID& self, -		const JID &muc,  +		MUC::ref muc,  		const String &nick,   		StanzaChannel* stanzaChannel,  -		PresenceSender* presenceSender,  		IQRouter* iqRouter,   		ChatWindowFactory* chatWindowFactory,   		PresenceOracle* presenceOracle, @@ -48,7 +47,7 @@ MUCController::MUCController (  		bool useDelayForLatency,  		TimerFactory* timerFactory,  		EventController* eventController) : -			ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, timerFactory), muc_(new MUC(stanzaChannel, iqRouter, presenceSender, muc)), nick_(nick) { +			ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc->getJID(), presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, timerFactory), muc_(muc), nick_(nick) {  	parting_ = true;  	joined_ = false;  	lastWasPresence_ = false; @@ -59,7 +58,7 @@ MUCController::MUCController (  	completer_ = new TabComplete();  	chatWindow_->setRosterModel(roster_);  	chatWindow_->setTabComplete(completer_); -	chatWindow_->setName(muc.getNode()); +	chatWindow_->setName(muc->getJID().getNode());  	chatWindow_->onClosed.connect(boost::bind(&MUCController::handleWindowClosed, this));  	muc_->onJoinComplete.connect(boost::bind(&MUCController::handleJoinComplete, this, _1));  	muc_->onJoinFailed.connect(boost::bind(&MUCController::handleJoinFailed, this, _1)); @@ -80,7 +79,6 @@ MUCController::MUCController (  }  MUCController::~MUCController() { -	delete muc_;  	chatWindow_->setRosterModel(NULL);  	delete roster_;  	if (loginCheckTimer_) { diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h index 2a6536c..1af9c58 100644 --- a/Swift/Controllers/Chat/MUCController.h +++ b/Swift/Controllers/Chat/MUCController.h @@ -41,7 +41,7 @@ namespace Swift {  	class MUCController : public ChatControllerBase {  		public: -			MUCController(const JID& self, const JID &muc, const String &nick, StanzaChannel* stanzaChannel, PresenceSender* presenceSender, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, PresenceOracle* presenceOracle, AvatarManager* avatarManager, UIEventStream* events, bool useDelayForLatency, TimerFactory* timerFactory, EventController* eventController); +			MUCController(const JID& self, MUC::ref muc, const String &nick, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, PresenceOracle* presenceOracle, AvatarManager* avatarManager, UIEventStream* events, bool useDelayForLatency, TimerFactory* timerFactory, EventController* eventController);  			~MUCController();  			boost::signal<void ()> onUserLeft;  			virtual void setOnline(bool online); @@ -80,7 +80,7 @@ namespace Swift {  			void processUserPart();  		private: -			MUC* muc_; +			MUC::ref muc_;  			UIEventStream* events_;  			String nick_;  			Roster* roster_; diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp index 44fbcfe..08106e6 100644 --- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp +++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp @@ -16,15 +16,17 @@  #include "Swiften/Client/Client.h"  #include "Swiften/Disco/EntityCapsManager.h"  #include "Swiften/Disco/CapsProvider.h" +#include "Swiften/MUC/MUCManager.h"  #include "Swift/Controllers/Chat/ChatController.h"  #include "Swift/Controllers/XMPPEvents/EventController.h"  #include "Swift/Controllers/Chat/MUCController.h" -#include "Swiften/Presence/PresenceSender.h" +#include "Swiften/Presence/StanzaChannelPresenceSender.h"  #include "Swiften/Avatars/NullAvatarManager.h"  #include "Swiften/Avatars/AvatarMemoryStorage.h"  #include "Swiften/VCards/VCardManager.h"  #include "Swiften/VCards/VCardMemoryStorage.h"  #include "Swiften/Client/NickResolver.h" +#include "Swiften/Presence/DirectedPresenceSender.h"  #include "Swiften/Roster/XMPPRosterImpl.h"  #include "Swift/Controllers/UnitTest/MockChatWindow.h"  #include "Swiften/Client/DummyStanzaChannel.h" @@ -71,12 +73,14 @@ public:  		nickResolver_ = new NickResolver(jid_.toBare(), xmppRoster_, NULL, mucRegistry_);  		presenceOracle_ = new PresenceOracle(stanzaChannel_);  		serverDiscoInfo_ = boost::shared_ptr<DiscoInfo>(new DiscoInfo()); -		presenceSender_ = new PresenceSender(stanzaChannel_); +		presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_); +		directedPresenceSender_ = new DirectedPresenceSender(presenceSender_); +		mucManager_ = new MUCManager(stanzaChannel_, iqRouter_, directedPresenceSender_, mucRegistry_);  		uiEventStream_ = new UIEventStream();  		entityCapsManager_ = new EntityCapsManager(capsProvider_, stanzaChannel_);  		chatListWindowFactory_ = mocks_->InterfaceMock<ChatListWindowFactory>();  		mocks_->ExpectCall(chatListWindowFactory_, ChatListWindowFactory::createWindow).With(uiEventStream_).Return(NULL); -		manager_ = new ChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, nickResolver_, presenceOracle_, presenceSender_, uiEventStream_, chatListWindowFactory_, true, NULL, mucRegistry_, entityCapsManager_); +		manager_ = new ChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, nickResolver_, presenceOracle_, directedPresenceSender_, uiEventStream_, chatListWindowFactory_, true, NULL, mucRegistry_, entityCapsManager_, mucManager_);  		avatarManager_ = new NullAvatarManager();  		manager_->setAvatarManager(avatarManager_); @@ -87,6 +91,7 @@ public:  		delete mocks_;  		delete avatarManager_;  		delete manager_; +		delete directedPresenceSender_;  		delete presenceSender_;  		delete presenceOracle_;  		delete nickResolver_; @@ -96,6 +101,7 @@ public:  		delete iqChannel_;  		delete iqRouter_;  		delete uiEventStream_; +		delete mucManager_;  		delete xmppRoster_;  		delete entityCapsManager_;  		delete capsProvider_; @@ -329,8 +335,10 @@ private:  	UIEventStream* uiEventStream_;  	ChatListWindowFactory* chatListWindowFactory_;  	MUCRegistry* mucRegistry_; +	DirectedPresenceSender* directedPresenceSender_;  	EntityCapsManager* entityCapsManager_;  	CapsProvider* capsProvider_; +	MUCManager* mucManager_;  };  CPPUNIT_TEST_SUITE_REGISTRATION(ChatsManagerTest); diff --git a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp index ea5a705..fb3a0ee 100644 --- a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp +++ b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp @@ -9,7 +9,8 @@  #include "3rdParty/hippomocks.h"  #include "Swift/Controllers/XMPPEvents/EventController.h" -#include "Swiften/Presence/PresenceSender.h" +#include "Swiften/Presence/DirectedPresenceSender.h" +#include "Swiften/Presence/StanzaChannelPresenceSender.h"  #include "Swiften/Avatars/NullAvatarManager.h"  #include "Swift/Controllers/Chat/MUCController.h"  #include "Swift/Controllers/UIInterfaces/ChatWindow.h" @@ -42,7 +43,6 @@ public:  	void setUp() {  		self_ = JID("girl@wonderland.lit/rabbithole"); -		muc_ = JID("teaparty@rooms.wonderland.lit");  		nick_ = "aLiCe";  		mocks_ = new MockRepository();  		stanzaChannel_ = new DummyStanzaChannel(); @@ -51,14 +51,16 @@ public:  		eventController_ = new EventController();  		chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();  		presenceOracle_ = new PresenceOracle(stanzaChannel_); -		presenceSender_ = new PresenceSender(stanzaChannel_); +		presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_); +		directedPresenceSender_ = new DirectedPresenceSender(presenceSender_);  		uiEventStream_ = new UIEventStream();  		avatarManager_ = new NullAvatarManager();  		TimerFactory* timerFactory = NULL;  		window_ = new MockChatWindow();//mocks_->InterfaceMock<ChatWindow>(); -		mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(muc_, uiEventStream_).Return(window_); -		controller_ = new MUCController (self_, muc_, nick_, stanzaChannel_, presenceSender_, -				iqRouter_, chatWindowFactory_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory, eventController_); +		mucRegistry_ = new MUCRegistry(); +		muc_ = MUC::ref(new MUC(stanzaChannel_, iqRouter_, directedPresenceSender_, JID("teaparty@rooms.wonderland.lit"), mucRegistry_)); +		mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(muc_->getJID(), uiEventStream_).Return(window_); +		controller_ = new MUCController (self_, muc_, nick_, stanzaChannel_, iqRouter_, chatWindowFactory_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory, eventController_);  	};  	void tearDown() { @@ -69,14 +71,16 @@ public:  		delete uiEventStream_;  		delete stanzaChannel_;  		delete presenceSender_; +		delete directedPresenceSender_;  		delete iqRouter_;  		delete iqChannel_; +		delete mucRegistry_;  		delete avatarManager_;  	}  	void finishJoin() {  		Presence::ref presence(new Presence()); -		presence->setFrom(JID(muc_.toString() + "/" + nick_)); +		presence->setFrom(JID(muc_->getJID().toString() + "/" + nick_));  		MUCUserPayload::ref status(new MUCUserPayload());  		MUCUserPayload::StatusCode code;  		code.code = 110; @@ -90,20 +94,20 @@ public:  		Message::ref message(new Message());  		message = Message::ref(new Message()); -		message->setFrom(JID(muc_.toString() + "/otherperson")); +		message->setFrom(JID(muc_->getJID().toString() + "/otherperson"));  		message->setBody(nick_ + ": hi there");  		message->setType(Message::Groupchat);  		controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));  		CPPUNIT_ASSERT_EQUAL((size_t)1, eventController_->getEvents().size()); -		message->setFrom(JID(muc_.toString() + "/other")); +		message->setFrom(JID(muc_->getJID().toString() + "/other"));  		message->setBody("Hi there " + nick_);  		message->setType(Message::Groupchat);  		controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));  		CPPUNIT_ASSERT_EQUAL((size_t)2, eventController_->getEvents().size());  		message = Message::ref(new Message()); -		message->setFrom(JID(muc_.toString() + "/other2")); +		message->setFrom(JID(muc_->getJID().toString() + "/other2"));  		message->setBody("Hi " + nick_.getLowerCase());  		message->setType(Message::Groupchat);  		controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message))); @@ -113,7 +117,7 @@ public:  	void testNotAddressedToSelf() {  		finishJoin();  		Message::ref message(new Message()); -		message->setFrom(JID(muc_.toString() + "/other3")); +		message->setFrom(JID(muc_->getJID().toString() + "/other3"));  		message->setBody("Hi there Hatter");  		message->setType(Message::Groupchat);  		controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message))); @@ -123,7 +127,7 @@ public:  	void testAddressedToSelfBySelf() {  		finishJoin();  		Message::ref message(new Message()); -		message->setFrom(JID(muc_.toString() + "/" + nick_)); +		message->setFrom(JID(muc_->getJID().toString() + "/" + nick_));  		message->setBody("Hi there " + nick_);  		message->setType(Message::Groupchat);  		controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message))); @@ -200,7 +204,7 @@ public:  private:  	JID self_; -	JID muc_; +	MUC::ref muc_;  	String nick_;  	StanzaChannel* stanzaChannel_;  	IQChannel* iqChannel_; @@ -211,10 +215,12 @@ private:  //	NickResolver* nickResolver_;  	PresenceOracle* presenceOracle_;  	AvatarManager* avatarManager_; -	PresenceSender* presenceSender_; +	StanzaChannelPresenceSender* presenceSender_; +	DirectedPresenceSender* directedPresenceSender_;  	MockRepository* mocks_;  	UIEventStream* uiEventStream_;  	MockChatWindow* window_; +	MUCRegistry* mucRegistry_;  };  CPPUNIT_TEST_SUITE_REGISTRATION(MUCControllerTest); | 
 Swift
 Swift