Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 7684 was 7681, checked in by rennerc, 18 years ago

finished and tested MessageManager

File size: 2.6 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
28enum MessageId
29{
30  TESTMESSAGEID = 1
31};
32
33typedef void (*MessageCallback)( MessageId messageId, byte * data, int dataLength, void * someData, int userId );
34
35enum RecieverType
36{
37  RT_ALL = 1,   //!< message is sent to all users
38  RT_USER,      //!< message is only sent to reciever
39  RT_NOT_USER   //!< message is sent to all but reciever
40};
41
42//TODO implement priority handling
43enum MessagePriority
44{
45  MP_HIGHBANDWIDTH = 1,  //!< fast and reliable but uses a lot of bandwidth
46  MP_LOWBANDWIDTH,       //!< may take a long time to arrive. reliable
47  MP_UNRELIABLE          //!< unreliable. low bandwidth
48};
49
50struct NetworkMessage
51{
52  MessageId        messageId;
53  byte *           data;
54  int              length;
55  int              number;
56  MessagePriority  priority;
57};
58
59struct MessageUserQueue
60{
61  std::list<NetworkMessage> messages;
62  std::list<int>            toAck;
63  std::list<int>            recievedMessages;
64};
65
66typedef std::map<int,MessageUserQueue> MessageQueue;
67
68struct MessageHandler
69{
70  MessageCallback cb;
71  MessageId       messageId;
72  void *          someData;
73};
74
75typedef std::map<MessageId,MessageHandler> MessageHandlerMap;
76
77//! A class for sending messages over network
78class MessageManager : public Synchronizeable {
79 protected:
80   MessageManager();
81 public:
82   inline static MessageManager * getInstance(){ if (!singletonRef) singletonRef = new MessageManager();  return singletonRef; }
83   
84   virtual ~MessageManager();
85   
86   bool registerMessageHandler( MessageId messageId, MessageCallback cb, void * someData );
87   
88   void sendMessage( MessageId messageId, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority );
89
90   virtual int getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH );
91   virtual int setStateDiff( int userId, byte* data, int length, int stateId, int fromStateId );
92   virtual void cleanUpUser( int userId );
93   
94   void initUser( int userId );
95
96
97 private:
98   static MessageManager * singletonRef;
99   MessageQueue            messageQueue;        //!< stores messages to send
100   MessageHandlerMap       messageHandlerMap;   //!< contains handlers for messages
101
102   int                     newNumber;           //!< used to create unique message numbers
103
104};
105
106#endif /* _PROTO_CLASS_H */
Note: See TracBrowser for help on using the repository browser.