summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/FileTransfer/FileTransferManager.h1
-rw-r--r--Swiften/FileTransfer/FileTransferManagerImpl.cpp12
-rw-r--r--Swiften/FileTransfer/FileTransferManagerImpl.h105
-rw-r--r--Swiften/FileTransfer/SConscript1
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp62
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h42
6 files changed, 169 insertions, 54 deletions
diff --git a/Swiften/FileTransfer/FileTransferManager.h b/Swiften/FileTransfer/FileTransferManager.h
index 3a1628f..d59f029 100644
--- a/Swiften/FileTransfer/FileTransferManager.h
+++ b/Swiften/FileTransfer/FileTransferManager.h
@@ -24,7 +24,6 @@ namespace Swift {
virtual ~FileTransferManager();
virtual void startListeningOnPort(int port) = 0;
- virtual void addS5BProxy(boost::shared_ptr<S5BProxyRequest> proxy) = 0;
virtual OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const boost::filesystem::path& filepath, const std::string& description, boost::shared_ptr<ReadBytestream> bytestream) = 0;
virtual OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const std::string& filename, const std::string& description, const boost::uintmax_t sizeInBytes, const boost::posix_time::ptime& lastModified, boost::shared_ptr<ReadBytestream> bytestream) = 0;
diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.cpp b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
index 445c7f0..83320b2 100644
--- a/Swiften/FileTransfer/FileTransferManagerImpl.cpp
+++ b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
@@ -13,6 +13,7 @@
#include "Swiften/Disco/EntityCapsProvider.h"
#include <Swiften/JID/JID.h>
#include <Swiften/Elements/StreamInitiationFileInfo.h>
+#include <Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h>
#include <Swiften/FileTransfer/ConnectivityManager.h>
#include <Swiften/FileTransfer/OutgoingFileTransferManager.h>
#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
@@ -30,7 +31,7 @@
namespace Swift {
-FileTransferManagerImpl::FileTransferManagerImpl(const JID& ownFullJID, JingleSessionManager* jingleSessionManager, IQRouter* router, EntityCapsProvider* capsProvider, PresenceOracle* presOracle, ConnectionFactory* connectionFactory, ConnectionServerFactory* connectionServerFactory, TimerFactory* timerFactory, NATTraverser* natTraverser) : ownJID(ownFullJID), jingleSM(jingleSessionManager), iqRouter(router), capsProvider(capsProvider), presenceOracle(presOracle), timerFactory(timerFactory), connectionFactory(connectionFactory), connectionServerFactory(connectionServerFactory), natTraverser(natTraverser), bytestreamServer(NULL) {
+FileTransferManagerImpl::FileTransferManagerImpl(const JID& ownFullJID, JingleSessionManager* jingleSessionManager, IQRouter* router, EntityCapsProvider* capsProvider, PresenceOracle* presOracle, ConnectionFactory* connectionFactory, ConnectionServerFactory* connectionServerFactory, TimerFactory* timerFactory, NATTraverser* natTraverser) : ownJID(ownFullJID), jingleSM(jingleSessionManager), iqRouter(router), capsProvider(capsProvider), presenceOracle(presOracle), timerFactory(timerFactory), connectionFactory(connectionFactory), connectionServerFactory(connectionServerFactory), natTraverser(natTraverser), bytestreamServer(NULL), s5bProxyFinder(NULL) {
assert(!ownFullJID.isBare());
connectivityManager = new ConnectivityManager(natTraverser);
@@ -45,8 +46,13 @@ FileTransferManagerImpl::FileTransferManagerImpl(const JID& ownFullJID, JingleSe
}
FileTransferManagerImpl::~FileTransferManagerImpl() {
+ if (s5bProxyFinder) {
+ s5bProxyFinder->stop();
+ delete s5bProxyFinder;
+ }
if (bytestreamServer) {
bytestreamServer->stop();
+ delete bytestreamServer;
}
delete incomingFTManager;
delete outgoingFTManager;
@@ -63,6 +69,10 @@ void FileTransferManagerImpl::startListeningOnPort(int port) {
bytestreamServer = new SOCKS5BytestreamServer(server, bytestreamRegistry);
bytestreamServer->start();
connectivityManager->addListeningPort(port);
+
+ s5bProxyFinder = new SOCKS5BytestreamProxyFinder(ownJID.getDomain(), iqRouter);
+ s5bProxyFinder->onProxyFound.connect(boost::bind(&FileTransferManagerImpl::addS5BProxy, this, _1));
+ s5bProxyFinder->start();
}
void FileTransferManagerImpl::addS5BProxy(S5BProxyRequest::ref proxy) {
diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.h b/Swiften/FileTransfer/FileTransferManagerImpl.h
index d1c3786..248b437 100644
--- a/Swiften/FileTransfer/FileTransferManagerImpl.h
+++ b/Swiften/FileTransfer/FileTransferManagerImpl.h
@@ -21,60 +21,61 @@
#include <Swiften/Elements/S5BProxyRequest.h>
namespace Swift {
+ class Client;
+ class ConnectionFactory;
+ class ConnectionServerFactory;
+ class ConnectivityManager;
+ class EntityCapsProvider;
+ class IQRouter;
+ class IncomingFileTransferManager;
+ class JingleSessionManager;
+ class LocalJingleTransportCandidateGeneratorFactory;
+ class OutgoingFileTransferManager;
+ class NATTraverser;
+ class PresenceOracle;
+ class ReadBytestream;
+ class RemoteJingleTransportCandidateSelectorFactory;
+ class SOCKS5BytestreamRegistry;
+ class SOCKS5BytestreamServer;
+ class SOCKS5BytestreamProxy;
+ class TimerFactory;
+ class SOCKS5BytestreamProxyFinder;
-class Client;
-class ConnectionFactory;
-class ConnectionServerFactory;
-class ConnectivityManager;
-class EntityCapsProvider;
-class IQRouter;
-class IncomingFileTransferManager;
-class JingleSessionManager;
-class LocalJingleTransportCandidateGeneratorFactory;
-class OutgoingFileTransferManager;
-class NATTraverser;
-class PresenceOracle;
-class ReadBytestream;
-class RemoteJingleTransportCandidateSelectorFactory;
-class SOCKS5BytestreamRegistry;
-class SOCKS5BytestreamServer;
-class SOCKS5BytestreamProxy;
-class TimerFactory;
+ class FileTransferManagerImpl : public FileTransferManager {
+ public:
+ FileTransferManagerImpl(const JID& ownFullJID, JingleSessionManager* jingleSessionManager, IQRouter* router, EntityCapsProvider* capsProvider, PresenceOracle* presOracle, ConnectionFactory* connectionFactory, ConnectionServerFactory* connectionServerFactory, TimerFactory* timerFactory, NATTraverser* natTraverser);
+ ~FileTransferManagerImpl();
+
+ void startListeningOnPort(int port);
+ void addS5BProxy(S5BProxyRequest::ref proxy);
-class FileTransferManagerImpl : public FileTransferManager {
-public:
- FileTransferManagerImpl(const JID& ownFullJID, JingleSessionManager* jingleSessionManager, IQRouter* router, EntityCapsProvider* capsProvider, PresenceOracle* presOracle, ConnectionFactory* connectionFactory, ConnectionServerFactory* connectionServerFactory, TimerFactory* timerFactory, NATTraverser* natTraverser);
- ~FileTransferManagerImpl();
-
- void startListeningOnPort(int port);
- void addS5BProxy(S5BProxyRequest::ref proxy);
+ OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const boost::filesystem::path& filepath, const std::string& description, boost::shared_ptr<ReadBytestream> bytestream);
+ OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const std::string& filename, const std::string& description, const boost::uintmax_t sizeInBytes, const boost::posix_time::ptime& lastModified, boost::shared_ptr<ReadBytestream> bytestream);
+
+ private:
+ boost::optional<JID> highestPriorityJIDSupportingFileTransfer(const JID& bareJID);
+
+ private:
+ JID ownJID;
+
+ OutgoingFileTransferManager* outgoingFTManager;
+ IncomingFileTransferManager* incomingFTManager;
+ RemoteJingleTransportCandidateSelectorFactory* remoteCandidateSelectorFactory;
+ LocalJingleTransportCandidateGeneratorFactory* localCandidateGeneratorFactory;
+ JingleSessionManager* jingleSM;
+ IQRouter* iqRouter;
+ EntityCapsProvider* capsProvider;
+ PresenceOracle* presenceOracle;
- OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const boost::filesystem::path& filepath, const std::string& description, boost::shared_ptr<ReadBytestream> bytestream);
- OutgoingFileTransfer::ref createOutgoingFileTransfer(const JID& to, const std::string& filename, const std::string& description, const boost::uintmax_t sizeInBytes, const boost::posix_time::ptime& lastModified, boost::shared_ptr<ReadBytestream> bytestream);
-
- private:
- boost::optional<JID> highestPriorityJIDSupportingFileTransfer(const JID& bareJID);
-
-private:
- JID ownJID;
-
- OutgoingFileTransferManager* outgoingFTManager;
- IncomingFileTransferManager* incomingFTManager;
- RemoteJingleTransportCandidateSelectorFactory* remoteCandidateSelectorFactory;
- LocalJingleTransportCandidateGeneratorFactory* localCandidateGeneratorFactory;
- JingleSessionManager* jingleSM;
- IQRouter* iqRouter;
- EntityCapsProvider* capsProvider;
- PresenceOracle* presenceOracle;
-
- TimerFactory* timerFactory;
- ConnectionFactory* connectionFactory;
- ConnectionServerFactory* connectionServerFactory;
- NATTraverser* natTraverser;
- SOCKS5BytestreamRegistry* bytestreamRegistry;
- SOCKS5BytestreamServer* bytestreamServer;
- SOCKS5BytestreamProxy* bytestreamProxy;
- ConnectivityManager* connectivityManager;
-};
+ TimerFactory* timerFactory;
+ ConnectionFactory* connectionFactory;
+ ConnectionServerFactory* connectionServerFactory;
+ NATTraverser* natTraverser;
+ SOCKS5BytestreamRegistry* bytestreamRegistry;
+ SOCKS5BytestreamServer* bytestreamServer;
+ SOCKS5BytestreamProxy* bytestreamProxy;
+ ConnectivityManager* connectivityManager;
+ SOCKS5BytestreamProxyFinder* s5bProxyFinder;
+ };
}
diff --git a/Swiften/FileTransfer/SConscript b/Swiften/FileTransfer/SConscript
index 83e223c..4e79992 100644
--- a/Swiften/FileTransfer/SConscript
+++ b/Swiften/FileTransfer/SConscript
@@ -27,6 +27,7 @@ sources = [
"SOCKS5BytestreamServerSession.cpp",
"SOCKS5BytestreamRegistry.cpp",
"SOCKS5BytestreamProxy.cpp",
+ "SOCKS5BytestreamProxyFinder.cpp",
"IBBSendSession.cpp",
"IBBReceiveSession.cpp",
"FileTransferManager.cpp",
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp
new file mode 100644
index 0000000..9d7505b
--- /dev/null
+++ b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2011 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h>
+
+#include <boost/smart_ptr/make_shared.hpp>
+#include <boost/bind.hpp>
+
+#include <Swiften/Base/Log.h>
+#include <Swiften/Elements/S5BProxyRequest.h>
+#include <Swiften/Queries/GenericRequest.h>
+#include <Swiften/Queries/IQRouter.h>
+
+namespace Swift {
+
+SOCKS5BytestreamProxyFinder::SOCKS5BytestreamProxyFinder(const JID& service, IQRouter *iqRouter) : service(service), iqRouter(iqRouter) {
+}
+
+SOCKS5BytestreamProxyFinder::~SOCKS5BytestreamProxyFinder() {
+}
+
+void SOCKS5BytestreamProxyFinder::start() {
+ serviceWalker = boost::make_shared<DiscoServiceWalker>(service, iqRouter);
+ serviceWalker->onServiceFound.connect(boost::bind(&SOCKS5BytestreamProxyFinder::handleServiceFound, this, _1, _2));
+ serviceWalker->beginWalk();
+}
+
+void SOCKS5BytestreamProxyFinder::stop() {
+ serviceWalker->endWalk();
+ serviceWalker->onServiceFound.disconnect(boost::bind(&SOCKS5BytestreamProxyFinder::handleServiceFound, this, _1, _2));
+ serviceWalker.reset();
+}
+
+void SOCKS5BytestreamProxyFinder::sendBytestreamQuery(const JID& jid) {
+ S5BProxyRequest::ref proxyRequest = boost::make_shared<S5BProxyRequest>();
+ boost::shared_ptr<GenericRequest<S5BProxyRequest> > request = boost::make_shared<GenericRequest<S5BProxyRequest> >(IQ::Get, jid, proxyRequest, iqRouter);
+ request->onResponse.connect(boost::bind(&SOCKS5BytestreamProxyFinder::handleProxyResponse, this, _1, _2));
+ request->send();
+}
+
+void SOCKS5BytestreamProxyFinder::handleServiceFound(const JID& jid, boost::shared_ptr<DiscoInfo> discoInfo) {
+ if (discoInfo->hasFeature(DiscoInfo::Bytestream)) {
+ sendBytestreamQuery(jid);
+ }
+}
+
+void SOCKS5BytestreamProxyFinder::handleProxyResponse(boost::shared_ptr<S5BProxyRequest> request, ErrorPayload::ref error) {
+ if (error) {
+ SWIFT_LOG(debug) << "ERROR" << std::endl;
+ } else {
+ if (request) {
+ onProxyFound(request);
+ } else {
+ //assert(false);
+ }
+ }
+}
+
+}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h
new file mode 100644
index 0000000..071e03a
--- /dev/null
+++ b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2011 Tobias Markmann
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <boost/shared_ptr.hpp>
+
+#include <Swiften/Disco/DiscoServiceWalker.h>
+#include <Swiften/Network/HostAddressPort.h>
+#include <Swiften/Elements/S5BProxyRequest.h>
+
+namespace Swift {
+
+class JID;
+class IQRouter;
+
+class SOCKS5BytestreamProxyFinder {
+public:
+ SOCKS5BytestreamProxyFinder(const JID& service, IQRouter *iqRouter);
+ ~SOCKS5BytestreamProxyFinder();
+
+ void start();
+ void stop();
+
+ boost::signal<void(boost::shared_ptr<S5BProxyRequest>)> onProxyFound;
+
+private:
+ void sendBytestreamQuery(const JID&);
+
+ void handleServiceFound(const JID&, boost::shared_ptr<DiscoInfo>);
+ void handleProxyResponse(boost::shared_ptr<S5BProxyRequest>, ErrorPayload::ref);
+private:
+ JID service;
+ IQRouter* iqRouter;
+ boost::shared_ptr<DiscoServiceWalker> serviceWalker;
+ std::vector<boost::shared_ptr<GenericRequest<S5BProxyRequest> > > requests;
+};
+
+}