Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/lib/network/message_manager.h @ 9507

Last change on this file since 9507 was 9507, checked in by patrick, 18 years ago

the player team change should now work on all clients in the network, its now a global synch variable

File size: 3.5 KB
Line 
1/*!
2 * @file message_manager.h
3 * @brief Definition of MessageManager
4*/
5
6#ifndef _MESSAGE_MANAGER_H
7#define _MESSAGE_MANAGER_H
8
9#include "synchronizeable.h"
10
11#include <map>
12#include <list>
13
14/*
15  Protocol:
16    int nacks
17    int acks[1..nacks]
18    int nmsg
19    (
20      int length
21      int number
22      int MessageId
23      byte * data
24    )[1..nmsg]
25*/
26
27
28//!< different message ids
29enum MessageId
30{
31  TESTMESSAGEID                  = 1,         //!< for testing purposes
32  MSGID_DELETESYNCHRONIZEABLE,                //!< message for sync deletion
33  MSGID_PREFEREDTEAM,                         //!< change prefered team
34  MSGID_CHANGENICKNAME,                       //!< change nicknames
35  MSGID_CHATMESSAGE,                          //!< chat message
36  MSGID_RESPAWN,                              //!< respawn message
37
38  MSGID_FORWARDMESSAGE                        //!< forwarding a messag between proxy and master server
39};
40
41
42typedef bool (*MessageCallback)( MessageId messageId, byte * data, int dataLength, void * someData, int userId );
43
44enum RecieverType
45{
46  RT_ALL_BUT_ME = 1,   //!< message is sent to all users but myself
47  RT_ALL_ME,           //!< message is sent to all users
48  RT_USER,             //!< message is only sent to reciever
49  RT_NOT_USER,         //!< message is sent to all but reciever
50  RT_SERVER            //!< message is sent to server only
51};
52
53//TODO implement priority handling
54enum MessagePriority
55{
56  MP_HIGHBANDWIDTH = 1,  //!< fast and reliable but uses a lot of bandwidth
57  MP_LOWBANDWIDTH,       //!< may take a long time to arrive. reliable
58  MP_UNRELIABLE          //!< unreliable. low bandwidth
59};
60
61struct NetworkMessage
62{
63  MessageId        messageId;
64  byte *           data;
65  int              length;
66  int              number;
67  MessagePriority  priority;
68};
69
70struct MessageUserQueue
71{
72  std::list<NetworkMessage> messages;
73  std::list<int>            toAck;
74  std::list<int>            recievedMessages;
75};
76
77typedef std::map<int,MessageUserQueue> MessageQueue;
78
79struct MessageHandler
80{
81  MessageCallback cb;
82  MessageId       messageId;
83  void *          someData;
84};
85
86typedef std::map<MessageId,MessageHandler> MessageHandlerMap;
87
88//! A class for sending messages over network
89class MessageManager : public Synchronizeable {
90 protected:
91   MessageManager();
92 public:
93   inline static MessageManager * getInstance(){ if (!singletonRef) singletonRef = new MessageManager();  return singletonRef; }
94
95   virtual ~MessageManager();
96
97   bool registerMessageHandler( MessageId messageId, MessageCallback cb, void * someData );
98
99   void sendMessage( MessageId messageId, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority );
100
101   virtual int getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH );
102   virtual int setStateDiff( int userId, byte* data, int length, int stateId, int fromStateId );
103   virtual void cleanUpUser( int userId );
104   virtual void handleSentState( int userId, int stateId, int fromStateId ){}
105   virtual void handleRecvState( int userId, int stateId, int fromStateId ){}
106
107   void initUser( int userId );
108
109
110 private:
111   static MessageManager *   singletonRef;
112   MessageQueue              messageQueue;           //!< stores messages to send
113   MessageHandlerMap         messageHandlerMap;      //!< contains handlers for messages
114
115   int                       newNumber;              //!< used to create unique message numbers
116   std::list<NetworkMessage> incomingMessageBuffer;
117
118};
119
120#endif /* _PROTO_CLASS_H */
Note: See TracBrowser for help on using the repository browser.