diff options
author | Tobias Markmann <tm@ayena.de> | 2015-03-30 13:49:56 (GMT) |
---|---|---|
committer | Kevin Smith <kevin.smith@isode.com> | 2015-04-10 14:06:42 (GMT) |
commit | 69dce2c01bf46cca3db68a113f49bb31e7be4b03 (patch) | |
tree | 55b983a139292cb0b96e498872c4f7e8a93d1520 /Swift/Controllers/Chat | |
parent | 89e5dd08171366ccfb1f598e6e5f140a166b0680 (diff) | |
download | swift-69dce2c01bf46cca3db68a113f49bb31e7be4b03.zip swift-69dce2c01bf46cca3db68a113f49bb31e7be4b03.tar.bz2 |
Introduce FeatureOracle class for contact feature support detection
This modifies the feature detection in the ChatController to try to use
the common features of all available resources feature detection if no
full JID has been bound to the chat yet.
Test-Information:
Tested with two Swift instances. Tested
a) the initial chat start case and,
b) the offline/online.
In case a) Swift used to initally show a yellow warning about no support
for message receipts. This warning is gone now.
In case b), after a user gone offline and online again in a running chat,
Swift used to show a warning about missing support for message receipts.
This warning is gone now.
Change-Id: I7a769fde8d14847b180503aeaa58280c572d81b3
Diffstat (limited to 'Swift/Controllers/Chat')
-rw-r--r-- | Swift/Controllers/Chat/ChatController.cpp | 60 | ||||
-rw-r--r-- | Swift/Controllers/Chat/ChatController.h | 7 | ||||
-rw-r--r-- | Swift/Controllers/Chat/MUCController.cpp | 8 |
3 files changed, 31 insertions, 44 deletions
diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp index 306ee9e..8c132d0 100644 --- a/Swift/Controllers/Chat/ChatController.cpp +++ b/Swift/Controllers/Chat/ChatController.cpp @@ -6,43 +6,45 @@ #include <Swift/Controllers/Chat/ChatController.h> +#include <stdio.h> + #include <boost/bind.hpp> #include <boost/smart_ptr/make_shared.hpp> -#include <stdio.h> #include <Swiften/Avatars/AvatarManager.h> #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/Base/Log.h> #include <Swiften/Chat/ChatStateNotifier.h> #include <Swiften/Chat/ChatStateTracker.h> #include <Swiften/Client/ClientBlockListManager.h> #include <Swiften/Client/NickResolver.h> #include <Swiften/Client/StanzaChannel.h> #include <Swiften/Disco/EntityCapsProvider.h> +#include <Swiften/Disco/FeatureOracle.h> #include <Swiften/Elements/DeliveryReceipt.h> #include <Swiften/Elements/DeliveryReceiptRequest.h> #include <Swiften/Elements/Idle.h> #include <Swiften/FileTransfer/FileTransferManager.h> -#include <Swift/Controllers/Intl.h> -#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h> -#include <Swift/Controllers/XMPPEvents/EventController.h> +#include <Swift/Controllers/Chat/ChatMessageParser.h> #include <Swift/Controllers/FileTransfer/FileTransferController.h> +#include <Swift/Controllers/Highlighter.h> +#include <Swift/Controllers/Intl.h> +#include <Swift/Controllers/SettingConstants.h> #include <Swift/Controllers/StatusUtil.h> -#include <Swift/Controllers/UIEvents/UIEventStream.h> -#include <Swift/Controllers/UIEvents/SendFileUIEvent.h> #include <Swift/Controllers/UIEvents/AcceptWhiteboardSessionUIEvent.h> #include <Swift/Controllers/UIEvents/CancelWhiteboardSessionUIEvent.h> -#include <Swift/Controllers/UIEvents/ShowWhiteboardUIEvent.h> -#include <Swift/Controllers/UIEvents/RequestChangeBlockStateUIEvent.h> #include <Swift/Controllers/UIEvents/InviteToMUCUIEvent.h> +#include <Swift/Controllers/UIEvents/RequestChangeBlockStateUIEvent.h> #include <Swift/Controllers/UIEvents/RequestInviteToMUCUIEvent.h> -#include <Swift/Controllers/SettingConstants.h> -#include <Swift/Controllers/Highlighter.h> -#include <Swift/Controllers/Chat/ChatMessageParser.h> +#include <Swift/Controllers/UIEvents/SendFileUIEvent.h> +#include <Swift/Controllers/UIEvents/ShowWhiteboardUIEvent.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h> +#include <Swift/Controllers/XMPPEvents/EventController.h> namespace Swift { @@ -125,28 +127,12 @@ void ChatController::cancelReplaces() { } void ChatController::handleBareJIDCapsChanged(const JID& /*jid*/) { - DiscoInfo::ref disco = entityCapsProvider_->getCaps(toJID_); - if (disco) { - if (disco->hasFeature(DiscoInfo::MessageCorrectionFeature)) { - chatWindow_->setCorrectionEnabled(ChatWindow::Yes); - } else { - chatWindow_->setCorrectionEnabled(ChatWindow::No); - } - if (disco->hasFeature(DiscoInfo::MessageDeliveryReceiptsFeature)) { - contactSupportsReceipts_ = ChatWindow::Yes; - } else { - contactSupportsReceipts_ = ChatWindow::No; - } - if (FileTransferManager::isSupportedBy(disco)) { - chatWindow_->setFileTransferEnabled(ChatWindow::Yes); - } else { - chatWindow_->setFileTransferEnabled(ChatWindow::No); - } - } else { - SWIFT_LOG(debug) << "No disco info :(" << std::endl; - chatWindow_->setCorrectionEnabled(ChatWindow::Maybe); - contactSupportsReceipts_ = ChatWindow::Maybe; - } + FeatureOracle featureOracle(entityCapsProvider_, presenceOracle_); + + chatWindow_->setCorrectionEnabled(featureOracle.isMessageCorrectionSupported(toJID_)); + chatWindow_->setFileTransferEnabled(featureOracle.isFileTransferSupported(toJID_)); + contactSupportsReceipts_ = featureOracle.isMessageReceiptsSupported(toJID_); + checkForDisplayingDisplayReceiptsAlert(); } @@ -230,7 +216,7 @@ void ChatController::postHandleIncomingMessage(boost::shared_ptr<MessageEvent> m void ChatController::preSendMessageRequest(boost::shared_ptr<Message> message) { chatStateNotifier_->addChatStateRequest(message); - if (userWantsReceipts_ && (contactSupportsReceipts_ != ChatWindow::No) && message) { + if (userWantsReceipts_ && (contactSupportsReceipts_ != No) && message) { message->addPayload(boost::make_shared<DeliveryReceiptRequest>()); } } @@ -248,9 +234,9 @@ void ChatController::handleSettingChanged(const std::string& settingPath) { void ChatController::checkForDisplayingDisplayReceiptsAlert() { boost::optional<ChatWindow::AlertID> newDeliverReceiptAlert; - if (userWantsReceipts_ && (contactSupportsReceipts_ == ChatWindow::No)) { + if (userWantsReceipts_ && (contactSupportsReceipts_ == No)) { newDeliverReceiptAlert = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat doesn't support delivery receipts.")); - } else if (userWantsReceipts_ && (contactSupportsReceipts_ == ChatWindow::Maybe)) { + } else if (userWantsReceipts_ && (contactSupportsReceipts_ == Maybe)) { newDeliverReceiptAlert = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat may not support delivery receipts. You might not receive delivery receipts for the messages you send.")); } else { if (deliveryReceiptAlert_) { diff --git a/Swift/Controllers/Chat/ChatController.h b/Swift/Controllers/Chat/ChatController.h index 317a836..a1f40be 100644 --- a/Swift/Controllers/Chat/ChatController.h +++ b/Swift/Controllers/Chat/ChatController.h @@ -6,11 +6,12 @@ #pragma once -#include <Swift/Controllers/Chat/ChatControllerBase.h> - #include <map> #include <string> +#include <Swiften/Base/Tristate.h> + +#include <Swift/Controllers/Chat/ChatControllerBase.h> #include <Swift/Controllers/UIInterfaces/ChatWindow.h> namespace Swift { @@ -95,7 +96,7 @@ namespace Swift { StatusShow::Type lastShownStatus_; UIEventStream* eventStream_; - ChatWindow::Tristate contactSupportsReceipts_; + Tristate contactSupportsReceipts_; bool receivingPresenceFromUs_; bool userWantsReceipts_; std::map<std::string, FileTransferController*> ftControllers; diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index 054f896..6794846 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -15,8 +15,8 @@ #include <Swiften/Avatars/AvatarManager.h> #include <Swiften/Base/Log.h> #include <Swiften/Base/foreach.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/format.h> +#include <Swiften/Base/Tristate.h> #include <Swiften/Client/BlockList.h> #include <Swiften/Client/ClientBlockListManager.h> #include <Swiften/Client/StanzaChannel.h> @@ -230,18 +230,18 @@ void MUCController::handleActionRequestedOnOccupant(ChatWindow::OccupantAction a } void MUCController::handleBareJIDCapsChanged(const JID& /*jid*/) { - ChatWindow::Tristate support = ChatWindow::Yes; + Tristate support = Yes; bool any = false; foreach (const std::string& nick, currentOccupants_) { DiscoInfo::ref disco = entityCapsProvider_->getCaps(toJID_.toBare().toString() + "/" + nick); if (disco && disco->hasFeature(DiscoInfo::MessageCorrectionFeature)) { any = true; } else { - support = ChatWindow::Maybe; + support = Maybe; } } if (!any) { - support = ChatWindow::No; + support = No; } chatWindow_->setCorrectionEnabled(support); } |