#ifndef NETWORK_TCP_HH
#define NETWORK_TCP_HH
#include <ClanLib/core.h>
#include "Socket.hh"
#include "Address.hh"
#include "Packet.hh"
#include "Buffer.hh"
const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096;
const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0;
class NetworkTCPTransport {
protected:
NetworkSocket socket;
NetworkBufferInput in;
NetworkBufferOutput out;
CL_SlotContainer slots;
public:
NetworkTCPTransport (NetworkSocket socket);
private:
void on_read (void);
void on_write (void);
void on_disconnected (void);
CL_Signal_v1<NetworkPacketInput&> _sig_packet;
CL_Signal_v0 _sig_disconnect;
public:
NetworkAddress getLocalAddress (void) { return socket.get_source_address(); }
NetworkAddress getRemoteAddress (void) { return socket.get_dest_address(); }
void write_packet (const NetworkPacketBuffer &packet);
CL_Signal_v1<NetworkPacketInput&>& sig_packet (void) { return _sig_packet; }
CL_Signal_v0& sig_disconnect (void) { return _sig_disconnect; }
};
class NetworkTCPServer {
private:
NetworkSocket socket;
CL_SlotContainer slots;
public:
NetworkTCPServer (const NetworkAddress &listen_addr);
private:
void on_accept (void);
CL_Signal_v1<NetworkTCPTransport *> _sig_client;
protected:
virtual NetworkTCPTransport* buildTransport (CL_Socket &socket);
public:
CL_Signal_v1<NetworkTCPTransport *>& sig_client (void) { return _sig_client; }
};
class NetworkTCPClient : public NetworkTCPTransport {
public:
NetworkTCPClient (const NetworkAddress &connect_addr);
};
#endif /* NETWORK_TCP_HH */