summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/FileTransfer')
-rw-r--r--Swiften/FileTransfer/IBBReceiveSession.cpp16
-rw-r--r--Swiften/FileTransfer/IncomingFileTransferManager.cpp5
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp2
3 files changed, 12 insertions, 11 deletions
diff --git a/Swiften/FileTransfer/IBBReceiveSession.cpp b/Swiften/FileTransfer/IBBReceiveSession.cpp
index 3aa6fdc..8cfd95d 100644
--- a/Swiften/FileTransfer/IBBReceiveSession.cpp
+++ b/Swiften/FileTransfer/IBBReceiveSession.cpp
@@ -1,117 +1,117 @@
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <Swiften/FileTransfer/IBBReceiveSession.h>
#include <boost/bind.hpp>
#include <Swiften/Base/Log.h>
#include <Swiften/Queries/IQRouter.h>
#include <Swiften/FileTransfer/IBBRequest.h>
#include <Swiften/FileTransfer/BytestreamException.h>
#include <Swiften/Queries/SetResponder.h>
#include <cassert>
namespace Swift {
class IBBReceiveSession::IBBResponder : public SetResponder<IBB> {
public:
IBBResponder(IBBReceiveSession* session, IQRouter* router) : SetResponder<IBB>(router), session(session), sequenceNumber(0), receivedSize(0) {
}
virtual bool handleSetRequest(const JID& from, const JID&, const std::string& id, IBB::ref ibb) {
if (from == session->from && ibb->getStreamID() == session->id) {
if (ibb->getAction() == IBB::Data) {
if (sequenceNumber == ibb->getSequenceNumber()) {
session->bytestream->write(ibb->getData());
receivedSize += ibb->getData().size();
sequenceNumber++;
sendResponse(from, id, IBB::ref());
if (receivedSize >= session->size) {
if (receivedSize > session->size) {
- std::cerr << "Warning: Received more data than expected" << std::endl;
+ SWIFT_LOG(warning) << "Received more data than expected";
}
session->finish(boost::optional<FileTransferError>());
}
}
else {
- SWIFT_LOG(warning) << "Received data out of order" << std::endl;
+ SWIFT_LOG(warning) << "Received data out of order";
sendError(from, id, ErrorPayload::NotAcceptable, ErrorPayload::Cancel);
session->finish(FileTransferError(FileTransferError::ClosedError));
}
}
else if (ibb->getAction() == IBB::Open) {
- SWIFT_LOG(debug) << "IBB open received" << std::endl;
+ SWIFT_LOG(debug) << "IBB open received";
sendResponse(from, id, IBB::ref());
}
else if (ibb->getAction() == IBB::Close) {
- SWIFT_LOG(debug) << "IBB close received" << std::endl;
+ SWIFT_LOG(debug) << "IBB close received";
sendResponse(from, id, IBB::ref());
session->finish(FileTransferError(FileTransferError::ClosedError));
}
return true;
}
- SWIFT_LOG(debug) << "wrong from/sessionID: " << from << " == " << session->from << " / " <<ibb->getStreamID() << " == " << session->id << std::endl;
+ SWIFT_LOG(debug) << "wrong from/sessionID: " << from << " == " << session->from << " / " <<ibb->getStreamID() << " == " << session->id;
return false;
}
private:
IBBReceiveSession* session;
int sequenceNumber;
unsigned long long receivedSize;
};
IBBReceiveSession::IBBReceiveSession(
const std::string& id,
const JID& from,
const JID& to,
unsigned long long size,
boost::shared_ptr<WriteBytestream> bytestream,
IQRouter* router) :
id(id),
from(from),
to(to),
size(size),
bytestream(bytestream),
router(router),
active(false) {
assert(!id.empty());
assert(from.isValid());
responder = new IBBResponder(this, router);
}
IBBReceiveSession::~IBBReceiveSession() {
if (active) {
- SWIFT_LOG(warning) << "Session still active" << std::endl;
+ SWIFT_LOG(warning) << "Session still active";
}
delete responder;
}
void IBBReceiveSession::start() {
- SWIFT_LOG(debug) << "receive session started" << std::endl;
+ SWIFT_LOG(debug) << "receive session started";
active = true;
responder->start();
}
void IBBReceiveSession::stop() {
- SWIFT_LOG(debug) << "receive session stopped" << std::endl;
+ SWIFT_LOG(debug) << "receive session stopped";
responder->stop();
if (active) {
if (router->isAvailable()) {
IBBRequest::create(to, from, IBB::createIBBClose(id), router)->send();
}
finish(boost::optional<FileTransferError>());
}
}
void IBBReceiveSession::finish(boost::optional<FileTransferError> error) {
active = false;
onFinished(error);
}
}
diff --git a/Swiften/FileTransfer/IncomingFileTransferManager.cpp b/Swiften/FileTransfer/IncomingFileTransferManager.cpp
index d40c5de..d8c4f89 100644
--- a/Swiften/FileTransfer/IncomingFileTransferManager.cpp
+++ b/Swiften/FileTransfer/IncomingFileTransferManager.cpp
@@ -1,67 +1,68 @@
/*
- * Copyright (c) 2010-2013 Remko Tronçon
+ * Copyright (c) 2010-2014 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
#include <boost/smart_ptr/make_shared.hpp>
+#include <Swiften/Base/Log.h>
#include <Swiften/Elements/JingleDescription.h>
#include <Swiften/Elements/JingleFileTransferDescription.h>
#include <Swiften/Elements/JingleIBBTransportPayload.h>
#include <Swiften/Elements/JingleS5BTransportPayload.h>
#include <Swiften/Jingle/JingleSessionManager.h>
#include <Swiften/Jingle/Jingle.h>
#include <Swiften/FileTransfer/IncomingJingleFileTransfer.h>
namespace Swift {
IncomingFileTransferManager::IncomingFileTransferManager(
JingleSessionManager* jingleSessionManager,
IQRouter* router,
FileTransferTransporterFactory* transporterFactory,
TimerFactory* timerFactory,
CryptoProvider* crypto) :
jingleSessionManager(jingleSessionManager),
router(router),
transporterFactory(transporterFactory),
timerFactory(timerFactory),
crypto(crypto) {
jingleSessionManager->addIncomingSessionHandler(this);
}
IncomingFileTransferManager::~IncomingFileTransferManager() {
jingleSessionManager->removeIncomingSessionHandler(this);
}
bool IncomingFileTransferManager::handleIncomingJingleSession(
JingleSession::ref session,
const std::vector<JingleContentPayload::ref>& contents,
const JID& recipient) {
if (JingleContentPayload::ref content = Jingle::getContentWithDescription<JingleFileTransferDescription>(contents)) {
if (content->getTransport<JingleS5BTransportPayload>()) {
JingleFileTransferDescription::ref description = content->getDescription<JingleFileTransferDescription>();
if (description && description->getOffers().size() == 1) {
IncomingJingleFileTransfer::ref transfer = boost::make_shared<IncomingJingleFileTransfer>(
recipient, session, content, transporterFactory, timerFactory, crypto);
onIncomingFileTransfer(transfer);
}
else {
- std::cerr << "Received a file-transfer request with no description or more than one file!" << std::endl;
+ SWIFT_LOG(warning) << "Received a file-transfer request with no description or more than one file.";
session->sendTerminate(JinglePayload::Reason::FailedApplication);
}
}
else {
session->sendTerminate(JinglePayload::Reason::UnsupportedTransports);
}
return true;
}
else {
return false;
}
}
}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
index f393c8d..cb34c58 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
@@ -62,71 +62,71 @@ void SOCKS5BytestreamServerSession::startSending(boost::shared_ptr<ReadBytestrea
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 {
return connection->getLocalAddress();
}
void SOCKS5BytestreamServerSession::handleDataRead(boost::shared_ptr<SafeByteArray> data) {
if (state != ReadingData) {
append(unprocessedData, *data);
process();
} else {
writeBytestream->write(createByteArray(vecptr(*data), data->size()));
// onBytesReceived(data->size());
}
}
void SOCKS5BytestreamServerSession::handleDataAvailable() {
if (waitingForData) {
sendData();
}
}
void SOCKS5BytestreamServerSession::handleDisconnected(const boost::optional<Connection::Error>& error) {
SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error") << std::endl;
- finish(error);
+ finish(error ? true : false);
}
void SOCKS5BytestreamServerSession::process() {
if (state == WaitingForAuthentication) {
if (unprocessedData.size() >= 2) {
size_t authCount = unprocessedData[1];
size_t i = 2;
while (i < 2 + authCount && i < unprocessedData.size()) {
// Skip authentication mechanism
++i;
}
if (i == 2 + authCount) {
// Authentication message is complete
if (i != unprocessedData.size()) {
SWIFT_LOG(debug) << "Junk after authentication mechanism" << std::endl;
}
unprocessedData.clear();
connection->write(createSafeByteArray("\x05\x00", 2));
state = WaitingForRequest;
}
}
}
else if (state == WaitingForRequest) {
if (unprocessedData.size() >= 5) {
ByteArray requestID;
size_t i = 5;
size_t hostnameSize = unprocessedData[4];
while (i < 5 + hostnameSize && i < unprocessedData.size()) {
requestID.push_back(unprocessedData[i]);
++i;
}
// Skip the port: 2 byte large, one already skipped. Add one for comparison with size
i += 2;
if (i <= unprocessedData.size()) {
if (i != unprocessedData.size()) {