From 0ca3ea9a88acb5e2d42baa3a85d61495d72b7352 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Tue, 19 Jan 2016 15:17:28 +0100
Subject: Reset impromptu support flag when logging off

Test-Information:

Added unit test verifying the expected behavior. It passes
on OS X 10.11.2.

Change-Id: I7531e313bf03dbea276f133db042ce26e6da4a53

diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp
index ae0eed2..f4b715c 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.cpp
+++ b/Swift/Controllers/Chat/ChatControllerBase.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -101,6 +101,7 @@ void ChatControllerBase::handleDayChangeTick() {
 
 void ChatControllerBase::setEnabled(bool enabled) {
 	chatWindow_->setOnline(enabled);
+	chatWindow_->setCanInitiateImpromptuChats(false);
 }
 
 void ChatControllerBase::setOnline(bool online) {
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index 48cdb29..1a69982 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -690,6 +690,7 @@ void ChatsManager::setOnline(bool enabled) {
 		markAllRecentsOffline();
 	} else {
 		setupBookmarks();
+		localMUCServiceJID_ = JID();
 		localMUCServiceFinderWalker_ = boost::make_shared<DiscoServiceWalker>(jid_.getDomain(), iqRouter_);
 		localMUCServiceFinderWalker_->onServiceFound.connect(boost::bind(&ChatsManager::handleLocalServiceFound, this, _1, _2));
 		localMUCServiceFinderWalker_->onWalkAborted.connect(boost::bind(&ChatsManager::handleLocalServiceWalkFinished, this));
@@ -1004,7 +1005,14 @@ void ChatsManager::handleLocalServiceFound(const JID& service, boost::shared_ptr
 }
 
 void ChatsManager::handleLocalServiceWalkFinished() {
-	onImpromptuMUCServiceDiscovered(!localMUCServiceJID_.toString().empty());
+	bool impromptuMUCSupported = !localMUCServiceJID_.toString().empty();
+	foreach (JIDChatControllerPair controllerPair, chatControllers_) {
+		controllerPair.second->setCanStartImpromptuChats(impromptuMUCSupported);
+	}
+	foreach (JIDMUCControllerPair controllerPair, mucControllers_) {
+		controllerPair.second->setCanStartImpromptuChats(impromptuMUCSupported);
+	}
+	onImpromptuMUCServiceDiscovered(impromptuMUCSupported);
 }
 
 std::vector<ChatListWindow::Chat> ChatsManager::getRecentChats() const {
diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
index 5f89f62..4f8cf5a 100644
--- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -74,8 +74,9 @@ class ChatsManagerTest : public CppUnit::TestFixture {
 	CPPUNIT_TEST(testChatControllerFullJIDBindingOnMessageAndNotReceipt);
 	CPPUNIT_TEST(testChatControllerFullJIDBindingOnTypingAndNotActive);
 	CPPUNIT_TEST(testChatControllerPMPresenceHandling);
+	CPPUNIT_TEST(testLocalMUCServiceDiscoveryResetOnDisconnect);
 	CPPUNIT_TEST_SUITE_END();
-	
+
 public:
 	void setUp() { 
 		mocks_ = new MockRepository();
@@ -673,6 +674,34 @@ public:
 		CPPUNIT_ASSERT_EQUAL(std::string("participantA has gone offline."), MockChatWindow::bodyFromMessage(window->lastReplacedMessage_));
 	}
 
+	void testLocalMUCServiceDiscoveryResetOnDisconnect() {
+		JID ownJID("test@test.com/resource");
+		JID sender("foo@test.com");
+
+		manager_->setOnline(true);
+
+		// Open chat window to a sender.
+		MockChatWindow* window = new MockChatWindow();
+		mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(sender, uiEventStream_).Return(window);
+
+		uiEventStream_->send(boost::make_shared<RequestChatUIEvent>(sender));
+
+		CPPUNIT_ASSERT_EQUAL(false, window->impromptuMUCSupported_);
+
+		boost::shared_ptr<IQ> infoRequest= iqChannel_->iqs_[1];
+		boost::shared_ptr<IQ> infoResponse = IQ::createResult(infoRequest->getFrom(), infoRequest->getTo(), infoRequest->getID());
+
+		DiscoInfo info;
+		info.addIdentity(DiscoInfo::Identity("Shakespearean Chat Service", "conference", "text"));
+		info.addFeature("http://jabber.org/protocol/muc");
+		infoResponse->addPayload(boost::make_shared<DiscoInfo>(info));
+		iqChannel_->onIQReceived(infoResponse);
+
+		CPPUNIT_ASSERT_EQUAL(true, window->impromptuMUCSupported_);
+		manager_->setOnline(false);
+		CPPUNIT_ASSERT_EQUAL(false, window->impromptuMUCSupported_);
+	}
+
 	void testhelperChatControllerPresenceAccessUpdatedOnSubscriptionChangeReceiptsAllowed(RosterItemPayload::Subscription from, RosterItemPayload::Subscription to) {
 		JID messageJID("testling@test.com/resource1");
 		xmppRoster_->addContact(messageJID, "foo", std::vector<std::string>(), from);
@@ -713,7 +742,7 @@ private:
 	JID jid_;
 	ChatsManager* manager_;
 	DummyStanzaChannel* stanzaChannel_;
-	IQChannel* iqChannel_;
+	DummyIQChannel* iqChannel_;
 	IQRouter* iqRouter_;
 	EventController* eventController_;
 	ChatWindowFactory* chatWindowFactory_;
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index ddb7e3e..4523d29 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2016 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -15,7 +15,7 @@
 namespace Swift {
 	class MockChatWindow : public ChatWindow {
 		public:
-			MockChatWindow() : labelsEnabled_(false) {}
+			MockChatWindow() : labelsEnabled_(false), impromptuMUCSupported_(false) {}
 			virtual ~MockChatWindow();
 
 			virtual std::string addMessage(const ChatMessage& message, const std::string& /*senderName*/, bool /*senderIsSelf*/, boost::shared_ptr<SecurityLabel> /*label*/, const std::string& /*avatarPath*/, const boost::posix_time::ptime& /*time*/, const HighlightAction& /*highlight*/) {
@@ -82,7 +82,10 @@ namespace Swift {
 			virtual void setAvailableRoomActions(const std::vector<RoomAction> &) {}
 
 			virtual void setBlockingState(BlockingState) {}
-			virtual void setCanInitiateImpromptuChats(bool /*supportsImpromptu*/) {}
+			virtual void setCanInitiateImpromptuChats(bool supportsImpromptu) {
+				impromptuMUCSupported_ = supportsImpromptu;
+			}
+
 			virtual void showBookmarkWindow(const MUCBookmark& /*bookmark*/) {}
 			virtual void setBookmarkState(RoomBookmarkState) {}
 
@@ -102,6 +105,7 @@ namespace Swift {
 			ChatMessage lastReplacedMessage_;
 			std::vector<SecurityLabelsCatalog::Item> labels_;
 			bool labelsEnabled_;
+			bool impromptuMUCSupported_;
 			SecurityLabelsCatalog::Item label_;
 			Roster* roster_;
 	};
-- 
cgit v0.10.2-6-g49f6