|
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 ©); |
|
33 NetworkBuffer& operator= (const NetworkBuffer ©); |
|
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 */ |