diff options
Diffstat (limited to 'Swift/Controllers/Chat')
-rw-r--r-- | Swift/Controllers/Chat/ChatController.cpp | 19 | ||||
-rw-r--r-- | Swift/Controllers/Chat/ChatControllerBase.cpp | 19 | ||||
-rw-r--r-- | Swift/Controllers/Chat/ChatControllerBase.h | 1 | ||||
-rw-r--r-- | Swift/Controllers/Chat/ChatsManager.cpp | 60 |
4 files changed, 53 insertions, 46 deletions
diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp index dbc5a79..b8bf4c3 100644 --- a/Swift/Controllers/Chat/ChatController.cpp +++ b/Swift/Controllers/Chat/ChatController.cpp @@ -14,7 +14,6 @@ #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/DateTime.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/format.h> #include <Swiften/Chat/ChatStateNotifier.h> #include <Swiften/Chat/ChatStateTracker.h> @@ -44,6 +43,7 @@ #include <Swift/Controllers/UIEvents/UIEventStream.h> #include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h> #include <Swift/Controllers/XMPPEvents/EventController.h> +#include <Swift/Controllers/XMPPEvents/IncomingFileTransferEvent.h> namespace Swift { @@ -346,9 +346,8 @@ void ChatController::handleStanzaAcked(std::shared_ptr<Stanza> stanza) { void ChatController::setOnline(bool online) { if (!online) { - std::map<std::shared_ptr<Stanza>, std::string>::iterator it = unackedStanzas_.begin(); - for ( ; it != unackedStanzas_.end(); ++it) { - chatWindow_->setAckState(it->second, ChatWindow::Failed); + for (auto& stanzaIdPair : unackedStanzas_) { + chatWindow_->setAckState(stanzaIdPair.second, ChatWindow::Failed); } unackedStanzas_.clear(); @@ -365,6 +364,18 @@ void ChatController::handleNewFileTransferController(FileTransferController* ftc std::string ftID = ftc->setChatWindow(chatWindow_, nick); ftControllers[ftID] = ftc; lastWasPresence_ = false; + + if (ftc->isIncoming()) { + auto incomingFileTransferEvent = std::make_shared<IncomingFileTransferEvent>(ftc->getOtherParty()); + if (hasOpenWindow()) { + incomingFileTransferEvent->conclude(); + } + else { + unreadMessages_.push_back(incomingFileTransferEvent); + updateMessageCount(); + } + eventController_->handleIncomingEvent(incomingFileTransferEvent); + } } void ChatController::handleWhiteboardSessionRequest(bool senderIsSelf) { diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp index 80f4167..15f6112 100644 --- a/Swift/Controllers/Chat/ChatControllerBase.cpp +++ b/Swift/Controllers/Chat/ChatControllerBase.cpp @@ -17,7 +17,6 @@ #include <Swiften/Avatars/AvatarManager.h> #include <Swiften/Base/Path.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/format.h> #include <Swiften/Client/StanzaChannel.h> #include <Swiften/Disco/EntityCapsProvider.h> @@ -129,12 +128,11 @@ void ChatControllerBase::setAvailableServerFeatures(std::shared_ptr<DiscoInfo> i void ChatControllerBase::handleAllMessagesRead() { if (!unreadMessages_.empty()) { targetedUnreadMessages_.clear(); - foreach (std::shared_ptr<StanzaEvent> stanzaEvent, unreadMessages_) { + for (std::shared_ptr<StanzaEvent> stanzaEvent : unreadMessages_) { stanzaEvent->conclude(); } unreadMessages_.clear(); - chatWindow_->setUnreadMessageCount(0); - onUnreadCountChanged(); + updateMessageCount(); } } @@ -219,7 +217,7 @@ void ChatControllerBase::handleHighlightActions(const ChatWindow::ChatMessage& c highlighter_->handleHighlightAction(chatMessage.getFullMessageHighlightAction()); playedSounds.insert(chatMessage.getFullMessageHighlightAction().getSoundFile()); } - foreach(std::shared_ptr<ChatWindow::ChatMessagePart> part, chatMessage.getParts()) { + for (std::shared_ptr<ChatWindow::ChatMessagePart> part : chatMessage.getParts()) { std::shared_ptr<ChatWindow::ChatHighlightingMessagePart> highlightMessage = std::dynamic_pointer_cast<ChatWindow::ChatHighlightingMessagePart>(part); if (highlightMessage && highlightMessage->action.playSound()) { if (playedSounds.find(highlightMessage->action.getSoundFile()) == playedSounds.end()) { @@ -230,6 +228,11 @@ void ChatControllerBase::handleHighlightActions(const ChatWindow::ChatMessage& c } } +void ChatControllerBase::updateMessageCount() { + chatWindow_->setUnreadMessageCount(boost::numeric_cast<int>(unreadMessages_.size())); + onUnreadCountChanged(); +} + std::string ChatControllerBase::addMessage(const ChatWindow::ChatMessage& chatMessage, const std::string& senderName, bool senderIsSelf, const std::shared_ptr<SecurityLabel> label, const boost::filesystem::path& avatarPath, const boost::posix_time::ptime& time) { if (chatMessage.isMeCommand()) { return chatWindow_->addAction(chatMessage, senderName, senderIsSelf, label, pathToString(avatarPath), time); @@ -330,8 +333,7 @@ void ChatControllerBase::handleIncomingMessage(std::shared_ptr<MessageEvent> mes logMessage(body, from, selfJID_, timeStamp, true); } chatWindow_->show(); - chatWindow_->setUnreadMessageCount(boost::numeric_cast<int>(unreadMessages_.size())); - onUnreadCountChanged(); + updateMessageCount(); postHandleIncomingMessage(messageEvent, chatMessage); } @@ -377,8 +379,7 @@ std::string ChatControllerBase::getErrorMessage(std::shared_ptr<ErrorPayload> er void ChatControllerBase::handleGeneralMUCInvitation(MUCInviteEvent::ref event) { unreadMessages_.push_back(event); chatWindow_->show(); - chatWindow_->setUnreadMessageCount(boost::numeric_cast<int>(unreadMessages_.size())); - onUnreadCountChanged(); + updateMessageCount(); chatWindow_->addMUCInvitation(senderDisplayNameFromMessage(event->getInviter()), event->getRoomJID(), event->getReason(), event->getPassword(), event->getDirect(), event->getImpromptu()); eventController_->handleIncomingEvent(event); } diff --git a/Swift/Controllers/Chat/ChatControllerBase.h b/Swift/Controllers/Chat/ChatControllerBase.h index 309d2fe..71390d9 100644 --- a/Swift/Controllers/Chat/ChatControllerBase.h +++ b/Swift/Controllers/Chat/ChatControllerBase.h @@ -97,6 +97,7 @@ namespace Swift { virtual void logMessage(const std::string& message, const JID& fromJID, const JID& toJID, const boost::posix_time::ptime& timeStamp, bool isIncoming) = 0; ChatWindow::ChatMessage buildChatWindowChatMessage(const std::string& message, bool senderIsSelf, const HighlightAction& fullMessageHighlightAction); void handleHighlightActions(const ChatWindow::ChatMessage& chatMessage); + void updateMessageCount(); private: IDGenerator idGenerator_; diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp index ffca925..be0af3e 100644 --- a/Swift/Controllers/Chat/ChatsManager.cpp +++ b/Swift/Controllers/Chat/ChatsManager.cpp @@ -20,7 +20,6 @@ #include <Swiften/Avatars/AvatarManager.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/ClientBlockListManager.h> #include <Swiften/Client/NickResolver.h> #include <Swiften/Client/StanzaChannel.h> @@ -62,7 +61,6 @@ #include <Swift/Controllers/UIInterfaces/JoinMUCWindowFactory.h> #include <Swift/Controllers/WhiteboardManager.h> #include <Swift/Controllers/XMPPEvents/EventController.h> -#include <Swift/Controllers/XMPPEvents/IncomingFileTransferEvent.h> BOOST_CLASS_VERSION(Swift::ChatListWindow::Chat, 1) @@ -199,10 +197,10 @@ ChatsManager::~ChatsManager() { roster_->onJIDUpdated.disconnect(boost::bind(&ChatsManager::handleJIDUpdatedInRoster, this, _1)); roster_->onRosterCleared.disconnect(boost::bind(&ChatsManager::handleRosterCleared, this)); delete joinMUCWindow_; - foreach (JIDChatControllerPair controllerPair, chatControllers_) { + for (JIDChatControllerPair controllerPair : chatControllers_) { delete controllerPair.second; } - foreach (JIDMUCControllerPair controllerPair, mucControllers_) { + for (JIDMUCControllerPair controllerPair : mucControllers_) { delete controllerPair.second; } delete mucBookmarkManager_; @@ -218,7 +216,7 @@ void ChatsManager::saveRecents() { recentsLimited.erase(recentsLimited.begin() + 25, recentsLimited.end()); } if (eagleMode_) { - foreach(ChatListWindow::Chat& chat, recentsLimited) { + for (ChatListWindow::Chat& chat : recentsLimited) { chat.activity = ""; } } @@ -259,7 +257,7 @@ void ChatsManager::handleRosterCleared() { /* Setting that all chat controllers aren't receiving presence anymore; including MUC 1-to-1 chats due to the assumtion that this handler is only called on log out. */ - foreach(JIDChatControllerPair pair, chatControllers_) { + for (JIDChatControllerPair pair : chatControllers_) { pair.second->setContactIsReceivingPresence(false); } } @@ -299,7 +297,7 @@ void ChatsManager::loadRecents() { std::vector<std::string> recents; boost::split(recents, recentsString, boost::is_any_of("\n")); int i = 0; - foreach (std::string recentString, recents) { + for (std::string recentString : recents) { if (i++ > 30) { break; } @@ -433,7 +431,7 @@ void ChatsManager::handleUnreadCountChanged(ChatControllerBase* controller) { int unreadTotal = 0; bool controllerIsMUC = dynamic_cast<MUCController*>(controller); bool isPM = controller && !controllerIsMUC && mucRegistry_->isMUC(controller->getToJID().toBare()); - foreach (ChatListWindow::Chat& chatItem, recentChats_) { + for (ChatListWindow::Chat& chatItem : recentChats_) { bool match = false; if (controller) { /* Matching MUC item */ @@ -466,7 +464,7 @@ boost::optional<ChatListWindow::Chat> ChatsManager::removeExistingChat(const Cha void ChatsManager::cleanupPrivateMessageRecents() { /* if we leave a MUC and close a PM, remove it's recent chat entry */ const std::list<ChatListWindow::Chat> chats = recentChats_; - foreach (const ChatListWindow::Chat& chat, chats) { + for (const ChatListWindow::Chat& chat : chats) { if (chat.isPrivateMessage) { typedef std::map<JID, MUCController*> ControllerMap; ControllerMap::iterator muc = mucControllers_.find(chat.jid.toBare()); @@ -503,7 +501,7 @@ void ChatsManager::handleUserLeftMUC(MUCController* mucController) { std::map<JID, MUCController*>::iterator it; for (it = mucControllers_.begin(); it != mucControllers_.end(); ++it) { if ((*it).second == mucController) { - foreach (ChatListWindow::Chat& chat, recentChats_) { + for (ChatListWindow::Chat& chat : recentChats_) { if (chat.isMUC && chat.jid == (*it).first) { chat.statusType = StatusShow::None; } @@ -530,7 +528,7 @@ void ChatsManager::finalizeImpromptuJoin(MUC::ref muc, const std::vector<JID>& j typedef std::pair<std::string, MUCOccupant> StringMUCOccupantPair; std::map<std::string, MUCOccupant> occupants = muc->getOccupants(); - foreach(StringMUCOccupantPair occupant, occupants) { + for (StringMUCOccupantPair occupant : occupants) { boost::optional<JID> realJID = occupant.second.getRealJID(); if (realJID) { missingJIDsToInvite.erase(std::remove(missingJIDsToInvite.begin(), missingJIDsToInvite.end(), realJID->toBare()), missingJIDsToInvite.end()); @@ -540,7 +538,7 @@ void ChatsManager::finalizeImpromptuJoin(MUC::ref muc, const std::vector<JID>& j if (reuseChatJID) { muc->invitePerson(reuseChatJID.get(), reason, true, true); } - foreach(const JID& jid, missingJIDsToInvite) { + for (const JID& jid : missingJIDsToInvite) { muc->invitePerson(jid, reason, true); } } @@ -594,7 +592,7 @@ void ChatsManager::handleUIEvent(std::shared_ptr<UIEvent> event) { } void ChatsManager::markAllRecentsOffline() { - foreach (ChatListWindow::Chat& chat, recentChats_) { + for (ChatListWindow::Chat& chat : recentChats_) { chat.setStatusType(StatusShow::None); } @@ -623,7 +621,7 @@ void ChatsManager::handleTransformChatToMUC(ChatController* chatController, Chat void ChatsManager::handlePresenceChange(std::shared_ptr<Presence> newPresence) { if (mucRegistry_->isMUC(newPresence->getFrom().toBare())) return; - foreach (ChatListWindow::Chat& chat, recentChats_) { + for (ChatListWindow::Chat& chat : recentChats_) { if (newPresence->getFrom().toBare() == chat.jid.toBare() && !chat.isMUC) { Presence::ref presence = presenceOracle_->getHighestPriorityPresence(chat.jid.toBare()); chat.setStatusType(presence ? presence->getShow() : StatusShow::None); @@ -647,7 +645,7 @@ void ChatsManager::setAvatarManager(AvatarManager* avatarManager) { avatarManager_->onAvatarChanged.disconnect(boost::bind(&ChatsManager::handleAvatarChanged, this, _1)); } avatarManager_ = avatarManager; - foreach (ChatListWindow::Chat& chat, recentChats_) { + for (ChatListWindow::Chat& chat : recentChats_) { if (!chat.isMUC) { chat.setAvatarPath(avatarManager_->getAvatarPath(chat.jid)); } @@ -656,7 +654,7 @@ void ChatsManager::setAvatarManager(AvatarManager* avatarManager) { } void ChatsManager::handleAvatarChanged(const JID& jid) { - foreach (ChatListWindow::Chat& chat, recentChats_) { + for (ChatListWindow::Chat& chat : recentChats_) { if (!chat.isMUC && jid.toBare() == chat.jid.toBare()) { chat.setAvatarPath(avatarManager_->getAvatarPath(jid)); break; @@ -666,10 +664,10 @@ void ChatsManager::handleAvatarChanged(const JID& jid) { void ChatsManager::setServerDiscoInfo(std::shared_ptr<DiscoInfo> info) { serverDiscoInfo_ = info; - foreach (JIDChatControllerPair pair, chatControllers_) { + for (JIDChatControllerPair pair : chatControllers_) { pair.second->setAvailableServerFeatures(info); } - foreach (JIDMUCControllerPair pair, mucControllers_) { + for (JIDMUCControllerPair pair : mucControllers_) { pair.second->setAvailableServerFeatures(info); } } @@ -678,10 +676,10 @@ void ChatsManager::setServerDiscoInfo(std::shared_ptr<DiscoInfo> info) { * This is to be called on connect/disconnect. */ void ChatsManager::setOnline(bool enabled) { - foreach (JIDChatControllerPair controllerPair, chatControllers_) { + for (JIDChatControllerPair controllerPair : chatControllers_) { controllerPair.second->setOnline(enabled); } - foreach (JIDMUCControllerPair controllerPair, mucControllers_) { + for (JIDMUCControllerPair controllerPair : mucControllers_) { controllerPair.second->setOnline(enabled); if (enabled) { controllerPair.second->rejoin(); @@ -712,7 +710,7 @@ void ChatsManager::handleChatRequest(const std::string &contact) { ChatController* ChatsManager::getChatControllerOrFindAnother(const JID &contact) { ChatController* controller = getChatControllerIfExists(contact); if (!controller && !mucRegistry_->isMUC(contact.toBare())) { - foreach (JIDChatControllerPair pair, chatControllers_) { + for (JIDChatControllerPair pair : chatControllers_) { if (pair.first.toBare() == contact.toBare()) { controller = pair.second; break; @@ -757,7 +755,7 @@ ChatController* ChatsManager::getChatControllerIfExists(const JID &contact, bool return chatControllers_[bare]; } } else { - foreach (JIDChatControllerPair pair, chatControllers_) { + for (JIDChatControllerPair pair : chatControllers_) { if (pair.first.toBare() == contact.toBare()) { if (rebindIfNeeded) { rebindControllerJID(pair.first, contact); @@ -944,10 +942,6 @@ void ChatsManager::handleMUCBookmarkActivated(const MUCBookmark& mucBookmark) { void ChatsManager::handleNewFileTransferController(FileTransferController* ftc) { ChatController* chatController = getChatControllerOrCreate(ftc->getOtherParty()); chatController->handleNewFileTransferController(ftc); - chatController->activateChatWindow(); - if (ftc->isIncoming()) { - eventController_->handleIncomingEvent(std::make_shared<IncomingFileTransferEvent>(ftc->getOtherParty())); - } } void ChatsManager::handleWhiteboardSessionRequest(const JID& contact, bool senderIsSelf) { @@ -977,7 +971,7 @@ void ChatsManager::handleRecentActivated(const ChatListWindow::Chat& chat) { if (chat.isMUC && !chat.impromptuJIDs.empty()) { typedef std::pair<std::string, JID> StringJIDPair; std::vector<JID> inviteJIDs; - foreach(StringJIDPair pair, chat.impromptuJIDs) { + for (StringJIDPair pair : chat.impromptuJIDs) { inviteJIDs.push_back(pair.second); } uiEventStream_->send(std::make_shared<CreateImpromptuMUCUIEvent>(inviteJIDs, chat.jid, "")); @@ -992,7 +986,7 @@ void ChatsManager::handleRecentActivated(const ChatListWindow::Chat& chat) { } void ChatsManager::handleLocalServiceFound(const JID& service, std::shared_ptr<DiscoInfo> info) { - foreach (DiscoInfo::Identity identity, info->getIdentities()) { + for (DiscoInfo::Identity identity : info->getIdentities()) { if ((identity.getCategory() == "directory" && identity.getType() == "chatroom") || (identity.getCategory() == "conference" @@ -1007,10 +1001,10 @@ void ChatsManager::handleLocalServiceFound(const JID& service, std::shared_ptr<D void ChatsManager::handleLocalServiceWalkFinished() { bool impromptuMUCSupported = !localMUCServiceJID_.toString().empty(); - foreach (JIDChatControllerPair controllerPair, chatControllers_) { + for (JIDChatControllerPair controllerPair : chatControllers_) { controllerPair.second->setCanStartImpromptuChats(impromptuMUCSupported); } - foreach (JIDMUCControllerPair controllerPair, mucControllers_) { + for (JIDMUCControllerPair controllerPair : mucControllers_) { controllerPair.second->setCanStartImpromptuChats(impromptuMUCSupported); } onImpromptuMUCServiceDiscovered(impromptuMUCSupported); @@ -1022,7 +1016,7 @@ std::vector<ChatListWindow::Chat> ChatsManager::getRecentChats() const { std::vector<Contact::ref> Swift::ChatsManager::getContacts(bool withMUCNicks) { std::vector<Contact::ref> result; - foreach (ChatListWindow::Chat chat, recentChats_) { + for (ChatListWindow::Chat chat : recentChats_) { if (!chat.isMUC) { result.push_back(std::make_shared<Contact>(chat.chatName.empty() ? chat.jid.toString() : chat.chatName, chat.jid, chat.statusType, chat.avatarPath)); } @@ -1030,11 +1024,11 @@ std::vector<Contact::ref> Swift::ChatsManager::getContacts(bool withMUCNicks) { if (withMUCNicks) { /* collect MUC nicks */ typedef std::map<JID, MUCController*>::value_type Item; - foreach (const Item& item, mucControllers_) { + for (const Item& item : mucControllers_) { JID mucJID = item.second->getToJID(); std::map<std::string, JID> participants = item.second->getParticipantJIDs(); typedef std::map<std::string, JID>::value_type ParticipantType; - foreach (const ParticipantType& participant, participants) { + for (const ParticipantType& participant : participants) { const JID nickJID = JID(mucJID.getNode(), mucJID.getDomain(), participant.first); Presence::ref presence = presenceOracle_->getLastPresence(nickJID); const boost::filesystem::path avatar = avatarManager_->getAvatarPath(nickJID); |