/* */ #ifndef _D_PEER_CONNECTION_H_ #define _D_PEER_CONNECTION_H_ #include "common.h" #include "SharedHandle.h" #include namespace aria2 { class Option; class Logger; class SocketCore; class ARC4Encryptor; class ARC4Decryptor; // we assume maximum length of incoming message is "piece" message with 16KB // data. Messages beyond that size are dropped. #define MAX_PAYLOAD_LEN (9+16*1024) class PeerConnection { private: int32_t cuid; SharedHandle socket; const Option* option; Logger* logger; unsigned char resbuf[MAX_PAYLOAD_LEN]; size_t resbufLength; size_t currentPayloadLength; unsigned char lenbuf[4]; size_t lenbufLength; bool _encryptionEnabled; SharedHandle _encryptor; SharedHandle _decryptor; bool _prevPeek; void readData(unsigned char* data, size_t& length, bool encryption); void sendData(const unsigned char* data, size_t length, bool encryption); public: PeerConnection(int32_t cuid, const SharedHandle& socket, const Option* op); ~PeerConnection(); // Returns the number of bytes written ssize_t sendMessage(const unsigned char* data, size_t dataLength); bool receiveMessage(unsigned char* data, size_t& dataLength); /** * Returns true if a handshake message is fully received, otherwise returns * false. * In both cases, 'msg' is filled with received bytes and the filled length * is assigned to 'length'. */ bool receiveHandshake(unsigned char* data, size_t& dataLength, bool peek = false); void enableEncryption(const SharedHandle& encryptor, const SharedHandle& decryptor); void presetBuffer(const unsigned char* data, size_t length); }; typedef SharedHandle PeerConnectionHandle; typedef WeakHandle PeerConnectionWeakHandle; } // namespace aria2 #endif // _D_PEER_CONNECTION_H_