terom@185: #ifndef NETWORK_OBJECT_HH terom@185: #define NETWORK_OBJECT_HH terom@185: terom@186: #include "Session.hh" terom@186: #include "Node.hh" terom@186: #include "../Logger.hh" terom@185: terom@185: #include terom@185: terom@185: typedef uint32_t NetworkObjectID; terom@185: typedef uint16_t NetworkMessageID; terom@185: terom@185: // forward-declare terom@185: class NetworkObject; terom@185: class NetworkObject_Client; terom@185: class NetworkObject_Server; terom@185: terom@185: class NetworkObjectController { terom@185: friend class NetworkObject; terom@185: friend class NetworkObject_Server; terom@185: friend class NetworkObject_Client; terom@185: terom@185: private: terom@185: NetworkSession &session; terom@185: NetworkChannelID channel_id; terom@185: terom@185: std::map objects; terom@185: terom@185: CL_Slot slot_message; terom@185: terom@185: protected: terom@185: NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id); terom@185: terom@185: private: terom@185: void on_message (NetworkPacket &pkt, NetworkNode *node); terom@185: terom@185: protected: terom@185: virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) = 0; terom@185: }; terom@185: terom@185: class NetworkObject_ServerController : public NetworkObjectController { terom@185: friend class NetworkObject_Server; terom@185: terom@185: private: terom@185: NetworkObjectID id_pool; terom@185: terom@185: public: terom@185: NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id); terom@185: terom@185: protected: terom@185: NetworkObjectID getObjectID (void); terom@185: terom@185: virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node); terom@185: }; terom@185: terom@185: class NetworkObject_ClientController : public NetworkObjectController { terom@185: friend class NetworkObject_Client; terom@185: terom@185: private: terom@185: NetworkNode *server; terom@185: terom@185: CL_Signal_v3 _sig_create; terom@185: terom@185: public: terom@185: NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server); terom@185: terom@185: protected: terom@185: virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node); terom@185: terom@185: public: terom@185: CL_Signal_v3& sig_create (void) { return _sig_create; } terom@185: }; terom@185: terom@185: class NetworkObject { terom@185: friend class NetworkObjectController; terom@185: friend std::ostream& operator<< (std::ostream &s, const NetworkObject &obj); terom@185: terom@185: protected: terom@185: NetworkObjectID obj_id; terom@185: terom@185: protected: terom@185: NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id); terom@185: terom@185: virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) = 0; terom@185: terom@185: void buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload); terom@185: }; terom@185: terom@185: std::ostream& operator<< (std::ostream &s, const NetworkObject &obj); terom@185: terom@185: class NetworkObject_Server : public NetworkObject { terom@185: friend class NetworkObject_ServerController; terom@185: terom@185: private: terom@185: NetworkObject_ServerController &controller; terom@185: terom@185: std::map > _map_sig_message; terom@185: terom@185: public: terom@185: NetworkObject_Server (NetworkObject_ServerController &controller); terom@185: terom@185: protected: terom@185: virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt); terom@185: terom@185: public: terom@185: void send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); terom@185: void send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); terom@185: void send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable = true); terom@185: terom@185: CL_Signal_v2& sig_message (NetworkMessageID msg_id) { return _map_sig_message[msg_id]; } terom@185: }; terom@185: terom@185: class NetworkObject_Client : public NetworkObject { terom@185: friend class NetworkObject_ClientController; terom@185: terom@185: private: terom@185: NetworkObject_ClientController &controller; terom@185: terom@185: std::map > _map_sig_message; terom@185: terom@185: protected: terom@185: NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id); terom@185: terom@185: virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt); terom@185: terom@185: public: terom@185: void send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true); terom@185: terom@185: CL_Signal_v1& sig_message (NetworkMessageID msg_id) { return _map_sig_message[msg_id]; } terom@185: }; terom@185: terom@185: #endif /* NETWORK_OBJECT_HH */