terom@89: #ifndef NETWORK_TCP_HH terom@89: #define NETWORK_TCP_HH terom@89: terom@89: #include terom@89: terom@89: #include "NetworkSocket.hh" terom@89: #include "NetworkAddress.hh" terom@89: #include "NetworkPacket.hh" terom@89: #include "Error.hh" terom@89: terom@89: const size_t NETWORK_TCP_CHUNK_SIZE = 1024; terom@89: const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096; terom@89: const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0; terom@89: terom@89: class NetworkBufferError : public Error { terom@89: public: terom@89: NetworkBufferError (const std::string &message) : Error(message) { } terom@89: }; terom@89: terom@89: class NetworkBuffer { terom@89: private: terom@89: NetworkSocket socket; terom@89: terom@89: char *buf; terom@89: size_t size, offset; terom@89: terom@89: public: terom@89: NetworkBuffer (NetworkSocket &socket, size_t size_hint); terom@89: ~NetworkBuffer (void); terom@89: terom@89: private: terom@89: NetworkBuffer (const NetworkBuffer ©); terom@89: NetworkBuffer& operator= (const NetworkBuffer ©); terom@89: terom@89: void resize (size_t item_size); terom@89: void trim (size_t prefix_size); terom@89: terom@89: public: terom@89: void push_write (char *buf_ptr, size_t buf_size); terom@89: void flush_write (void); terom@89: void write_prefix (char *buf, uint16_t prefix); terom@89: void write_prefix (char *buf, uint32_t prefix); terom@89: terom@89: bool try_read (size_t item_size); terom@89: bool peek_prefix (uint16_t &ref); terom@89: bool peek_prefix (uint32_t &ref); terom@89: template PrefixType read_prefix (char *buf_ptr, size_t buf_max); terom@89: }; terom@89: terom@89: class NetworkTCPTransport { terom@89: protected: terom@89: NetworkSocket socket; terom@89: terom@89: NetworkBuffer in, out; terom@89: terom@89: CL_SlotContainer slots; terom@89: terom@89: public: terom@89: NetworkTCPTransport (NetworkSocket socket); terom@89: terom@89: private: terom@89: void on_read (void); terom@89: void on_write (void); terom@89: void on_disconnected (void); terom@89: terom@89: CL_Signal_v1 _sig_packet; terom@89: CL_Signal_v0 _sig_disconnect; terom@89: terom@89: public: terom@89: NetworkAddress getLocalAddress (void) { return socket.get_source_address(); } terom@89: NetworkAddress getRemoteAddress (void) { return socket.get_dest_address(); } terom@89: terom@89: void write_packet (const NetworkPacket &packet); terom@89: terom@89: CL_Signal_v1& sig_packet (void) { return _sig_packet; } terom@89: CL_Signal_v0& sig_disconnect (void) { return _sig_disconnect; } terom@89: }; terom@89: terom@89: class NetworkTCPServer { terom@89: private: terom@89: NetworkSocket socket; terom@89: terom@89: CL_SlotContainer slots; terom@89: terom@89: public: terom@89: NetworkTCPServer (const NetworkAddress &listen_addr); terom@89: terom@89: private: terom@89: void on_accept (void); terom@89: terom@89: CL_Signal_v1 _sig_client; terom@89: terom@89: protected: terom@89: virtual NetworkTCPTransport* buildTransport (CL_Socket &socket); terom@89: terom@89: public: terom@89: CL_Signal_v1& sig_client (void) { return _sig_client; } terom@89: }; terom@89: terom@89: class NetworkTCPClient : public NetworkTCPTransport { terom@89: public: terom@89: NetworkTCPClient (const NetworkAddress &connect_addr); terom@89: }; terom@89: terom@89: #endif /* NETWORK_TCP_HH */