/*! * @file message_manager.h * @brief Definition of MessageManager */ #ifndef _MESSAGE_MANAGER_H #define _MESSAGE_MANAGER_H #include "synchronizeable.h" #include #include /* Protocol: int nacks int acks[1..nacks] int nmsg ( int length int number byte MessageId byte * data )[1..nmsg] */ typedef void (*MessageCallback)( byte * data, int dataLength, void * someData, int userId ); enum MessageId { }; enum RecieverType { RT_ALL = 1, //!< message is sent to all users RT_USER, //!< message is only sent to reciever RT_NOT_USER //!< message is sent to all but reciever }; struct NetworkMessage { MessageId messageId; byte * data; int length; int number; }; struct MessageUserQueue { std::list messages; std::list toAck; }; typedef std::map MessageQueue; struct MessageHandler { MessageCallback cb; MessageId messageId; }; typedef std::map MessageHandlerMap; //! A class for sending messages over network class MessageManager : public Synchronizeable { protected: MessageManager(); public: inline static MessageManager * getInstance(){ if (!singletonRef) singletonRef = new MessageManager(); return singletonRef; } virtual ~MessageManager(); bool registerMessageHandler( MessageId messageId, MessageCallback cb, void * someData ); void sendMessage( MessageId messageId, byte * data, int dataLength, RecieverType recieverType, int reciever ); virtual int getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH ); virtual int setStateDiff( int userId, byte* data, int length, int stateId, int fromStateId ); virtual void cleanUpUser( int userId ); void initUser( int userId ); private: static MessageManager * singletonRef; MessageQueue messageQueue; //!< stores messages to send MessageHandlerMap messageHandlerMap; //!< contains handlers for messages }; #endif /* _PROTO_CLASS_H */