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