Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

receiver type is transmitted also since it is needed for message relays

File size: 4.1 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 MessageType
23      byte * data
24    )[1..nmsg]
25*/
26
27
28//!< different message ids
29enum MessageType
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)( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId );
43
44typedef enum 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  MessageType      messageType;                         //!< type of the message
64  byte *           data;                                //!< data
65  int              length;                              //!< length of the data
66  int              number;                              //!< serial number
67  int              senderId;                            //!< userId of the sender
68  int              destinationId;                       //!< userId of the destination
69  RecieverType     recieverType;                        //!< type of the receiver
70  MessagePriority  priority;                            //!< priority of the messages
71};
72
73struct MessageUserQueue
74{
75  std::list<NetworkMessage> messages;
76  std::list<int>            toAck;
77  std::list<int>            recievedMessages;
78};
79
80typedef std::map<int,MessageUserQueue> MessageQueue;
81
82
83
84struct MessageHandler
85{
86  MessageCallback   cb;
87  MessageType       messageType;
88  void *            someData;
89};
90
91typedef std::map<MessageType,MessageHandler> MessageHandlerMap;
92
93//! A class for sending messages over network
94class MessageManager : public Synchronizeable {
95 protected:
96   MessageManager();
97 public:
98   inline static MessageManager * getInstance(){ if (!singletonRef) singletonRef = new MessageManager();  return singletonRef; }
99
100   virtual ~MessageManager();
101
102   bool registerMessageHandler( MessageType messageType, MessageCallback cb, void * someData );
103
104   void sendMessage( MessageType messageType, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority );
105
106   void initUser( int userId );
107
108
109  private:
110   virtual int getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH );
111   virtual int setStateDiff( int userId, byte* data, int length, int stateId, int fromStateId );
112   virtual void cleanUpUser( int userId );
113   virtual void handleSentState( int userId, int stateId, int fromStateId ){}
114   virtual void handleRecvState( int userId, int stateId, int fromStateId ){}
115
116
117 private:
118   static MessageManager *   singletonRef;           //!< the singleton reference
119
120   std::list<NetworkMessage> incomingMessageQueue;   //!< the incoming message buffer
121   MessageQueue              outgoingMessageQueue;   //!< stores messages to send
122   MessageHandlerMap         messageHandlerMap;      //!< contains handlers for messages
123
124   int                       newNumber;              //!< used to create unique message numbers
125
126
127};
128
129#endif /* _PROTO_CLASS_H */
Note: See TracBrowser for help on using the repository browser.