From dfa83363f4f8c8faa77be4c410d960a4cf39ec43 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Thu, 28 Mar 2013 10:06:07 +0100
Subject: Add blocking support for MUC 1-to-1 conversations.

Change-Id: I1cc138aecc6876609de4bdc4b22f1c98e3dd993f
License: This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details.

diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp
index f0de59c..68af288 100644
--- a/Swift/Controllers/Chat/ChatController.cpp
+++ b/Swift/Controllers/Chat/ChatController.cpp
@@ -30,6 +30,7 @@
 #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 <Swiften/Elements/DeliveryReceipt.h>
 #include <Swiften/Elements/DeliveryReceiptRequest.h>
 #include <Swiften/Elements/Idle.h>
@@ -86,6 +87,8 @@ ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQ
 	chatWindow_->onWhiteboardSessionAccept.connect(boost::bind(&ChatController::handleWhiteboardSessionAccept, this));
 	chatWindow_->onWhiteboardSessionCancel.connect(boost::bind(&ChatController::handleWhiteboardSessionCancel, this));
 	chatWindow_->onWhiteboardWindowShow.connect(boost::bind(&ChatController::handleWhiteboardWindowShow, this));
+	chatWindow_->onBlockUserRequest.connect(boost::bind(&ChatController::handleBlockUserRequest, this));
+	chatWindow_->onUnblockUserRequest.connect(boost::bind(&ChatController::handleUnblockUserRequest, this));
 	handleBareJIDCapsChanged(toJID_);
 
 	settings_->onSettingChanged.connect(boost::bind(&ChatController::handleSettingChanged, this, _1));
@@ -233,7 +236,7 @@ void ChatController::checkForDisplayingDisplayReceiptsAlert() {
 void ChatController::handleBlockingStateChanged() {
 	boost::shared_ptr<BlockList> blockList = clientBlockListManager_->getBlockList();
 	if (blockList->getState() == BlockList::Available) {
-		if (blockList->isBlocked(toJID_.toBare())) {
+		if (isInMUC_ ? blockList->isBlocked(toJID_) : blockList->isBlocked(toJID_.toBare())) {
 			chatWindow_->setAlert(QT_TRANSLATE_NOOP("", "You've currently blocked this contact. To continue your conversation you have to unblock the contact first."));
 			chatWindow_->setInputEnabled(false);
 			chatWindow_->setBlockingState(ChatWindow::IsBlocked);
@@ -244,7 +247,7 @@ void ChatController::handleBlockingStateChanged() {
 }
 
 void ChatController::handleBlockingItemAdded(const JID& jid) {
-	if (jid == toJID_.toBare()) {
+	if (toJID_ == (isInMUC_ ? jid: jid.toBare())) {
 		chatWindow_->setAlert(QT_TRANSLATE_NOOP("", "You've currently blocked this contact. To continue your conversation you have to unblock the contact first."));
 		chatWindow_->setInputEnabled(false);
 		chatWindow_->setBlockingState(ChatWindow::IsBlocked);
@@ -252,7 +255,7 @@ void ChatController::handleBlockingItemAdded(const JID& jid) {
 }
 
 void ChatController::handleBlockingItemRemoved(const JID& jid) {
-	if (jid == toJID_.toBare()) {
+	if (toJID_ == (isInMUC_ ? jid: jid.toBare())) {
 		// FIXME: Support for different types of alerts.
 		chatWindow_->cancelAlert();
 		chatWindow_->setInputEnabled(true);
@@ -260,6 +263,22 @@ void ChatController::handleBlockingItemRemoved(const JID& jid) {
 	}
 }
 
+void ChatController::handleBlockUserRequest() {
+	if (isInMUC_) {
+		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Blocked, toJID_));
+	} else {
+		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Blocked, toJID_.toBare()));
+	}
+}
+
+void ChatController::handleUnblockUserRequest() {
+	if (isInMUC_) {
+		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Unblocked, toJID_));
+	} else {
+		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Unblocked, toJID_.toBare()));
+	}
+}
+
 void ChatController::postSendMessage(const std::string& body, boost::shared_ptr<Stanza> sentStanza) {
 	boost::shared_ptr<Replace> replace = sentStanza->getPayload<Replace>();
 	if (replace) {
diff --git a/Swift/Controllers/Chat/ChatController.h b/Swift/Controllers/Chat/ChatController.h
index 4322240..17bfdd0 100644
--- a/Swift/Controllers/Chat/ChatController.h
+++ b/Swift/Controllers/Chat/ChatController.h
@@ -73,6 +73,9 @@ namespace Swift {
 			void handleBlockingItemAdded(const JID&);
 			void handleBlockingItemRemoved(const JID&);
 
+			void handleBlockUserRequest();
+			void handleUnblockUserRequest();
+
 		private:
 			NickResolver* nickResolver_;
 			ChatStateNotifier* chatStateNotifier_;
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index b8e6722..93a1376 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -144,6 +144,10 @@ namespace Swift {
 			boost::signal<void ()> onWhiteboardSessionAccept;
 			boost::signal<void ()> onWhiteboardSessionCancel;
 			boost::signal<void ()> onWhiteboardWindowShow;
+
+			// Blocking Command related
+			boost::signal<void ()> onBlockUserRequest;
+			boost::signal<void ()> onUnblockUserRequest;
 	};
 }
 
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index efdab99..0857455 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -24,7 +24,6 @@
 #include <Swift/Controllers/UIEvents/UIEventStream.h>
 #include <Swift/Controllers/UIEvents/SendFileUIEvent.h>
 #include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
-#include <Swift/Controllers/UIEvents/RequestChangeBlockStateUIEvent.h>
 #include "QtChatWindowJSBridge.h"
 #include "QtUtilities.h"
 
@@ -985,10 +984,10 @@ void QtChatWindow::handleActionButtonClicked() {
 		onInvitePersonToThisMUCRequest();
 	}
 	else if (result == block) {
-		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Blocked, JID(Q2PSTRING(contact_))));
+		onBlockUserRequest();
 	}
 	else if (result == unblock) {
-		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Unblocked, JID(Q2PSTRING(contact_))));
+		onUnblockUserRequest();
 	}
 }
 
-- 
cgit v0.10.2-6-g49f6