Files
Sun1602/Tools/WiseClient/Object/MsgHandler.h
T
2022-10-26 12:25:11 +08:00

118 lines
3.0 KiB
C++

#pragma once
#include "GameObject.h"
#include <Sessions/UserSessionMgr.h>
//////////////////////////////////////////////////////////////////////////
//
class WiseUser;
#pragma pack(push, 1)
template<eWISESUBTYPE _MSGTYPE, typename _TyMSG_BUFFER>
struct sMESSAGE_BLOCK
{
sSIG_NETMSG SIG_NETWORK_MESSAGE_REF[1];
_TyMSG_BUFFER MESSAGE_BLOCK;
sMESSAGE_BLOCK()
{
SIG_NETWORK_MESSAGE_REF->MSG_LEN() = 0;
ReFresh();
}
inline BOOL Store(ServerSession* pSession, WiseUser* pUser, BYTE* pMsg, WORD wSize)
{
// Size검사에서 Packet Max Size + 4의 공간이 감안되어야 한다.
if(!(pUser && pSession && pMsg && ((DWORD)wSize < sizeof(MESSAGE_BLOCK.MSG_STREAM))))
{
DEBUGGING_CODE_L1("Invalid Store Info");
return FALSE;
}
SIG_NETWORK_MESSAGE_REF->USER() = pUser;
SIG_NETWORK_MESSAGE_REF->SESSION_PTR() = pSession;
SIG_NETWORK_MESSAGE_REF->MSG_HDR() = MESSAGE_BLOCK.MSG_STREAM;
SIG_NETWORK_MESSAGE_REF->MSG_LEN() = wSize;
if(SIG_NETWORK_MESSAGE_REF->MSG_HDR() != pMsg)
CopyMemory(SIG_NETWORK_MESSAGE_REF->MSG_HDR(), pMsg, wSize);
MAGIC_CODE_EXPOSURE(&(MESSAGE_BLOCK.MSG_STREAM[wSize])) = MAGIC_MEMORY_IDS_MARK;
return TRUE;
}
template<typename _TY>
inline _TY& InstanceOf()
{ return MESSAGE_BLOCK.InstanceOf<_TY>(); }
template<typename _TY>
inline static _TY& TypeOf()
{ return MESSAGE_BLOCK.TypeOf<_TY>(); }
inline BOOL IntegrityCheck()
{
BOOL bRET = MESSAGE_BLOCK.IntegrityCheck();
bRET = bRET && (MAGIC_MEMORY_IDS_MARK == MAGIC_CODE_EXPOSURE(&MESSAGE_BLK[SIG_NETWORK_MESSAGE_REF->MSG_LEN()]));
return bRET;
}
inline BOOL ReFresh()
{
SIG_NETWORK_MESSAGE_REF->SUBTYPE() = _MSGTYPE;
SIG_NETWORK_MESSAGE_REF->USER() = NULL;
SIG_NETWORK_MESSAGE_REF->SESSION_PTR() = NULL;
SIG_NETWORK_MESSAGE_REF->MSG_HDR() = MESSAGE_BLOCK.MSG_STREAM;
WORD wSize = SIG_NETWORK_MESSAGE_REF->MSG_LEN();
SIG_NETWORK_MESSAGE_REF->MSG_LEN() = 0;
MESSAGE_BLOCK.Refresh();
if(!(wSize > sizeof(MESSAGE_BLOCK.MSG_STREAM)))
ZeroMemory(MESSAGE_BLOCK.MSG_STREAM, wSize);
else
{
DEBUGGING_CODE_L1("Need Check Overflow!");
ZeroMemory(MESSAGE_BLOCK.MSG_STREAM, sizeof(MESSAGE_BLOCK.MSG_STREAM));
}
return TRUE;
}
};
#pragma pack(pop)
//////////////////////////////////////////////////////////////////////////
// <MSG PROCESSOR>
//
class MsgHandler
{
private: MsgHandler();
~MsgHandler();
public: static void CreateInstance();
static void DestroyInstance();
static MsgHandler* Instance() { return ms_pInstance; }
BOOL OnMsg(sSIG_WISEBASE* pSIG_MSG, GameObject* pObject);
private: void _Initialize();
public:
typedef BOOL (*MessageHandler)(sSIG_WISEBASE* pSIG_MSG, GameObject* pObject);
//typedef std::map<eWISESUBTYPE, MessageHandler> SIGHANDLER_MAP;
//typedef SIGHANDLER_MAP::iterator SIGHANDLER_MAP_IT;
typedef STLX_MAP<DWORD, MessageHandler> SIGMSG_MAP;
typedef SIGMSG_MAP::iterator SIGMSG_MAP_IT;
private:
SIGMSG_MAP m_SIGMSG;
private: static MsgHandler* ms_pInstance;
};
//////////////////////////////////////////////////////////////////////////
//