src/proto2/NetworkTCP.hh
author terom
Mon, 10 Nov 2008 21:58:38 +0000
branchno-netsession
changeset 34 1ea6554d703e
parent 33 e53f09b378f4
child 36 785d220fc6b7
permissions -rw-r--r--
add even more uncompiled 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);

        CL_Signal_v1<const NetworkPacket&> _sig_packet;
        CL_Signal_v0 _sig_disconnect;

    public:
        NetworkAddress getRemoteAddress (void) { return socket.get_dest_address(); }

        void write_packet (const NetworkPacket &packet);
        
        CL_Signal_v1<const NetworkPacket&> sig_packet (void) { return _sig_packet; }
        CL_Signal_v0 sig_disconnect (void) { return _sig_disconnect; }
};

class NetworkTCPServer {
    private:
        NetworkSocket socket;

    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 */