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