diff options
-rw-r--r-- | Swift/Controllers/Roster/ContactRosterItem.cpp | 1 | ||||
-rw-r--r-- | Swift/Controllers/Roster/Roster.cpp | 27 | ||||
-rw-r--r-- | Swift/Controllers/Roster/Roster.h | 3 | ||||
-rw-r--r-- | Swift/Controllers/Roster/RosterController.cpp | 18 | ||||
-rw-r--r-- | Swift/Controllers/Roster/SetAvailableFeatures.h | 36 | ||||
-rw-r--r-- | Swift/Controllers/Roster/SetBlockingState.h | 36 |
6 files changed, 89 insertions, 32 deletions
diff --git a/Swift/Controllers/Roster/ContactRosterItem.cpp b/Swift/Controllers/Roster/ContactRosterItem.cpp index 6239033..622b6ae 100644 --- a/Swift/Controllers/Roster/ContactRosterItem.cpp +++ b/Swift/Controllers/Roster/ContactRosterItem.cpp @@ -139,6 +139,7 @@ void ContactRosterItem::removeGroup(const std::string& group) { void ContactRosterItem::setSupportedFeatures(const std::set<Feature>& features) { features_ = features; + onDataChanged(); } bool ContactRosterItem::supportsFeature(const Feature feature) const { diff --git a/Swift/Controllers/Roster/Roster.cpp b/Swift/Controllers/Roster/Roster.cpp index dbb1780..51e888f 100644 --- a/Swift/Controllers/Roster/Roster.cpp +++ b/Swift/Controllers/Roster/Roster.cpp @@ -66,36 +66,15 @@ GroupRosterItem* Roster::getGroup(const std::string& groupName) { return group; } -void Roster::setAvailableFeatures(const JID& jid, const std::set<ContactRosterItem::Feature>& features) { - ItemMap::const_iterator i = itemMap_.find(fullJIDMapping_ ? jid : jid.toBare()); - if (i == itemMap_.end()) { - return; - } - foreach(ContactRosterItem* item, i->second) { - item->setSupportedFeatures(features); - } -} - -void Roster::setBlockedState(const std::vector<JID> &jids, ContactRosterItem::BlockState state) { - if (!blockingSupported_ ) { +void Roster::setBlockingSupported(bool isSupported) { + if (!blockingSupported_) { foreach(ItemMap::value_type i, itemMap_) { foreach(ContactRosterItem* item, i.second) { item->setBlockState(ContactRosterItem::IsUnblocked); } } } - - foreach(const JID& jid, jids) { - ItemMap::const_iterator i = itemMap_.find(fullJIDMapping_ ? jid : jid.toBare()); - if (i == itemMap_.end()) { - continue; - } - foreach(ContactRosterItem* item, i->second) { - item->setBlockState(state); - } - } - - blockingSupported_ = true; + blockingSupported_ = isSupported; } void Roster::removeGroup(const std::string& group) { diff --git a/Swift/Controllers/Roster/Roster.h b/Swift/Controllers/Roster/Roster.h index 821c8f5..9a1dfa3 100644 --- a/Swift/Controllers/Roster/Roster.h +++ b/Swift/Controllers/Roster/Roster.h @@ -47,8 +47,7 @@ class Roster { boost::signal<void (RosterItem*)> onDataChanged; boost::signal<void (JID&)> onVCardUpdateRequested; GroupRosterItem* getGroup(const std::string& groupName); - void setAvailableFeatures(const JID& jid, const std::set<ContactRosterItem::Feature>& features); - void setBlockedState(const std::vector<JID>& jids, ContactRosterItem::BlockState state); + void setBlockingSupported(bool isSupported); private: void handleDataChanged(RosterItem* item); diff --git a/Swift/Controllers/Roster/RosterController.cpp b/Swift/Controllers/Roster/RosterController.cpp index fd0dbb8..cb6d4d2 100644 --- a/Swift/Controllers/Roster/RosterController.cpp +++ b/Swift/Controllers/Roster/RosterController.cpp @@ -35,6 +35,8 @@ #include <Swift/Controllers/Roster/Roster.h> #include <Swift/Controllers/Roster/RosterVCardProvider.h> #include <Swift/Controllers/Roster/SetAvatar.h> +#include <Swift/Controllers/Roster/SetAvailableFeatures.h> +#include <Swift/Controllers/Roster/SetBlockingState.h> #include <Swift/Controllers/Roster/SetName.h> #include <Swift/Controllers/Roster/SetPresence.h> #include <Swift/Controllers/Roster/SetVCard.h> @@ -191,16 +193,18 @@ void RosterController::handleSettingChanged(const std::string& settingPath) { void RosterController::handleBlockingStateChanged() { if (clientBlockListManager_->getBlockList()->getState() == BlockList::Available) { - roster_->setBlockedState(clientBlockListManager_->getBlockList()->getItems(), ContactRosterItem::IsBlocked); + foreach(const JID& jid, clientBlockListManager_->getBlockList()->getItems()) { + roster_->applyOnItems(SetBlockingState(jid, ContactRosterItem::IsBlocked)); + } } } void RosterController::handleBlockingItemAdded(const JID& jid) { - roster_->setBlockedState(std::vector<JID>(1, jid), ContactRosterItem::IsBlocked); + roster_->applyOnItems(SetBlockingState(jid, ContactRosterItem::IsBlocked)); } void RosterController::handleBlockingItemRemoved(const JID& jid) { - roster_->setBlockedState(std::vector<JID>(1, jid), ContactRosterItem::IsUnblocked); + roster_->applyOnItems(SetBlockingState(jid, ContactRosterItem::IsUnblocked)); } void RosterController::handleUIEvent(boost::shared_ptr<UIEvent> event) { @@ -282,9 +286,11 @@ void RosterController::initBlockingCommand() { blockingOnStateChangedConnection_ = blockList->onStateChanged.connect(boost::bind(&RosterController::handleBlockingStateChanged, this)); blockingOnItemAddedConnection_ = blockList->onItemAdded.connect(boost::bind(&RosterController::handleBlockingItemAdded, this, _1)); blockingOnItemRemovedConnection_ = blockList->onItemRemoved.connect(boost::bind(&RosterController::handleBlockingItemRemoved, this, _1)); - + roster_->setBlockingSupported(true); if (blockList->getState() == BlockList::Available) { - roster_->setBlockedState(blockList->getItems(), ContactRosterItem::IsBlocked); + foreach(const JID& jid, blockList->getItems()) { + roster_->applyOnItems(SetBlockingState(jid, ContactRosterItem::IsBlocked)); + } } } @@ -356,7 +362,7 @@ void RosterController::handleOnCapsChanged(const JID& jid) { if (info->hasFeature(DiscoInfo::WhiteboardFeature)) { features.insert(ContactRosterItem::WhiteboardFeature); } - roster_->setAvailableFeatures(jid, features); + roster_->applyOnItems(SetAvailableFeatures(jid, features)); } } diff --git a/Swift/Controllers/Roster/SetAvailableFeatures.h b/Swift/Controllers/Roster/SetAvailableFeatures.h new file mode 100644 index 0000000..f7e00d0 --- /dev/null +++ b/Swift/Controllers/Roster/SetAvailableFeatures.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <Swiften/JID/JID.h> + +#include <Swift/Controllers/Roster/RosterItemOperation.h> +#include <Swift/Controllers/Roster/ContactRosterItem.h> + +namespace Swift { + +class RosterItem; + +class SetAvailableFeatures : public RosterItemOperation { + public: + SetAvailableFeatures(const JID& jid, const std::set<ContactRosterItem::Feature>& availableFeatures, JID::CompareType compareType = JID::WithoutResource) : RosterItemOperation(true, jid), jid_(jid), availableFeatures_(availableFeatures), compareType_(compareType) { + } + + virtual void operator() (RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (contact && contact->getJID().equals(jid_, compareType_)) { + contact->setSupportedFeatures(availableFeatures_); + } + } + + private: + JID jid_; + std::set<ContactRosterItem::Feature> availableFeatures_; + JID::CompareType compareType_; +}; + +} diff --git a/Swift/Controllers/Roster/SetBlockingState.h b/Swift/Controllers/Roster/SetBlockingState.h new file mode 100644 index 0000000..72fd2e5 --- /dev/null +++ b/Swift/Controllers/Roster/SetBlockingState.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <Swiften/JID/JID.h> + +#include <Swift/Controllers/Roster/RosterItemOperation.h> +#include <Swift/Controllers/Roster/ContactRosterItem.h> + +namespace Swift { + +class RosterItem; + +class SetBlockingState : public RosterItemOperation { + public: + SetBlockingState(const JID& jid, ContactRosterItem::BlockState state, JID::CompareType compareType = JID::WithoutResource) : RosterItemOperation(true, jid), jid_(jid), state_(state), compareType_(compareType) { + } + + virtual void operator() (RosterItem* item) const { + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (contact && contact->getJID().equals(jid_, compareType_)) { + contact->setBlockState(state_); + } + } + + private: + JID jid_; + ContactRosterItem::BlockState state_; + JID::CompareType compareType_; +}; + +} |