diff options
Diffstat (limited to 'Swift/Controllers/Chat/ChatControllerBase.h')
-rw-r--r-- | Swift/Controllers/Chat/ChatControllerBase.h | 247 |
1 files changed, 139 insertions, 108 deletions
diff --git a/Swift/Controllers/Chat/ChatControllerBase.h b/Swift/Controllers/Chat/ChatControllerBase.h index 7db94a4..92c6175 100644 --- a/Swift/Controllers/Chat/ChatControllerBase.h +++ b/Swift/Controllers/Chat/ChatControllerBase.h @@ -1,134 +1,165 @@ /* - * Copyright (c) 2010-2013 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. + * Copyright (c) 2010-2018 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. */ #pragma once #include <map> -#include <vector> +#include <memory> #include <string> +#include <vector> -#include <boost/shared_ptr.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/filesystem/path.hpp> #include <boost/optional.hpp> -#include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/signals2.hpp> -#include <Swiften/Network/Timer.h> -#include <Swiften/Network/TimerFactory.h> -#include <Swiften/Elements/Stanza.h> -#include <Swiften/Base/boost_bsignals.h> +#include <Swiften/Base/IDGenerator.h> #include <Swiften/Elements/DiscoInfo.h> -#include <Swiften/JID/JID.h> -#include <Swiften/Elements/SecurityLabelsCatalog.h> #include <Swiften/Elements/ErrorPayload.h> +#include <Swiften/Elements/SecurityLabelsCatalog.h> +#include <Swiften/Elements/Stanza.h> +#include <Swiften/JID/JID.h> +#include <Swiften/MUC/MUCRegistry.h> #include <Swiften/Presence/PresenceOracle.h> #include <Swiften/Queries/IQRouter.h> -#include <Swiften/Base/IDGenerator.h> -#include <Swiften/MUC/MUCRegistry.h> -#include <Swift/Controllers/XMPPEvents/MessageEvent.h> -#include <Swift/Controllers/XMPPEvents/MUCInviteEvent.h> +#include <Swift/Controllers/Highlighting/HighlightManager.h> #include <Swift/Controllers/HistoryController.h> -#include <Swift/Controllers/HighlightManager.h> +#include <Swift/Controllers/Settings/SettingsProvider.h> #include <Swift/Controllers/UIInterfaces/ChatWindow.h> +#include <Swift/Controllers/XMPPEvents/MUCInviteEvent.h> +#include <Swift/Controllers/XMPPEvents/MessageEvent.h> namespace Swift { - class IQRouter; - class StanzaChannel; - class ChatWindowFactory; - class AvatarManager; - class UIEventStream; - class EventController; - class EntityCapsProvider; - class HighlightManager; - class Highlighter; - class ChatMessageParser; - class AutoAcceptMUCInviteDecider; + class AutoAcceptMUCInviteDecider; + class AvatarManager; + class ChatMessageParser; + class Chattables; + class ChatWindowFactory; + class EntityCapsProvider; + class EventController; + class Highlighter; + class HighlightManager; + class IQRouter; + class NickResolver; + class StanzaChannel; + class UIEventStream; + + class ChatControllerBase : public boost::signals2::trackable { + public: + class StreamWindowMessageIDPair { + public: + std::string idInStream; + std::string idInWindow; + }; + + public: + virtual ~ChatControllerBase(); + void showChatWindow(); + void activateChatWindow(); + bool hasOpenWindow() const; + virtual void setAvailableServerFeatures(std::shared_ptr<DiscoInfo> info); + virtual void handleIncomingOwnMessage(std::shared_ptr<Message> /*message*/) {} + void handleIncomingMessage(std::shared_ptr<MessageEvent> message); + std::string addMessage(const ChatWindow::ChatMessage& chatMessage, const std::string& senderName, bool senderIsSelf, std::shared_ptr<SecurityLabel> label, const boost::filesystem::path& avatarPath, const boost::posix_time::ptime& time); + void replaceMessage(const ChatWindow::ChatMessage& chatMessage, const std::string& id, const boost::posix_time::ptime& time); + virtual void setOnline(bool online); + void setEnabled(bool enabled); + virtual void setToJID(const JID& jid) {toJID_ = jid;} + /** Used for determining when something is recent.*/ + boost::signals2::signal<void (const std::string& /*activity*/)> onActivity; + boost::signals2::signal<void ()> onUnreadCountChanged; + boost::signals2::signal<void ()> onWindowClosed; + size_t getUnreadCount(); + const JID& getToJID() {return toJID_;} + void handleCapsChanged(const JID& jid); + void setCanStartImpromptuChats(bool supportsImpromptu); + virtual ChatWindow* detachChatWindow(); + boost::signals2::signal<void(ChatWindow* /*window to reuse*/, const std::vector<JID>& /*invite people*/, const std::string& /*reason*/)> onConvertToMUC; + + protected: + ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, EntityCapsProvider* entityCapsProvider, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables); - class ChatControllerBase : public boost::bsignals::trackable { - public: - virtual ~ChatControllerBase(); - void showChatWindow(); - void activateChatWindow(); - virtual void setAvailableServerFeatures(boost::shared_ptr<DiscoInfo> info); - void handleIncomingMessage(boost::shared_ptr<MessageEvent> message); - std::string addMessage(const std::string& message, const std::string& senderName, bool senderIsSelf, boost::shared_ptr<SecurityLabel> label, const boost::filesystem::path& avatarPath, const boost::posix_time::ptime& time, const HighlightAction& highlight); - void replaceMessage(const std::string& message, const std::string& id, const boost::posix_time::ptime& time, const HighlightAction& highlight); - virtual void setOnline(bool online); - virtual void setEnabled(bool enabled); - virtual void setToJID(const JID& jid) {toJID_ = jid;} - /** Used for determining when something is recent.*/ - boost::signal<void (const std::string& /*activity*/)> onActivity; - boost::signal<void ()> onUnreadCountChanged; - int getUnreadCount(); - const JID& getToJID() {return toJID_;} - void handleCapsChanged(const JID& jid); - void setCanStartImpromptuChats(bool supportsImpromptu); - virtual ChatWindow* detachChatWindow(); - boost::signal<void(ChatWindow* /*window to reuse*/, const std::vector<JID>& /*invite people*/, const std::string& /*reason*/)> onConvertToMUC; + /** + * Pass the Message appended, and the stanza used to send it. + */ + virtual void postSendMessage(const std::string&, std::shared_ptr<Stanza>) {} + virtual std::string senderDisplayNameFromMessage(const JID& from) = 0; + virtual std::string senderHighlightNameFromMessage(const JID& from) = 0; + virtual bool isIncomingMessageFromMe(std::shared_ptr<Message>) = 0; + virtual void preHandleIncomingMessage(std::shared_ptr<MessageEvent>) {} + virtual void addMessageHandleIncomingMessage(const JID& from, const ChatWindow::ChatMessage& message, const std::string& messageID, bool senderIsSelf, std::shared_ptr<SecurityLabel> label, const boost::posix_time::ptime& time) = 0; + virtual void handleIncomingReplaceMessage(const JID& from, const ChatWindow::ChatMessage& chatMessage, const std::string& messageID, const std::string& idToReplace, bool senderIsSelf, std::shared_ptr<SecurityLabel> label, const boost::posix_time::ptime& timeStamp) = 0; + virtual void postHandleIncomingMessage(std::shared_ptr<MessageEvent>, const ChatWindow::ChatMessage&) {} + virtual void preSendMessageRequest(std::shared_ptr<Message>) {} + virtual bool isFromContact(const JID& from); + virtual boost::optional<boost::posix_time::ptime> getMessageTimestamp(std::shared_ptr<Message>) const = 0; + virtual void dayTicked() {} + virtual void handleBareJIDCapsChanged(const JID& jid) = 0; + std::string getErrorMessage(std::shared_ptr<ErrorPayload>); + virtual void setContactIsReceivingPresence(bool /* isReceivingPresence */) {} + virtual void cancelReplaces() = 0; + /** JID any iq for account should go to - bare except for PMs */ + virtual JID getBaseJID(); + 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, const std::string& senderName, bool senderIsSelf); + void updateMessageCount(); + virtual bool shouldIgnoreMessage(std::shared_ptr<Message> /* message */) { + return false; + } - protected: - 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, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ChatMessageParser* chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider); + /** + * What JID should be used for last message correction (XEP-0308) tracking. + */ + virtual JID messageCorrectionJID(const JID& fromJID) = 0; + virtual void handleResendMessageRequest(const std::string& id); - /** - * Pass the Message appended, and the stanza used to send it. - */ - virtual void postSendMessage(const std::string&, boost::shared_ptr<Stanza>) {} - virtual std::string senderDisplayNameFromMessage(const JID& from) = 0; - virtual bool isIncomingMessageFromMe(boost::shared_ptr<Message>) = 0; - virtual void preHandleIncomingMessage(boost::shared_ptr<MessageEvent>) {} - virtual void postHandleIncomingMessage(boost::shared_ptr<MessageEvent>, const HighlightAction&) {} - virtual void preSendMessageRequest(boost::shared_ptr<Message>) {} - virtual bool isFromContact(const JID& from); - virtual boost::optional<boost::posix_time::ptime> getMessageTimestamp(boost::shared_ptr<Message>) const = 0; - virtual void dayTicked() {} - virtual void handleBareJIDCapsChanged(const JID& jid) = 0; - std::string getErrorMessage(boost::shared_ptr<ErrorPayload>); - virtual void setContactIsReceivingPresence(bool /* isReceivingPresence */) {} - virtual void cancelReplaces() = 0; - /** JID any iq for account should go to - bare except for PMs */ - virtual JID getBaseJID(); - virtual void logMessage(const std::string& message, const JID& fromJID, const JID& toJID, const boost::posix_time::ptime& timeStamp, bool isIncoming) = 0; + private: + IDGenerator idGenerator_; + std::string lastSentMessageStanzaID_; - private: - IDGenerator idGenerator_; - std::string lastSentMessageStanzaID_; - void createDayChangeTimer(); - void handleSendMessageRequest(const std::string &body, bool isCorrectionMessage); - void handleAllMessagesRead(); - void handleSecurityLabelsCatalogResponse(boost::shared_ptr<SecurityLabelsCatalog>, ErrorPayload::ref error); - void handleDayChangeTick(); - void handleMUCInvitation(Message::ref message); - void handleMediatedMUCInvitation(Message::ref message); - void handleGeneralMUCInvitation(MUCInviteEvent::ref event); - void handleLogCleared(); + void handleSendMessageRequest(const std::string &body, bool isCorrectionMessage); + void handleAllMessagesRead(); + void handleSecurityLabelsCatalogResponse(std::shared_ptr<SecurityLabelsCatalog>, ErrorPayload::ref error); + void handleMUCInvitation(Message::ref message); + void handleMediatedMUCInvitation(Message::ref message); + void handleGeneralMUCInvitation(MUCInviteEvent::ref event); + void handleContinuationsBroken(); - protected: - JID selfJID_; - std::vector<boost::shared_ptr<StanzaEvent> > unreadMessages_; - std::vector<boost::shared_ptr<StanzaEvent> > targetedUnreadMessages_; - StanzaChannel* stanzaChannel_; - IQRouter* iqRouter_; - ChatWindowFactory* chatWindowFactory_; - ChatWindow* chatWindow_; - JID toJID_; - bool labelsEnabled_; - std::map<JID, std::string> lastMessagesUIID_; - PresenceOracle* presenceOracle_; - AvatarManager* avatarManager_; - bool useDelayForLatency_; - EventController* eventController_; - boost::shared_ptr<Timer> dateChangeTimer_; - TimerFactory* timerFactory_; - EntityCapsProvider* entityCapsProvider_; - SecurityLabelsCatalog::Item lastLabel_; - HistoryController* historyController_; - MUCRegistry* mucRegistry_; - Highlighter* highlighter_; - ChatMessageParser* chatMessageParser_; - AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_; - UIEventStream* eventStream_; - }; + protected: + JID selfJID_; + std::vector<std::shared_ptr<StanzaEvent> > unreadMessages_; + std::vector<std::shared_ptr<StanzaEvent> > targetedUnreadMessages_; + StanzaChannel* stanzaChannel_; + IQRouter* iqRouter_; + ChatWindowFactory* chatWindowFactory_; + ChatWindow* chatWindow_; + JID toJID_; + bool labelsEnabled_; + std::map<JID, StreamWindowMessageIDPair> lastMessagesIDs_; + PresenceOracle* presenceOracle_; + AvatarManager* avatarManager_; + bool useDelayForLatency_; + EventController* eventController_; + EntityCapsProvider* entityCapsProvider_; + SecurityLabelsCatalog::Item lastLabel_; + HistoryController* historyController_; + MUCRegistry* mucRegistry_; + Highlighter* highlighter_; + std::shared_ptr<ChatMessageParser> chatMessageParser_; + AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_; + UIEventStream* eventStream_; + bool lastWasPresence_ = false; + std::string roomSecurityMarking_; + std::string previousMessageSecurityMarking_; + SettingsProvider* settings_; + boost::signals2::scoped_connection scopedConnectionResendMessage_; + std::map<std::string, std::string> requestedReceipts_; + std::map<std::shared_ptr<Stanza>, std::string> unackedStanzas_; + std::map<std::string, std::shared_ptr<Stanza>> failedStanzas_; + Chattables& chattables_; + }; } |