summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/FileTransfer/SOCKS5BytestreamServer.cpp')
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServer.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp
new file mode 100644
index 0000000..58506f3
--- /dev/null
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp
@@ -0,0 +1,51 @@
+/*
+ * 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/SOCKS5BytestreamServer.h"
+
+#include <boost/bind.hpp>
+
+#include "Swiften/StringCodecs/Hexify.h"
+#include "Swiften/StringCodecs/SHA1.h"
+#include "Swiften/FileTransfer/SOCKS5BytestreamServerSession.h"
+
+namespace Swift {
+
+SOCKS5BytestreamServer::SOCKS5BytestreamServer(boost::shared_ptr<ConnectionServer> connectionServer) : connectionServer(connectionServer) {
+}
+
+void SOCKS5BytestreamServer::start() {
+ connectionServer->onNewConnection.connect(boost::bind(&SOCKS5BytestreamServer::handleNewConnection, this, _1));
+}
+
+void SOCKS5BytestreamServer::stop() {
+ connectionServer->onNewConnection.disconnect(boost::bind(&SOCKS5BytestreamServer::handleNewConnection, this, _1));
+}
+
+void SOCKS5BytestreamServer::addBytestream(const String& id, const JID& from, const JID& to, boost::shared_ptr<ReadBytestream> byteStream) {
+ bytestreams.addBytestream(getSOCKSDestinationAddress(id, from, to), byteStream);
+}
+
+void SOCKS5BytestreamServer::removeBytestream(const String& id, const JID& from, const JID& to) {
+ bytestreams.removeBytestream(getSOCKSDestinationAddress(id, from, to));
+}
+
+String SOCKS5BytestreamServer::getSOCKSDestinationAddress(const String& id, const JID& from, const JID& to) {
+ return Hexify::hexify(SHA1::getHash(ByteArray(id + from.toString() + to.toString())));
+}
+
+void SOCKS5BytestreamServer::handleNewConnection(boost::shared_ptr<Connection> connection) {
+ boost::shared_ptr<SOCKS5BytestreamServerSession> session(new SOCKS5BytestreamServerSession(connection, &bytestreams));
+ sessions.push_back(session);
+ session->start();
+}
+
+HostAddressPort SOCKS5BytestreamServer::getAddressPort() const {
+ return connectionServer->getAddressPort();
+}
+
+}
+