src/NetworkTCP.hh
changeset 185 25becd2cb026
equal deleted inserted replaced
184:561892e2a30e 185:25becd2cb026
       
     1 #ifndef NETWORK_TCP_HH
       
     2 #define NETWORK_TCP_HH
       
     3 
       
     4 #include <ClanLib/core.h>
       
     5 
       
     6 #include "NetworkSocket.hh"
       
     7 #include "NetworkAddress.hh"
       
     8 #include "NetworkPacket.hh"
       
     9 #include "Error.hh"
       
    10 
       
    11 const size_t NETWORK_TCP_CHUNK_SIZE = 1024;
       
    12 const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096;
       
    13 const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0;
       
    14 
       
    15 class NetworkBufferError : public Error {
       
    16     public:
       
    17         NetworkBufferError (const std::string &message) : Error(message) { }
       
    18 };
       
    19 
       
    20 class NetworkBuffer {
       
    21     private:
       
    22         NetworkSocket socket;
       
    23 
       
    24         char *buf;
       
    25         size_t size, offset;
       
    26     
       
    27     public:
       
    28         NetworkBuffer (NetworkSocket &socket, size_t size_hint);
       
    29         ~NetworkBuffer (void);
       
    30     
       
    31     private:
       
    32         NetworkBuffer (const NetworkBuffer &copy);
       
    33         NetworkBuffer& operator= (const NetworkBuffer &copy);
       
    34 
       
    35         void resize (size_t item_size);
       
    36         void trim (size_t prefix_size);
       
    37 
       
    38     public:    
       
    39         void push_write (char *buf_ptr, size_t buf_size);
       
    40         void flush_write (void);
       
    41         void write_prefix (char *buf, uint16_t prefix);
       
    42         void write_prefix (char *buf, uint32_t prefix);
       
    43         
       
    44         bool try_read (size_t item_size);
       
    45         bool peek_prefix (uint16_t &ref);
       
    46         bool peek_prefix (uint32_t &ref);
       
    47         template <typename PrefixType> PrefixType read_prefix (char *buf_ptr, size_t buf_max);
       
    48 };
       
    49 
       
    50 class NetworkTCPTransport {
       
    51     protected:
       
    52         NetworkSocket socket;
       
    53 
       
    54         NetworkBuffer in, out;
       
    55     
       
    56         CL_SlotContainer slots; 
       
    57     
       
    58     public:
       
    59         NetworkTCPTransport (NetworkSocket socket);
       
    60 
       
    61     private:
       
    62         void on_read (void);
       
    63         void on_write (void);
       
    64         void on_disconnected (void);
       
    65 
       
    66         CL_Signal_v1<NetworkPacket &> _sig_packet;
       
    67         CL_Signal_v0 _sig_disconnect;
       
    68 
       
    69     public:
       
    70         NetworkAddress getLocalAddress (void) { return socket.get_source_address(); }
       
    71         NetworkAddress getRemoteAddress (void) { return socket.get_dest_address(); }
       
    72 
       
    73         void write_packet (const NetworkPacket &packet);
       
    74         
       
    75         CL_Signal_v1<NetworkPacket&>& sig_packet (void) { return _sig_packet; }
       
    76         CL_Signal_v0& sig_disconnect (void) { return _sig_disconnect; }
       
    77 };
       
    78 
       
    79 class NetworkTCPServer {
       
    80     private:
       
    81         NetworkSocket socket;
       
    82 
       
    83         CL_SlotContainer slots; 
       
    84 
       
    85     public:
       
    86         NetworkTCPServer (const NetworkAddress &listen_addr);
       
    87 
       
    88     private:
       
    89         void on_accept (void);
       
    90 
       
    91         CL_Signal_v1<NetworkTCPTransport *> _sig_client;
       
    92 
       
    93     protected:
       
    94         virtual NetworkTCPTransport* buildTransport (CL_Socket &socket);
       
    95 
       
    96     public:
       
    97         CL_Signal_v1<NetworkTCPTransport *>& sig_client (void) { return _sig_client; }
       
    98 };
       
    99 
       
   100 class NetworkTCPClient : public NetworkTCPTransport {
       
   101     public:
       
   102         NetworkTCPClient (const NetworkAddress &connect_addr);
       
   103 };
       
   104 
       
   105 #endif /* NETWORK_TCP_HH */