diff options
| author | Remko Tronçon <git@el-tramo.be> | 2011-09-29 20:21:01 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2011-09-29 20:21:01 (GMT) | 
| commit | eb25d910e7991503eaa74233f0b396648f512e88 (patch) | |
| tree | caeb9c22e97991be73235285c53fc93197a5eebb /Swiften/FileTransfer/IBBSendSession.cpp | |
| parent | bea648fcd6bce4f0d7f19725f60e5b2b3ef0a340 (diff) | |
| download | swift-contrib-eb25d910e7991503eaa74233f0b396648f512e88.zip swift-contrib-eb25d910e7991503eaa74233f0b396648f512e88.tar.bz2  | |
Allow ReadBytestreams to be resumed.
Diffstat (limited to 'Swiften/FileTransfer/IBBSendSession.cpp')
| -rw-r--r-- | Swiften/FileTransfer/IBBSendSession.cpp | 42 | 
1 files changed, 30 insertions, 12 deletions
diff --git a/Swiften/FileTransfer/IBBSendSession.cpp b/Swiften/FileTransfer/IBBSendSession.cpp index b925c5f..3a1390c 100644 --- a/Swiften/FileTransfer/IBBSendSession.cpp +++ b/Swiften/FileTransfer/IBBSendSession.cpp @@ -14,10 +14,12 @@  namespace Swift { -IBBSendSession::IBBSendSession(const std::string& id, const JID& from, const JID& to, boost::shared_ptr<ReadBytestream> bytestream, IQRouter* router) : id(id), from(from), to(to), bytestream(bytestream), router(router), blockSize(4096), sequenceNumber(0), active(false) { +IBBSendSession::IBBSendSession(const std::string& id, const JID& from, const JID& to, boost::shared_ptr<ReadBytestream> bytestream, IQRouter* router) : id(id), from(from), to(to), bytestream(bytestream), router(router), blockSize(4096), sequenceNumber(0), active(false), waitingForData(false) { +	bytestream->onDataAvailable.connect(boost::bind(&IBBSendSession::handleDataAvailable, this));  }  IBBSendSession::~IBBSendSession() { +	bytestream->onDataAvailable.disconnect(boost::bind(&IBBSendSession::handleDataAvailable, this));  }  void IBBSendSession::start() { @@ -37,17 +39,7 @@ void IBBSendSession::stop() {  void IBBSendSession::handleIBBResponse(IBB::ref, ErrorPayload::ref error) {  	if (!error && active) {  		if (!bytestream->isFinished()) { -			try { -				std::vector<unsigned char> data = bytestream->read(blockSize); -				IBBRequest::ref request = IBBRequest::create(from, to, IBB::createIBBData(id, sequenceNumber, data), router); -				sequenceNumber++; -				request->onResponse.connect(boost::bind(&IBBSendSession::handleIBBResponse, this, _1, _2)); -				request->send(); -				onBytesSent(data.size()); -			} -			catch (const BytestreamException&) { -				finish(FileTransferError(FileTransferError::ReadError)); -			} +			sendMoreData();  		}  		else {  			finish(boost::optional<FileTransferError>()); @@ -58,9 +50,35 @@ void IBBSendSession::handleIBBResponse(IBB::ref, ErrorPayload::ref error) {  	}  } +void IBBSendSession::sendMoreData() { +	try { +		std::vector<unsigned char> data = bytestream->read(blockSize); +		if (!data.empty()) { +			waitingForData = false; +			IBBRequest::ref request = IBBRequest::create(from, to, IBB::createIBBData(id, sequenceNumber, data), router); +			sequenceNumber++; +			request->onResponse.connect(boost::bind(&IBBSendSession::handleIBBResponse, this, _1, _2)); +			request->send(); +			onBytesSent(data.size()); +		} +		else { +			waitingForData = true; +		} +	} +	catch (const BytestreamException&) { +		finish(FileTransferError(FileTransferError::ReadError)); +	} +} +  void IBBSendSession::finish(boost::optional<FileTransferError> error) {  	active = false;  	onFinished(error);  } +void IBBSendSession::handleDataAvailable() { +	if (waitingForData) { +		sendMoreData(); +	} +} +  }  | 
 Swift