1 #ifndef NETWORK_SESSION_HH |
1 #ifndef NETWORK_SESSION_HH |
2 #define NETWORK_SESSION_HH |
2 #define NETWORK_SESSION_HH |
3 |
3 |
4 #include "NetworkTCP.hh" |
4 // forward-declare |
5 #include "NetworkUDP.hh" |
5 class NetworkSession; |
6 |
|
7 #include <map> |
|
8 |
|
9 /* |
|
10 * Should be set to some 8-char magic value to identify the application |
|
11 */ |
|
12 typedef char[8] NetworkSessionMagic; |
|
13 |
6 |
14 /* |
7 /* |
15 * Used to separate packets, ID zero is reserved for NetworkSession use |
8 * Used to separate packets, ID zero is reserved for NetworkSession use |
16 */ |
9 */ |
17 typedef uint16_t NetworkChannelID; |
10 typedef uint16_t NetworkChannelID; |
18 |
11 |
|
12 #include "NetworkTCP.hh" |
|
13 #include "NetworkUDP.hh" |
|
14 #include "NetworkNode.hh" |
|
15 |
|
16 #include <map> |
|
17 |
19 class NetworkSession { |
18 class NetworkSession { |
20 private: |
19 private: |
21 NetworkSessionMagic magic; |
20 uint64_t magic; |
22 NetworkTCPServer *tcp_srv; |
21 NetworkTCPServer *tcp_srv; |
23 NetworkUDP *udp_srv, *udp_client; |
22 NetworkUDP *udp_srv, *udp_client; |
24 |
23 |
25 CL_SlotContainer slots; |
24 CL_SlotContainer slots; |
26 |
25 |
27 std::map<NetworkAddress, NetworkNode*> nodes; |
26 std::map<NetworkAddress, NetworkNode*> nodes; |
28 std::map<NetworkChannelID, CL_Signal_v2<const NetworkPacket&, NetworkNode *>> _map_sig_chan_message; |
27 std::map<NetworkChannelID, CL_Signal_v2<NetworkPacket&, NetworkNode *> > _map_sig_chan_message; |
29 |
28 |
30 public: |
29 public: |
31 NetworkSession (NetworkSessionMagic magic); |
30 NetworkSession (uint64_t magic); |
32 |
31 |
33 void listen (const NetworkAddress &addr); |
32 void listen (const NetworkAddress &addr); |
34 NetworkNode* connect (const NetworkAddress &addr); |
33 NetworkNode* connect (const NetworkAddress &addr); |
|
34 |
|
35 protected: |
|
36 virtual NetworkNode *build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type); |
35 |
37 |
36 private: |
38 private: |
37 void on_tcp_client (const NetworkTCPTransport *client); |
39 void on_tcp_client (NetworkTCPTransport *client); |
38 void on_disconnect (NetworkNode *node); |
40 void handle_disconnect (NetworkNode *node); |
39 |
41 |
40 CL_Signal_v1<NetworkNode*> _sig_node_connected; |
42 CL_Signal_v1<NetworkNode*> _sig_node_connected; |
41 CL_Signal_v1<NetworkNode*> _sig_node_disconnected; |
|
42 |
43 |
43 public: |
44 public: |
44 void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true); |
45 void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true); |
45 void send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable = true); |
46 void send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable = true); |
46 |
47 |
47 CL_Signal_v1<NetworkNode*> sig_node_connected (void) { return _sig_node_connected; } |
48 CL_Signal_v1<NetworkNode*>& sig_node_connected (void) { return _sig_node_connected; } |
48 CL_Signal_v1<NetworkNode*> sig_node_disconnected (void) { return _sig_node_disconnected; } |
49 CL_Signal_v2<NetworkPacket&, NetworkNode *>& sig_chan_message (NetworkChannelID cid) { return _map_sig_chan_message[cid]; } |
49 CL_Signal_v2<const NetworkPacket&, NetworkNode *>& sig_chan_message (NetworkChannelID cid) { return _map_sig_chan_message(cid); } |
|
50 }; |
50 }; |
51 |
51 |
52 #endif /* NETWORK_SESSION_HH */ |
52 #endif /* NETWORK_SESSION_HH */ |