Files
2022-10-26 12:25:11 +08:00

100 lines
2.5 KiB
C++

#pragma once
#ifndef WORLDSERVER_PACKET_HANDLER_H
#define WORLDSERVER_PACKET_HANDLER_H
#include <FunctionMap.h>
#include <PacketStruct.h>
//==================================================================================================
namespace ns_world {
;
class ServerSessionInWorld;
enum ePACKET_HANDLER
{
//PACKET_HANDLER_CLIENT = 0,
PACKET_HANDLER_DBPROXY,
PACKET_HANDLER_AGENT,
PACKET_HANDLER_MASTER,
//
PACKET_HANDLER_COUNTS
};
struct PacketHandlerNode;
struct PacketHandlerInfo;
//==================================================================================================
class PacketHandler
{
public:
typedef void (*fnHandler)(ns_world::ServerSessionInWorld* const server_session,
const MSG_BASE* const msg, const uint16_t msg_size);
static PacketHandler* Instance();
void ParsePacket(ePACKET_HANDLER handler_type,
ns_world::ServerSessionInWorld* server_session,
MSG_BASE* msg_base, WORD msg_size);
private:
struct HANDLER_FUNC : public util::BASE_FUNC
{
fnHandler m_fnHandler;
};
PacketHandler();
~PacketHandler();
static PacketHandler* CreateInstance();
bool Register();
bool AddHandler(ePACKET_HANDLER handler_type,
BYTE category, BYTE protocol, fnHandler fnHandler);
// f100819.1L, a batched process for a partial protocol group
bool _RegisterPartialBlock(const TCHAR* group_name, ePACKET_HANDLER handler_type,
const ns_world::PacketHandlerInfo& regist_info);
// fields...
util::FunctionMap function_table_[PACKET_HANDLER_COUNTS];
// last order...
static PacketHandler* instance_static_;
__DISABLE_COPY(PacketHandler);
}; //end of class
//==================================================================================================
struct PacketHandlerNode
{
union {
uint16_t category_and_protocol_;
struct {
uint8_t category_;
uint8_t protocol_;
};
};
ePHASE_SHIFT phase_shift_;
PacketHandler::fnHandler handler_;
};
struct PacketHandlerInfo
{
const PacketHandlerNode* node_array_;
int number_of_array_;
};
}; //end of namespace
//==================================================================================================
inline ns_world::PacketHandler* ns_world::PacketHandler::Instance()
{
if (instance_static_ != NULL) {
return instance_static_;
}
return CreateInstance();
}
#endif //WORLDSERVER_PACKET_HANDLER_H