#include "stdafx.h" #include "PacketHandler.h" #include "Sessions/ServerSessionEx.h" #include "Handler_AM.h" #include "Handler_DM.h" #include "Handler_GM.h" #include "Handler_MO.h" #include "Handler_MP.h" #include "Handler_MW.h" #include "Handler_MX.h" #include "Handler_MZ.h" #include "Handler_SM.h" #include "Handler_ME.h" //------------------------------------------------------- // MODULE VARIABLE static PACKET_HANDLER_DELEGATOR s_pPacketHandler = NULL; PacketHandler::PacketHandler() { _Initialize(); } PacketHandler::~PacketHandler() { m_FuncMaps[FIELD_SERVER] = NULL; m_FuncMaps[BATTLE_SERVER] = NULL; for( DWORD i=0 ; i_UnLocking(); Handler_AM::RegisterHandler_ALL( s_pPacketHandler ); Handler_DM::RegisterHandler_ALL( s_pPacketHandler ); Handler_GM::RegisterHandler_ALL( s_pPacketHandler ); Handler_MO::RegisterHandler_ALL( s_pPacketHandler ); #if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION) Handler_MP::RegisterHandler_ALL( s_pPacketHandler ); #endif Handler_MW::RegisterHandler_ALL( s_pPacketHandler ); Handler_MX::RegisterHandler_ALL( s_pPacketHandler ); Handler_MZ::RegisterHandler_ALL( s_pPacketHandler ); Handler_SM::RegisterHandler_ALL( s_pPacketHandler ); Handler_ME::RegisterHandler_ALL( s_pPacketHandler ); s_pPacketHandler->_Locking(); } BOOL PacketHandler::_RegisterHandler( eSERVER_TYPE serverType, sPACKET_HANDLER_INFO* pINFOs ) { if( _IsLock() ) return FALSE; sPACKET_HANDLER_INFO* pOffset = pINFOs; BOOL bResult = TRUE; if( (DWORD)MAX_SERVER > (DWORD)serverType ) { FUNCTION_MAP_DELEGATOR& rFuncMap = m_FuncMaps[serverType]; if( rFuncMap != NULL ) { for( ; pOffset ; ++pOffset ) { if( pOffset->pfnHandler ) { FUNC_GENERIC_DELEGATOR func = new FUNC_GENERIC; func->m_dwFunctionKey = pOffset->wCATEGORYnPROTOCOL; func->m_fnHandler = pOffset->pfnHandler; bResult = rFuncMap->Add( func() ); if( !bResult ) break; } else if( !(pOffset->wCATEGORYnPROTOCOL) ) { break; } } } else bResult = FALSE; } else bResult = FALSE; if( !bResult ) { BYTE byCategory = (BYTE)(pOffset->wCATEGORYnPROTOCOL&0xFF); BYTE byProtocol = (BYTE)((pOffset->wCATEGORYnPROTOCOL>>8)&0xFF); MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, _T("Can't Register %s Packet Handler [C:%03u][P:%03u]"), GetServerType2String(serverType), byCategory, byProtocol ); } return bResult; } // // // inline BOOL PacketHandler::CanDoProcess( FUNC_GENERIC_DELEGATOR& funcDelegator ) { if( funcDelegator == NULL ) { return FALSE; } return TRUE; } // // // BOOL PacketHandler::_ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE* pMsg, WORD wSize ) { if( (DWORD)MAX_SERVER > (DWORD)serverType ) { FUNCTION_MAP_DELEGATOR& rFuncMap = m_FuncMaps[serverType]; if( rFuncMap != NULL ) { WORD wCP = MAKEWORD(pMsg->m_byCategory, pMsg->m_byProtocol); FUNC_GENERIC_DELEGATOR fnINFO = (FUNC_GENERIC*)rFuncMap->Find( wCP ); if( CanDoProcess( fnINFO ) ) { fnINFO->m_fnHandler( pSession, pMsg, wSize ); return TRUE; } } } MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, _T("%s Handler Null, Invalid Type, UnAuthorized [C:P=%03d:%03d]"), GetServerType2String(serverType), pMsg->m_byCategory, pMsg->m_byProtocol ); return FALSE; } BOOL PacketHandler::_ParsePacket( eSERVER_TYPE serverType, ServerSession* pSession, MSG_BASE_INTERNAL* pMsg, WORD wSize ) { if( (DWORD)MAX_SERVER > (DWORD)serverType ) { FUNCTION_MAP_DELEGATOR& rFuncMap = m_FuncMaps[serverType]; if( rFuncMap != NULL ) { WORD wCP = MAKEWORD(pMsg->m_byCategory, pMsg->m_byProtocol); FUNC_GENERIC_DELEGATOR fnINFO = (FUNC_GENERIC*)rFuncMap->Find( wCP ); if( CanDoProcess( fnINFO ) ) { fnINFO->m_fnHandler( pSession, (MSG_BASE*)pMsg, wSize ); return TRUE; } } } MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, _T("%s Handler Null, Invalid Type, UnAuthorized [C:P=%03d:%03d]"), GetServerType2String(serverType), pMsg->m_byCategory, pMsg->m_byProtocol ); return FALSE; } // // Session °ü·Ã // VOID Services4Session::RegisterPacketHandler() { m_pPacketHandler = &s_pPacketHandler; }