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