summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-10-24 12:10:44 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-10-24 12:15:24 (GMT)
commitb107bdd08df9ae3a978ad8f966a26eb8d551bd13 (patch)
treead1c4d6550f323a19dffd699c98513aa68acddaf /Swiften
parentcfa314bd0b6f6ed9285c7167948899184f6a8c12 (diff)
downloadswift-b107bdd08df9ae3a978ad8f966a26eb8d551bd13.zip
swift-b107bdd08df9ae3a978ad8f966a26eb8d551bd13.tar.bz2
Creating abstract XMPPRoster base class.
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/Client/Client.cpp8
-rw-r--r--Swiften/Client/Client.h7
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp6
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp (renamed from Swiften/Roster/UnitTest/XMPPRosterTest.cpp)15
-rw-r--r--Swiften/Roster/XMPPRoster.cpp51
-rw-r--r--Swiften/Roster/XMPPRoster.h61
-rw-r--r--Swiften/Roster/XMPPRosterController.cpp4
-rw-r--r--Swiften/Roster/XMPPRosterController.h6
-rw-r--r--Swiften/Roster/XMPPRosterImpl.cpp68
-rw-r--r--Swiften/Roster/XMPPRosterImpl.h36
-rw-r--r--Swiften/SConscript3
11 files changed, 175 insertions, 90 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 20a0c47..f1ca207 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -7,7 +7,7 @@
#include "Swiften/Client/Client.h"
#include "Swiften/Queries/Responders/SoftwareVersionResponder.h"
-#include "Swiften/Roster/XMPPRoster.h"
+#include "Swiften/Roster/XMPPRosterImpl.h"
#include "Swiften/Roster/XMPPRosterController.h"
#include "Swiften/Presence/PresenceOracle.h"
@@ -17,7 +17,7 @@ Client::Client(const JID& jid, const String& password) : CoreClient(jid, passwor
softwareVersionResponder = new SoftwareVersionResponder(getIQRouter());
softwareVersionResponder->start();
- roster = new XMPPRoster();
+ roster = new XMPPRosterImpl();
rosterController = new XMPPRosterController(getIQRouter(), roster);
presenceOracle = new PresenceOracle(getStanzaChannel());
@@ -35,6 +35,10 @@ Client::~Client() {
delete softwareVersionResponder;
}
+XMPPRoster* Client::getRoster() const {
+ return roster;
+}
+
void Client::setSoftwareVersion(const String& name, const String& version) {
softwareVersionResponder->setVersion(name, version);
}
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index bf19f2f..4de630c 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -11,6 +11,7 @@
namespace Swift {
class SoftwareVersionResponder;
class XMPPRoster;
+ class XMPPRosterImpl;
class XMPPRosterController;
class PresenceOracle;
@@ -46,9 +47,7 @@ namespace Swift {
*
* \see requestRoster()
*/
- XMPPRoster* getRoster() const {
- return roster;
- }
+ XMPPRoster* getRoster() const;
/**
* Requests the roster from the server.
@@ -84,7 +83,7 @@ namespace Swift {
private:
SoftwareVersionResponder* softwareVersionResponder;
- XMPPRoster* roster;
+ XMPPRosterImpl* roster;
XMPPRosterController* rosterController;
PresenceOracle* presenceOracle;
};
diff --git a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
index 33fc04a..17c5527 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
@@ -13,7 +13,7 @@
#include "Swiften/Elements/RosterPayload.h"
#include "Swiften/Queries/DummyIQChannel.h"
#include "Swiften/Queries/IQRouter.h"
-#include "Swiften/Roster/XMPPRoster.h"
+#include "Swiften/Roster/XMPPRosterImpl.h"
using namespace Swift;
@@ -31,7 +31,7 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture
void setUp() {
channel_ = new DummyIQChannel();
router_ = new IQRouter(channel_);
- xmppRoster_ = new XMPPRoster();
+ xmppRoster_ = new XMPPRosterImpl();
}
void tearDown() {
@@ -79,7 +79,7 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture
private:
DummyIQChannel* channel_;
IQRouter* router_;
- XMPPRoster* xmppRoster_;
+ XMPPRosterImpl* xmppRoster_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterControllerTest);
diff --git a/Swiften/Roster/UnitTest/XMPPRosterTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp
index 7e64d8c..fbc3430 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterTest.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterImplTest.cpp
@@ -11,7 +11,7 @@
#include <vector>
-#include "Swiften/Roster/XMPPRoster.h"
+#include "Swiften/Roster/XMPPRosterImpl.h"
using namespace Swift;
@@ -73,16 +73,16 @@ private:
};
-class XMPPRosterTest : public CppUnit::TestFixture
+class XMPPRosterImplTest : public CppUnit::TestFixture
{
- CPPUNIT_TEST_SUITE(XMPPRosterTest);
+ CPPUNIT_TEST_SUITE(XMPPRosterImplTest);
CPPUNIT_TEST(testJIDAdded);
CPPUNIT_TEST(testJIDRemoved);
CPPUNIT_TEST(testJIDUpdated);
CPPUNIT_TEST_SUITE_END();
private:
- XMPPRoster* roster_;
+ XMPPRosterImpl* roster_;
XMPPRosterSignalHandler* handler_;
JID jid1_;
JID jid2_;
@@ -92,11 +92,10 @@ class XMPPRosterTest : public CppUnit::TestFixture
public:
-
- XMPPRosterTest() : jid1_(JID("a@b.c")), jid2_(JID("b@c.d")), jid3_(JID("c@d.e")) {}
+ XMPPRosterImplTest() : jid1_(JID("a@b.c")), jid2_(JID("b@c.d")), jid3_(JID("c@d.e")) {}
void setUp() {
- roster_ = new XMPPRoster();
+ roster_ = new XMPPRosterImpl();
handler_ = new XMPPRosterSignalHandler(roster_);
groups1_.push_back("bobs");
groups1_.push_back("berts");
@@ -167,5 +166,5 @@ class XMPPRosterTest : public CppUnit::TestFixture
}
};
-CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterTest);
+CPPUNIT_TEST_SUITE_REGISTRATION(XMPPRosterImplTest);
diff --git a/Swiften/Roster/XMPPRoster.cpp b/Swiften/Roster/XMPPRoster.cpp
index 56616c2..61630b4 100644
--- a/Swiften/Roster/XMPPRoster.cpp
+++ b/Swiften/Roster/XMPPRoster.cpp
@@ -11,57 +11,8 @@ namespace Swift {
XMPPRoster::XMPPRoster() {
}
-void XMPPRoster::addContact(const JID& jid, const String& name, const std::vector<String>& groups, RosterItemPayload::Subscription subscription) {
- JID bareJID(jid.toBare());
- bool exists = containsJID(bareJID);
- String oldName = getNameForJID(bareJID);
- std::vector<String> oldGroups = entries_[bareJID].groups;
- if (exists) {
- entries_.erase(bareJID);
- }
- XMPPRosterItem item;
- item.groups = groups;
- item.name = name;
- item.jid = jid;
- item.subscription = subscription;
- entries_[bareJID] = item;
- if (exists) {
- onJIDUpdated(bareJID, oldName, oldGroups);
- } else {
- onJIDAdded(bareJID);
- }
-}
-
-void XMPPRoster::removeContact(const JID& jid) {
- entries_.erase(JID(jid.toBare()));
- onJIDRemoved(jid);
-}
-
-void XMPPRoster::clear() {
- entries_.clear();
- onRosterCleared();
-}
-
-bool XMPPRoster::containsJID(const JID& jid) {
- return entries_.find(JID(jid.toBare())) != entries_.end();
-}
-
-String XMPPRoster::getNameForJID(const JID& jid) const {
- std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare());
- if (i != entries_.end()) {
- return i->second.name;
- }
- else {
- return "";
- }
-}
-
-const std::vector<String>& XMPPRoster::getGroupsForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].groups;
-}
-RosterItemPayload::Subscription XMPPRoster::getSubscriptionStateForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].subscription;
+XMPPRoster::~XMPPRoster() {
}
}
diff --git a/Swiften/Roster/XMPPRoster.h b/Swiften/Roster/XMPPRoster.h
index abafdfe..b88148d 100644
--- a/Swiften/Roster/XMPPRoster.h
+++ b/Swiften/Roster/XMPPRoster.h
@@ -10,36 +10,63 @@
#include "Swiften/JID/JID.h"
#include "Swiften/Elements/RosterItemPayload.h"
-#include <map>
#include <vector>
#include "Swiften/Base/boost_bsignals.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 XMPPRoster {
public:
XMPPRoster();
+ virtual ~XMPPRoster();
- void addContact(const JID& jid, const String& name, const std::vector<String>& groups, const RosterItemPayload::Subscription subscription);
- void removeContact(const JID& jid);
- void clear();
+ /**
+ * Checks whether the bare jid of the given jid is in the roster.
+ */
+ virtual bool containsJID(const JID& jid) = 0;
- bool containsJID(const JID& jid);
- RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid);
- String getNameForJID(const JID& jid) const;
- const std::vector<String>& getGroupsForJID(const JID& jid);
+ /**
+ * 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 String getNameForJID(const JID& jid) const = 0;
+
+ /**
+ * Returns the list of groups for the given JID.
+ */
+ virtual const std::vector<String>& getGroupsForJID(const JID& jid) = 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 String&, const std::vector<String>&)> onJIDUpdated;
- boost::signal<void ()> onRosterCleared;
- private:
- struct XMPPRosterItem {
- JID jid;
- String name;
- std::vector<String> groups;
- RosterItemPayload::Subscription subscription;
- };
- std::map<JID, XMPPRosterItem> entries_;
+ /**
+ * 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;
};
}
diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp
index 024cb1d..75ab494 100644
--- a/Swiften/Roster/XMPPRosterController.cpp
+++ b/Swiften/Roster/XMPPRosterController.cpp
@@ -16,14 +16,14 @@
#include "Swiften/Roster/Roster.h"
#include "Swiften/Roster/SetPresence.h"
#include "Swiften/Roster/OfflineRosterFilter.h"
-#include "Swiften/Roster/XMPPRoster.h"
+#include "Swiften/Roster/XMPPRosterImpl.h"
namespace Swift {
/**
* The controller does not gain ownership of these parameters.
*/
-XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, XMPPRoster* xmppRoster) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster) {
+XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, XMPPRosterImpl* xmppRoster) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster) {
rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1));
rosterPushResponder_.start();
}
diff --git a/Swiften/Roster/XMPPRosterController.h b/Swiften/Roster/XMPPRosterController.h
index d846b86..dedf090 100644
--- a/Swiften/Roster/XMPPRosterController.h
+++ b/Swiften/Roster/XMPPRosterController.h
@@ -17,11 +17,11 @@
namespace Swift {
class IQRouter;
- class XMPPRoster;
+ class XMPPRosterImpl;
class XMPPRosterController {
public:
- XMPPRosterController(IQRouter *iqRouter, XMPPRoster* xmppRoster);
+ XMPPRosterController(IQRouter *iqRouter, XMPPRosterImpl* xmppRoster);
~XMPPRosterController();
void requestRoster();
@@ -31,7 +31,7 @@ namespace Swift {
private:
IQRouter* iqRouter_;
RosterPushResponder rosterPushResponder_;
- XMPPRoster* xmppRoster_;
+ XMPPRosterImpl* xmppRoster_;
};
}
diff --git a/Swiften/Roster/XMPPRosterImpl.cpp b/Swiften/Roster/XMPPRosterImpl.cpp
new file mode 100644
index 0000000..762ae29
--- /dev/null
+++ b/Swiften/Roster/XMPPRosterImpl.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/Roster/XMPPRosterImpl.h"
+
+namespace Swift {
+
+XMPPRosterImpl::XMPPRosterImpl() {
+}
+
+void XMPPRosterImpl::addContact(const JID& jid, const String& name, const std::vector<String>& groups, RosterItemPayload::Subscription subscription) {
+ JID bareJID(jid.toBare());
+ bool exists = containsJID(bareJID);
+ String oldName = getNameForJID(bareJID);
+ std::vector<String> oldGroups = entries_[bareJID].groups;
+ if (exists) {
+ entries_.erase(bareJID);
+ }
+ XMPPRosterItem item;
+ item.groups = groups;
+ item.name = name;
+ item.jid = jid;
+ item.subscription = subscription;
+ entries_[bareJID] = item;
+ if (exists) {
+ onJIDUpdated(bareJID, oldName, oldGroups);
+ } else {
+ onJIDAdded(bareJID);
+ }
+}
+
+void XMPPRosterImpl::removeContact(const JID& jid) {
+ entries_.erase(JID(jid.toBare()));
+ onJIDRemoved(jid);
+}
+
+void XMPPRosterImpl::clear() {
+ entries_.clear();
+ onRosterCleared();
+}
+
+bool XMPPRosterImpl::containsJID(const JID& jid) {
+ return entries_.find(JID(jid.toBare())) != entries_.end();
+}
+
+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.name;
+ }
+ else {
+ return "";
+ }
+}
+
+const std::vector<String>& XMPPRosterImpl::getGroupsForJID(const JID& jid) {
+ return entries_[JID(jid.toBare())].groups;
+}
+
+RosterItemPayload::Subscription XMPPRosterImpl::getSubscriptionStateForJID(const JID& jid) {
+ return entries_[JID(jid.toBare())].subscription;
+}
+
+}
+
diff --git a/Swiften/Roster/XMPPRosterImpl.h b/Swiften/Roster/XMPPRosterImpl.h
new file mode 100644
index 0000000..c2d2458
--- /dev/null
+++ b/Swiften/Roster/XMPPRosterImpl.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <map>
+
+#include "Swiften/Roster/XMPPRoster.h"
+
+namespace Swift {
+ class XMPPRosterImpl : public XMPPRoster {
+ public:
+ XMPPRosterImpl();
+
+ void addContact(const JID& jid, const String& name, const std::vector<String>& groups, const RosterItemPayload::Subscription subscription);
+ void removeContact(const JID& jid);
+ void clear();
+
+ bool containsJID(const JID& jid);
+ RosterItemPayload::Subscription getSubscriptionStateForJID(const JID& jid);
+ String getNameForJID(const JID& jid) const;
+ const std::vector<String>& getGroupsForJID(const JID& jid);
+
+ private:
+ struct XMPPRosterItem {
+ JID jid;
+ String name;
+ std::vector<String> groups;
+ RosterItemPayload::Subscription subscription;
+ };
+ std::map<JID, XMPPRosterItem> entries_;
+ };
+}
diff --git a/Swiften/SConscript b/Swiften/SConscript
index e96a868..12703fc 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -60,6 +60,7 @@ if env["SCONS_STAGE"] == "build" :
"Roster/RosterItem.cpp",
"Roster/Roster.cpp",
"Roster/XMPPRoster.cpp",
+ "Roster/XMPPRosterImpl.cpp",
"Roster/XMPPRosterController.cpp",
"Serializer/AuthRequestSerializer.cpp",
"Serializer/AuthSuccessSerializer.cpp",
@@ -222,7 +223,7 @@ if env["SCONS_STAGE"] == "build" :
File("Queries/UnitTest/ResponderTest.cpp"),
File("Roster/UnitTest/OfflineRosterFilterTest.cpp"),
File("Roster/UnitTest/RosterTest.cpp"),
- File("Roster/UnitTest/XMPPRosterTest.cpp"),
+ File("Roster/UnitTest/XMPPRosterImplTest.cpp"),
File("Roster/UnitTest/XMPPRosterControllerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PayloadsSerializer.cpp"),
File("Serializer/PayloadSerializers/UnitTest/CapsInfoSerializerTest.cpp"),