diff options
Diffstat (limited to 'Swiften/Roster/Roster.cpp')
-rw-r--r-- | Swiften/Roster/Roster.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/Swiften/Roster/Roster.cpp b/Swiften/Roster/Roster.cpp index e6640e2..8c2aa0e 100644 --- a/Swiften/Roster/Roster.cpp +++ b/Swiften/Roster/Roster.cpp @@ -56,12 +56,14 @@ void Roster::handleUserAction(boost::shared_ptr<UserRosterAction> action) { void Roster::addContact(const JID& jid, const String& name, const String& group) { ContactRosterItem *item = new ContactRosterItem(jid, name, getGroup(group), widgetFactory_); items_.push_back(item); + itemMap_[jid.toBare()].push_back(item); item->onUserAction.connect(boost::bind(&Roster::handleUserAction, this, _1)); filterItem(item); } void Roster::removeContact(const JID& jid) { + itemMap_.erase(jid.toBare()); std::vector<RosterItem*>::iterator it = children_.begin(); while (it != children_.end()) { ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(*it); @@ -91,6 +93,21 @@ void Roster::removeContactFromGroup(const JID& jid, const String& groupName) { void Roster::applyOnItems(const RosterItemOperation& operation) { + if (operation.requiresLookup()) { + applyOnItem(operation, operation.lookupJID()); + } else { + applyOnAllItems(operation); + } +} + +void Roster::applyOnItem(const RosterItemOperation& operation, const JID& jid) { + foreach (RosterItem* item, itemMap_[jid]) { + operation(item); + filterItem(item); + } +} + +void Roster::applyOnAllItems(const RosterItemOperation& operation) { std::deque<RosterItem*> queue(children_.begin(), children_.end()); while (!queue.empty()) { RosterItem* item = *queue.begin(); |