From 5c55a79de95c11cecc0c98b57dfa1ff81ec7fb95 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Sat, 20 Jun 2015 14:20:41 +0200
Subject: Show canceled file-transfer by other party as canceled and not failed

Test-Information:

Added unit test that checks for the expected behavior.

Change-Id: I4079bdc1182af466eedd2496b9837e024f14acb2

diff --git a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
index 5c18b13..f9441cd 100644
--- a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
+++ b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
@@ -136,9 +136,12 @@ void OutgoingJingleFileTransfer::handleSessionTerminateReceived(boost::optional<
 	if (reason && reason->type == JinglePayload::Reason::Cancel) {
 		setFinishedState(FileTransfer::State::Canceled, FileTransferError(FileTransferError::PeerError));
 	}
+	else if (reason && reason->type == JinglePayload::Reason::Decline) {
+		setFinishedState(FileTransfer::State::Canceled, boost::optional<FileTransferError>());
+	}
 	else if (reason && reason->type == JinglePayload::Reason::Success) {
 		setFinishedState(FileTransfer::State::Finished, boost::optional<FileTransferError>());
-	} 
+	}
 	else {
 		setFinishedState(FileTransfer::State::Failed, FileTransferError(FileTransferError::PeerError));
 	}
@@ -190,6 +193,7 @@ void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
 	transport->setDstAddr(dstAddr);
 	foreach(JingleS5BTransportPayload::Candidate candidate, candidates) {
 		transport->addCandidate(candidate);	
+		SWIFT_LOG(debug) << "\t" << "S5B candidate: " << candidate.hostPort.toString() << std::endl;
 	}
 	setState(WaitingForAccept);
 	session->sendInitiate(contentID, description, transport);
diff --git a/Swiften/FileTransfer/UnitTest/OutgoingJingleFileTransferTest.cpp b/Swiften/FileTransfer/UnitTest/OutgoingJingleFileTransferTest.cpp
index 40e7233..4b2fb50 100644
--- a/Swiften/FileTransfer/UnitTest/OutgoingJingleFileTransferTest.cpp
+++ b/Swiften/FileTransfer/UnitTest/OutgoingJingleFileTransferTest.cpp
@@ -56,17 +56,29 @@ class OutgoingJingleFileTransferTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST(test_SendSessionInitiateOnStart);
 		CPPUNIT_TEST(test_FallbackToIBBAfterFailingS5B);
 		CPPUNIT_TEST(test_ReceiveSessionTerminateAfterSessionInitiate);
+		CPPUNIT_TEST(test_DeclineEmitsFinishedStateCanceled);
 		CPPUNIT_TEST_SUITE_END();
 
 		class FTStatusHelper {
 		public:
-			bool finishedCalled;
-			FileTransferError::Type error;
+			FTStatusHelper() : finishedCalled(false), error(FileTransferError::UnknownError) {
+			}
+
 			void handleFileTransferFinished(boost::optional<FileTransferError> error) {
 				finishedCalled = true;
 				if (error.is_initialized()) this->error = error.get().getType();
 			}
+
+			void handleFileTransferStatusChanged(FileTransfer::State fileTransferSTate) {
+				state = fileTransferSTate;
+			}
+
+		public:
+			bool finishedCalled;
+			FileTransferError::Type error;
+			boost::optional<FileTransfer::State> state;
 		};
+
 public:
 
 		boost::shared_ptr<OutgoingJingleFileTransfer> createTestling() {
@@ -193,6 +205,22 @@ public:
 			CPPUNIT_ASSERT(FileTransferError::PeerError == helper.error);
 		}
 		
+		void test_DeclineEmitsFinishedStateCanceled() {
+			boost::shared_ptr<OutgoingJingleFileTransfer> transfer = createTestling();
+			transfer->start();
+
+			getCall<FakeJingleSession::InitiateCall>(0);
+
+			FTStatusHelper helper;
+			helper.finishedCalled = false;
+			transfer->onFinished.connect(bind(&FTStatusHelper::handleFileTransferFinished, &helper, _1));
+			transfer->onStateChanged.connect(bind(&FTStatusHelper::handleFileTransferStatusChanged, &helper, _1));
+			fakeJingleSession->handleSessionTerminateReceived(JinglePayload::Reason(JinglePayload::Reason::Decline));
+			CPPUNIT_ASSERT_EQUAL(true, helper.finishedCalled);
+			CPPUNIT_ASSERT(FileTransferError::UnknownError == helper.error);
+			CPPUNIT_ASSERT_EQUAL(true, helper.state.is_initialized());
+			CPPUNIT_ASSERT(FileTransfer::State::Canceled == helper.state.get().type);
+		}
 
 //TODO: some more testcases
 
-- 
cgit v0.10.2-6-g49f6