src/Network/TCP.hh
author terom
Mon, 08 Dec 2008 01:12:00 +0000
changeset 277 40f4a03917e2
parent 200 2dbf40661580
child 286 2a8f20a53ff2
permissions -rw-r--r--
fix NetworkClient handleInput
#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 */