2004-07-04 17:41:17 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
2003-11-25 03:11:50 +01:00
|
|
|
#include "posix.h"
|
2004-03-03 00:54:51 +01:00
|
|
|
#include "lib.h"
|
2003-11-25 03:11:50 +01:00
|
|
|
#include <stdio.h>
|
2004-08-16 17:19:17 +02:00
|
|
|
#include <map>
|
2003-11-25 03:11:50 +01:00
|
|
|
|
|
|
|
#define ALLNETMSGS_IMPLEMENT
|
|
|
|
|
|
|
|
#include "NetMessage.h"
|
2004-08-16 17:19:17 +02:00
|
|
|
|
|
|
|
#include "CLogger.h"
|
|
|
|
|
|
|
|
#define LOG_CAT_NET "net"
|
2003-11-25 03:11:50 +01:00
|
|
|
|
|
|
|
// NEVER modify the deserializer map outside the ONCE-block in DeserializeMessage
|
2004-03-08 03:04:34 +01:00
|
|
|
typedef std::map <ENetMessageType, NetMessageDeserializer> MessageDeserializerMap;
|
2003-11-25 03:11:50 +01:00
|
|
|
MessageDeserializerMap g_DeserializerMap;
|
|
|
|
|
2004-09-21 16:40:43 +02:00
|
|
|
CNetMessage::~CNetMessage()
|
|
|
|
{
|
|
|
|
m_Type=NMT_NONE;
|
|
|
|
}
|
|
|
|
|
2004-03-08 03:04:34 +01:00
|
|
|
u8 *CNetMessage::Serialize(u8 *pos) const
|
|
|
|
{ return pos; }
|
2003-11-25 03:11:50 +01:00
|
|
|
|
|
|
|
uint CNetMessage::GetSerializedLength() const
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-03-08 03:04:34 +01:00
|
|
|
CStr CNetMessage::GetString() const
|
2004-09-21 16:40:43 +02:00
|
|
|
{
|
|
|
|
if (m_Type==NMT_NONE)
|
|
|
|
return "NMT_NONE { Invalid Message }";
|
|
|
|
else
|
|
|
|
return CStr("Unknown Message ")+CStr(m_Type);
|
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
|
|
|
const u8 *CNetMessage::Deserialize(const u8 *pos, const u8 *end)
|
|
|
|
{ return pos; }
|
|
|
|
|
2004-08-16 17:19:17 +02:00
|
|
|
CNetMessage *CNetMessage::Copy() const
|
|
|
|
{
|
2004-09-21 16:40:43 +02:00
|
|
|
LOG(ERROR, LOG_CAT_NET, "CNetMessage::Copy(): Attempting to copy non-copyable message!");
|
|
|
|
return new CNetMessage(NMT_NONE);
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
2004-03-08 03:04:34 +01:00
|
|
|
CNetMessage *CNetMessage::DeserializeMessage(ENetMessageType type, u8 *buffer, uint length)
|
2003-11-25 03:11:50 +01:00
|
|
|
{
|
|
|
|
{
|
|
|
|
ONCE(
|
|
|
|
SNetMessageDeserializerRegistration *pReg=&g_DeserializerRegistrations[0];
|
|
|
|
for (;pReg->m_pDeserializer;pReg++)
|
|
|
|
{
|
|
|
|
g_DeserializerMap.insert(std::make_pair(pReg->m_Type, pReg->m_pDeserializer));
|
|
|
|
}
|
2004-05-06 19:14:30 +02:00
|
|
|
);
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
MessageDeserializerMap::const_iterator dEntry=g_DeserializerMap.find(type);
|
|
|
|
if (dEntry == g_DeserializerMap.end())
|
2004-08-16 17:19:17 +02:00
|
|
|
{
|
|
|
|
LOG(WARNING, LOG_CAT_NET, "Unknown message received on socket: type 0x%04x, length %u", type, length);
|
2003-11-25 03:11:50 +01:00
|
|
|
return NULL;
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
2003-11-25 03:11:50 +01:00
|
|
|
NetMessageDeserializer pDes=dEntry->second;
|
|
|
|
return (pDes)(buffer, length);
|
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|