26 class BaseMessageTypeDescriptor :
public NewOverrideBase<Stat_Default_Mem>
29 virtual ~BaseMessageTypeDescriptor() { }
31 const String& GetMessageTypeName()
const {
return MessageTypeName; }
32 UInt32 GetMessageLatestVersion()
const {
return MessageLatestVersion; }
33 UInt32 GetMessageType()
const {
return MessageType; }
34 UInt32 GetPeerMessageType()
const {
return PeerMessageType; }
35 bool CanHandle(IMessageHandler::Mode handlerMode)
const {
return MessageHandler!=NULL && MessageHandler->HandleMode() == handlerMode; }
36 void Handle(Message* msg)
const { MessageHandler->Handle(msg); }
38 virtual BaseMessageTypeDescriptor* Clone()
const = 0;
39 virtual Message* CreateMessage(MemoryHeap* heap)
const = 0;
42 BaseMessageTypeDescriptor(
const char* messageTypeName,
UInt32 messageLatestVersion,
UInt32 messageType, Ptr<IMessageHandler> messageHandler)
43 : MessageHandler(messageHandler)
44 , MessageTypeName(messageTypeName)
45 , MessageLatestVersion(messageLatestVersion)
46 , MessageType(messageType)
47 , PeerMessageType(messageType)
51 friend class MessageTypeRegistry;
53 Ptr<IMessageHandler> MessageHandler;
54 String MessageTypeName;
55 UInt32 MessageLatestVersion;
62 template <
class TMessage>
63 class MessageTypeDescriptor :
public BaseMessageTypeDescriptor
66 friend class MessageTypeRegistry;
68 MessageTypeDescriptor(
const char* messageTypeName,
UInt32 messageLatestVersion,
UInt32 messageType, Ptr<IMessageHandler> messageHandler)
69 :BaseMessageTypeDescriptor(messageTypeName, messageLatestVersion, messageType, messageHandler)
73 virtual MessageTypeDescriptor<TMessage>* Clone()
const {
return KY_NEW(MessageTypeDescriptor<TMessage>)(MessageTypeName, MessageLatestVersion, MessageType, MessageHandler); }
74 virtual TMessage* CreateMessage(MemoryHeap* heap)
const
76 TMessage* msg = KY_HEAP_NEW(heap) TMessage();
77 msg->SetMessageType(MessageType);
84 class MessageTypeRegistry
90 MessageTypeRegistry();
92 ~MessageTypeRegistry()
94 for (
UInt32 i = 0; i < Descriptors.GetSize(); ++i)
95 delete Descriptors[i];
102 template<
class TMessage>
103 void AddMessageType(Ptr<IMessageHandler> handler)
106 BaseMessageTypeDescriptor* myDescriptor = GetMessageTypeDescriptor_Unique(TMessage::GetTypeName());
107 if (myDescriptor == NULL)
110 MessageTypeDescriptor<TMessage>* descriptor = KY_NEW MessageTypeDescriptor<TMessage>(TMessage::GetTypeName(), TMessage::GetLatestVersion() , localMsgType, handler);
111 StringToMsgType.SetCaseInsensitive(TMessage::GetTypeName(), localMsgType);
112 Descriptors.PushBack(descriptor);
116 if (myDescriptor->GetMessageTypeName() != TMessage::GetTypeName())
118 KY_DEBUG_ERRORN((
"MessageType '%s-%u' ignored, it conflicts with descriptor %u, %s-%u",
119 TMessage::GetTypeName(), TMessage::GetLatestVersion(),
120 static_cast<unsigned int>(myDescriptor->GetMessageType()),
121 myDescriptor->GetMessageTypeName().ToCStr(),
static_cast<unsigned int>(myDescriptor->GetMessageLatestVersion())));
125 KY_DEBUG_WARNINGN_IF(myDescriptor->MessageHandler != NULL, (
"Handler of descriptor %u, %s-%u is overridden",
126 static_cast<unsigned int>(myDescriptor->GetMessageType()),
127 myDescriptor->GetMessageTypeName().ToCStr(),
static_cast<unsigned int>(myDescriptor->GetMessageLatestVersion())));
128 myDescriptor->MessageHandler = handler;
132 void AddMessageTypeRegistry(
const MessageTypeRegistry& other);
134 BaseMessageTypeDescriptor* GetMessageTypeDescriptor(
const String& messageTypeName)
const
136 BaseMessageTypeDescriptor* descriptor = GetMessageTypeDescriptor_Unique(messageTypeName);
137 if (descriptor->GetMessageTypeName() == messageTypeName)
143 template<
class TMessage>
144 UInt32 GetMessageType()
const
146 return GetMessageType(TMessage::GetTypeName());
149 UInt32 GetMessageType(
const String& messageTypeName)
const
151 const BaseMessageTypeDescriptor* descriptor = GetMessageTypeDescriptor(messageTypeName);
152 return (descriptor ? descriptor->GetMessageType() : Message::InvalidMsgType);
155 UInt32 GetMessageTypeCount()
const
157 return (
UInt32)Descriptors.GetSize();
160 BaseMessageTypeDescriptor* GetMessageTypeDescriptor(
UInt32 localMsgType)
const
162 if (localMsgType < Descriptors.GetSize())
163 return Descriptors[localMsgType];
172 if (peerMsgType < MsgTypeConverter.GetSize())
174 return MsgTypeConverter[peerMsgType];
176 return Message::InvalidMsgType;
186 if (localMsgType < Descriptors.GetSize())
188 return Descriptors[localMsgType]->GetPeerMessageType();
191 return Message::InvalidMsgType;
202 void MapMsgTypes(RegistryEntry* peerRegistryData,
UInt32 dataSize);
203 void DisableMapping() { MappingEnabled =
false; }
204 bool IsMappingEnabled()
const {
return MappingEnabled!=0; }
207 template<
class TMessage>
208 TMessage* CreateMessage(
void* memoryHeap,
bool doMapType)
const
210 return static_cast<TMessage*
>(CreateMessage(memoryHeap, doMapType, TMessage::GetTypeName()));
213 Message* CreateMessage(
void* memoryHeap,
bool doMapType,
const String& messageTypeName)
const;
215 Message* CreateMessageRegistry(
void* memoryHeap,
bool doMapType)
const;
219 BaseMessageTypeDescriptor* GetMessageTypeDescriptor_Unique(
const String& messageTypeName)
const
221 const UInt32* pMsgType = StringToMsgType.GetCaseInsensitive(messageTypeName);
222 return (pMsgType && (*pMsgType < Descriptors.GetSize()) ? Descriptors[*pMsgType] : NULL);
227 Array<BaseMessageTypeDescriptor*> Descriptors;
228 StringHash<UInt32> StringToMsgType;
230 Array<UInt32> MsgTypeConverter;
std::uint32_t UInt32
uint32_t
Definition: SF_Types.h:137
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17