7 #ifndef INC_KY_AMP_MESSAGEREGISTRY_H
8 #define INC_KY_AMP_MESSAGEREGISTRY_H
27 class BaseMessageTypeDescriptor :
public NewOverrideBase<Stat_Default_Mem>
30 virtual ~BaseMessageTypeDescriptor() { }
32 const String& GetMessageTypeName()
const {
return MessageTypeName; }
33 UInt32 GetMessageLatestVersion()
const {
return MessageLatestVersion; }
34 UInt32 GetMessageType()
const {
return MessageType; }
35 UInt32 GetPeerMessageType()
const {
return PeerMessageType; }
36 bool CanHandle(IMessageHandler::Mode handlerMode)
const {
return MessageHandler!=NULL && MessageHandler->HandleMode() == handlerMode; }
37 void Handle(Message* msg)
const { MessageHandler->Handle(msg); }
39 virtual BaseMessageTypeDescriptor* Clone()
const = 0;
40 virtual Message* CreateMessage(MemoryHeap* heap)
const = 0;
43 BaseMessageTypeDescriptor(
const char* messageTypeName, UInt32 messageLatestVersion, UInt32 messageType, Ptr<IMessageHandler> messageHandler)
44 : MessageHandler(messageHandler)
45 , MessageTypeName(messageTypeName)
46 , MessageLatestVersion(messageLatestVersion)
47 , MessageType(messageType)
48 , PeerMessageType(messageType)
52 friend class MessageTypeRegistry;
54 Ptr<IMessageHandler> MessageHandler;
55 String MessageTypeName;
56 UInt32 MessageLatestVersion;
58 UInt32 PeerMessageType;
63 template <
class TMessage>
64 class MessageTypeDescriptor :
public BaseMessageTypeDescriptor
67 friend class MessageTypeRegistry;
69 MessageTypeDescriptor(
const char* messageTypeName, UInt32 messageLatestVersion, UInt32 messageType, Ptr<IMessageHandler> messageHandler)
70 :BaseMessageTypeDescriptor(messageTypeName, messageLatestVersion, messageType, messageHandler)
74 virtual MessageTypeDescriptor<TMessage>* Clone()
const {
return KY_NEW(MessageTypeDescriptor<TMessage>)(MessageTypeName, MessageLatestVersion, MessageType, MessageHandler); }
75 virtual TMessage* CreateMessage(MemoryHeap* heap)
const
77 TMessage* msg = KY_HEAP_NEW(heap) TMessage();
78 msg->SetMessageType(MessageType);
85 class MessageTypeRegistry
91 MessageTypeRegistry();
93 ~MessageTypeRegistry()
95 for (UInt32 i = 0; i < Descriptors.GetSize(); ++i)
96 delete Descriptors[i];
103 template<
class TMessage>
104 void AddMessageType(Ptr<IMessageHandler> handler)
107 BaseMessageTypeDescriptor* myDescriptor = GetMessageTypeDescriptor_Unique(TMessage::GetTypeName());
108 if (myDescriptor == NULL)
110 UInt32 localMsgType =
static_cast<Kaim::UInt32
>(Descriptors.GetSize());
111 MessageTypeDescriptor<TMessage>* descriptor = KY_NEW MessageTypeDescriptor<TMessage>(TMessage::GetTypeName(), TMessage::GetLatestVersion() , localMsgType, handler);
112 StringToMsgType.SetCaseInsensitive(TMessage::GetTypeName(), localMsgType);
113 Descriptors.PushBack(descriptor);
117 if (myDescriptor->GetMessageTypeName() != TMessage::GetTypeName())
119 KY_DEBUG_ERRORN((
"MessageType '%s-%u' ignored, it conflicts with descriptor %u, %s-%u",
120 TMessage::GetTypeName(), TMessage::GetLatestVersion(),
121 static_cast<unsigned int>(myDescriptor->GetMessageType()),
122 myDescriptor->GetMessageTypeName().ToCStr(),
static_cast<unsigned int>(myDescriptor->GetMessageLatestVersion())));
126 KY_DEBUG_WARNINGN_IF(myDescriptor->MessageHandler != NULL, (
"Handler of descriptor %u, %s-%u is overridden",
127 static_cast<unsigned int>(myDescriptor->GetMessageType()),
128 myDescriptor->GetMessageTypeName().ToCStr(),
static_cast<unsigned int>(myDescriptor->GetMessageLatestVersion())));
129 myDescriptor->MessageHandler = handler;
133 void AddMessageTypeRegistry(
const MessageTypeRegistry& other);
135 BaseMessageTypeDescriptor* GetMessageTypeDescriptor(
const String& messageTypeName)
const
137 BaseMessageTypeDescriptor* descriptor = GetMessageTypeDescriptor_Unique(messageTypeName);
138 if (descriptor->GetMessageTypeName() == messageTypeName)
144 template<
class TMessage>
145 UInt32 GetMessageType()
const
147 return GetMessageType(TMessage::GetTypeName());
150 UInt32 GetMessageType(
const String& messageTypeName)
const
152 const BaseMessageTypeDescriptor* descriptor = GetMessageTypeDescriptor(messageTypeName);
153 return (descriptor ? descriptor->GetMessageType() : Message::InvalidMsgType);
156 UInt32 GetMessageTypeCount()
const
158 return (UInt32)Descriptors.GetSize();
161 BaseMessageTypeDescriptor* GetMessageTypeDescriptor(UInt32 localMsgType)
const
163 if (localMsgType < Descriptors.GetSize())
164 return Descriptors[localMsgType];
169 UInt32 GetLocalMessageType(UInt32 peerMsgType)
const
173 if (peerMsgType < MsgTypeConverter.GetSize())
175 return MsgTypeConverter[peerMsgType];
177 return Message::InvalidMsgType;
183 UInt32 GetPeerMessageType(UInt32 localMsgType)
const
187 if (localMsgType < Descriptors.GetSize())
189 return Descriptors[localMsgType]->GetPeerMessageType();
192 return Message::InvalidMsgType;
203 void MapMsgTypes(RegistryEntry* peerRegistryData, UInt32 dataSize);
204 void DisableMapping() { MappingEnabled =
false; }
205 bool IsMappingEnabled()
const {
return MappingEnabled!=0; }
208 template<
class TMessage>
209 TMessage* CreateMessage(
void* memoryHeap,
bool doMapType)
const
211 return static_cast<TMessage*
>(CreateMessage(memoryHeap, doMapType, TMessage::GetTypeName()));
214 Message* CreateMessage(
void* memoryHeap,
bool doMapType,
const String& messageTypeName)
const;
216 Message* CreateMessageRegistry(
void* memoryHeap,
bool doMapType)
const;
220 BaseMessageTypeDescriptor* GetMessageTypeDescriptor_Unique(
const String& messageTypeName)
const
222 const UInt32* pMsgType = StringToMsgType.GetCaseInsensitive(messageTypeName);
223 return (pMsgType && (*pMsgType < Descriptors.GetSize()) ? Descriptors[*pMsgType] : NULL);
228 Array<BaseMessageTypeDescriptor*> Descriptors;
229 StringHash<UInt32> StringToMsgType;
231 Array<UInt32> MsgTypeConverter;
232 UInt32 MappingEnabled;
Definition: gamekitcrowddispersion.h:20