summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Roster')
-rw-r--r--Swiften/Roster/GetRosterRequest.h37
-rw-r--r--Swiften/Roster/RosterMemoryStorage.cpp14
-rw-r--r--Swiften/Roster/RosterMemoryStorage.h22
-rw-r--r--Swiften/Roster/RosterPushResponder.h41
-rw-r--r--Swiften/Roster/RosterStorage.h16
-rw-r--r--Swiften/Roster/SetRosterRequest.h46
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp681
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp172
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp25
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h74
-rw-r--r--Swiften/Roster/XMPPRoster.h165
-rw-r--r--Swiften/Roster/XMPPRosterController.cpp115
-rw-r--r--Swiften/Roster/XMPPRosterController.h63
-rw-r--r--Swiften/Roster/XMPPRosterImpl.cpp116
-rw-r--r--Swiften/Roster/XMPPRosterImpl.h44
-rw-r--r--Swiften/Roster/XMPPRosterItem.h77
16 files changed, 852 insertions, 856 deletions
diff --git a/Swiften/Roster/GetRosterRequest.h b/Swiften/Roster/GetRosterRequest.h
index 56ee2bb..1a0499f 100644
--- a/Swiften/Roster/GetRosterRequest.h
+++ b/Swiften/Roster/GetRosterRequest.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,28 +7,27 @@
#pragma once
#include <Swiften/Base/API.h>
-#include <Swiften/Queries/GenericRequest.h>
#include <Swiften/Elements/RosterPayload.h>
-
+#include <Swiften/Queries/GenericRequest.h>
namespace Swift {
- class SWIFTEN_API GetRosterRequest : public GenericRequest<RosterPayload> {
- public:
- typedef boost::shared_ptr<GetRosterRequest> ref;
+ class SWIFTEN_API GetRosterRequest : public GenericRequest<RosterPayload> {
+ public:
+ typedef std::shared_ptr<GetRosterRequest> ref;
- static ref create(IQRouter* router) {
- return ref(new GetRosterRequest(router));
- }
+ static ref create(IQRouter* router) {
+ return ref(new GetRosterRequest(router));
+ }
- static ref create(IQRouter* router, const std::string& version) {
- ref result(new GetRosterRequest(router));
- result->getPayloadGeneric()->setVersion(version);
- return result;
- }
+ static ref create(IQRouter* router, const std::string& version) {
+ ref result(new GetRosterRequest(router));
+ result->getPayloadGeneric()->setVersion(version);
+ return result;
+ }
- private:
- GetRosterRequest(IQRouter* router) :
- GenericRequest<RosterPayload>(IQ::Get, JID(), boost::shared_ptr<Payload>(new RosterPayload()), router) {
- }
- };
+ private:
+ GetRosterRequest(IQRouter* router) :
+ GenericRequest<RosterPayload>(IQ::Get, JID(), std::make_shared<RosterPayload>(), router) {
+ }
+ };
}
diff --git a/Swiften/Roster/RosterMemoryStorage.cpp b/Swiften/Roster/RosterMemoryStorage.cpp
index abaac5e..1b72a85 100644
--- a/Swiften/Roster/RosterMemoryStorage.cpp
+++ b/Swiften/Roster/RosterMemoryStorage.cpp
@@ -1,23 +1,23 @@
/*
- * Copyright (c) 2011 Isode Limited.
+ * Copyright (c) 2011-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/Roster/RosterMemoryStorage.h>
-#include <boost/smart_ptr/make_shared.hpp>
+#include <memory>
namespace Swift {
RosterMemoryStorage::RosterMemoryStorage() {
}
-void RosterMemoryStorage::setRoster(boost::shared_ptr<RosterPayload> r) {
- roster.reset();
- if (r) {
- roster = boost::make_shared<RosterPayload>(*r);
- }
+void RosterMemoryStorage::setRoster(std::shared_ptr<RosterPayload> r) {
+ roster.reset();
+ if (r) {
+ roster = std::make_shared<RosterPayload>(*r);
+ }
}
}
diff --git a/Swiften/Roster/RosterMemoryStorage.h b/Swiften/Roster/RosterMemoryStorage.h
index 9e1ca76..19e7802 100644
--- a/Swiften/Roster/RosterMemoryStorage.h
+++ b/Swiften/Roster/RosterMemoryStorage.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011 Isode Limited.
+ * Copyright (c) 2011-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,17 +10,17 @@
#include <Swiften/Roster/RosterStorage.h>
namespace Swift {
- class SWIFTEN_API RosterMemoryStorage : public RosterStorage {
- public:
- RosterMemoryStorage();
+ class SWIFTEN_API RosterMemoryStorage : public RosterStorage {
+ public:
+ RosterMemoryStorage();
- virtual boost::shared_ptr<RosterPayload> getRoster() const {
- return roster;
- }
+ virtual std::shared_ptr<RosterPayload> getRoster() const {
+ return roster;
+ }
- virtual void setRoster(boost::shared_ptr<RosterPayload>);
+ virtual void setRoster(std::shared_ptr<RosterPayload>);
- private:
- boost::shared_ptr<RosterPayload> roster;
- };
+ private:
+ std::shared_ptr<RosterPayload> roster;
+ };
}
diff --git a/Swiften/Roster/RosterPushResponder.h b/Swiften/Roster/RosterPushResponder.h
index a54438b..00411df 100644
--- a/Swiften/Roster/RosterPushResponder.h
+++ b/Swiften/Roster/RosterPushResponder.h
@@ -1,34 +1,35 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <Swiften/Base/boost_bsignals.h>
+#include <boost/signals2.hpp>
+
#include <Swiften/Base/API.h>
-#include <Swiften/Queries/SetResponder.h>
#include <Swiften/Elements/RosterPayload.h>
+#include <Swiften/Queries/SetResponder.h>
namespace Swift {
- class SWIFTEN_API RosterPushResponder : public SetResponder<RosterPayload> {
- public:
- RosterPushResponder(IQRouter* router) : SetResponder<RosterPayload>(router) {}
+ class SWIFTEN_API RosterPushResponder : public SetResponder<RosterPayload> {
+ public:
+ RosterPushResponder(IQRouter* router) : SetResponder<RosterPayload>(router) {}
- public:
- boost::signal<void (boost::shared_ptr<RosterPayload>)> onRosterReceived;
+ public:
+ boost::signals2::signal<void (std::shared_ptr<RosterPayload>)> onRosterReceived;
- private:
- virtual bool handleSetRequest(const JID& from, const JID&, const std::string& id, boost::shared_ptr<RosterPayload> payload) {
- if (getIQRouter()->isAccountJID(from)) {
- onRosterReceived(payload);
- sendResponse(from, id, boost::shared_ptr<RosterPayload>());
- }
- else {
- sendError(from, id, ErrorPayload::NotAuthorized, ErrorPayload::Cancel);
- }
- return true;
- }
- };
+ private:
+ virtual bool handleSetRequest(const JID& from, const JID&, const std::string& id, std::shared_ptr<RosterPayload> payload) {
+ if (getIQRouter()->isAccountJID(from)) {
+ onRosterReceived(payload);
+ sendResponse(from, id, std::shared_ptr<RosterPayload>());
+ }
+ else {
+ sendError(from, id, ErrorPayload::NotAuthorized, ErrorPayload::Cancel);
+ }
+ return true;
+ }
+ };
}
diff --git a/Swiften/Roster/RosterStorage.h b/Swiften/Roster/RosterStorage.h
index c7e92d2..1c1461d 100644
--- a/Swiften/Roster/RosterStorage.h
+++ b/Swiften/Roster/RosterStorage.h
@@ -1,22 +1,22 @@
/*
- * Copyright (c) 2011 Isode Limited.
+ * Copyright (c) 2011-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <boost/shared_ptr.hpp>
+#include <memory>
#include <Swiften/Base/API.h>
#include <Swiften/Elements/RosterPayload.h>
namespace Swift {
- class SWIFTEN_API RosterStorage {
- public:
- virtual ~RosterStorage();
+ class SWIFTEN_API RosterStorage {
+ public:
+ virtual ~RosterStorage();
- virtual boost::shared_ptr<RosterPayload> getRoster() const = 0;
- virtual void setRoster(boost::shared_ptr<RosterPayload>) = 0;
- };
+ virtual std::shared_ptr<RosterPayload> getRoster() const = 0;
+ virtual void setRoster(std::shared_ptr<RosterPayload>) = 0;
+ };
}
diff --git a/Swiften/Roster/SetRosterRequest.h b/Swiften/Roster/SetRosterRequest.h
index 95a9f65..0f71ab7 100644
--- a/Swiften/Roster/SetRosterRequest.h
+++ b/Swiften/Roster/SetRosterRequest.h
@@ -1,41 +1,41 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <Swiften/Base/boost_bsignals.h>
-#include <boost/shared_ptr.hpp>
+#include <memory>
+
+#include <boost/signals2.hpp>
#include <Swiften/Base/API.h>
-#include <Swiften/Queries/Request.h>
#include <Swiften/Elements/RosterPayload.h>
-
+#include <Swiften/Queries/Request.h>
namespace Swift {
- class SWIFTEN_API SetRosterRequest : public Request {
- public:
- typedef boost::shared_ptr<SetRosterRequest> ref;
+ class SWIFTEN_API SetRosterRequest : public Request {
+ public:
+ typedef std::shared_ptr<SetRosterRequest> ref;
- static ref create(RosterPayload::ref payload, IQRouter* router) {
- return ref(new SetRosterRequest(JID(), payload, router));
- }
+ static ref create(RosterPayload::ref payload, IQRouter* router) {
+ return ref(new SetRosterRequest(JID(), payload, router));
+ }
- static ref create(RosterPayload::ref payload, const JID& to, IQRouter* router) {
- return ref(new SetRosterRequest(to, payload, router));
- }
+ static ref create(RosterPayload::ref payload, const JID& to, IQRouter* router) {
+ return ref(new SetRosterRequest(to, payload, router));
+ }
- private:
- SetRosterRequest(const JID& to, boost::shared_ptr<RosterPayload> payload, IQRouter* router) : Request(IQ::Set, to, boost::shared_ptr<RosterPayload>(payload), router) {
- }
+ private:
+ SetRosterRequest(const JID& to, std::shared_ptr<RosterPayload> payload, IQRouter* router) : Request(IQ::Set, to, std::shared_ptr<RosterPayload>(payload), router) {
+ }
- virtual void handleResponse(boost::shared_ptr<Payload> /*payload*/, ErrorPayload::ref error) {
- onResponse(error);
- }
+ virtual void handleResponse(std::shared_ptr<Payload> /*payload*/, ErrorPayload::ref error) {
+ onResponse(error);
+ }
- public:
- boost::signal<void (ErrorPayload::ref)> onResponse;
- };
+ public:
+ boost::signals2::signal<void (ErrorPayload::ref)> onResponse;
+ };
}
diff --git a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
index 21f197b..b646aba 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
@@ -1,360 +1,361 @@
/*
- * Copyright (c) 2010-2011 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <memory>
+
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <boost/smart_ptr/make_shared.hpp>
-#include <Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h>
-#include <Swiften/Roster/XMPPRosterController.h>
+#include <Swiften/Client/DummyStanzaChannel.h>
#include <Swiften/Elements/Payload.h>
#include <Swiften/Elements/RosterItemPayload.h>
#include <Swiften/Elements/RosterPayload.h>
-#include <Swiften/Client/DummyStanzaChannel.h>
#include <Swiften/Queries/IQRouter.h>
-#include <Swiften/Roster/XMPPRosterImpl.h>
#include <Swiften/Roster/RosterMemoryStorage.h>
+#include <Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h>
+#include <Swiften/Roster/XMPPRosterController.h>
+#include <Swiften/Roster/XMPPRosterImpl.h>
using namespace Swift;
class XMPPRosterControllerTest : public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(XMPPRosterControllerTest);
- CPPUNIT_TEST(testGet_Response);
- CPPUNIT_TEST(testGet_EmptyResponse);
- CPPUNIT_TEST(testGet_NoRosterInStorage);
- CPPUNIT_TEST(testGet_NoVersionInStorage);
- CPPUNIT_TEST(testGet_VersionInStorage);
- CPPUNIT_TEST(testGet_ServerDoesNotSupportVersion);
- CPPUNIT_TEST(testGet_ResponseWithoutNewVersion);
- CPPUNIT_TEST(testGet_ResponseWithNewVersion);
- CPPUNIT_TEST(testAdd);
- CPPUNIT_TEST(testAddFromNonAccount);
- CPPUNIT_TEST(testModify);
- CPPUNIT_TEST(testRemove);
- CPPUNIT_TEST(testRemove_RosterStorageUpdated);
- CPPUNIT_TEST(testMany);
- CPPUNIT_TEST_SUITE_END();
-
- public:
- void setUp() {
- channel_ = new DummyStanzaChannel();
- router_ = new IQRouter(channel_);
- router_->setJID("me@bla.com");
- xmppRoster_ = new XMPPRosterImpl();
- handler_ = new XMPPRosterSignalHandler(xmppRoster_);
- rosterStorage_ = new RosterMemoryStorage();
- jid1_ = JID("foo@bar.com");
- jid2_ = JID("alice@wonderland.lit");
- jid3_ = JID("jane@austen.lit");
- }
-
- void tearDown() {
- delete rosterStorage_;
- delete handler_;
- delete xmppRoster_;
- delete router_;
- delete channel_;
- }
-
- void testGet_Response() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
-
- testling->requestRoster();
- boost::shared_ptr<RosterPayload> payload = boost::make_shared<RosterPayload>();
- payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- payload->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), payload));
-
- CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid1_));
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
- }
-
- void testGet_EmptyResponse() {
- XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
-
- controller.requestRoster();
-
- channel_->onIQReceived(IQ::createResult(JID("baz@fum.com/dum"), channel_->sentStanzas[0]->getID(), boost::shared_ptr<RosterPayload>()));
- }
-
- void testAdd() {
- XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
-
- boost::shared_ptr<RosterPayload> payload(new RosterPayload());
- payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "eou", payload));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), xmppRoster_->getGroupsForJID(jid1_).size());
- CPPUNIT_ASSERT(xmppRoster_->containsJID(jid1_));
- CPPUNIT_ASSERT_EQUAL(std::string("Bob"), xmppRoster_->getNameForJID(jid1_));
- }
-
- void testGet_NoRosterInStorage() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
-
- testling->requestRoster();
-
- boost::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
- CPPUNIT_ASSERT(roster->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string(""), *roster->getVersion());
- }
-
- void testGet_NoVersionInStorage() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
- rosterStorage_->setRoster(boost::make_shared<RosterPayload>());
-
- testling->requestRoster();
-
- boost::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
- CPPUNIT_ASSERT(roster->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string(""), *roster->getVersion());
- }
-
- void testGet_VersionInStorage() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
- boost::shared_ptr<RosterPayload> payload(new RosterPayload());
- payload->setVersion("foover");
- rosterStorage_->setRoster(payload);
-
- testling->requestRoster();
-
- boost::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
- CPPUNIT_ASSERT(roster->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string("foover"), *roster->getVersion());
- }
-
- void testGet_ServerDoesNotSupportVersion() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- boost::shared_ptr<RosterPayload> payload(new RosterPayload());
- payload->setVersion("foover");
- rosterStorage_->setRoster(payload);
-
- testling->requestRoster();
-
- boost::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
- CPPUNIT_ASSERT(!roster->getVersion());
- }
-
- void testGet_ResponseWithoutNewVersion() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
- boost::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
- storedRoster->setVersion("version10");
- storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- storedRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
- rosterStorage_->setRoster(storedRoster);
- testling->requestRoster();
-
- channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), boost::shared_ptr<RosterPayload>()));
-
- CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid1_));
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
- CPPUNIT_ASSERT(rosterStorage_->getRoster());
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string("version10"), *rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid1_));
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
- }
-
- void testGet_ResponseWithNewVersion() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
- boost::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
- storedRoster->setVersion("version10");
- storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- rosterStorage_->setRoster(storedRoster);
- testling->requestRoster();
-
- boost::shared_ptr<RosterPayload> serverRoster(new RosterPayload());
- serverRoster->setVersion("version12");
- serverRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
- std::vector<std::string> groups;
- groups.push_back("foo");
- groups.push_back("bar");
- serverRoster->addItem(RosterItemPayload(jid3_, "Rabbit", RosterItemPayload::Both, groups));
- channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), serverRoster));
-
-
- CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
- CPPUNIT_ASSERT(!xmppRoster_->getItem(jid1_));
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
- CPPUNIT_ASSERT(xmppRoster_->getItem(jid3_));
- CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT(rosterStorage_->getRoster());
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string("version12"), *rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT(!rosterStorage_->getRoster()->getItem(jid1_));
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid3_));
- CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(rosterStorage_->getRoster()->getItem(jid3_)->getGroups().size()));
- }
-
- void testAddFromNonAccount() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
-
- boost::shared_ptr<RosterPayload> payload(new RosterPayload());
- payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- IQ::ref request = IQ::createRequest(IQ::Set, JID(), "eou", payload);
- request->setFrom(jid2_);
- channel_->onIQReceived(request);
-
- CPPUNIT_ASSERT_EQUAL(None, handler_->getLastEvent());
- }
-
- void testModify() {
- XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
- boost::shared_ptr<RosterPayload> payload1(new RosterPayload());
- payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload2(new RosterPayload());
- payload2->addItem(RosterItemPayload(jid1_, "Bob2", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
-
- CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
-
- CPPUNIT_ASSERT_EQUAL(std::string("Bob2"), xmppRoster_->getNameForJID(jid1_));
- }
-
- void testRemove() {
- XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
- boost::shared_ptr<RosterPayload> payload1(new RosterPayload());
- payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload2(new RosterPayload());
- payload2->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
- CPPUNIT_ASSERT(!xmppRoster_->containsJID(jid1_));
- CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
-
- }
-
- void testRemove_RosterStorageUpdated() {
- boost::shared_ptr<XMPPRosterController> testling(createController());
- testling->setUseVersioning(true);
- boost::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
- storedRoster->setVersion("version10");
- storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- storedRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
- rosterStorage_->setRoster(storedRoster);
- testling->requestRoster();
- channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), boost::shared_ptr<RosterPayload>()));
-
- boost::shared_ptr<RosterPayload> payload2(new RosterPayload());
- payload2->setVersion("version15");
- payload2->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
-
- CPPUNIT_ASSERT(rosterStorage_->getRoster());
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT_EQUAL(std::string("version15"), *rosterStorage_->getRoster()->getVersion());
- CPPUNIT_ASSERT(!rosterStorage_->getRoster()->getItem(jid1_));
- CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
- }
-
- void testMany() {
- XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
- boost::shared_ptr<RosterPayload> payload1(new RosterPayload());
- payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload2(new RosterPayload());
- payload2->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload3(new RosterPayload());
- payload3->addItem(RosterItemPayload(jid1_, "Ernie", RosterItemPayload::Both));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id3", payload3));
-
- CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload4(new RosterPayload());
- RosterItemPayload item(jid3_, "Jane", RosterItemPayload::Both);
- std::string janesGroup("Jane's Group");
- item.addGroup(janesGroup);
- payload4->addItem(item);
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id4", payload4));
-
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid3_).size());
- CPPUNIT_ASSERT_EQUAL(janesGroup, xmppRoster_->getGroupsForJID(jid3_)[0]);
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload5(new RosterPayload());
- payload5->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id5", payload5));
- CPPUNIT_ASSERT(!xmppRoster_->containsJID(jid1_));
- CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
-
- boost::shared_ptr<RosterPayload> payload6(new RosterPayload());
- RosterItemPayload item2(jid2_, "Little Alice", RosterItemPayload::Both);
- std::string alicesGroup("Alice's Group");
- item2.addGroup(alicesGroup);
- payload6->addItem(item2);
- channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id6", payload6));
- CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("Little Alice"), xmppRoster_->getNameForJID(jid2_));
- CPPUNIT_ASSERT_EQUAL(std::string("Jane"), xmppRoster_->getNameForJID(jid3_));
- CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid2_).size());
- CPPUNIT_ASSERT_EQUAL(alicesGroup, xmppRoster_->getGroupsForJID(jid2_)[0]);
- CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid3_).size());
- CPPUNIT_ASSERT_EQUAL(janesGroup, xmppRoster_->getGroupsForJID(jid3_)[0]);
- handler_->reset();
-
- }
-
- private:
- XMPPRosterController* createController() {
- return new XMPPRosterController(router_, xmppRoster_, rosterStorage_);
- }
-
- private:
- DummyStanzaChannel* channel_;
- IQRouter* router_;
- XMPPRosterImpl* xmppRoster_;
- XMPPRosterSignalHandler* handler_;
- RosterMemoryStorage* rosterStorage_;
- JID jid1_;
- JID jid2_;
- JID jid3_;
+ CPPUNIT_TEST_SUITE(XMPPRosterControllerTest);
+ CPPUNIT_TEST(testGet_Response);
+ CPPUNIT_TEST(testGet_EmptyResponse);
+ CPPUNIT_TEST(testGet_NoRosterInStorage);
+ CPPUNIT_TEST(testGet_NoVersionInStorage);
+ CPPUNIT_TEST(testGet_VersionInStorage);
+ CPPUNIT_TEST(testGet_ServerDoesNotSupportVersion);
+ CPPUNIT_TEST(testGet_ResponseWithoutNewVersion);
+ CPPUNIT_TEST(testGet_ResponseWithNewVersion);
+ CPPUNIT_TEST(testAdd);
+ CPPUNIT_TEST(testAddFromNonAccount);
+ CPPUNIT_TEST(testModify);
+ CPPUNIT_TEST(testRemove);
+ CPPUNIT_TEST(testRemove_RosterStorageUpdated);
+ CPPUNIT_TEST(testMany);
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+ void setUp() {
+ channel_ = new DummyStanzaChannel();
+ router_ = new IQRouter(channel_);
+ router_->setJID("me@bla.com");
+ xmppRoster_ = new XMPPRosterImpl();
+ handler_ = new XMPPRosterSignalHandler(xmppRoster_);
+ rosterStorage_ = new RosterMemoryStorage();
+ jid1_ = JID("foo@bar.com");
+ jid2_ = JID("alice@wonderland.lit");
+ jid3_ = JID("jane@austen.lit");
+ }
+
+ void tearDown() {
+ delete rosterStorage_;
+ delete handler_;
+ delete xmppRoster_;
+ delete router_;
+ delete channel_;
+ }
+
+ void testGet_Response() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+
+ testling->requestRoster();
+ std::shared_ptr<RosterPayload> payload = std::make_shared<RosterPayload>();
+ payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ payload->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), payload));
+
+ CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid1_));
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
+ }
+
+ void testGet_EmptyResponse() {
+ XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
+
+ controller.requestRoster();
+
+ channel_->onIQReceived(IQ::createResult(JID("baz@fum.com/dum"), channel_->sentStanzas[0]->getID(), std::shared_ptr<RosterPayload>()));
+ }
+
+ void testAdd() {
+ XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
+
+ std::shared_ptr<RosterPayload> payload(new RosterPayload());
+ payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "eou", payload));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), xmppRoster_->getGroupsForJID(jid1_).size());
+ CPPUNIT_ASSERT(xmppRoster_->containsJID(jid1_));
+ CPPUNIT_ASSERT_EQUAL(std::string("Bob"), xmppRoster_->getNameForJID(jid1_));
+ }
+
+ void testGet_NoRosterInStorage() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+
+ testling->requestRoster();
+
+ std::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
+ CPPUNIT_ASSERT(roster->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), *roster->getVersion());
+ }
+
+ void testGet_NoVersionInStorage() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+ rosterStorage_->setRoster(std::make_shared<RosterPayload>());
+
+ testling->requestRoster();
+
+ std::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
+ CPPUNIT_ASSERT(roster->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), *roster->getVersion());
+ }
+
+ void testGet_VersionInStorage() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+ std::shared_ptr<RosterPayload> payload(new RosterPayload());
+ payload->setVersion("foover");
+ rosterStorage_->setRoster(payload);
+
+ testling->requestRoster();
+
+ std::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
+ CPPUNIT_ASSERT(roster->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string("foover"), *roster->getVersion());
+ }
+
+ void testGet_ServerDoesNotSupportVersion() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ std::shared_ptr<RosterPayload> payload(new RosterPayload());
+ payload->setVersion("foover");
+ rosterStorage_->setRoster(payload);
+
+ testling->requestRoster();
+
+ std::shared_ptr<RosterPayload> roster = channel_->sentStanzas[0]->getPayload<RosterPayload>();
+ CPPUNIT_ASSERT(!roster->getVersion());
+ }
+
+ void testGet_ResponseWithoutNewVersion() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+ std::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
+ storedRoster->setVersion("version10");
+ storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ storedRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
+ rosterStorage_->setRoster(storedRoster);
+ testling->requestRoster();
+
+ channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), std::shared_ptr<RosterPayload>()));
+
+ CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid1_));
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string("version10"), *rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid1_));
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
+ }
+
+ void testGet_ResponseWithNewVersion() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+ std::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
+ storedRoster->setVersion("version10");
+ storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ rosterStorage_->setRoster(storedRoster);
+ testling->requestRoster();
+
+ std::shared_ptr<RosterPayload> serverRoster(new RosterPayload());
+ serverRoster->setVersion("version12");
+ serverRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
+ std::vector<std::string> groups;
+ groups.push_back("foo");
+ groups.push_back("bar");
+ serverRoster->addItem(RosterItemPayload(jid3_, "Rabbit", RosterItemPayload::Both, groups));
+ channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), serverRoster));
+
+
+ CPPUNIT_ASSERT_EQUAL(2, handler_->getEventCount());
+ CPPUNIT_ASSERT(!xmppRoster_->getItem(jid1_));
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid2_));
+ CPPUNIT_ASSERT(xmppRoster_->getItem(jid3_));
+ CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string("version12"), *rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT(!rosterStorage_->getRoster()->getItem(jid1_));
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid3_));
+ CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(rosterStorage_->getRoster()->getItem(jid3_)->getGroups().size()));
+ }
+
+ void testAddFromNonAccount() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+
+ std::shared_ptr<RosterPayload> payload(new RosterPayload());
+ payload->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ IQ::ref request = IQ::createRequest(IQ::Set, JID(), "eou", payload);
+ request->setFrom(jid2_);
+ channel_->onIQReceived(request);
+
+ CPPUNIT_ASSERT_EQUAL(None, handler_->getLastEvent());
+ }
+
+ void testModify() {
+ XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
+ std::shared_ptr<RosterPayload> payload1(new RosterPayload());
+ payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload2(new RosterPayload());
+ payload2->addItem(RosterItemPayload(jid1_, "Bob2", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
+
+ CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+
+ CPPUNIT_ASSERT_EQUAL(std::string("Bob2"), xmppRoster_->getNameForJID(jid1_));
+ }
+
+ void testRemove() {
+ XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
+ std::shared_ptr<RosterPayload> payload1(new RosterPayload());
+ payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload2(new RosterPayload());
+ payload2->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
+ CPPUNIT_ASSERT(!xmppRoster_->containsJID(jid1_));
+ CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+
+ }
+
+ void testRemove_RosterStorageUpdated() {
+ std::shared_ptr<XMPPRosterController> testling(createController());
+ testling->setUseVersioning(true);
+ std::shared_ptr<RosterPayload> storedRoster(new RosterPayload());
+ storedRoster->setVersion("version10");
+ storedRoster->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ storedRoster->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
+ rosterStorage_->setRoster(storedRoster);
+ testling->requestRoster();
+ channel_->onIQReceived(IQ::createResult("foo@bar.com", channel_->sentStanzas[0]->getID(), std::shared_ptr<RosterPayload>()));
+
+ std::shared_ptr<RosterPayload> payload2(new RosterPayload());
+ payload2->setVersion("version15");
+ payload2->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
+
+ CPPUNIT_ASSERT(rosterStorage_->getRoster());
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT_EQUAL(std::string("version15"), *rosterStorage_->getRoster()->getVersion());
+ CPPUNIT_ASSERT(!rosterStorage_->getRoster()->getItem(jid1_));
+ CPPUNIT_ASSERT(rosterStorage_->getRoster()->getItem(jid2_));
+ }
+
+ void testMany() {
+ XMPPRosterController controller(router_, xmppRoster_, rosterStorage_);
+ std::shared_ptr<RosterPayload> payload1(new RosterPayload());
+ payload1->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id1", payload1));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload2(new RosterPayload());
+ payload2->addItem(RosterItemPayload(jid2_, "Alice", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id2", payload2));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload3(new RosterPayload());
+ payload3->addItem(RosterItemPayload(jid1_, "Ernie", RosterItemPayload::Both));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id3", payload3));
+
+ CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload4(new RosterPayload());
+ RosterItemPayload item(jid3_, "Jane", RosterItemPayload::Both);
+ std::string janesGroup("Jane's Group");
+ item.addGroup(janesGroup);
+ payload4->addItem(item);
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id4", payload4));
+
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid3_).size());
+ CPPUNIT_ASSERT_EQUAL(janesGroup, xmppRoster_->getGroupsForJID(jid3_)[0]);
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload5(new RosterPayload());
+ payload5->addItem(RosterItemPayload(jid1_, "Bob", RosterItemPayload::Remove));
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id5", payload5));
+ CPPUNIT_ASSERT(!xmppRoster_->containsJID(jid1_));
+ CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+
+ std::shared_ptr<RosterPayload> payload6(new RosterPayload());
+ RosterItemPayload item2(jid2_, "Little Alice", RosterItemPayload::Both);
+ std::string alicesGroup("Alice's Group");
+ item2.addGroup(alicesGroup);
+ payload6->addItem(item2);
+ channel_->onIQReceived(IQ::createRequest(IQ::Set, JID(), "id6", payload6));
+ CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("Little Alice"), xmppRoster_->getNameForJID(jid2_));
+ CPPUNIT_ASSERT_EQUAL(std::string("Jane"), xmppRoster_->getNameForJID(jid3_));
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid2_).size());
+ CPPUNIT_ASSERT_EQUAL(alicesGroup, xmppRoster_->getGroupsForJID(jid2_)[0]);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xmppRoster_->getGroupsForJID(jid3_).size());
+ CPPUNIT_ASSERT_EQUAL(janesGroup, xmppRoster_->getGroupsForJID(jid3_)[0]);
+ handler_->reset();
+
+ }
+
+ private:
+ XMPPRosterController* createController() {
+ return new XMPPRosterController(router_, xmppRoster_, rosterStorage_);
+ }
+
+ private:
+ DummyStanzaChannel* channel_;
+ IQRouter* router_;
+ XMPPRosterImpl* xmppRoster_;
+ XMPPRosterSignalHandler* handler_;
+ RosterMemoryStorage* rosterStorage_;
+ JID jid1_;
+ JID jid2_;
+ JID jid3_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterControllerTest);
diff --git a/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp
index 2615db1..73e76d3 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp
@@ -1,112 +1,108 @@
/*
- * Copyright (c) 2010-2011 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <memory>
+
+#include <boost/bind.hpp>
+
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <boost/shared_ptr.hpp>
-#include <boost/bind.hpp>
#include <Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h>
#include <Swiften/Roster/XMPPRosterImpl.h>
-
using namespace Swift;
class XMPPRosterImplTest : public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(XMPPRosterImplTest);
- CPPUNIT_TEST(testJIDAdded);
- CPPUNIT_TEST(testJIDRemoved);
- CPPUNIT_TEST(testJIDUpdated);
- CPPUNIT_TEST_SUITE_END();
-
- public:
- void setUp() {
- jid1_ = JID("a@b.c");
- jid2_ = JID("b@c.d");
- jid3_ = JID("c@d.e");
- roster_ = new XMPPRosterImpl();
- handler_ = new XMPPRosterSignalHandler(roster_);
- groups1_.push_back("bobs");
- groups1_.push_back("berts");
- groups2_.push_back("ernies");
- }
+ CPPUNIT_TEST_SUITE(XMPPRosterImplTest);
+ CPPUNIT_TEST(testJIDAdded);
+ CPPUNIT_TEST(testJIDRemoved);
+ CPPUNIT_TEST(testJIDUpdated);
+ CPPUNIT_TEST_SUITE_END();
- void tearDown() {
- delete handler_;
- delete roster_;
- }
+ public:
+ void setUp() {
+ jid1_ = JID("a@b.c");
+ jid2_ = JID("b@c.d");
+ jid3_ = JID("c@d.e");
+ roster_ = std::unique_ptr<XMPPRosterImpl>(new XMPPRosterImpl());
+ handler_ = std::unique_ptr<XMPPRosterSignalHandler>(new XMPPRosterSignalHandler(roster_.get()));
+ groups1_.push_back("bobs");
+ groups1_.push_back("berts");
+ groups2_.push_back("ernies");
+ }
- void testJIDAdded() {
- roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
- CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
- handler_->reset();
- roster_->addContact(jid2_, "NameTwo", groups1_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NameTwo"), roster_->getNameForJID(jid2_));
- CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
- CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid2_));
- CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
- handler_->reset();
- roster_->addContact(jid3_, "NewName", groups2_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid3_));
- CPPUNIT_ASSERT(groups2_ == roster_->getGroupsForJID(jid3_));
- }
+ void testJIDAdded() {
+ roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
+ CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
+ handler_->reset();
+ roster_->addContact(jid2_, "NameTwo", groups1_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NameTwo"), roster_->getNameForJID(jid2_));
+ CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
+ CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid2_));
+ CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
+ handler_->reset();
+ roster_->addContact(jid3_, "NewName", groups2_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid3_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid3_));
+ CPPUNIT_ASSERT(groups2_ == roster_->getGroupsForJID(jid3_));
+ }
- void testJIDRemoved() {
- roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
- handler_->reset();
- roster_->removeContact(jid1_);
- CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- handler_->reset();
- roster_->addContact(jid1_, "NewName2", groups1_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NewName2"), roster_->getNameForJID(jid1_));
- roster_->addContact(jid2_, "NewName3", groups1_, RosterItemPayload::Both);
- handler_->reset();
- roster_->removeContact(jid2_);
- CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
- handler_->reset();
- roster_->removeContact(jid1_);
- CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- }
+ void testJIDRemoved() {
+ roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
+ handler_->reset();
+ roster_->removeContact(jid1_);
+ CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ handler_->reset();
+ roster_->addContact(jid1_, "NewName2", groups1_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NewName2"), roster_->getNameForJID(jid1_));
+ roster_->addContact(jid2_, "NewName3", groups1_, RosterItemPayload::Both);
+ handler_->reset();
+ roster_->removeContact(jid2_);
+ CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid2_, handler_->getLastJID());
+ handler_->reset();
+ roster_->removeContact(jid1_);
+ CPPUNIT_ASSERT_EQUAL(Remove, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ }
- void testJIDUpdated() {
- roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
- CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
- handler_->reset();
- roster_->addContact(jid1_, "NameTwo", groups2_, RosterItemPayload::Both);
- CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
- CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
- CPPUNIT_ASSERT_EQUAL(std::string("NameTwo"), roster_->getNameForJID(jid1_));
- CPPUNIT_ASSERT(groups2_ == roster_->getGroupsForJID(jid1_));
- }
+ void testJIDUpdated() {
+ roster_->addContact(jid1_, "NewName", groups1_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Add, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NewName"), roster_->getNameForJID(jid1_));
+ CPPUNIT_ASSERT(groups1_ == roster_->getGroupsForJID(jid1_));
+ handler_->reset();
+ roster_->addContact(jid1_, "NameTwo", groups2_, RosterItemPayload::Both);
+ CPPUNIT_ASSERT_EQUAL(Update, handler_->getLastEvent());
+ CPPUNIT_ASSERT_EQUAL(jid1_, handler_->getLastJID());
+ CPPUNIT_ASSERT_EQUAL(std::string("NameTwo"), roster_->getNameForJID(jid1_));
+ CPPUNIT_ASSERT(groups2_ == roster_->getGroupsForJID(jid1_));
+ }
- private:
- XMPPRosterImpl* roster_;
- XMPPRosterSignalHandler* handler_;
- JID jid1_;
- JID jid2_;
- JID jid3_;
- std::vector<std::string> groups1_;
- std::vector<std::string> groups2_;
+ private:
+ std::unique_ptr<XMPPRosterImpl> roster_;
+ std::unique_ptr<XMPPRosterSignalHandler> handler_;
+ JID jid1_;
+ JID jid2_;
+ JID jid3_;
+ std::vector<std::string> groups1_;
+ std::vector<std::string> groups2_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterImplTest);
diff --git a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp
index 76aa690..add34a0 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.cpp
@@ -1,28 +1,29 @@
/*
- * Copyright (c) 2010-2011 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h>
-#include <boost/bind.hpp>
#include <cassert>
+#include <boost/bind.hpp>
+
using namespace Swift;
XMPPRosterSignalHandler::XMPPRosterSignalHandler(Swift::XMPPRoster* roster) : eventCount(0) {
- lastEvent_ = None;
- roster->onJIDAdded.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDAdded, this, _1));
- roster->onJIDRemoved.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDRemoved, this, _1));
- roster->onJIDUpdated.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDUpdated, this, _1, _2, _3));
+ lastEvent_ = None;
+ roster->onJIDAdded.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDAdded, this, _1));
+ roster->onJIDRemoved.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDRemoved, this, _1));
+ roster->onJIDUpdated.connect(boost::bind(&XMPPRosterSignalHandler::handleJIDUpdated, this, _1, _2, _3));
}
void XMPPRosterSignalHandler::handleJIDUpdated(const Swift::JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups) {
- assert(lastEvent_ == None);
- lastJID_ = jid;
- lastOldName_ = oldName;
- lastOldGroups_ = oldGroups;
- lastEvent_ = Update;
- eventCount++;
+ assert(lastEvent_ == None);
+ lastJID_ = jid;
+ lastOldName_ = oldName;
+ lastOldGroups_ = oldGroups;
+ lastEvent_ = Update;
+ eventCount++;
}
diff --git a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
index f55e749..0535578 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
+++ b/Swiften/Roster/UnitTest/XMPPRosterSignalHandler.h
@@ -1,12 +1,12 @@
/*
- * Copyright (c) 2010-2011 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <boost/shared_ptr.hpp>
+#include <memory>
#include <vector>
#include <Swiften/Roster/XMPPRosterImpl.h>
@@ -15,50 +15,50 @@ enum XMPPRosterEvents {None, Add, Remove, Update};
class XMPPRosterSignalHandler {
public:
- XMPPRosterSignalHandler(Swift::XMPPRoster* roster);
+ XMPPRosterSignalHandler(Swift::XMPPRoster* roster);
- XMPPRosterEvents getLastEvent() {
- return lastEvent_;
- }
+ XMPPRosterEvents getLastEvent() {
+ return lastEvent_;
+ }
- Swift::JID getLastJID() {
- return lastJID_;
- }
+ Swift::JID getLastJID() {
+ return lastJID_;
+ }
- std::string getLastOldName() {
- return lastOldName_;
- }
+ std::string getLastOldName() {
+ return lastOldName_;
+ }
- std::vector<std::string> getLastOldGroups() {
- return lastOldGroups_;
- }
+ std::vector<std::string> getLastOldGroups() {
+ return lastOldGroups_;
+ }
- void reset() {
- lastEvent_ = None;
- }
+ void reset() {
+ lastEvent_ = None;
+ }
- int getEventCount() const {
- return eventCount;
- }
+ int getEventCount() const {
+ return eventCount;
+ }
private:
- void handleJIDAdded(const Swift::JID& jid) {
- lastJID_ = jid;
- lastEvent_ = Add;
- eventCount++;
- }
+ void handleJIDAdded(const Swift::JID& jid) {
+ lastJID_ = jid;
+ lastEvent_ = Add;
+ eventCount++;
+ }
- void handleJIDRemoved(const Swift::JID& jid) {
- lastJID_ = jid;
- lastEvent_ = Remove;
- eventCount++;
- }
+ void handleJIDRemoved(const Swift::JID& jid) {
+ lastJID_ = jid;
+ lastEvent_ = Remove;
+ eventCount++;
+ }
- void handleJIDUpdated(const Swift::JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups);
+ void handleJIDUpdated(const Swift::JID& jid, const std::string& oldName, const std::vector<std::string>& oldGroups);
- XMPPRosterEvents lastEvent_;
- Swift::JID lastJID_;
- std::string lastOldName_;
- std::vector<std::string> lastOldGroups_;
- int eventCount;
+ XMPPRosterEvents lastEvent_;
+ Swift::JID lastJID_;
+ std::string lastOldName_;
+ std::vector<std::string> lastOldGroups_;
+ int eventCount;
};
diff --git a/Swiften/Roster/XMPPRoster.h b/Swiften/Roster/XMPPRoster.h
index d454516..ae2dbc7 100644
--- a/Swiften/Roster/XMPPRoster.h
+++ b/Swiften/Roster/XMPPRoster.h
@@ -1,97 +1,98 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <boost/optional.hpp>
-#include <vector>
#include <set>
-#include <Swiften/Base/boost_bsignals.h>
-
#include <string>
+#include <vector>
+
+#include <boost/optional.hpp>
+#include <boost/signals2.hpp>
+
#include <Swiften/Base/API.h>
-#include <Swiften/JID/JID.h>
#include <Swiften/Elements/RosterItemPayload.h>
+#include <Swiften/JID/JID.h>
#include <Swiften/Roster/XMPPRosterItem.h>
namespace Swift {
- /**
- * This class represents the roster of an account, as stored on the XMPP server.
- *
- * Changes to the roster (either due to subscription requests or by going online/offline) are
- * emitted through signals.
- */
- class SWIFTEN_API XMPPRoster {
- public:
- XMPPRoster();
- virtual ~XMPPRoster();
-
- /**
- * Checks whether the bare jid of the given jid is in the roster.
- */
- virtual bool containsJID(const JID& jid) = 0;
-
- /**
- * Retrieves the subscription state for the given jid.
- */
- virtual RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid) = 0;
-
- /**
- * Retrieves the stored roster name for the given jid.
- */
- virtual std::string getNameForJID(const JID& jid) const = 0;
-
- /**
- * Returns the list of groups for the given JID.
- */
- virtual std::vector<std::string> getGroupsForJID(const JID& jid) = 0;
-
- /**
- * Retrieve the items in the roster.
- */
- virtual std::vector<XMPPRosterItem> getItems() const = 0;
-
- /**
- * Retrieve the item with the given JID.
- */
- virtual boost::optional<XMPPRosterItem> getItem(const JID&) const = 0;
-
- /**
- * Retrieve the list of (existing) groups.
- */
- virtual std::set<std::string> getGroups() const = 0;
-
- public:
- /**
- * Emitted when the given JID is added to the roster.
- */
- boost::signal<void (const JID&)> onJIDAdded;
-
- /**
- * Emitted when the given JID is removed from the roster.
- */
- boost::signal<void (const JID&)> onJIDRemoved;
-
- /**
- * Emitted when the name or the groups of the roster item with the
- * given JID changes.
- */
- boost::signal<void (const JID&, const std::string&, const std::vector<std::string>&)> onJIDUpdated;
-
- /**
- * Emitted when the roster is reset (e.g. due to logging in/logging out).
- * After this signal is emitted, the roster is empty. It will be repopulated through
- * onJIDAdded and onJIDRemoved events.
- */
- boost::signal<void ()> onRosterCleared;
-
- /**
- * Emitted after the last contact of the initial roster request response
- * was added.
- */
- boost::signal<void ()> onInitialRosterPopulated;
- };
+ /**
+ * This class represents the roster of an account, as stored on the XMPP server.
+ *
+ * Changes to the roster (either due to subscription requests or by going online/offline) are
+ * emitted through signals.
+ */
+ class SWIFTEN_API XMPPRoster {
+ public:
+ XMPPRoster();
+ virtual ~XMPPRoster();
+
+ /**
+ * Checks whether the bare jid of the given jid is in the roster.
+ */
+ virtual bool containsJID(const JID& jid) = 0;
+
+ /**
+ * Retrieves the subscription state for the given jid.
+ */
+ virtual RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid) = 0;
+
+ /**
+ * Retrieves the stored roster name for the given jid.
+ */
+ virtual std::string getNameForJID(const JID& jid) const = 0;
+
+ /**
+ * Returns the list of groups for the given JID.
+ */
+ virtual std::vector<std::string> getGroupsForJID(const JID& jid) = 0;
+
+ /**
+ * Retrieve the items in the roster.
+ */
+ virtual std::vector<XMPPRosterItem> getItems() const = 0;
+
+ /**
+ * Retrieve the item with the given JID.
+ */
+ virtual boost::optional<XMPPRosterItem> getItem(const JID&) const = 0;
+
+ /**
+ * Retrieve the list of (existing) groups.
+ */
+ virtual std::set<std::string> getGroups() const = 0;
+
+ public:
+ /**
+ * Emitted when the given JID is added to the roster.
+ */
+ boost::signals2::signal<void (const JID&)> onJIDAdded;
+
+ /**
+ * Emitted when the given JID is removed from the roster.
+ */
+ boost::signals2::signal<void (const JID&)> onJIDRemoved;
+
+ /**
+ * Emitted when the name or the groups of the roster item with the
+ * given JID changes.
+ */
+ boost::signals2::signal<void (const JID&, const std::string&, const std::vector<std::string>&)> onJIDUpdated;
+
+ /**
+ * Emitted when the roster is reset (e.g. due to logging in/logging out).
+ * After this signal is emitted, the roster is empty. It will be repopulated through
+ * onJIDAdded and onJIDRemoved events.
+ */
+ boost::signals2::signal<void ()> onRosterCleared;
+
+ /**
+ * Emitted after the last contact of the initial roster request response
+ * was added.
+ */
+ boost::signals2::signal<void ()> onInitialRosterPopulated;
+ };
}
diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp
index e958628..8ee9755 100644
--- a/Swiften/Roster/XMPPRosterController.cpp
+++ b/Swiften/Roster/XMPPRosterController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,86 +7,85 @@
#include <Swiften/Roster/XMPPRosterController.h>
#include <boost/bind.hpp>
-#include <iostream>
-#include <Swiften/Base/foreach.h>
+#include <Swiften/Base/Log.h>
#include <Swiften/Elements/RosterItemPayload.h>
#include <Swiften/Queries/IQRouter.h>
#include <Swiften/Roster/GetRosterRequest.h>
-#include <Swiften/Roster/XMPPRosterImpl.h>
#include <Swiften/Roster/RosterStorage.h>
+#include <Swiften/Roster/XMPPRosterImpl.h>
namespace Swift {
-
+
/**
* The controller does not gain ownership of these parameters.
*/
XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, XMPPRosterImpl* xmppRoster, RosterStorage* rosterStorage) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster), rosterStorage_(rosterStorage), useVersioning(false) {
- rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, false, boost::shared_ptr<RosterPayload>()));
- rosterPushResponder_.start();
+ rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, false, std::shared_ptr<RosterPayload>()));
+ rosterPushResponder_.start();
}
XMPPRosterController::~XMPPRosterController() {
- rosterPushResponder_.stop();
+ rosterPushResponder_.stop();
}
void XMPPRosterController::requestRoster() {
- xmppRoster_->clear();
+ xmppRoster_->clear();
- boost::shared_ptr<RosterPayload> storedRoster = rosterStorage_->getRoster();
- GetRosterRequest::ref rosterRequest;
- if (useVersioning) {
- std::string version = "";
- if (storedRoster && storedRoster->getVersion()) {
- version = *storedRoster->getVersion();
- }
- rosterRequest = GetRosterRequest::create(iqRouter_, version);
- }
- else {
- rosterRequest = GetRosterRequest::create(iqRouter_);
- }
- rosterRequest->onResponse.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, true, storedRoster));
- rosterRequest->send();
+ std::shared_ptr<RosterPayload> storedRoster = rosterStorage_->getRoster();
+ GetRosterRequest::ref rosterRequest;
+ if (useVersioning) {
+ std::string version = "";
+ if (storedRoster && storedRoster->getVersion()) {
+ version = *storedRoster->getVersion();
+ }
+ rosterRequest = GetRosterRequest::create(iqRouter_, version);
+ }
+ else {
+ rosterRequest = GetRosterRequest::create(iqRouter_);
+ }
+ rosterRequest->onResponse.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, true, storedRoster));
+ rosterRequest->send();
}
-void XMPPRosterController::handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload, bool initial, boost::shared_ptr<RosterPayload> previousRoster) {
- if (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());
- }
- }
- }
- else if (previousRoster) {
- // The cached version hasn't changed; emit all items
- foreach(const RosterItemPayload& item, previousRoster->getItems()) {
- if (item.getSubscription() != RosterItemPayload::Remove) {
- xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
- }
- else {
- std::cerr << "ERROR: Stored invalid roster item" << std::endl;
- }
- }
- }
- if (initial) {
- xmppRoster_->onInitialRosterPopulated();
- }
- if (rosterPayload && rosterPayload->getVersion() && useVersioning) {
- saveRoster(*rosterPayload->getVersion());
- }
+void XMPPRosterController::handleRosterReceived(std::shared_ptr<RosterPayload> rosterPayload, bool initial, std::shared_ptr<RosterPayload> previousRoster) {
+ if (rosterPayload) {
+ for (const auto& 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());
+ }
+ }
+ }
+ else if (previousRoster) {
+ // The cached version hasn't changed; emit all items
+ for (const auto& item : previousRoster->getItems()) {
+ if (item.getSubscription() != RosterItemPayload::Remove) {
+ xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
+ }
+ else {
+ SWIFT_LOG(error) << "Stored invalid roster item" << std::endl;
+ }
+ }
+ }
+ if (initial) {
+ xmppRoster_->onInitialRosterPopulated();
+ }
+ if (rosterPayload && rosterPayload->getVersion() && useVersioning) {
+ saveRoster(*rosterPayload->getVersion());
+ }
}
void XMPPRosterController::saveRoster(const std::string& version) {
- std::vector<XMPPRosterItem> items = xmppRoster_->getItems();
- boost::shared_ptr<RosterPayload> roster(new RosterPayload());
- roster->setVersion(version);
- foreach(const XMPPRosterItem& item, items) {
- roster->addItem(RosterItemPayload(item.getJID(), item.getName(), item.getSubscription(), item.getGroups()));
- }
- rosterStorage_->setRoster(roster);
+ std::vector<XMPPRosterItem> items = xmppRoster_->getItems();
+ std::shared_ptr<RosterPayload> roster(new RosterPayload());
+ roster->setVersion(version);
+ for (const auto& item : items) {
+ roster->addItem(RosterItemPayload(item.getJID(), item.getName(), item.getSubscription(), item.getGroups()));
+ }
+ rosterStorage_->setRoster(roster);
}
}
diff --git a/Swiften/Roster/XMPPRosterController.h b/Swiften/Roster/XMPPRosterController.h
index 90b1304..f952c60 100644
--- a/Swiften/Roster/XMPPRosterController.h
+++ b/Swiften/Roster/XMPPRosterController.h
@@ -1,47 +1,48 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <boost/shared_ptr.hpp>
+#include <memory>
+#include <string>
+
+#include <boost/signals2.hpp>
#include <Swiften/Base/API.h>
-#include <Swiften/JID/JID.h>
-#include <string>
#include <Swiften/Elements/IQ.h>
#include <Swiften/Elements/RosterPayload.h>
+#include <Swiften/JID/JID.h>
#include <Swiften/Roster/RosterPushResponder.h>
-#include <Swiften/Base/boost_bsignals.h>
namespace Swift {
- class IQRouter;
- class XMPPRosterImpl;
- class RosterStorage;
-
- class SWIFTEN_API XMPPRosterController {
- public:
- XMPPRosterController(IQRouter *iqRouter, XMPPRosterImpl* xmppRoster, RosterStorage* storage);
- ~XMPPRosterController();
-
- void requestRoster();
-
- void setUseVersioning(bool b) {
- useVersioning = b;
- }
-
- private:
- void handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload, bool initial, boost::shared_ptr<RosterPayload> previousRoster);
- void saveRoster(const std::string& version);
-
- private:
- IQRouter* iqRouter_;
- RosterPushResponder rosterPushResponder_;
- XMPPRosterImpl* xmppRoster_;
- RosterStorage* rosterStorage_;
- bool useVersioning;
- };
+ class IQRouter;
+ class XMPPRosterImpl;
+ class RosterStorage;
+
+ class SWIFTEN_API XMPPRosterController {
+ public:
+ XMPPRosterController(IQRouter *iqRouter, XMPPRosterImpl* xmppRoster, RosterStorage* storage);
+ ~XMPPRosterController();
+
+ void requestRoster();
+
+ void setUseVersioning(bool b) {
+ useVersioning = b;
+ }
+
+ private:
+ void handleRosterReceived(std::shared_ptr<RosterPayload> rosterPayload, bool initial, std::shared_ptr<RosterPayload> previousRoster);
+ void saveRoster(const std::string& version);
+
+ private:
+ IQRouter* iqRouter_;
+ RosterPushResponder rosterPushResponder_;
+ XMPPRosterImpl* xmppRoster_;
+ RosterStorage* rosterStorage_;
+ bool useVersioning;
+ };
}
diff --git a/Swiften/Roster/XMPPRosterImpl.cpp b/Swiften/Roster/XMPPRosterImpl.cpp
index 96b9949..74f634f 100644
--- a/Swiften/Roster/XMPPRosterImpl.cpp
+++ b/Swiften/Roster/XMPPRosterImpl.cpp
@@ -1,13 +1,11 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/Roster/XMPPRosterImpl.h>
-#include <Swiften/Base/foreach.h>
-
namespace Swift {
XMPPRosterImpl::XMPPRosterImpl() {
@@ -18,89 +16,89 @@ XMPPRosterImpl::~XMPPRosterImpl() {
}
void XMPPRosterImpl::addContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription) {
- JID bareJID(jid.toBare());
- std::map<JID, XMPPRosterItem>::iterator i = entries_.find(bareJID);
- if (i != entries_.end()) {
- std::string oldName = i->second.getName();
- std::vector<std::string> oldGroups = i->second.getGroups();
- i->second = XMPPRosterItem(jid, name, groups, subscription);
- onJIDUpdated(bareJID, oldName, oldGroups);
- }
- else {
- entries_.insert(std::make_pair(bareJID, XMPPRosterItem(jid, name, groups, subscription)));
- onJIDAdded(bareJID);
- }
+ JID bareJID(jid.toBare());
+ std::map<JID, XMPPRosterItem>::iterator i = entries_.find(bareJID);
+ if (i != entries_.end()) {
+ std::string oldName = i->second.getName();
+ std::vector<std::string> oldGroups = i->second.getGroups();
+ i->second = XMPPRosterItem(jid, name, groups, subscription);
+ onJIDUpdated(bareJID, oldName, oldGroups);
+ }
+ else {
+ entries_.insert(std::make_pair(bareJID, XMPPRosterItem(jid, name, groups, subscription)));
+ onJIDAdded(bareJID);
+ }
}
void XMPPRosterImpl::removeContact(const JID& jid) {
- entries_.erase(JID(jid.toBare()));
- onJIDRemoved(jid);
+ entries_.erase(JID(jid.toBare()));
+ onJIDRemoved(jid);
}
void XMPPRosterImpl::clear() {
- entries_.clear();
- onRosterCleared();
+ entries_.clear();
+ onRosterCleared();
}
bool XMPPRosterImpl::containsJID(const JID& jid) {
- return entries_.find(JID(jid.toBare())) != entries_.end();
+ return entries_.find(JID(jid.toBare())) != entries_.end();
}
std::string XMPPRosterImpl::getNameForJID(const JID& jid) const {
- std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare());
- if (i != entries_.end()) {
- return i->second.getName();
- }
- else {
- return "";
- }
+ std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare());
+ if (i != entries_.end()) {
+ return i->second.getName();
+ }
+ else {
+ return "";
+ }
}
std::vector<std::string> XMPPRosterImpl::getGroupsForJID(const JID& jid) {
- std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare());
- if (i != entries_.end()) {
- return i->second.getGroups();
- }
- else {
- return std::vector<std::string>();
- }
+ std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare());
+ if (i != entries_.end()) {
+ return i->second.getGroups();
+ }
+ else {
+ return std::vector<std::string>();
+ }
}
RosterItemPayload::Subscription XMPPRosterImpl::getSubscriptionStateForJID(const JID& jid) {
- std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare());
- if (i != entries_.end()) {
- return i->second.getSubscription();
- }
- else {
- return RosterItemPayload::None;
- }
+ std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare());
+ if (i != entries_.end()) {
+ return i->second.getSubscription();
+ }
+ else {
+ return RosterItemPayload::None;
+ }
}
std::vector<XMPPRosterItem> XMPPRosterImpl::getItems() const {
- std::vector<XMPPRosterItem> result;
- foreach(const RosterMap::value_type& entry, entries_) {
- result.push_back(entry.second);
- }
- return result;
+ std::vector<XMPPRosterItem> result;
+ for (const auto& entry : entries_) {
+ result.push_back(entry.second);
+ }
+ return result;
}
boost::optional<XMPPRosterItem> XMPPRosterImpl::getItem(const JID& jid) const {
- std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare());
- if (i != entries_.end()) {
- return i->second;
- }
- else {
- return boost::optional<XMPPRosterItem>();
- }
+ std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare());
+ if (i != entries_.end()) {
+ return i->second;
+ }
+ else {
+ return boost::optional<XMPPRosterItem>();
+ }
}
std::set<std::string> XMPPRosterImpl::getGroups() const {
- std::set<std::string> result;
- foreach(const RosterMap::value_type& entry, entries_) {
- std::vector<std::string> groups = entry.second.getGroups();
- result.insert(groups.begin(), groups.end());
- }
- return result;
+ std::set<std::string> result;
+ for (const auto& entry : entries_) {
+ std::vector<std::string> groups = entry.second.getGroups();
+ result.insert(groups.begin(), groups.end());
+ }
+ return result;
}
}
diff --git a/Swiften/Roster/XMPPRosterImpl.h b/Swiften/Roster/XMPPRosterImpl.h
index 284b18a..28e3919 100644
--- a/Swiften/Roster/XMPPRosterImpl.h
+++ b/Swiften/Roster/XMPPRosterImpl.h
@@ -13,26 +13,26 @@
#include <Swiften/Roster/XMPPRoster.h>
namespace Swift {
- class SWIFTEN_API XMPPRosterImpl : public XMPPRoster {
- public:
- XMPPRosterImpl();
- virtual ~XMPPRosterImpl();
-
- void addContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription);
- void removeContact(const JID& jid);
- void clear();
-
- bool containsJID(const JID& jid);
- RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid);
- std::string getNameForJID(const JID& jid) const;
- std::vector<std::string> getGroupsForJID(const JID& jid);
-
- virtual std::vector<XMPPRosterItem> getItems() const;
- virtual boost::optional<XMPPRosterItem> getItem(const JID&) const;
- virtual std::set<std::string> getGroups() const;
-
- private:
- typedef std::map<JID, XMPPRosterItem> RosterMap;
- RosterMap entries_;
- };
+ class SWIFTEN_API XMPPRosterImpl : public XMPPRoster {
+ public:
+ XMPPRosterImpl();
+ virtual ~XMPPRosterImpl();
+
+ void addContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription);
+ void removeContact(const JID& jid);
+ void clear();
+
+ bool containsJID(const JID& jid);
+ RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid);
+ std::string getNameForJID(const JID& jid) const;
+ std::vector<std::string> getGroupsForJID(const JID& jid);
+
+ virtual std::vector<XMPPRosterItem> getItems() const;
+ virtual boost::optional<XMPPRosterItem> getItem(const JID&) const;
+ virtual std::set<std::string> getGroups() const;
+
+ private:
+ typedef std::map<JID, XMPPRosterItem> RosterMap;
+ RosterMap entries_;
+ };
}
diff --git a/Swiften/Roster/XMPPRosterItem.h b/Swiften/Roster/XMPPRosterItem.h
index 3ea11ce..53b3781 100644
--- a/Swiften/Roster/XMPPRosterItem.h
+++ b/Swiften/Roster/XMPPRosterItem.h
@@ -1,54 +1,53 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-
-#include <vector>
#include <string>
+#include <vector>
#include <Swiften/Base/API.h>
-#include <Swiften/JID/JID.h>
#include <Swiften/Elements/RosterItemPayload.h>
+#include <Swiften/JID/JID.h>
namespace Swift {
- class SWIFTEN_API XMPPRosterItem {
- public:
- XMPPRosterItem(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription) : jid(jid), name(name), groups(groups), subscription(subscription) {
- }
-
- const JID& getJID() const {
- return jid;
- }
-
- const std::string& getName() const {
- return name;
- }
-
- void setName(const std::string& name) {
- this->name = name;
- }
-
- const std::vector<std::string>& getGroups() const {
- return groups;
- }
-
- void setGroups(const std::vector<std::string>& groups) {
- this->groups = groups;
- }
-
- RosterItemPayload::Subscription getSubscription() const {
- return subscription;
- }
-
- private:
- JID jid;
- std::string name;
- std::vector<std::string> groups;
- RosterItemPayload::Subscription subscription;
- };
+ class SWIFTEN_API XMPPRosterItem {
+ public:
+ XMPPRosterItem(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription) : jid(jid), name(name), groups(groups), subscription(subscription) {
+ }
+
+ const JID& getJID() const {
+ return jid;
+ }
+
+ const std::string& getName() const {
+ return name;
+ }
+
+ void setName(const std::string& name) {
+ this->name = name;
+ }
+
+ const std::vector<std::string>& getGroups() const {
+ return groups;
+ }
+
+ void setGroups(const std::vector<std::string>& groups) {
+ this->groups = groups;
+ }
+
+ RosterItemPayload::Subscription getSubscription() const {
+ return subscription;
+ }
+
+ private:
+ JID jid;
+ std::string name;
+ std::vector<std::string> groups;
+ RosterItemPayload::Subscription subscription;
+ };
}