diff options
Diffstat (limited to 'Swiften/Roster')
-rw-r--r-- | Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp | 86 | ||||
-rw-r--r-- | Swiften/Roster/XMPPRosterController.cpp | 48 | ||||
-rw-r--r-- | Swiften/Roster/XMPPRosterController.h | 36 |
3 files changed, 170 insertions, 0 deletions
diff --git a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp new file mode 100644 index 0000000..7e76d3a --- /dev/null +++ b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include "Swiften/Roster/XMPPRosterController.h" +#include "Swiften/Elements/Payload.h" +#include "Swiften/Elements/RosterItemPayload.h" +#include "Swiften/Elements/RosterPayload.h" +#include "Swiften/Queries/DummyIQChannel.h" +#include "Swiften/Queries/IQRouter.h" +#include "Swiften/Roster/XMPPRoster.h" + +using namespace Swift; + +class XMPPRosterControllerTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(XMPPRosterControllerTest); + CPPUNIT_TEST(testAdd); + CPPUNIT_TEST(testModify); + CPPUNIT_TEST(testRemove); + CPPUNIT_TEST_SUITE_END(); + + public: + XMPPRosterControllerTest() {} + + void setUp() { + channel_ = new DummyIQChannel(); + router_ = new IQRouter(channel_); + xmppRoster_ = new XMPPRoster(); + } + + void tearDown() { + delete channel_; + delete router_; + } + + void testAdd() { + 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() { + 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() { + 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_; + XMPPRoster* xmppRoster_; +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterControllerTest); + + diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp new file mode 100644 index 0000000..dca74c0 --- /dev/null +++ b/Swiften/Roster/XMPPRosterController.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Swiften/Roster/XMPPRosterController.h" + +#include <boost/bind.hpp> + +#include "Swiften/Base/foreach.h" +#include "Swiften/Elements/RosterItemPayload.h" +#include "Swiften/Queries/IQRouter.h" +#include "Swiften/Queries/Requests/GetRosterRequest.h" +#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/Roster/Roster.h" +#include "Swiften/Roster/SetPresence.h" +#include "Swiften/Roster/OfflineRosterFilter.h" +#include "Swiften/Roster/XMPPRoster.h" + +namespace Swift { + +/** + * The controller does not gain ownership of these parameters. + */ +XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, XMPPRoster* xmppRoster) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster) { + rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1)); +} + +void XMPPRosterController::requestRoster() { + xmppRoster_->clear(); + boost::shared_ptr<GetRosterRequest> rosterRequest(new GetRosterRequest(iqRouter_)); + rosterRequest->onResponse.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1)); + rosterRequest->send(); +} + +void XMPPRosterController::handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload) { + foreach(const RosterItemPayload& item, rosterPayload->getItems()) { + //Don't worry about the updated case, the XMPPRoster sorts that out. + if (item.getSubscription() == RosterItemPayload::Remove) { + xmppRoster_->removeContact(item.getJID()); + } else { + xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription()); + } + } +} + +} diff --git a/Swiften/Roster/XMPPRosterController.h b/Swiften/Roster/XMPPRosterController.h new file mode 100644 index 0000000..3ef7795 --- /dev/null +++ b/Swiften/Roster/XMPPRosterController.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <boost/shared_ptr.hpp> + +#include "Swiften/JID/JID.h" +#include "Swiften/Base/String.h" +#include "Swiften/Elements/IQ.h" +#include "Swiften/Elements/RosterPayload.h" +#include "Swiften/Queries/Responders/RosterPushResponder.h" +#include "Swiften/Base/boost_bsignals.h" + +namespace Swift { + class IQRouter; + class XMPPRoster; + + class XMPPRosterController { + public: + XMPPRosterController(IQRouter *iqRouter, XMPPRoster* xmppRoster); + + void requestRoster(); + + void handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload); + + private: + IQRouter* iqRouter_; + RosterPushResponder rosterPushResponder_; + XMPPRoster* xmppRoster_; + }; +} + |