From cdc8e88963e2f12cf0a6398a4dd6bb787b456b46 Mon Sep 17 00:00:00 2001
From: Richard Maudsley <richard.maudsley@isode.com>
Date: Thu, 31 Jul 2014 10:12:51 +0100
Subject: Fix blocklist not being requested on reconnect.

Test-Information:

Connect client and confirm that blocklist is requested only once. Reconnect client and confirm that blocklist is requested again.

Change-Id: Iebf38c9f3c1ff9749c239b6cf785feb7a539a9b1

diff --git a/Swift/Controllers/Roster/RosterController.cpp b/Swift/Controllers/Roster/RosterController.cpp
index e823a1c..43623d5 100644
--- a/Swift/Controllers/Roster/RosterController.cpp
+++ b/Swift/Controllers/Roster/RosterController.cpp
@@ -287,7 +287,7 @@ void RosterController::updateItem(const XMPPRosterItem& item) {
 }
 
 void RosterController::initBlockingCommand() {
-	boost::shared_ptr<BlockList> blockList = clientBlockListManager_->getBlockList();
+	boost::shared_ptr<BlockList> blockList = clientBlockListManager_->requestBlockList();
 
 	blockingOnStateChangedConnection_ = blockList->onStateChanged.connect(boost::bind(&RosterController::handleBlockingStateChanged, this));
 	blockingOnItemAddedConnection_ = blockList->onItemAdded.connect(boost::bind(&RosterController::handleBlockingItemAdded, this, _1));
diff --git a/Swiften/Client/ClientBlockListManager.cpp b/Swiften/Client/ClientBlockListManager.cpp
index 6646a5c..d446315 100644
--- a/Swiften/Client/ClientBlockListManager.cpp
+++ b/Swiften/Client/ClientBlockListManager.cpp
@@ -74,20 +74,24 @@ ClientBlockListManager::~ClientBlockListManager() {
 		unblockResponder->stop();
 		blockResponder->stop();
 	}
-	if (getRequest) {
-		getRequest->onResponse.disconnect(boost::bind(&ClientBlockListManager::handleBlockListReceived, this, _1, _2));
-	}
 }
 
 boost::shared_ptr<BlockList> ClientBlockListManager::getBlockList() {
 	if (!blockList) {
 		blockList = boost::make_shared<BlockListImpl>();
-		blockList->setState(BlockList::Requesting);
-		assert(!getRequest);
-		getRequest = boost::make_shared< GenericRequest<BlockListPayload> >(IQ::Get, JID(), boost::make_shared<BlockListPayload>(), iqRouter);
-		getRequest->onResponse.connect(boost::bind(&ClientBlockListManager::handleBlockListReceived, this, _1, _2));
-		getRequest->send();
+		blockList->setState(BlockList::Init);
+	}
+	return blockList;
+}
+
+boost::shared_ptr<BlockList> ClientBlockListManager::requestBlockList() {
+	if (!blockList) {
+		blockList = boost::make_shared<BlockListImpl>();
 	}
+	blockList->setState(BlockList::Requesting);
+	boost::shared_ptr<GenericRequest<BlockListPayload> > getRequest = boost::make_shared< GenericRequest<BlockListPayload> >(IQ::Get, JID(), boost::make_shared<BlockListPayload>(), iqRouter);
+	getRequest->onResponse.connect(boost::bind(&ClientBlockListManager::handleBlockListReceived, this, _1, _2));
+	getRequest->send();
 	return blockList;
 }
 
diff --git a/Swiften/Client/ClientBlockListManager.h b/Swiften/Client/ClientBlockListManager.h
index e8d4ac6..e715737 100644
--- a/Swiften/Client/ClientBlockListManager.h
+++ b/Swiften/Client/ClientBlockListManager.h
@@ -31,6 +31,11 @@ namespace Swift {
 			 */
 			boost::shared_ptr<BlockList> getBlockList();
 
+			/**
+			 * Get the blocklist from the server.
+			 */
+			boost::shared_ptr<BlockList> requestBlockList();
+
 			GenericRequest<BlockPayload>::ref createBlockJIDRequest(const JID& jid);
 			GenericRequest<BlockPayload>::ref createBlockJIDsRequest(const std::vector<JID>& jids);
 
@@ -43,7 +48,6 @@ namespace Swift {
 
 		private:
 			IQRouter* iqRouter;
-			boost::shared_ptr<GenericRequest<BlockListPayload> > getRequest;
 			boost::shared_ptr<SetResponder<BlockPayload> > blockResponder;
 			boost::shared_ptr<SetResponder<UnblockPayload> > unblockResponder;
 			boost::shared_ptr<BlockListImpl> blockList;
diff --git a/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp b/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp
index 9010042..dd6c95d 100644
--- a/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp
+++ b/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp
@@ -152,7 +152,7 @@ class ClientBlockListManagerTest : public CppUnit::TestFixture {
 
 	private:
 		void helperInitialBlockListFetch(const std::vector<JID>& blockedJids) {
-			boost::shared_ptr<BlockList> blockList = clientBlockListManager_->getBlockList();
+			boost::shared_ptr<BlockList> blockList = clientBlockListManager_->requestBlockList();
 			CPPUNIT_ASSERT(blockList);
 
 			// check for IQ request
-- 
cgit v0.10.2-6-g49f6