src/proto2/NetworkTCP.hh
author terom
Mon, 10 Nov 2008 16:49:09 +0000
branchno-netsession
changeset 31 d0d7489d4e8b
child 32 2ff929186c90
permissions -rw-r--r--
add initial code written so far
#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 */