diff options
| -rw-r--r-- | Swift/Controllers/UnitTest/XMPPRosterControllerTest.cpp | 72 | ||||
| -rw-r--r-- | Swift/Controllers/XMPPRosterController.cpp | 18 | ||||
| -rw-r--r-- | Swift/Controllers/XMPPRosterController.h | 10 | ||||
| -rw-r--r-- | Swiften/Queries/Responders/RosterPushResponder.h | 23 | 
4 files changed, 62 insertions, 61 deletions
diff --git a/Swift/Controllers/UnitTest/XMPPRosterControllerTest.cpp b/Swift/Controllers/UnitTest/XMPPRosterControllerTest.cpp index c1d53c6..0b7fd6c 100644 --- a/Swift/Controllers/UnitTest/XMPPRosterControllerTest.cpp +++ b/Swift/Controllers/UnitTest/XMPPRosterControllerTest.cpp @@ -19,14 +19,13 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture  		CPPUNIT_TEST(testRemove);  		CPPUNIT_TEST_SUITE_END(); -		DummyIQChannel* channel_; -		IQRouter* router_;  	public:  		XMPPRosterControllerTest() {}  		void setUp() {  			channel_ = new DummyIQChannel();  			router_ = new IQRouter(channel_); +			xmppRoster_ = boost::shared_ptr<XMPPRoster>(new XMPPRoster());  		}  		void tearDown() { @@ -35,52 +34,45 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture  		}  		void testAdd() { -			boost::shared_ptr<XMPPRoster> xmppRoster(new XMPPRoster()); -			XMPPRosterController controller(router_, xmppRoster); -			JID testling("foo@bar"); -			CPPUNIT_ASSERT(!xmppRoster->containsJID(testling)); -			boost::shared_ptr<Payload> payload(new RosterPayload()); -			RosterItemPayload item(testling, "Bob", RosterItemPayload::Both); -			dynamic_cast<RosterPayload*>(payload.get())->addItem(item); -			controller.handleIQ(IQ::createRequest(IQ::Set, JID(), "eou", payload)); -			CPPUNIT_ASSERT(xmppRoster->containsJID(testling)); +			XMPPRosterController controller(router_, xmppRoster_); + +			boost::shared_ptr<RosterPayload> payload(new RosterPayload()); +			payload->addItem(RosterItemPayload(JID("foo@bar.com"), "Bob", RosterItemPayload::Both)); +			channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "eou", payload)); + +			CPPUNIT_ASSERT(xmppRoster_->containsJID(JID("foo@bar.com"))); +			CPPUNIT_ASSERT_EQUAL(String("Bob"), xmppRoster_->getNameForJID(JID("foo@bar.com")));  		}  		void testModify() { -			boost::shared_ptr<XMPPRoster> xmppRoster(new XMPPRoster()); -			XMPPRosterController controller(router_, xmppRoster); -			JID testling("foo@bar"); -			CPPUNIT_ASSERT(!xmppRoster->containsJID(testling)); -			boost::shared_ptr<Payload> payload1(new RosterPayload()); -			RosterItemPayload item1(testling, "Bob", RosterItemPayload::Both); -			dynamic_cast<RosterPayload*>(payload1.get())->addItem(item1); -			controller.handleIQ(IQ::createRequest(IQ::Set, JID(), "eou", payload1)); -			CPPUNIT_ASSERT(xmppRoster->containsJID(testling)); -			CPPUNIT_ASSERT_EQUAL(String("Bob"), xmppRoster->getNameForJID(testling)); -			boost::shared_ptr<Payload> payload2(new RosterPayload()); -			RosterItemPayload item2(testling, "Bob2", RosterItemPayload::Both); -			dynamic_cast<RosterPayload*>(payload2.get())->addItem(item2); -			controller.handleIQ(IQ::createRequest(IQ::Set, JID(), "eou", payload2)); -			CPPUNIT_ASSERT_EQUAL(String("Bob2"), xmppRoster->getNameForJID(testling)); +			XMPPRosterController controller(router_, xmppRoster_); +			boost::shared_ptr<RosterPayload> payload1(new RosterPayload()); +			payload1->addItem(RosterItemPayload(JID("foo@bar"), "Bob", RosterItemPayload::Both)); +			channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1)); + +			boost::shared_ptr<RosterPayload> payload2(new RosterPayload()); +			payload2->addItem(RosterItemPayload(JID("foo@bar"), "Bob2", RosterItemPayload::Both)); +			channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2)); + +			CPPUNIT_ASSERT_EQUAL(String("Bob2"), xmppRoster_->getNameForJID(JID("foo@bar")));  		}  		void testRemove() { -			boost::shared_ptr<XMPPRoster> xmppRoster(new XMPPRoster()); -			XMPPRosterController controller(router_, xmppRoster); -			JID testling("foo@bar"); -			CPPUNIT_ASSERT(!xmppRoster->containsJID(testling)); -			boost::shared_ptr<Payload> payload1(new RosterPayload()); -			RosterItemPayload item1(testling, "Bob", RosterItemPayload::Both); -			dynamic_cast<RosterPayload*>(payload1.get())->addItem(item1); -			controller.handleIQ(IQ::createRequest(IQ::Set, JID(), "eou", payload1)); -			CPPUNIT_ASSERT(xmppRoster->containsJID(testling)); -			boost::shared_ptr<Payload> payload2(new RosterPayload()); -			RosterItemPayload item2(testling, "Bob", RosterItemPayload::Remove); -			dynamic_cast<RosterPayload*>(payload2.get())->addItem(item2); -			controller.handleIQ(IQ::createRequest(IQ::Set, JID(), "eou", payload2)); -			CPPUNIT_ASSERT(!xmppRoster->containsJID(testling)); +			XMPPRosterController controller(router_, xmppRoster_); +			boost::shared_ptr<RosterPayload> payload1(new RosterPayload()); +			payload1->addItem(RosterItemPayload(JID("foo@bar"), "Bob", RosterItemPayload::Both)); +			channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1)); + +			boost::shared_ptr<RosterPayload> payload2(new RosterPayload()); +			payload2->addItem(RosterItemPayload(JID("foo@bar"), "Bob", RosterItemPayload::Remove)); +			channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2)); +			CPPUNIT_ASSERT(!xmppRoster_->containsJID(JID("foo@bar")));  		} +	private: +		DummyIQChannel* channel_; +		IQRouter* router_; +		boost::shared_ptr<XMPPRoster> xmppRoster_;  };  CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterControllerTest); diff --git a/Swift/Controllers/XMPPRosterController.cpp b/Swift/Controllers/XMPPRosterController.cpp index 8385f65..46fb40c 100644 --- a/Swift/Controllers/XMPPRosterController.cpp +++ b/Swift/Controllers/XMPPRosterController.cpp @@ -21,13 +21,8 @@ namespace Swift {  /**   * The controller does not gain ownership of these parameters.   */ -XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, boost::shared_ptr<XMPPRoster> xmppRoster) - : iqRouter_(iqRouter), xmppRoster_(xmppRoster) { -	iqRouter_->addHandler(this); -} - -XMPPRosterController::~XMPPRosterController() { -	iqRouter_->removeHandler(this); +XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, boost::shared_ptr<XMPPRoster> xmppRoster) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster) { +	rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1));  }  void XMPPRosterController::requestRoster() { @@ -46,13 +41,4 @@ void XMPPRosterController::handleRosterReceived(boost::shared_ptr<RosterPayload>  	}  } -bool XMPPRosterController::handleIQ(boost::shared_ptr<IQ> iq) { -	if (iq->getType() != IQ::Set || iq->getPayload<RosterPayload>().get() == NULL || iq->getFrom().isValid()) { -		return false; -	} -	handleRosterReceived(iq->getPayload<RosterPayload>()); -	return true; -} -  } - diff --git a/Swift/Controllers/XMPPRosterController.h b/Swift/Controllers/XMPPRosterController.h index 7695ff5..c3c4625 100644 --- a/Swift/Controllers/XMPPRosterController.h +++ b/Swift/Controllers/XMPPRosterController.h @@ -4,7 +4,7 @@  #include "Swiften/Base/String.h"  #include "Swiften/Elements/IQ.h"  #include "Swiften/Elements/RosterPayload.h" -#include "Swiften/Queries/IQHandler.h" +#include "Swiften/Queries/Responders/RosterPushResponder.h"  #include <boost/signals.hpp>  #include <boost/shared_ptr.hpp> @@ -13,19 +13,19 @@ namespace Swift {  	class IQRouter;  	class XMPPRoster; -	class XMPPRosterController : public IQHandler { +	class XMPPRosterController {  		public:  			XMPPRosterController(IQRouter *iqRouter, boost::shared_ptr<XMPPRoster> xmppRoster); -			~XMPPRosterController();  			void requestRoster();  			boost::shared_ptr<XMPPRoster> getXMPPRoster() {return xmppRoster_;}; -			bool handleIQ(boost::shared_ptr<IQ>); + +			void handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload);  		private:  			IQRouter* iqRouter_; -			void handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload); +			RosterPushResponder rosterPushResponder_;  			boost::shared_ptr<XMPPRoster> xmppRoster_;  	};  } diff --git a/Swiften/Queries/Responders/RosterPushResponder.h b/Swiften/Queries/Responders/RosterPushResponder.h new file mode 100644 index 0000000..69185c8 --- /dev/null +++ b/Swiften/Queries/Responders/RosterPushResponder.h @@ -0,0 +1,23 @@ +#pragma once + +#include <boost/signal.hpp> + +#include "Swiften/Queries/SetResponder.h" +#include "Swiften/Elements/RosterPayload.h" + +namespace Swift { +	class RosterPushResponder : public SetResponder<RosterPayload> { +		public: +			RosterPushResponder(IQRouter* router) : SetResponder<RosterPayload>(router) {} + +		public: +			boost::signal<void (boost::shared_ptr<RosterPayload>)> onRosterReceived; + +		private: +			virtual bool handleSetRequest(const JID& from, const String& id, boost::shared_ptr<RosterPayload> payload) { +				onRosterReceived(payload); +				sendResponse(from, id, boost::shared_ptr<Payload>()); +				return true; +			} +	}; +}  | 
 Swift