diff options
Diffstat (limited to 'Swiften/FileTransfer/SOCKS5BytestreamServer.cpp')
| -rw-r--r-- | Swiften/FileTransfer/SOCKS5BytestreamServer.cpp | 44 | 
1 files changed, 30 insertions, 14 deletions
| diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp index 00c72a7..f491918 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp @@ -9,6 +9,7 @@  #include <boost/bind.hpp>  #include <Swiften/Base/Log.h> +#include <Swiften/Base/foreach.h>  #include <Swiften/StringCodecs/Hexify.h>  #include <Swiften/Crypto/CryptoProvider.h>  #include <Swiften/FileTransfer/SOCKS5BytestreamServerSession.h> @@ -16,7 +17,11 @@  namespace Swift { -SOCKS5BytestreamServer::SOCKS5BytestreamServer(boost::shared_ptr<ConnectionServer> connectionServer, SOCKS5BytestreamRegistry* registry, CryptoProvider* crypto) : connectionServer(connectionServer), registry(registry), crypto(crypto) { +SOCKS5BytestreamServer::SOCKS5BytestreamServer( +		boost::shared_ptr<ConnectionServer> connectionServer,  +		SOCKS5BytestreamRegistry* registry) : +			connectionServer(connectionServer),  +			registry(registry) {  }  void SOCKS5BytestreamServer::start() { @@ -25,22 +30,17 @@ void SOCKS5BytestreamServer::start() {  void SOCKS5BytestreamServer::stop() {  	connectionServer->onNewConnection.disconnect(boost::bind(&SOCKS5BytestreamServer::handleNewConnection, this, _1)); -} - -void SOCKS5BytestreamServer::addReadBytestream(const std::string& id, const JID& from, const JID& to, boost::shared_ptr<ReadBytestream> byteStream) { -	registry->addReadBytestream(getSOCKSDestinationAddress(id, from, to), byteStream); -} - -void SOCKS5BytestreamServer::removeReadBytestream(const std::string& id, const JID& from, const JID& to) { -	registry->removeReadBytestream(getSOCKSDestinationAddress(id, from, to)); -} - -std::string SOCKS5BytestreamServer::getSOCKSDestinationAddress(const std::string& id, const JID& from, const JID& to) { -	return Hexify::hexify(crypto->getSHA1Hash(createByteArray(id + from.toString() + to.toString()))); +	foreach (boost::shared_ptr<SOCKS5BytestreamServerSession> session, sessions) { +		session->onFinished.disconnect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session)); +		session->stop(); +	} +	sessions.clear();  }  void SOCKS5BytestreamServer::handleNewConnection(boost::shared_ptr<Connection> connection) { -	boost::shared_ptr<SOCKS5BytestreamServerSession> session(new SOCKS5BytestreamServerSession(connection, registry)); +	boost::shared_ptr<SOCKS5BytestreamServerSession> session =  +		boost::make_shared<SOCKS5BytestreamServerSession>(connection, registry); +	session->onFinished.connect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session));  	sessions.push_back(session);  	session->start();  } @@ -49,5 +49,21 @@ HostAddressPort SOCKS5BytestreamServer::getAddressPort() const {  	return connectionServer->getAddressPort();  } +std::vector< boost::shared_ptr<SOCKS5BytestreamServerSession> > SOCKS5BytestreamServer::getSessions( +		const std::string& streamID) const { +	std::vector< boost::shared_ptr<SOCKS5BytestreamServerSession> > result; +	foreach (boost::shared_ptr<SOCKS5BytestreamServerSession> session, sessions) { +		if (session->getStreamID() == streamID) { +			result.push_back(session); +		} +	} +	return result; +} + +void SOCKS5BytestreamServer::handleSessionFinished(boost::shared_ptr<SOCKS5BytestreamServerSession> session) { +	sessions.erase(std::remove(sessions.begin(), sessions.end(), session), sessions.end()); +	session->onFinished.disconnect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session)); +} +  } | 
 Swift
 Swift