summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Roster')
-rw-r--r--Swiften/Roster/XMPPRoster.h26
-rw-r--r--Swiften/Roster/XMPPRosterImpl.cpp72
-rw-r--r--Swiften/Roster/XMPPRosterImpl.h16
-rw-r--r--Swiften/Roster/XMPPRosterItem.h53
4 files changed, 136 insertions, 31 deletions
diff --git a/Swiften/Roster/XMPPRoster.h b/Swiften/Roster/XMPPRoster.h
index b88148d..676e8f9 100644
--- a/Swiften/Roster/XMPPRoster.h
+++ b/Swiften/Roster/XMPPRoster.h
@@ -6,12 +6,15 @@
#pragma once
+#include <boost/optional.hpp>
+#include <vector>
+#include <set>
+#include "Swiften/Base/boost_bsignals.h"
+
#include "Swiften/Base/String.h"
#include "Swiften/JID/JID.h"
#include "Swiften/Elements/RosterItemPayload.h"
-
-#include <vector>
-#include "Swiften/Base/boost_bsignals.h"
+#include <Swiften/Roster/XMPPRosterItem.h>
namespace Swift {
/**
@@ -43,7 +46,22 @@ namespace Swift {
/**
* Returns the list of groups for the given JID.
*/
- virtual const std::vector<String>& getGroupsForJID(const JID& jid) = 0;
+ virtual std::vector<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<String> getGroups() const = 0;
public:
/**
diff --git a/Swiften/Roster/XMPPRosterImpl.cpp b/Swiften/Roster/XMPPRosterImpl.cpp
index 762ae29..3e9e312 100644
--- a/Swiften/Roster/XMPPRosterImpl.cpp
+++ b/Swiften/Roster/XMPPRosterImpl.cpp
@@ -4,7 +4,8 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
-#include "Swiften/Roster/XMPPRosterImpl.h"
+#include <Swiften/Roster/XMPPRosterImpl.h>
+#include <Swiften/Base/foreach.h>
namespace Swift {
@@ -13,21 +14,15 @@ 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) {
+ std::map<JID, XMPPRosterItem>::iterator i = entries_.find(bareJID);
+ if (i != entries_.end()) {
+ String oldName = i->second.getName();
+ std::vector<String> oldGroups = i->second.getGroups();
+ i->second = XMPPRosterItem(jid, name, groups, subscription);
onJIDUpdated(bareJID, oldName, oldGroups);
- } else {
+ }
+ else {
+ entries_.insert(std::make_pair(bareJID, XMPPRosterItem(jid, name, groups, subscription)));
onJIDAdded(bareJID);
}
}
@@ -49,19 +44,58 @@ bool XMPPRosterImpl::containsJID(const JID& jid) {
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;
+ return i->second.getName();
}
else {
return "";
}
}
-const std::vector<String>& XMPPRosterImpl::getGroupsForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].groups;
+std::vector<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<String>();
+ }
}
RosterItemPayload::Subscription XMPPRosterImpl::getSubscriptionStateForJID(const JID& jid) {
- return entries_[JID(jid.toBare())].subscription;
+ 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;
+}
+
+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::set<String> XMPPRosterImpl::getGroups() const {
+ std::set<String> result;
+ foreach(const RosterMap::value_type& entry, entries_) {
+ std::vector<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 c2d2458..f65683f 100644
--- a/Swiften/Roster/XMPPRosterImpl.h
+++ b/Swiften/Roster/XMPPRosterImpl.h
@@ -7,6 +7,7 @@
#pragma once
#include <map>
+#include <set>
#include "Swiften/Roster/XMPPRoster.h"
@@ -22,15 +23,14 @@ namespace Swift {
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);
+ std::vector<String> getGroupsForJID(const JID& jid);
+
+ virtual std::vector<XMPPRosterItem> getItems() const;
+ virtual boost::optional<XMPPRosterItem> getItem(const JID&) const;
+ virtual std::set<String> getGroups() const;
private:
- struct XMPPRosterItem {
- JID jid;
- String name;
- std::vector<String> groups;
- RosterItemPayload::Subscription subscription;
- };
- std::map<JID, XMPPRosterItem> entries_;
+ typedef std::map<JID, XMPPRosterItem> RosterMap;
+ RosterMap entries_;
};
}
diff --git a/Swiften/Roster/XMPPRosterItem.h b/Swiften/Roster/XMPPRosterItem.h
new file mode 100644
index 0000000..ceb7763
--- /dev/null
+++ b/Swiften/Roster/XMPPRosterItem.h
@@ -0,0 +1,53 @@
+/*
+ * 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 <vector>
+
+#include <Swiften/Base/String.h>
+#include <Swiften/JID/JID.h>
+#include <Swiften/Elements/RosterItemPayload.h>
+
+namespace Swift {
+ class XMPPRosterItem {
+ public:
+ XMPPRosterItem(const JID& jid, const String& name, const std::vector<String>& groups, RosterItemPayload::Subscription subscription) : jid(jid), name(name), groups(groups), subscription(subscription) {
+ }
+
+ const JID& getJID() const {
+ return jid;
+ }
+
+ const String& getName() const {
+ return name;
+ }
+
+ void setName(const String& name) {
+ this->name = name;
+ }
+
+ const std::vector<String>& getGroups() const {
+ return groups;
+ }
+
+ void setGroups(const std::vector<String>& groups) {
+ this->groups = groups;
+ }
+
+ RosterItemPayload::Subscription getSubscription() const {
+ return subscription;
+ }
+
+ private:
+ JID jid;
+ String name;
+ std::vector<String> groups;
+ RosterItemPayload::Subscription subscription;
+ };
+}
+