#pragma once #include // // PACKET STRUCTUREs #include #include #include #include #include #include #include // #include #include #include #include #include #include #include #include #include // #ifdef _DEBUG # include #define __NA000000_081104_REGISTERED_PROTOCOL_NAMES__ #endif //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // struct MSG_BASE; class UserSession; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // #pragma pack(push,1) #pragma warning(push) #pragma warning(disable : 4201) // Agent ±âÁØ¿ë struct PACKET_CONTROL { static const DWORD MAX_PACKET_SIZE = 16384; union uPACKET_STRUCTURE { BYTE PacketStream[PACKET_CONTROL::MAX_PACKET_SIZE]; struct { DWORD dwUserKey; BYTE pC2APacketPtr[1]; }; struct { WORD wBLANK; union { MSG_CG_CRYPTOGRAPHY_PACKET_ENCODING pMSG_ENCODING[1]; MSG_CG_CRYPTOGRAPHY_PACKET_ENCODED pMSG_ENCODED[1]; }; } BASE_PK; struct { DWORD dwUserKey; MSG_BASE_INTERNAL pMSG_BASE_INTERNAL[1]; } FORWARD; struct { MSG_BASE pMSG_BASE[1]; MSG_BASE_FORWARD pMSG_BASE_FORWARD[1]; } BASE; }; static uPACKET_STRUCTURE sRECV_PACKET_STRUCTURE; static uPACKET_STRUCTURE sSEND_PACKET_STRUCTURE; // TempUser, User(no crypt), MSG_BASE root inline static BYTE* GetPacketPtr_C2A() { return (BYTE*)sRECV_PACKET_STRUCTURE.pC2APacketPtr; } // TempUser, User(no crypt), MSG_BASE root inline static BYTE* GetPacketPtr_A2C() { return (BYTE*)sSEND_PACKET_STRUCTURE.pC2APacketPtr; } // User(crypt) inline static MSG_CG_CRYPTOGRAPHY_PACKET_ENCODED* GetPacketPtr_C2A_ENCODED() { return sRECV_PACKET_STRUCTURE.BASE_PK.pMSG_ENCODED; } // User(crypt) inline static MSG_CG_CRYPTOGRAPHY_PACKET_ENCODING* GetPacketPtr_A2C_ENCODING() { return sSEND_PACKET_STRUCTURE.BASE_PK.pMSG_ENCODING; } inline static MSG_BASE* GetPacketPtr_BASE_C2A() { return sRECV_PACKET_STRUCTURE.BASE.pMSG_BASE; } inline static MSG_BASE* GetPacketPtr_BASE_A2C() { return sSEND_PACKET_STRUCTURE.BASE.pMSG_BASE; } inline static MSG_BASE_FORWARD* GetPacketPtr_FORWARD_C2A() { return sRECV_PACKET_STRUCTURE.BASE.pMSG_BASE_FORWARD; } inline static MSG_BASE_FORWARD* GetPacketPtr_FORWARD_A2C() { return sSEND_PACKET_STRUCTURE.BASE.pMSG_BASE_FORWARD; } // Agent Server -> ¼­¹öÆÀ °ü¸® ¼­¹öµé inline static BYTE* GetPacketPtr_A2GDWMZ() { return (BYTE*)&(sSEND_PACKET_STRUCTURE.FORWARD); } // ¼­¹öÆÀ °ü¸® ¼­¹öµé -> Agent Server inline static BYTE* GetPacketPtr_GDWMZ2A() { return (BYTE*)&(sRECV_PACKET_STRUCTURE.FORWARD); } // Agent Server -> Login F, Auth, Wops inline static BYTE* GetPacketPtr_A2LUO() { return (BYTE*)sSEND_PACKET_STRUCTURE.FORWARD.pMSG_BASE_INTERNAL; } // Login F, Auth, Wops -> Agent Server inline static BYTE* GetPacketPtr_LUO2A() { return (BYTE*)sRECV_PACKET_STRUCTURE.FORWARD.pMSG_BASE_INTERNAL; } static BOOL m_bShowPacketStream; #ifdef _DEBUG static const CPShowFNTable* m_CPShowHandler; #endif static BOOL GetShowPacketStream() { return m_bShowPacketStream; } static VOID SetShowPacketStream( BOOL bSet ) { m_bShowPacketStream = bSet; #ifdef _DEBUG m_CPShowHandler = GetCPShowHandler(); m_CPShowHandler->fnInit( C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, CATEGORY_ODD_NUMBER, PROTOCOL_ODD_NUMBER ); #endif } static VOID ShowPacketStream( MSG_BASE* pBASE, WORD wSize, CHAR* pPrefix ); }; #pragma warning(pop) #pragma pack(pop) //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // TYPE DEFINITION typedef VOID (*PH_fnHandler)( ServerSession* pSession, MSG_BASE* pMsg, WORD wSize ); typedef VOID (*PH_fnCAHandler)( UserSession* pSession, MSG_BASE* pMsg, WORD wSize ); struct sPACKET_HANDLER_INFO { WORD wCATEGORYnPROTOCOL; ePHASE_SHIFT ePHASE_SHIFT_T; PH_fnHandler pfnHandler; }; struct FUNC_GENERIC : public util::BASE_FUNC { ePHASE_SHIFT m_PHASE_SHIFT_T; PH_fnHandler m_fnHandler; }; class PacketHandler; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // class ProtocolMatrix { #pragma warning(push) #pragma warning(disable : 4201) public: struct sNode { union { WORD wPROTOCOLnCATEGORY; struct { BYTE bPROTOCOL; // ÀϹݰú ¿ª¼ø... ¿¬¼Ó ½ºÆ®¸² ¾ò±â À§ÇÔ. BYTE bCATEGORY; // MAKEWORD(pMsg->m_byProtocol, pMsg->m_byCategory) }; }; ePHASE_SHIFT ePHASE_SHIFT_T; PH_fnCAHandler m_fnHandler; #ifdef __NA000000_081104_REGISTERED_PROTOCOL_NAMES__ const CHAR* m_ProtocolName; #endif }; #pragma warning(pop) typedef util::ARRAY_TYPEINFO< sNode, 0, 65536 > array_t; public: public: ProtocolMatrix(); public: const sNode* Find(BYTE category, BYTE protocol) const; bool RegisterFowardHandler(PH_fnCAHandler handler) { m_FowardHandler = handler; } bool RegisterAllDefault(const ePHASE_SHIFT phase, PH_fnCAHandler handler); bool RegisterHandler(const sPACKET_HANDLER_INFO* IN pInfo); bool RegisterHandlerRange(const BYTE category, const ePHASE_SHIFT phase, PH_fnCAHandler handler); #ifdef __NA000000_081104_REGISTERED_PROTOCOL_NAMES__ void RegisterHandlerName(const BYTE category, const BYTE protocol, const CHAR* const protocol_name); #endif private: array_t::array_type m_Array; ePHASE_SHIFT m_DefaultPhase; PH_fnCAHandler m_DefaultHandler; PH_fnCAHandler m_FowardHandler; friend class PacketHandler; }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // typedef Delegator PACKET_HANDLER_DELEGATOR; typedef Delegator* PACKET_HANDLER_DELEGATOR_P; typedef Delegator FUNCTION_MAP_DELEGATOR; typedef Delegator FUNC_GENERIC_DELEGATOR; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // class PacketHandler { public: PacketHandler(); ~PacketHandler(); static VOID RegisterHandler(); static VOID ReleaseHandler(); static PACKET_HANDLER_DELEGATOR GetHandler() { return ms_pInstance; } const FUNC_GENERIC* GetServerProtocolBinding(eSERVER_TYPE server_type, BYTE category, BYTE protocol); const ProtocolMatrix::sNode* GetClientProtocolBinding(BYTE category, BYTE protocol) const; //------------------------------------------------------------------------------------- // ÆÐŶ ÆÄ½Ì <¼­¹ö °£ ¿¬°á> inline BOOL CanDoProcess( FUNC_GENERIC_DELEGATOR& funcDelegator ); BOOL ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE* pMsg, WORD wSize ) { return _ParsePacket( serverType, pSession, pMsg, wSize ); } BOOL ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE_INTERNAL* pMsg, WORD wSize ) { return _ParsePacket( serverType, pSession, pMsg, wSize ); } //------------------------------------------------------------------------------------- // ÆÐŶ ÆÄ½Ì <¼­¹ö °£ ¿¬°á> BOOL ParsePacketCA( eUSER_PARSER_TYPE userType, User* pSession, MSG_BASE* pMsg, WORD wSize ) { return _ParsePacketCA( userType, pSession, pMsg, wSize ); } BOOL ParsePacketCA( eUSER_PARSER_TYPE userType, User* pSession, MSG_BASE_INTERNAL* pMsg, WORD wSize ) { return _ParsePacketCA( userType, pSession, pMsg, wSize ); } private: BOOL _ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE* pMsg, WORD wSize ); BOOL _ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE_INTERNAL* pMsg, WORD wSize ); BOOL _ParsePacketCA( eUSER_PARSER_TYPE userType, User* pSession, MSG_BASE* pMsg, WORD wSize ); BOOL _ParsePacketCA( eUSER_PARSER_TYPE userType, User* pSession, MSG_BASE_INTERNAL* pMsg, WORD wSize ); // ¶Ç ÀÖ´Ù¸é Çö(060815) ¼³°è»ó Connection °è¿­ÀÏ °ÍÀÌ´Ù. //------------------------------------------------------------------------------------- public: class Phase { private: ePHASE_SHIFT m_Phase; public: Phase() : m_Phase(PHASE_NOACTION) {} BOOL Shift( ePHASE_SHIFT phase ); BOOL RegisterHandler( sPACKET_HANDLER_INFO* pINFOs, WORD wCounts ); }; public: template BOOL RegisterHandler_( sPACKET_HANDLER_INFO* pINFOs ) { return _RegisterHandler( serverType, pINFOs ); } template BOOL RegisterHandlerCA_( sPACKET_HANDLER_INFO* pINFOs ) { return _RegisterHandlerCA( userType, pINFOs ); } bool RegisterFowardHandlerGroupCG(eUSER_PARSER_TYPE user_parse_type, BYTE category); #ifdef _NA000000_CW_PROTOCOL_UNIFICATION bool RegisterFowardHandlerGroupCW(eUSER_PARSER_TYPE user_parse_type, BYTE category); #endif #ifdef __NA000000_081104_REGISTERED_PROTOCOL_NAMES__ BOOLEAN RegisterHandlerNames(); const CHAR* GetProtocolName( const BYTE category, const BYTE protocol ); #endif private: BOOL _RegisterHandler( eSERVER_TYPE serverType, sPACKET_HANDLER_INFO* pINFOs ); BOOL _RegisterHandlerCA( eUSER_PARSER_TYPE userType, sPACKET_HANDLER_INFO* pINFOs ); private: VOID _Initialize(); //FUNC_HASH_DELEGATOR GetHandler( ServerSessionEx* pSession ); private: VOID _LockInit() { m_bLock = FALSE; } BOOL _IsLock() { return m_bLock; } VOID _Locking() { m_bLock = TRUE; } VOID _UnLocking() { m_bLock = FALSE; } // VOID _CALockInit() { m_bCALock = FALSE; } BOOL _IsCALock() { return m_bCALock; } VOID _CALocking() { m_bCALock = TRUE; } VOID _CAUnLocking() { m_bCALock = FALSE; } private: // static PACKET_HANDLER_DELEGATOR ms_pInstance; BOOL m_bLock; BOOL m_bCALock; // #ifdef _NA_007988_20150127_MODIFY_PROTOCOL_MATRIX_TO_STATIC ProtocolMatrix m_ProtocolMatrix; #else ProtocolMatrix* m_pProtocolMatrix; #endif // _NA_007988_20150127_MODIFY_PROTOCOL_MATRIX_TO_STATIC FUNCTION_MAP_DELEGATOR m_FuncMaps[MAX_SERVER]; };