diff options
Diffstat (limited to 'Swift/Controllers/Chat/ChatControllerBase.cpp')
| -rw-r--r-- | Swift/Controllers/Chat/ChatControllerBase.cpp | 47 | 
1 files changed, 40 insertions, 7 deletions
diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp index 281d968..802a7cb 100644 --- a/Swift/Controllers/Chat/ChatControllerBase.cpp +++ b/Swift/Controllers/Chat/ChatControllerBase.cpp @@ -1,5 +1,5 @@  /* - * Copyright (c) 2010 Kevin Smith + * Copyright (c) 2010-2011 Kevin Smith   * Licensed under the GNU General Public License v3.   * See Documentation/Licenses/GPLv3.txt for more information.   */ @@ -7,6 +7,7 @@  #include "Swift/Controllers/Chat/ChatControllerBase.h"  #include <sstream> +#include <map>  #include <boost/bind.hpp>  #include <boost/shared_ptr.hpp> @@ -20,6 +21,7 @@  #include "Swiften/Elements/Delay.h"  #include "Swiften/Base/foreach.h"  #include "Swift/Controllers/XMPPEvents/EventController.h" +#include "Swiften/Disco/EntityCapsProvider.h"  #include "Swift/Controllers/UIInterfaces/ChatWindow.h"  #include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h"  #include "Swiften/Queries/Requests/GetSecurityLabelsCatalogRequest.h" @@ -27,10 +29,11 @@  namespace Swift { -ChatControllerBase::ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, TimerFactory* timerFactory) : selfJID_(self), stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle), avatarManager_(avatarManager), useDelayForLatency_(useDelayForLatency), eventController_(eventController), timerFactory_(timerFactory) { +ChatControllerBase::ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, TimerFactory* timerFactory, EntityCapsProvider* entityCapsProvider) : selfJID_(self), stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle), avatarManager_(avatarManager), useDelayForLatency_(useDelayForLatency), eventController_(eventController), timerFactory_(timerFactory), entityCapsProvider_(entityCapsProvider) {  	chatWindow_ = chatWindowFactory_->createChatWindow(toJID, eventStream);  	chatWindow_->onAllMessagesRead.connect(boost::bind(&ChatControllerBase::handleAllMessagesRead, this)); -	chatWindow_->onSendMessageRequest.connect(boost::bind(&ChatControllerBase::handleSendMessageRequest, this, _1)); +	chatWindow_->onSendMessageRequest.connect(boost::bind(&ChatControllerBase::handleSendMessageRequest, this, _1, _2)); +	entityCapsProvider_->onCapsChanged.connect(boost::bind(&ChatControllerBase::handleCapsChanged, this, _1));  	setOnline(stanzaChannel->isAvailable() && iqRouter->isAvailable());  	createDayChangeTimer();  } @@ -39,6 +42,12 @@ ChatControllerBase::~ChatControllerBase() {  	delete chatWindow_;  } +void ChatControllerBase::handleCapsChanged(const JID& jid) { +	if (jid.compare(toJID_, JID::WithoutResource) == 0) { +		handleBareJIDCapsChanged(jid); +	} +} +  void ChatControllerBase::createDayChangeTimer() {  	if (timerFactory_) {  		boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); @@ -86,9 +95,14 @@ void ChatControllerBase::handleAllMessagesRead() {  	}  	unreadMessages_.clear();  	chatWindow_->setUnreadMessageCount(0); +	onUnreadCountChanged(); +} + +int ChatControllerBase::getUnreadCount() { +	return unreadMessages_.size();  } -void ChatControllerBase::handleSendMessageRequest(const std::string &body) { +void ChatControllerBase::handleSendMessageRequest(const std::string &body, bool isCorrectionMessage) {  	if (!stanzaChannel_->isAvailable() || body.empty()) {  		return;  	} @@ -104,8 +118,13 @@ void ChatControllerBase::handleSendMessageRequest(const std::string &body) {  		boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();  		message->addPayload(boost::shared_ptr<Delay>(new Delay(now, selfJID_)));  	} +	if (isCorrectionMessage) { +		message->addPayload(boost::shared_ptr<Replace> (new Replace(lastSentMessageStanzaID_))); +	} +	message->setID(lastSentMessageStanzaID_ = idGenerator_.generateID());  	stanzaChannel_->sendMessage(message);  	postSendMessage(message->getBody(), boost::dynamic_pointer_cast<Stanza>(message)); +	onActivity(message->getBody());  }  void ChatControllerBase::handleSecurityLabelsCatalogResponse(boost::shared_ptr<SecurityLabelsCatalog> catalog, ErrorPayload::ref error) { @@ -152,7 +171,7 @@ void ChatControllerBase::handleIncomingMessage(boost::shared_ptr<MessageEvent> m  	boost::shared_ptr<Message> message = messageEvent->getStanza();  	std::string body = message->getBody();  	if (message->isError()) { -		std::string errorMessage = getErrorMessage(message->getPayload<ErrorPayload>()); +		std::string errorMessage = str(format(QT_TRANSLATE_NOOP("", "Couldn't send message: %1%")) % getErrorMessage(message->getPayload<ErrorPayload>()));  		chatWindow_->addErrorMessage(errorMessage);  	}  	else { @@ -163,7 +182,7 @@ void ChatControllerBase::handleIncomingMessage(boost::shared_ptr<MessageEvent> m  		JID from = message->getFrom();  		std::vector<boost::shared_ptr<Delay> > delayPayloads = message->getPayloads<Delay>();  		for (size_t i = 0; useDelayForLatency_ && i < delayPayloads.size(); i++) { -			if (!delayPayloads[i]->getFrom()) {  +			if (!delayPayloads[i]->getFrom()) {  				continue;  			}  			boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time(); @@ -179,11 +198,25 @@ void ChatControllerBase::handleIncomingMessage(boost::shared_ptr<MessageEvent> m  		if (messageTimeStamp) {  			timeStamp = *messageTimeStamp;  		} +		onActivity(body); -		addMessage(body, senderDisplayNameFromMessage(from), isIncomingMessageFromMe(message), label, std::string(avatarManager_->getAvatarPath(from).string()), timeStamp); + 		boost::shared_ptr<Replace> replace = message->getPayload<Replace>(); +		if (replace) { +			std::string body = message->getBody(); +			// Should check if the user has a previous message +			std::map<JID, std::string>::iterator lastMessage; +			lastMessage = lastMessagesUIID_.find(from); +			if (lastMessage != lastMessagesUIID_.end()) { +				chatWindow_->replaceMessage(body, lastMessagesUIID_[from], timeStamp); +			} +		} +		else { +			lastMessagesUIID_[from] = addMessage(body, senderDisplayNameFromMessage(from), isIncomingMessageFromMe(message), label, std::string(avatarManager_->getAvatarPath(from).string()), timeStamp); +		}  	}  	chatWindow_->show();  	chatWindow_->setUnreadMessageCount(unreadMessages_.size()); +	onUnreadCountChanged();  	postHandleIncomingMessage(messageEvent);  }  | 
 Swift