Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

disconnecting client over the network via proxy control

File size: 4.4 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_PROXY_NEWCLIENT,                       //!< informs the master server about a new client
39  MSGID_PROXY_LEAVECLIENT                      //!< informs the master and other proxy servers about a leaving client
40};
41
42
43typedef bool (*MessageCallback)( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId );
44
45typedef enum RecieverType
46{
47  RT_ALL_BUT_ME = 1,   //!< message is sent to all users but myself
48  RT_ALL_ME,           //!< message is sent to all users
49  RT_USER,             //!< message is only sent to reciever
50  RT_NOT_USER,         //!< message is sent to all but reciever
51  RT_SERVER            //!< message is sent to server only
52};
53
54//TODO implement priority handling
55enum MessagePriority
56{
57  MP_HIGHBANDWIDTH = 1,  //!< fast and reliable but uses a lot of bandwidth
58  MP_LOWBANDWIDTH,       //!< may take a long time to arrive. reliable
59  MP_UNRELIABLE          //!< unreliable. low bandwidth
60};
61
62struct NetworkMessage
63{
64  MessageType      messageType;                         //!< type of the message
65  byte *           data;                                //!< data
66  int              length;                              //!< length of the data
67  int              number;                              //!< serial number
68  int              senderId;                            //!< userId of the sender
69  int              destinationId;                       //!< userId of the destination
70  RecieverType     recieverType;                        //!< type of the receiver
71  MessagePriority  priority;                            //!< priority of the messages
72};
73
74struct MessageUserQueue
75{
76  std::list<NetworkMessage> messages;
77  std::list<int>            toAck;
78  std::list<int>            recievedMessages;
79};
80
81typedef std::map<int,MessageUserQueue> MessageQueue;
82
83
84
85struct MessageHandler
86{
87  MessageCallback   cb;
88  MessageType       messageType;
89  void *            someData;
90};
91
92typedef std::map<MessageType,MessageHandler> MessageHandlerMap;
93
94//! A class for sending messages over network
95class MessageManager : public Synchronizeable {
96 protected:
97   MessageManager();
98 public:
99   inline static MessageManager * getInstance(){ if (!singletonRef) singletonRef = new MessageManager();  return singletonRef; }
100
101   virtual ~MessageManager();
102
103   bool registerMessageHandler( MessageType messageType, MessageCallback cb, void * someData );
104
105   void sendMessage( MessageType messageType, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority );
106   void sendMessage( MessageType messageType, byte * data, int dataLength, RecieverType recieverType, int sender, int reciever, MessagePriority messagePriority );
107
108   void initUser( int userId );
109
110
111  private:
112   virtual int getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH );
113   virtual int setStateDiff( int userId, byte* data, int length, int stateId, int fromStateId );
114   virtual void cleanUpUser( int userId );
115   virtual void handleSentState( int userId, int stateId, int fromStateId ){}
116   virtual void handleRecvState( int userId, int stateId, int fromStateId ){}
117
118
119 private:
120   static MessageManager *   singletonRef;           //!< the singleton reference
121
122   std::list<NetworkMessage> incomingMessageQueue;   //!< the incoming message buffer
123   MessageQueue              outgoingMessageQueue;   //!< stores messages to send
124   MessageHandlerMap         messageHandlerMap;      //!< contains handlers for messages
125
126   int                       newNumber;              //!< used to create unique message numbers
127
128
129};
130
131#endif /* _MESSAGE_MANAGER_H */
Note: See TracBrowser for help on using the repository browser.