|
1 #ifndef NETWORK_OBJECT_HH |
|
2 #define NETWORK_OBJECT_HH |
|
3 |
|
4 #include <map> |
|
5 |
|
6 typedef uint32_t NetworkObjectID; |
|
7 typedef uint16_t NetworkMessageID; |
|
8 |
|
9 class NetworkObjectController { |
|
10 friend class NetworkObject; |
|
11 |
|
12 private: |
|
13 NetworkSession &session; |
|
14 NetworkChannelID channel_id; |
|
15 |
|
16 std::map<NetworkObjectID, NetworkObject*> objects; |
|
17 |
|
18 CL_Slot slot_message; |
|
19 |
|
20 protected: |
|
21 NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id); |
|
22 |
|
23 private: |
|
24 void on_message (const NetworkPacket &pkt, NetworkNode *node); |
|
25 |
|
26 protected: |
|
27 virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *node) = 0; |
|
28 }; |
|
29 |
|
30 class NetworkObject_ServerController : NetworkObjectController { |
|
31 friend class NetworkObject_Server; |
|
32 |
|
33 private: |
|
34 NetworkObjectID id_pool; |
|
35 |
|
36 public: |
|
37 NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id); |
|
38 |
|
39 protected: |
|
40 NetworkObjectID getObjectId (void); |
|
41 |
|
42 virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *node); |
|
43 }; |
|
44 |
|
45 class NetworkObject_ClientController : NetworkObjectController { |
|
46 friend class NetworkObject_Client; |
|
47 |
|
48 private: |
|
49 NetworkNode *server; |
|
50 |
|
51 CL_Signal_v3<NetworkObject_Client*, NetworkMessageID, const NetworkPacket&> _sig_create; |
|
52 |
|
53 protected: |
|
54 virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *node); |
|
55 |
|
56 public: |
|
57 NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server); |
|
58 |
|
59 CL_Signal_v3<NetworkObject_Client*, NetworkMessageID, const NetworkPacket&>& sig_create (void) { return _sig_create; } |
|
60 }; |
|
61 |
|
62 class NetworkObject { |
|
63 friend class NetworkObjectController; |
|
64 |
|
65 private: |
|
66 NetworkObjectID obj_id; |
|
67 |
|
68 std::map<NetworkMessageID, CL_Signal_v2<NetworkNode*, const NetworkPacket&>> _map_sig_message; |
|
69 |
|
70 protected: |
|
71 NetworkObject (NetworkObjectID obj_id, NetworkObjectController &controller); |
|
72 |
|
73 void buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload); |
|
74 |
|
75 public: |
|
76 CL_Signal_v2<NetworkNode*, const NetworkPacket&>& sig_message (NetworkMessageID msg_id) { return _map_sig_message[msg_id]; } |
|
77 }; |
|
78 |
|
79 class NetworkObject_Server : public NetworkObject { |
|
80 friend class NetworkObject_ServerController; |
|
81 |
|
82 private: |
|
83 NetworkObject_ServerController &controller; |
|
84 |
|
85 public: |
|
86 NetworkObject_Server (NetworkObjectController &controller); |
|
87 |
|
88 void send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); |
|
89 void send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); |
|
90 void send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable = true); |
|
91 }; |
|
92 |
|
93 class NetworkObject_Client : public NetworkObject { |
|
94 friend class NetworkObject_ClientController; |
|
95 |
|
96 private: |
|
97 NetworkObject_ClientController &controller; |
|
98 |
|
99 protected: |
|
100 NetworkObject_Client (NetworkObject_ClientController &controller, NetworkNode *server, NetworkObjectID id); |
|
101 |
|
102 public: |
|
103 void send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); |
|
104 } |
|
105 |
|
106 #endif /* NETWORK_OBJECT_HH */ |