Files
@ 5c1c94902bc5
Branch filter:
Location: libtransport.git/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp - annotation
5c1c94902bc5
4.6 KiB
text/x-c++hdr
Added redhat packaging components -- needs some work on spec file version detection in particular.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 b55ba07e93d3 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 7b118794ceaf 7b118794ceaf 7b118794ceaf 7b118794ceaf 7b118794ceaf 7b118794ceaf 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be 88b7dd86b2be | /*
* 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/MyOutgoingSIFileTransfer.h>
#include <boost/bind.hpp>
#include <Swiften/FileTransfer/StreamInitiationRequest.h>
#include <Swiften/FileTransfer/BytestreamsRequest.h>
#include <Swiften/FileTransfer/SOCKS5BytestreamServer.h>
#include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h>
#include <Swiften/FileTransfer/IBBSendSession.h>
namespace Swift {
MyOutgoingSIFileTransfer::MyOutgoingSIFileTransfer(const std::string& id, const JID& from, const JID& to, const std::string& name, int size, const std::string& description, boost::shared_ptr<ReadBytestream> bytestream, IQRouter* iqRouter, SOCKS5BytestreamServer* socksServer, SOCKS5BytestreamRegistry* registry) : id(id), from(from), to(to), name(name), size(size), description(description), bytestream(bytestream), iqRouter(iqRouter), socksServer(socksServer), registry(registry) {
}
void MyOutgoingSIFileTransfer::start() {
StreamInitiation::ref streamInitiation(new StreamInitiation());
streamInitiation->setID(id);
streamInitiation->setFileInfo(StreamInitiationFileInfo(name, description, size));
streamInitiation->addProvidedMethod("http://jabber.org/protocol/bytestreams");
streamInitiation->addProvidedMethod("http://jabber.org/protocol/ibb");
StreamInitiationRequest::ref request = StreamInitiationRequest::create(from, to, streamInitiation, iqRouter);
request->onResponse.connect(boost::bind(&MyOutgoingSIFileTransfer::handleStreamInitiationRequestResponse, this, _1, _2));
request->send();
}
void MyOutgoingSIFileTransfer::stop() {
}
void MyOutgoingSIFileTransfer::cancel() {
// TODO
// session->sendTerminate(JinglePayload::Reason::Cancel);
if (ibbSession) {
ibbSession->stop();
}
SOCKS5BytestreamServerSession *serverSession = registry->getConnectedSession(SOCKS5BytestreamRegistry::getHostname(id, from, to));
if (serverSession) {
serverSession->stop();
}
onStateChange(FileTransfer::State(FileTransfer::State::Canceled));
}
void MyOutgoingSIFileTransfer::handleStreamInitiationRequestResponse(StreamInitiation::ref response, ErrorPayload::ref error) {
if (error) {
finish(FileTransferError());
}
else {
if (response->getRequestedMethod() == "http://jabber.org/protocol/bytestreams") {
registry->addReadBytestream(SOCKS5BytestreamRegistry::getHostname(id, from, to), bytestream);
socksServer->addReadBytestream(id, from, to, bytestream);
Bytestreams::ref bytestreams(new Bytestreams());
bytestreams->setStreamID(id);
HostAddressPort addressPort = socksServer->getAddressPort();
bytestreams->addStreamHost(Bytestreams::StreamHost(addressPort.getAddress().toString(), from, addressPort.getPort()));
BytestreamsRequest::ref request = BytestreamsRequest::create(from, to, bytestreams, iqRouter);
request->onResponse.connect(boost::bind(&MyOutgoingSIFileTransfer::handleBytestreamsRequestResponse, this, _1, _2));
request->send();
}
else if (response->getRequestedMethod() == "http://jabber.org/protocol/ibb") {
ibbSession = boost::shared_ptr<IBBSendSession>(new IBBSendSession(id, from, to, bytestream, iqRouter));
ibbSession->onFinished.connect(boost::bind(&MyOutgoingSIFileTransfer::handleIBBSessionFinished, this, _1));
ibbSession->start();
onStateChange(FileTransfer::State(FileTransfer::State::Transferring));
}
}
}
void MyOutgoingSIFileTransfer::handleBytestreamsRequestResponse(Bytestreams::ref, ErrorPayload::ref error) {
if (error) {
finish(FileTransferError());
return;
}
SOCKS5BytestreamServerSession *serverSession = registry->getConnectedSession(SOCKS5BytestreamRegistry::getHostname(id, from, to));
// serverSession->onBytesSent.connect(boost::bind(boost::ref(onProcessedBytes), _1));
// serverSession->onFinished.connect(boost::bind(&OutgoingJingleFileTransfer::handleTransferFinished, this, _1));
serverSession->startTransfer();
onStateChange(FileTransfer::State(FileTransfer::State::Transferring));
//socksServer->onTransferFinished.connect();
}
void MyOutgoingSIFileTransfer::finish(boost::optional<FileTransferError> error) {
if (ibbSession) {
ibbSession->onFinished.disconnect(boost::bind(&MyOutgoingSIFileTransfer::handleIBBSessionFinished, this, _1));
ibbSession.reset();
}
socksServer->removeReadBytestream(id, from, to);
if(error) {
onStateChange(FileTransfer::State(FileTransfer::State::Canceled));
}
else {
onStateChange(FileTransfer::State(FileTransfer::State::Finished));
}
onFinished(error);
}
void MyOutgoingSIFileTransfer::handleIBBSessionFinished(boost::optional<FileTransferError> error) {
finish(error);
}
}
|