From cb62de17d1e17fd3049a6bc8155a100574a42a85 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Thu, 29 Oct 2015 11:12:03 +0100
Subject: Add FileTransfer::getState() method

In addition, this adds the file-transfer classes to the
Doxygen documentation.

Test-Information:

Unit and integration tests still pass.

Change-Id: Ib6c16078c90ed56fae835cb2abfea8a564c3afa3

diff --git a/Documentation/API/Doxyfile b/Documentation/API/Doxyfile
index 84fdaac..0634800 100644
--- a/Documentation/API/Doxyfile
+++ b/Documentation/API/Doxyfile
@@ -89,17 +89,18 @@ INPUT                  = \
 	Swiften/Base \
 	Swiften/Chat \
 	Swiften/Client/Client.h \
-	Swiften/Client/CoreClient.h \
 	Swiften/Client/ClientError.h \
-	Swiften/Client/StanzaChannel.h \
+	Swiften/Client/CoreClient.h \
+	Swiften/Client/MemoryStorages.h \
 	Swiften/Client/NickResolver.h \
+	Swiften/Client/StanzaChannel.h \
 	Swiften/Client/Storages.h \
-	Swiften/Client/MemoryStorages.h \
 	Swiften/Component/Component.h \
 	Swiften/Component/CoreComponent.h \
 	Swiften/Disco \
 	Swiften/Elements \
 	Swiften/EventLoop \
+	Swiften/FileTransfer \
 	Swiften/JID \
 	Swiften/MUC \
 	Swiften/Presence \
diff --git a/Swiften/FileTransfer/FileTransfer.cpp b/Swiften/FileTransfer/FileTransfer.cpp
index 6b594aa..f63a4e8 100644
--- a/Swiften/FileTransfer/FileTransfer.cpp
+++ b/Swiften/FileTransfer/FileTransfer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Isode Limited.
+ * Copyright (c) 2013-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -8,13 +8,18 @@
 
 using namespace Swift;
 
-FileTransfer::FileTransfer() : fileSizeInBytes(0) {
+FileTransfer::FileTransfer() : fileSizeInBytes_(0), state_(State::Initial) {
 }
 
 FileTransfer::~FileTransfer() {
 }
 
+void FileTransfer::setState(const State& state) {
+	state_ = state;
+	onStateChanged(state);
+}
+
 void FileTransfer::setFileInfo(const std::string& name, boost::uintmax_t size) {
-	filename = name;
-	fileSizeInBytes = size;
+	filename_ = name;
+	fileSizeInBytes_ = size;
 }
diff --git a/Swiften/FileTransfer/FileTransfer.h b/Swiften/FileTransfer/FileTransfer.h
index 01c8295..afb3f7b 100644
--- a/Swiften/FileTransfer/FileTransfer.h
+++ b/Swiften/FileTransfer/FileTransfer.h
@@ -21,6 +21,12 @@
 #include <Swiften/FileTransfer/FileTransferError.h>
 
 namespace Swift {
+	/**
+	 * The FileTransfer class provides a general interface for file-transfer
+	 * implmenetations. Currently, only Jingle File Transfer based on XEP-0234 is
+	 * implementated in the \ref OutgoingJingleFileTransfer and
+	 * \ref IncomingJingleFileTransfer classes.
+	 */
 	class SWIFTEN_API FileTransfer {
 		public:
 			struct State {
@@ -49,11 +55,15 @@ namespace Swift {
 			virtual void cancel() = 0;
 
 			const std::string& getFileName() const {
-				return filename;
+				return filename_;
 			}
 
 			boost::uintmax_t getFileSizeInBytes() const {
-				return fileSizeInBytes;
+				return fileSizeInBytes_;
+			}
+
+			const State& getState() const {
+				return state_;
 			}
 
 		public:
@@ -62,10 +72,12 @@ namespace Swift {
 			boost::signal<void (boost::optional<FileTransferError>)> onFinished;
 
 		protected:
+			void setState(const State& state);
 			void setFileInfo(const std::string& name, boost::uintmax_t size);
 
 		private:
-			boost::uintmax_t fileSizeInBytes;
-			std::string filename;
+			boost::uintmax_t fileSizeInBytes_;
+			std::string filename_;
+			State state_;
 	};
 }
diff --git a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
index f9441cd..6369581 100644
--- a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
+++ b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
@@ -89,7 +89,7 @@ void OutgoingJingleFileTransfer::start() {
 	}
 
 	setTransporter(transporterFactory->createInitiatorTransporter(getInitiator(), getResponder(), options));
-	setState(GeneratingInitialLocalCandidates);
+	setInternalState(GeneratingInitialLocalCandidates);
 	transporter->startGeneratingLocalCandidates();
 }
 
@@ -116,7 +116,7 @@ void OutgoingJingleFileTransfer::handleSessionAcceptReceived(
 
 	if (JingleS5BTransportPayload::ref s5bPayload = boost::dynamic_pointer_cast<JingleS5BTransportPayload>(transportPayload)) {
 		transporter->addRemoteCandidates(s5bPayload->getCandidates(), s5bPayload->getDstAddr());
-		setState(TryingCandidates);
+		setInternalState(TryingCandidates);
 		transporter->startTryingRemoteCandidates();
 	}
 	else {
@@ -178,7 +178,7 @@ void OutgoingJingleFileTransfer::sendSessionInfoHash() {
 void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
 		const std::string& s5bSessionID, const std::vector<JingleS5BTransportPayload::Candidate>& candidates, const std::string& dstAddr) {
 	SWIFT_LOG(debug) << std::endl;
-	if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+	if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; }
 
 	fillCandidateMap(localCandidates, candidates);
 
@@ -195,7 +195,7 @@ void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
 		transport->addCandidate(candidate);	
 		SWIFT_LOG(debug) << "\t" << "S5B candidate: " << candidate.hostPort.toString() << std::endl;
 	}
-	setState(WaitingForAccept);
+	setInternalState(WaitingForAccept);
 	session->sendInitiate(contentID, description, transport);
 }
 
@@ -205,7 +205,7 @@ void OutgoingJingleFileTransfer::fallback() {
 		JingleIBBTransportPayload::ref ibbTransport = boost::make_shared<JingleIBBTransportPayload>();
 		ibbTransport->setBlockSize(DEFAULT_BLOCK_SIZE);
 		ibbTransport->setSessionID(idGenerator->generateID());
-		setState(FallbackRequested);
+		setInternalState(FallbackRequested);
 		session->sendTransportReplace(contentID, ibbTransport);
 	}
 	else {
@@ -225,7 +225,7 @@ void OutgoingJingleFileTransfer::handleTransferFinished(boost::optional<FileTran
 		sendSessionInfoHash();
 
 		// wait for other party to terminate session after they have verified the hash
-		setState(WaitForTermination);
+		setInternalState(WaitForTermination);
 		waitForRemoteTermination->start();
 	}
 }
@@ -238,15 +238,15 @@ void OutgoingJingleFileTransfer::startTransferring(boost::shared_ptr<TransportSe
 			boost::bind(boost::ref(onProcessedBytes), _1));
 	transferFinishedConnection = transportSession->onFinished.connect(
 			boost::bind(&OutgoingJingleFileTransfer::handleTransferFinished, this, _1));
-	setState(Transferring);
+	setInternalState(Transferring);
 	transportSession->start();
 }
 
 
-void OutgoingJingleFileTransfer::setState(State state) {
+void OutgoingJingleFileTransfer::setInternalState(State state) {
 	SWIFT_LOG(debug) <<  state << std::endl;
 	this->state = state;
-	onStateChanged(FileTransfer::State(getExternalState(state)));
+	setState(FileTransfer::State(getExternalState(state)));
 }
 
 void OutgoingJingleFileTransfer::setFinishedState(
@@ -306,7 +306,7 @@ void OutgoingJingleFileTransfer::startTransferViaRemoteCandidate() {
 	SWIFT_LOG(debug) << std::endl;
 
 	if (ourCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
-		setState(WaitingForPeerProxyActivate);
+		setInternalState(WaitingForPeerProxyActivate);
 	} 
 	else {
 		transportSession = createRemoteCandidateSession();
@@ -318,7 +318,7 @@ void OutgoingJingleFileTransfer::startTransferViaLocalCandidate() {
 	SWIFT_LOG(debug) << std::endl;
 
 	if (theirCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
-		setState(WaitingForLocalProxyActivate);
+		setInternalState(WaitingForLocalProxyActivate);
 		transporter->startActivatingProxy(theirCandidateChoice->jid);
 	} 
 	else {
@@ -332,7 +332,7 @@ void OutgoingJingleFileTransfer::startTransferringIfCandidateAcknowledged() {
 		startTransferring(transportSession);
 	}
 	else {
-		setState(WaitingForCandidateAcknowledge);
+		setInternalState(WaitingForCandidateAcknowledge);
 	}
 }
 
diff --git a/Swiften/FileTransfer/OutgoingJingleFileTransfer.h b/Swiften/FileTransfer/OutgoingJingleFileTransfer.h
index 4cb2685..96b465b 100644
--- a/Swiften/FileTransfer/OutgoingJingleFileTransfer.h
+++ b/Swiften/FileTransfer/OutgoingJingleFileTransfer.h
@@ -12,27 +12,27 @@
 
 #pragma once
 
-#include <boost/shared_ptr.hpp>
 #include <boost/optional/optional.hpp>
+#include <boost/shared_ptr.hpp>
 
 #include <Swiften/Base/API.h>
 #include <Swiften/Base/Override.h>
-#include <Swiften/Jingle/JingleContentID.h>
 #include <Swiften/Elements/JingleFileTransferFileInfo.h>
-#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
-#include <Swiften/FileTransfer/JingleFileTransfer.h>
 #include <Swiften/FileTransfer/FileTransferOptions.h>
+#include <Swiften/FileTransfer/JingleFileTransfer.h>
+#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
+#include <Swiften/Jingle/JingleContentID.h>
 #include <Swiften/Network/Timer.h>
 
 namespace Swift {
-	class ReadBytestream;
-	class IDGenerator;
-	class IncrementalBytestreamHashCalculator;
 	class CryptoProvider;
 	class FileTransferTransporter;
 	class FileTransferTransporterFactory;
-	class TransportSession;
+	class IDGenerator;
+	class IncrementalBytestreamHashCalculator;
+	class ReadBytestream;
 	class TimerFactory;
+	class TransportSession;
 
 	class SWIFTEN_API OutgoingJingleFileTransfer : public OutgoingFileTransfer, public JingleFileTransfer {
 		public:
@@ -98,7 +98,7 @@ namespace Swift {
 			void handleWaitForRemoteTerminationTimeout();
 
 			void stopAll();
-			void setState(State state);
+			void setInternalState(State state);
 			void setFinishedState(FileTransfer::State::Type, const boost::optional<FileTransferError>& error);
 
 			static FileTransfer::State::Type getExternalState(State state);
-- 
cgit v0.10.2-6-g49f6