diff options
| author | Remko Tronçon <git@el-tramo.be> | 2012-12-25 14:39:48 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2013-05-11 10:22:56 (GMT) | 
| commit | 927d62cc54c8a5087dba6b61afa9ad30dc528a23 (patch) | |
| tree | e67dc911bd30c0519d31a542d8e085bbb209879d /Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp | |
| parent | 17b188343e7208b875af7af30d94f0bf948f6b93 (diff) | |
| download | swift-927d62cc54c8a5087dba6b61afa9ad30dc528a23.zip swift-927d62cc54c8a5087dba6b61afa9ad30dc528a23.tar.bz2 | |
File Transfer refactoring.
Allocate S5B server lazily.
Forward forts lazily.
Various state machine fixes.
Temporarily disabling S5B proxy support.
Change-Id: I3145e85a99b15a7e457306bbfbe9c0eb570191e4
Diffstat (limited to 'Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp')
| -rw-r--r-- | Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp | 94 | 
1 files changed, 49 insertions, 45 deletions
| diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp index 7521822..12a0f12 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp @@ -15,54 +15,61 @@  #include <Swiften/Base/Algorithm.h>  #include <Swiften/Base/Concat.h>  #include <Swiften/Base/Log.h> +#include <Swiften/Network/HostAddressPort.h>  #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h>  #include <Swiften/FileTransfer/BytestreamException.h>  namespace Swift { -SOCKS5BytestreamServerSession::SOCKS5BytestreamServerSession(boost::shared_ptr<Connection> connection, SOCKS5BytestreamRegistry* bytestreams) : connection(connection), bytestreams(bytestreams), state(Initial), chunkSize(131072), waitingForData(false) { -	connection->onDisconnected.connect(boost::bind(&SOCKS5BytestreamServerSession::handleDisconnected, this, _1)); +SOCKS5BytestreamServerSession::SOCKS5BytestreamServerSession( +		boost::shared_ptr<Connection> connection,  +		SOCKS5BytestreamRegistry* bytestreams) :  +			connection(connection),  +			bytestreams(bytestreams),  +			state(Initial),  +			chunkSize(131072),  +			waitingForData(false) { +	disconnectedConnection = connection->onDisconnected.connect(boost::bind(&SOCKS5BytestreamServerSession::handleDisconnected, this, _1));  }  SOCKS5BytestreamServerSession::~SOCKS5BytestreamServerSession() {  	if (state != Finished && state != Initial) { -		std::cerr << "Warning: SOCKS5BytestremServerSession unfinished" << std::endl; +		std::cerr << "Warning: SOCKS5BytestreamServerSession unfinished" << std::endl;  		finish(false);  	}  }  void SOCKS5BytestreamServerSession::start() {  	SWIFT_LOG(debug) << std::endl; -	connection->onDataRead.connect(boost::bind(&SOCKS5BytestreamServerSession::handleDataRead, this, _1)); +	dataReadConnection = connection->onDataRead.connect( +			boost::bind(&SOCKS5BytestreamServerSession::handleDataRead, this, _1));  	state = WaitingForAuthentication;  }  void SOCKS5BytestreamServerSession::stop() { -	connection->onDataWritten.disconnect(boost::bind(&SOCKS5BytestreamServerSession::sendData, this)); -	connection->onDataRead.disconnect(boost::bind(&SOCKS5BytestreamServerSession::handleDataRead, this, _1)); -	connection->disconnect(); -	if (readBytestream) { -			readBytestream->onDataAvailable.disconnect(boost::bind(&SOCKS5BytestreamServerSession::handleDataAvailable, this)); -	} -	state = Finished; +	finish(false);  } -void SOCKS5BytestreamServerSession::startTransfer() { -	if (state == ReadyForTransfer) { -		if (readBytestream) { -			state = WritingData; -			connection->onDataWritten.connect(boost::bind(&SOCKS5BytestreamServerSession::sendData, this)); -			sendData(); -		} -		else if(writeBytestream) { -			state = ReadingData; -			writeBytestream->write(unprocessedData); -			onBytesReceived(unprocessedData.size()); -			unprocessedData.clear(); -		} -	} else { -		SWIFT_LOG(debug) << "Not ready for transfer!" << std::endl; -	} +void SOCKS5BytestreamServerSession::startSending(boost::shared_ptr<ReadBytestream> stream) { +	if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!" << std::endl; return; } + +	readBytestream = stream; +	state = WritingData; +	dataAvailableConnection = readBytestream->onDataAvailable.connect( +			boost::bind(&SOCKS5BytestreamServerSession::handleDataAvailable, this)); +	dataWrittenConnection = connection->onDataWritten.connect( +			boost::bind(&SOCKS5BytestreamServerSession::sendData, this)); +	sendData(); +} + +void SOCKS5BytestreamServerSession::startReceiving(boost::shared_ptr<WriteBytestream> stream) { +	if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!" << std::endl; return; } + +	writeBytestream = stream; +	state = ReadingData; +	writeBytestream->write(unprocessedData); +	onBytesReceived(unprocessedData.size()); +	unprocessedData.clear();  }  HostAddressPort SOCKS5BytestreamServerSession::getAddressPort() const { @@ -87,9 +94,7 @@ void SOCKS5BytestreamServerSession::handleDataAvailable() {  void SOCKS5BytestreamServerSession::handleDisconnected(const boost::optional<Connection::Error>& error) {  	SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error") << std::endl; -	if (error) { -		finish(true); -	} +	finish(error);  }  void SOCKS5BytestreamServerSession::process() { @@ -128,29 +133,22 @@ void SOCKS5BytestreamServerSession::process() {  					SWIFT_LOG(debug) << "Junk after authentication mechanism" << std::endl;  				}  				unprocessedData.clear(); -				std::string streamID = byteArrayToString(requestID); -				readBytestream = bytestreams->getReadBytestream(streamID); -				writeBytestream = bytestreams->getWriteBytestream(streamID); +				streamID = byteArrayToString(requestID); +				bool hasBytestream = bytestreams->hasBytestream(streamID);  				SafeByteArray result = createSafeByteArray("\x05", 1); -				result.push_back((readBytestream || writeBytestream) ? 0x0 : 0x4); +				result.push_back(hasBytestream ? 0x0 : 0x4);  				append(result, createByteArray("\x00\x03", 2));  				result.push_back(boost::numeric_cast<unsigned char>(requestID.size()));  				append(result, concat(requestID, createByteArray("\x00\x00", 2))); -				if (!readBytestream && !writeBytestream) { +				if (!hasBytestream) {  					SWIFT_LOG(debug) << "Readstream or Wrtiestream with ID " << streamID << " not found!" << std::endl;  					connection->write(result);  					finish(true);  				}  				else { -					SWIFT_LOG(debug) << "Found " << (readBytestream ? "Readstream" : "Writestream") << ". Sent OK." << std::endl; +					SWIFT_LOG(debug) << "Found stream. Sent OK." << std::endl;  					connection->write(result); -					bytestreams->serverSessions[streamID] = this;  					state = ReadyForTransfer; - -					if (readBytestream) { -							readBytestream->onDataAvailable.connect(boost::bind(&SOCKS5BytestreamServerSession::handleDataAvailable, this)); -					} -  				}  			}  		} @@ -180,9 +178,15 @@ void SOCKS5BytestreamServerSession::sendData() {  }  void SOCKS5BytestreamServerSession::finish(bool error) { -	connection->onDataWritten.disconnect(boost::bind(&SOCKS5BytestreamServerSession::sendData, this)); -	connection->onDataRead.disconnect(boost::bind(&SOCKS5BytestreamServerSession::handleDataRead, this, _1)); -	connection->onDisconnected.disconnect(boost::bind(&SOCKS5BytestreamServerSession::handleDisconnected, this, _1)); +	SWIFT_LOG(debug) << error << " " << state << std::endl; +	if (state == Finished) { +		return; +	} + +	disconnectedConnection.disconnect(); +	dataReadConnection.disconnect(); +	dataWrittenConnection.disconnect(); +	dataAvailableConnection.disconnect();  	readBytestream.reset();  	state = Finished;  	if (error) { | 
 Swift
 Swift