diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-09-03 15:07:47 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-09-03 19:06:29 (GMT) |
commit | a0185934b0c929622c5526b84235b86cd44aad1d (patch) | |
tree | 2b377a5e8754c35e1a40fe7405dd75804e66fd73 /Swift/Controllers/Chat/ChatController.cpp | |
parent | fde15d66a75334b23ca8bbd56b44e33893c813c4 (diff) | |
download | swift-contrib-a0185934b0c929622c5526b84235b86cd44aad1d.zip swift-contrib-a0185934b0c929622c5526b84235b86cd44aad1d.tar.bz2 |
XEP-0198 Ack support in the UI
Resolves: #7
Diffstat (limited to 'Swift/Controllers/Chat/ChatController.cpp')
-rw-r--r-- | Swift/Controllers/Chat/ChatController.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp index 52288c2..9154b9a 100644 --- a/Swift/Controllers/Chat/ChatController.cpp +++ b/Swift/Controllers/Chat/ChatController.cpp @@ -12,6 +12,7 @@ #include "Swiften/Chat/ChatStateNotifier.h" #include "Swiften/Chat/ChatStateMessageSender.h" #include "Swiften/Chat/ChatStateTracker.h" +#include "Swiften/Client/StanzaChannel.h" #include "Swift/Controllers/UIInterfaces/ChatWindow.h" #include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h" #include "Swift/Controllers/NickResolver.h" @@ -32,6 +33,7 @@ ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQ nickResolver_ = nickResolver; presenceOracle_->onPresenceChange.connect(boost::bind(&ChatController::handlePresenceChange, this, _1, _2)); chatStateTracker_->onChatStateChange.connect(boost::bind(&ChatWindow::setContactChatState, chatWindow_, _1)); + stanzaChannel_->onStanzaAcked.connect(boost::bind(&ChatController::handleStanzaAcked, this, _1)); String nick = nickResolver_->jidToNick(toJID_); chatWindow_->setName(nick); String startMessage("Starting chat with " + nick); @@ -43,6 +45,7 @@ ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQ chatWindow_->addSystemMessage(startMessage); chatWindow_->onUserTyping.connect(boost::bind(&ChatStateNotifier::setUserIsTyping, chatStateNotifier_)); chatWindow_->onUserCancelsTyping.connect(boost::bind(&ChatStateNotifier::userCancelledNewMessage, chatStateNotifier_)); + } ChatController::~ChatController() { @@ -80,12 +83,35 @@ void ChatController::preSendMessageRequest(boost::shared_ptr<Message> message) { } } -void ChatController::postSendMessage(const String& body) { - addMessage(body, "me", true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>(), String(avatarManager_->getAvatarPath(selfJID_).string()), boost::posix_time::microsec_clock::universal_time()); +void ChatController::postSendMessage(const String& body, boost::shared_ptr<Stanza> sentStanza) { + String id = addMessage(body, "me", true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>(), String(avatarManager_->getAvatarPath(selfJID_).string()), boost::posix_time::microsec_clock::universal_time()); + if (stanzaChannel_->getStreamManagementEnabled()) { + chatWindow_->setAckState(id, ChatWindow::Pending); + unackedStanzas_[sentStanza] = id; + } lastWasPresence_ = false; chatStateNotifier_->userSentMessage(); } +void ChatController::handleStanzaAcked(boost::shared_ptr<Stanza> stanza) { + String id = unackedStanzas_[stanza]; + if (id != "") { + chatWindow_->setAckState(id, ChatWindow::Received); + } + unackedStanzas_.erase(unackedStanzas_.find(stanza)); +} + +void ChatController::setEnabled(bool enabled) { + if (!enabled) { + std::map<boost::shared_ptr<Stanza>, String>::iterator it = unackedStanzas_.begin(); + for ( ; it != unackedStanzas_.end(); it++) { + chatWindow_->setAckState(it->second, ChatWindow::Failed); + } + unackedStanzas_.clear(); + } + ChatControllerBase::setEnabled(enabled); +} + String ChatController::senderDisplayNameFromMessage(const JID& from) { return nickResolver_->jidToNick(from); } |