#ifndef NETWORK_TCP_HH
#define NETWORK_TCP_HH
#include "NetworkSocket.hh"
#include "NetworkAddress.hh"
const size_t NETWORK_TCP_CHUNK_SIZE = 1024;
const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096;
const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0;
class NetworkDisconnectError : public exception {
};
class NetworkBuffer {
private:
char *buf;
size_t size, off;
NetworkSocket &socket;
public:
NetworkBuffer (NetworkSocket &socket, size_t size_hint);
private:
void resize (size_t new_size);
public:
void write (const char *buf, size_t size);
void read (char *buf, size_t size);
void flush_write (void);
template <typename T> bool read_prefix (T &val_ref);
};
class NetworkTCPTransport {
private:
NetworkSocket socket;
NetworkBuffer in, out;
protected:
CL_SlotContainer slots;
public:
NetworkTCPTransport (CL_Socket socket);
private:
void on_read (void);
void on_write (void);
void on_disconnected (void);
protected:
void write_packet (const NetworkPacket &packet);
virtual void handle_packet (const NetworkPacket &packet) = 0;
virtual void handle_disconnect (void) = 0;
};
class NetworkTCPServer {
private:
NetworkSocket socket;
public:
NetworkTCPServer (const NetworkAddress &listen_addr);
private:
void on_accept (void);
protected:
virtual void handle_client (NetworkTCPTransport *client) = 0;
};
class NetworkTCPClient : public NetworkTCPTransport {
public:
NetworkTCPClient (const NetworkAddress &connect_addr);
};
#endif /* NETWORK_TCP_HH */