src/proto2/NetworkTCP.hh
author terom
Mon, 10 Nov 2008 18:21:23 +0000
branchno-netsession
changeset 32 2ff929186c90
parent 31 d0d7489d4e8b
child 33 e53f09b378f4
permissions -rw-r--r--
write some mode code...
#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:
        NetworkBuffer (const NetworkBuffer &copy) { };
        ~NetworkBuffer (void);
        NetworkBuffer& operator= (const NetworkBuffer &copy) { };

        void resize (size_t suffix_size);
        void trim (size_t prefix_size);

    public:    
        void push_write (char *buf_ptr, size_t buf_size);
        void flush_write (void);
        template <typename PrefixType> void write_prefix (char *buf, PrefixType prefix);
        
        void try_read (size_t item_size);
        bool peek_prefix (uint16_t &ref);
        bool peek_prefix (uint32_t &ref);
        template <typename PrefixType> PrefixType read_prefix (char *buf_ptr, size_t buf_max);
};

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);

    public:
        void write_packet (const NetworkPacket &packet);
        
        CL_Signal_v1<const NetworkPacket&> sig_packet;
        CL_Signal_v0 sig_disconnect;
};

class NetworkTCPServer {
    private:
        NetworkSocket socket;

    public:
        NetworkTCPServer (const NetworkAddress &listen_addr);

    private:
        void on_accept (void);

    public:
        CL_Signal_v1<NetworkTCPTransport *> sig_client;
};

class NetworkTCPClient : public NetworkTCPTransport {
    public:
        NetworkTCPClient (const NetworkAddress &connect_addr);
};

#endif /* NETWORK_TCP_HH */