diff options
author | Kevin Smith <git@kismith.co.uk> | 2009-12-26 22:52:16 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2009-12-26 22:52:16 (GMT) |
commit | c3bda61b09597a7944fbc382366bcdf998540e82 (patch) | |
tree | a710af80c7e494a60a2676d3595ba4ab3a5ccf79 /Swift/Controllers/ChatsManager.cpp | |
parent | 21532c3557a3dc43f5f0376bf6554f6895c71a03 (diff) | |
download | swift-contrib-c3bda61b09597a7944fbc382366bcdf998540e82.zip swift-contrib-c3bda61b09597a7944fbc382366bcdf998540e82.tar.bz2 |
More thoroughly test the chat routing.
This adds in the behaviour for unbinding chats when the resource goes offline (only if there isn't already an unbound chatwindow).
Resolves: #155
Diffstat (limited to 'Swift/Controllers/ChatsManager.cpp')
-rw-r--r-- | Swift/Controllers/ChatsManager.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/Swift/Controllers/ChatsManager.cpp b/Swift/Controllers/ChatsManager.cpp index ef187f4..fe8efb3 100644 --- a/Swift/Controllers/ChatsManager.cpp +++ b/Swift/Controllers/ChatsManager.cpp @@ -1,5 +1,7 @@ #include "Swift/Controllers/ChatsManager.h" +#include <boost/bind.hpp> + #include "Swiften/Client/Client.h" #include "Swift/Controllers/ChatController.h" @@ -23,6 +25,7 @@ ChatsManager::ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRo avatarManager_ = NULL; serverDiscoInfo_ = serverDiscoInfo; presenceSender_ = presenceSender; + presenceOracle_->onPresenceChange.connect(boost::bind(&ChatsManager::handlePresenceChange, this, _1, _2)); } ChatsManager::~ChatsManager() { @@ -35,6 +38,20 @@ ChatsManager::~ChatsManager() { } +/** + * If a resource goes offline, release bound chatdialog to that resource. + */ +void ChatsManager::handlePresenceChange(boost::shared_ptr<Presence> /*oldPresence*/, boost::shared_ptr<Presence> newPresence) { + if (newPresence->getType() != Presence::Unavailable) return; + JID fullJID(newPresence->getFrom()); + std::map<JID, ChatController*>::iterator it = chatControllers_.find(fullJID); + if (it == chatControllers_.end()) return; + JID bareJID(fullJID.toBare()); + //It doesn't make sense to have two unbound dialogs. + if (chatControllers_.find(bareJID) != chatControllers_.end()) return; + rebindControllerJID(fullJID, bareJID); +} + void ChatsManager::setAvatarManager(AvatarManager* avatarManager) { avatarManager_ = avatarManager; } @@ -83,19 +100,20 @@ void ChatsManager::handleChatRequest(const String &contact) { } ChatController* ChatsManager::getChatController(const JID &contact) { - JID lookupContact(contact); - if (chatControllers_.find(lookupContact) == chatControllers_.end()) { - lookupContact = JID(contact.toBare()); - } - if (chatControllers_.find(lookupContact) == chatControllers_.end()) { - chatControllers_[contact] = new ChatController(jid_, stanzaChannel_, iqRouter_, chatWindowFactory_, contact, nickResolver_, presenceOracle_, avatarManager_); - chatControllers_[contact]->setAvailableServerFeatures(serverDiscoInfo_); - lookupContact = contact; + if (chatControllers_.find(contact) == chatControllers_.end()) { + //Need to look for an unboud window to bind first + JID bare(contact.toBare()); + if (chatControllers_.find(bare) != chatControllers_.end()) { + rebindControllerJID(bare, contact); + } else { + chatControllers_[contact] = new ChatController(jid_, stanzaChannel_, iqRouter_, chatWindowFactory_, contact, nickResolver_, presenceOracle_, avatarManager_); + chatControllers_[contact]->setAvailableServerFeatures(serverDiscoInfo_); + } } - return chatControllers_[lookupContact]; + return chatControllers_[contact]; } -void ChatsManager::handleChatControllerJIDChanged(const JID& from, const JID& to) { +void ChatsManager::rebindControllerJID(const JID& from, const JID& to) { chatControllers_[to] = chatControllers_[from]; chatControllers_.erase(from); } |