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 ©); |
37 NetworkBuffer (const NetworkBuffer ©); |
30 ~NetworkBuffer (void); |
|
31 NetworkBuffer& operator= (const NetworkBuffer ©); |
38 NetworkBuffer& operator= (const NetworkBuffer ©); |
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); |