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