/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include #include #include #include #include #include namespace Swift { class SOCKS5BytestreamRegistry; class SWIFTEN_API SOCKS5BytestreamServerSession { public: typedef boost::shared_ptr ref; public: enum State { Initial, WaitingForAuthentication, WaitingForRequest, ReadyForTransfer, ReadingData, WritingData, Finished }; SOCKS5BytestreamServerSession(boost::shared_ptr connection, SOCKS5BytestreamRegistry* registry); ~SOCKS5BytestreamServerSession(); void setChunkSize(int chunkSize) { this->chunkSize = chunkSize; } void start(); void stop(); void startSending(boost::shared_ptr); void startReceiving(boost::shared_ptr); HostAddressPort getAddressPort() const; boost::signal)> onFinished; boost::signal onBytesSent; // boost::signal onBytesReceived; const std::string& getStreamID() const { return streamID; } private: void finish(bool error); void process(); void handleDataRead(boost::shared_ptr); void handleDisconnected(const boost::optional&); void handleDataAvailable(); void sendData(); private: boost::shared_ptr connection; SOCKS5BytestreamRegistry* bytestreams; ByteArray unprocessedData; State state; int chunkSize; std::string streamID; boost::shared_ptr readBytestream; boost::shared_ptr writeBytestream; bool waitingForData; boost::bsignals::connection disconnectedConnection; boost::bsignals::connection dataReadConnection; boost::bsignals::connection dataWrittenConnection; boost::bsignals::connection dataAvailableConnection; }; }