#include "stdafx.h" #include #include #include "PacketHandler.h" #include "HandlerFromMasterServer.h" #include "Sessions/MasterServerSession.h" #include #include #include #include #include #include // WorkLoad Handlers #include "HandlerFromMasterServer.WorkLoad.hxx" #define SM_HANDLER_INFO_EOR() { MAKEWORD(0, 0), PHASE_NOACTION, (PH_fnHandler)NULL } #define SM_HANDLER_INFO( c, p, accptablePHASE ) \ { MAKEWORD(c, p), accptablePHASE, (PH_fnHandler)&HandlerFromMasterServer::On##p } sPACKET_HANDLER_INFO* HandlerFromMasterServer::GetHandlerInfo() { static sPACKET_HANDLER_INFO s_pHandlerInfo[] = { // SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_HEARTBEAT, (ePHASE_SHIFT)(PHASE_UNKNOWN|PHASE_SERVICE)), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_CONNECTION_SYN, PHASE_UNKNOWN ), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_CONNECTION_ACK, PHASE_UNKNOWN ), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_CONNECTION_NAK, PHASE_UNKNOWN ), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_DISCONNECT_CMD, PHASE_UNLIMITED), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_PHASE_SHIFT_CMD, PHASE_UNLIMITED), //SM_HANDLER_INFO(SM_CONNECTION, SM_CONNECTION_BLOCK_CMD, PHASE_UNLIMITED), // SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_DESTINATION_KEY_SYN, PHASE_EXCHANGE ), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_DESTINATION_KEY_ACK, PHASE_EXCHANGE ), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_DESTINATION_KEY_NAK, PHASE_EXCHANGE ), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_QUERY_SYN, PHASE_SERVICE), //SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_QUERY_ACK, PHASE_SERVICE), //SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_QUERY_CMD, PHASE_SERVICE), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_QUERY_NAK, PHASE_SERVICE), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_AUTHENTICATION_SYN, PHASE_SERVICE ), //SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_AUTHENTICATION_ACK, PHASE_SERVICE ), //SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_AUTHENTICATION_NAK, PHASE_SERVICE ), SM_HANDLER_INFO(SM_SERVER_INFO, SM_SERVER_INFO_CACHEITEM_REPORT_NTF, PHASE_SERVICE ), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_KEY, PHASE_EXCHANGE ), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_ACK, PHASE_EXCHANGE ), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_NAK, PHASE_EXCHANGE ), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_CMD, PHASE_EXCHANGE ), SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_PACKET_ENCODED, PHASE_SERVICE), SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_PACKET_ENCODING, PHASE_SERVICE), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_SNK_KEY, PHASE_SERVICE), //SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_SNK_CMD, PHASE_SERVICE), SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_SNK_ACK, PHASE_SERVICE), SM_HANDLER_INFO(SM_CRYPTOGRAPHY, SM_CRYPTOGRAPHY_SNK_NAK, PHASE_SERVICE), // SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN, PHASE_SERVICE), //SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK, PHASE_SERVICE), //SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK, PHASE_SERVICE), //SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_SENDDATA_CMD, PHASE_SERVICE), SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_SENDDATA_ACK, PHASE_SERVICE), SM_HANDLER_INFO(SM_DATA_TRANSFER, SM_DATA_TRANSFER_SENDDATA_NAK, PHASE_SERVICE), SM_HANDLER_INFO_EOR(), }; return s_pHandlerInfo; } VOID HandlerFromMasterServer::RegisterHandler_ALL( PACKET_HANDLER_DELEGATOR pInstance ) { //BOOL bResult = pInstance->RegisterHandler_( GetHandlerInfo() ); // } HandlerFromMasterServer_IMPL( SM_CONNECTION_HEARTBEAT ) { __TOUCHED((pServerSession, pMsg, wSize)); } // //HandlerFromMasterServer_IMPL( SM_CONNECTION_CONNECTION_SYN ) //HandlerFromMasterServer_IMPL( SM_CONNECTION_CONNECTION_ACK ) //HandlerFromMasterServer_IMPL( SM_CONNECTION_CONNECTION_NAK ) //HandlerFromMasterServer_IMPL( SM_CONNECTION_DISCONNECT_CMD ) //HandlerFromMasterServer_IMPL( SM_CONNECTION_PHASE_SHIFT_CMD ) //HandlerFromMasterServer_IMPL( SM_CONNECTION_BLOCK_CMD ) // HandlerFromMasterServer_IMPL( SM_SERVER_INFO_DESTINATION_KEY_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); } HandlerFromMasterServer_IMPL( SM_SERVER_INFO_DESTINATION_KEY_ACK ) { __TOUCHED((pServerSession, pMsg, wSize)); } HandlerFromMasterServer_IMPL( SM_SERVER_INFO_DESTINATION_KEY_NAK ) { __TOUCHED((pServerSession, pMsg, wSize)); } HandlerFromMasterServer_IMPL( SM_SERVER_INFO_QUERY_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); // ¸¶½ºÅͺ° ¼­¹öÁ¤º¸ ¸ñ·ÏÀº ÀÌ¹Ì ·ÎµùÇÑ »óŰ¡ ÀüÁ¦µÈ´Ù. // ¼­¹ö ÀÎÁõ°ü·Ã ¸ÅÅ©·Î°¡ Àû¿ëµÇÁö ¾ÊÀº »óÅ¿¡¼­´Â ±âÁ¸ ·çƾ¿¡ Ãß°¡µÈ flow°¡ Ãß°¡µÈ °ÍÀ¸·Î ó¸®Ç϶ó. #ifdef __WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ SolarAcceptableMasterServerListLoaderDelegator& rMasterInfoManager = ScriptLoadManager::Instance()->SolarAcceptableMasterServerListLoaderHandle; ACCEPTABLE_MASTER_SERVER_INFO_DELEGATOR& rINFO = rMasterInfoManager->GetMasterServerByIP( pServerSession->GetIPAddress() ); ServerTreeINFO* pTREE = rINFO->GetServerTree(); MSG_SM_SERVER_INFO_QUERY_ACK* pMsgACK = NULL; if( !pTREE ) { MessageOut( eCRITICAL_LOG, _T("ÇØ´ç ¸¶½ºÅÍ ¼­¹ö {%s}¿¡ ¼­¹ö ¸ñ·ÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."), pServerSession->GetIP() ); return; } if( pTREE ) { DWORD rdwUpper; PSERVER_INFO_GENERIC pINFOs = pTREE->GetServerArrayList( rdwUpper ); PSERVER_INFO_GENERIC pINFO = pINFOs; DWORD dwIdx = 0; while( dwIdx < rdwUpper ) { DWORD dwCount = 0; pMsgACK = new (PACKET_CONTROL_SM::GetBasePacketPtr4Send()) MSG_SM_SERVER_INFO_QUERY_ACK; sSERVER_INFO_GENERIC* pServerINFO = pMsgACK->m_ServerInfos; for( ; dwIdxm_ServerType == UNKNOWN_SERVER ) continue; *pServerINFO = *pINFO; ++dwCount; ++pServerINFO; if( MSG_SM_SERVER_INFO_QUERY_ACK::_MAX_SERVERINFO_ARRAY_COUNT == dwCount ) { ++dwIdx; ++pINFO; break; } } if( dwCount ) { pMsgACK->m_wCounts = (WORD)dwCount; pServerSession->SendPacket( pMsgACK, pMsgACK->GetSize() ); dwCount = 0; } } MSG_SM_SERVER_INFO_QUERY_CMD pMsgCMD[1]; pServerSession->SendPacket( pMsgCMD, sizeof(MSG_SM_SERVER_INFO_QUERY_CMD) ); MSG_SM_CONNECTION_PHASE_SHIFT_CMD pMsgCMD_SHIFT[1]; pMsgCMD_SHIFT->m_dwPHASE_SHIFT = (DWORD)PHASE_SERVICE; pServerSession->SendPacket( pMsgCMD_SHIFT, sizeof(MSG_SM_CONNECTION_PHASE_SHIFT_CMD) ); printf( "SEND {MSG_SM_CONNECTION_PHASE_SHIFT_CMD} EXCHANGE->SERVICE\n" ); } #else //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ #endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ } //HandlerFromMasterServer_IMPL( SM_SERVER_INFO_QUERY_ACK ) //HandlerFromMasterServer_IMPL( SM_SERVER_INFO_QUERY_CMD ) HandlerFromMasterServer_IMPL( SM_SERVER_INFO_QUERY_NAK ) { __TOUCHED((pServerSession, pMsg, wSize)); // ¼­¹ö ÀÎÁõ°ü·Ã ¸ÅÅ©·Î°¡ Àû¿ëµÇÁö ¾ÊÀº »óÅ¿¡¼­´Â ±âÁ¸ ·çƾ¿¡ Ãß°¡µÈ flow°¡ Ãß°¡µÈ °ÍÀ¸·Î ó¸®Ç϶ó. #ifdef __WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ #else //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ #endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ } HandlerFromMasterServer_IMPL(SM_SERVER_INFO_AUTHENTICATION_SYN) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_SM_SERVER_INFO_AUTHENTICATION_SYN* pMsgSYN = (MSG_SM_SERVER_INFO_AUTHENTICATION_SYN*)pMsg; #ifdef __WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ SolarAcceptableMasterServerListLoaderDelegator& rMasterInfoManager = ScriptLoadManager::Instance()->SolarAcceptableMasterServerListLoaderHandle; ACCEPTABLE_MASTER_SERVER_INFO_DELEGATOR& rINFO = rMasterInfoManager->GetMasterServerByIP( pServerSession->GetIPAddress() ); ServerTreeINFO* pTREE = rINFO->GetServerTree(); if( !pTREE ) { MessageOut( eCRITICAL_LOG, _T("ÇØ´ç ¸¶½ºÅÍ ¼­¹ö {%s}¿¡ ¼­¹ö ¸ñ·ÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."), pServerSession->GetIP() ); return; } SERVER_KEY skKey = pMsgSYN->m_ServerKey; if( sSERVER_INFO_GENERIC* pSERVER_INFO = pTREE->FindServer( skKey ) ) { if( pSERVER_INFO ) { MSG_SM_SERVER_INFO_AUTHENTICATION_ACK pMsgACK[1]; pMsgACK->m_dwInnerIP = pMsgSYN->m_dwInnerIP; pMsgACK->m_ServerInfo = *pSERVER_INFO; pServerSession->SendPacket( pMsgACK, sizeof(MSG_SM_SERVER_INFO_AUTHENTICATION_ACK) ); CHAR strIP[2][MAX_IP_STRING_LEN+1]; CHAR* pIP = IPOperation::ConvertDWORD2StrIP(pSERVER_INFO->m_dwMasterIP); memcpy( strIP[0], pIP, MAX_IP_STRING_LEN ); strIP[0][MAX_IP_STRING_LEN] = '\0'; pIP = IPOperation::ConvertDWORD2StrIP(pSERVER_INFO->m_dwInnerIP); memcpy( strIP[1], pIP, MAX_IP_STRING_LEN ); strIP[1][MAX_IP_STRING_LEN] = '\0'; SERVER_KEY& rKey = pSERVER_INFO->m_ServerKey; MessageOut( eCRITICAL_LOG, _T("¼­¹ö ÀÎÁõ MasterIP {%s}\tÀÎÁõµÈ ¼­¹ö {%s}-[%02u][%02u][%s][%02u]"), strIP[0], strIP[1], rKey.GetWorldID(), rKey.GetChannelID(), GetServerType2String( pSERVER_INFO->m_ServerType ), rKey.GetServerID() ); return; } } MessageOut( eCRITICAL_LOG, _T("ÇØ´ç ¸¶½ºÅÍ ¼­¹ö {%s}¿¡ ÀÎÁõ ¿äûÇÑ ¼­¹ö Á¤º¸[%02u:%02u:%02u:%02u]°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."), pServerSession->GetIP(), skKey.GetWorldID(), skKey.GetChannelID(), skKey.GetServerType(), skKey.GetServerID() ); return; #endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ } //HandlerFromMasterServer_IMPL(SM_SERVER_INFO_AUTHENTICATION_ACK) //HandlerFromMasterServer_IMPL(SM_SERVER_INFO_AUTHENTICATION_NAK) // //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_KEY ) //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_ACK ) //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_NAK ) //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_CMD ) HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_PACKET_ENCODED ) { __TOUCHED((pServerSession, pMsg, wSize)); } HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_PACKET_ENCODING ) { __TOUCHED((pServerSession, pMsg, wSize)); } //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_SNK_KEY ) //HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_SNK_CMD ) HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_SNK_ACK ) { __TOUCHED((pServerSession, pMsg, wSize)); } HandlerFromMasterServer_IMPL( SM_CRYPTOGRAPHY_SNK_NAK ) { __TOUCHED((pServerSession, pMsg, wSize)); } // HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_SM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN* pMsgSYN = (MSG_SM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN*)pMsg; ScriptLoadManager* pLoadManager = ScriptLoadManager::Instance(); eSCRIPT_CODE scriptCode = (eSCRIPT_CODE)pMsgSYN->m_wDataType; if( !(SCRIPT_CONTROL_FLAG_UPPERBOUNDARY > scriptCode) ) { SCRIPT_RECORD_INFO_DELEGATOR& rRecord = pLoadManager->ScriptListLoaderHandle->GetScriptInfo( scriptCode ); if( rRecord != NULL ) { MSG_SM_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK msgACK; pServerSession->SendPacket( &msgACK, sizeof(msgACK) ); PROCESS_SM_DATA_TRANSFER_SENDDATA_CMD* pWorkCMD = new PROCESS_SM_DATA_TRANSFER_SENDDATA_CMD(); SCRIPT_DATA_STREAM_DELEGATOR rSTREAM_INFO = ScriptLoadManager::GetScriptDataByIP( pServerSession->GetIPAddress(), scriptCode ); // (WAVERIX) (0807XX) (BUG-FIX) WorkKeyÀÇ Áߺ¹ °¡´É¼º ³·Ãß±â À§ÇÑ ¹ö±× ¼öÁ¤ const DWORD ipaddress = pServerSession->GetIPAddress(); const WORK_KEY regWorkKey = (WORD)( ( (LOBYTE(LOWORD(ipaddress))+HIBYTE(LOWORD(ipaddress))) << 8 ) + ( (LOBYTE(HIWORD(ipaddress))+HIBYTE(HIWORD(ipaddress))) << 4 ) + scriptCode); Services4Session& rServices = pServerSession->Services(); if(rSTREAM_INFO != NULL && WorkLoadManager::c_NotExistKey == rServices.GetWorkLoadContainer().FindWorkKey( regWorkKey ) ) { pWorkCMD->SetServerSession( pServerSession ); pWorkCMD->SetInformation( rSTREAM_INFO->m_pDataStream, rSTREAM_INFO->m_CompressSize,rSTREAM_INFO->m_dwFileSize, 0, (WORD)scriptCode ); WORK_KEY workKey = WorkLoadManager::RegisterTask( pWorkCMD, TRUE, regWorkKey ); if( WorkLoadManager::c_NotExistKey != workKey ) { rServices.GetWorkLoadContainer().RegisterWork( workKey, (DWORD)(__int64)pWorkCMD ); MessageOut( eCRITICAL_LOG, _T("[%-16s] DATA_SYN(%u) -> ACCEPT -> SEND PROC"), pServerSession->GetIP(), scriptCode ); return; } } SAFE_DELETE( pWorkCMD ); } MessageOut( eCRITICAL_LOG, _T("[%-16s] DATA_SYN(%u) -> REJECT -> Already SendWorking or Can't Find Script"), pServerSession->GetIP(), scriptCode ); } else if( SCRIPT_NOTIFY_SIGNAL == scriptCode ) { // NOTIFY_SIGNAL MSG_SM_DATA_TRANSFER_SENDDATA_CMD* pMsgCMD = new ( PACKET_CONTROL_SM::GetBasePacketPtr4Send() ) MSG_SM_DATA_TRANSFER_SENDDATA_CMD(); pMsgCMD->m_wControlCmd = MSG_SM_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_HEADER; pMsgCMD->m_FILE_INFO.m_wDataType = SCRIPT_NOTIFY_SIGNAL; pMsgCMD->m_FILE_INFO.m_dwBufferSize = 4; pMsgCMD->m_FILE_INFO.m_dwCRC = 0; pServerSession->SendPacket( pMsgCMD, pMsgCMD->GetSize() ); new ( PACKET_CONTROL_SM::GetBasePacketPtr4Send() ) MSG_SM_DATA_TRANSFER_SENDDATA_CMD(); pMsgCMD->m_wControlCmd = MSG_SM_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_DATA; pMsgCMD->m_TOKEN_INFO.m_Header.m_wDataType = SCRIPT_NOTIFY_SIGNAL; pMsgCMD->m_TOKEN_INFO.m_Header.m_wBufferSize = 4; pMsgCMD->m_TOKEN_INFO.m_Header.m_wTokenNo = 0; pMsgCMD->m_TOKEN_INFO.m_pSTREAM[0] = '0'; pMsgCMD->m_TOKEN_INFO.m_pSTREAM[1] = '0'; pMsgCMD->m_TOKEN_INFO.m_pSTREAM[2] = '0'; pMsgCMD->m_TOKEN_INFO.m_pSTREAM[3] = '\0'; pServerSession->SendPacket( pMsgCMD, pMsgCMD->GetSize() ); new ( PACKET_CONTROL_SM::GetBasePacketPtr4Send() ) MSG_SM_DATA_TRANSFER_SENDDATA_CMD(); pMsgCMD->m_wControlCmd = MSG_SM_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_CLOSURE; pMsgCMD->m_FILE_CLOSURE.m_wDataType = SCRIPT_NOTIFY_SIGNAL; pMsgCMD->m_FILE_CLOSURE.m_dwCRC = 0; pServerSession->SendPacket( pMsgCMD, pMsgCMD->GetSize() ); MessageOut( eCRITICAL_LOG, _T("[%-16s] NTF_SYN(%u) -> ACCEPT -> RAISE NEXT PROCESS"), pServerSession->GetIP(), scriptCode ); return; } MSG_SM_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK msgNAK; pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) ); return; //MSG_SM_DATA_TRANSFER_SENDDATA_CMD msgCMD; //pServerSession->SendPacket( &msgCMD, sizeof(msgCMD) ); //printf( "SEND {SM_DATA_TRANSFER_SENDDATA_CMD}\n" ); } //HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK ) //HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK ) //HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_SENDDATA_CMD ) HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_SENDDATA_ACK ) { __TOUCHED((pServerSession, pMsg, wSize)); printf( "RECEIVED {SM_DATA_TRANSFER_SENDDATA_ACK}\n" ); } HandlerFromMasterServer_IMPL( SM_DATA_TRANSFER_SENDDATA_NAK ) { __TOUCHED((pServerSession, pMsg, wSize)); printf( "RECEIVED {SM_DATA_TRANSFER_SENDDATA_ACK}\n" ); } HandlerFromMasterServer_IMPL( SM_SERVER_INFO_CACHEITEM_REPORT_NTF ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_SM_SERVER_INFO_CACHEITEM_REPORT_NTF* pNTF = (MSG_SM_SERVER_INFO_CACHEITEM_REPORT_NTF*)pMsg; if( sizeof(*pNTF) != (SIZE_T)wSize ) { MessageOut( eCRITICAL_LOG, _T("INVALID REPORT INFO") ); return; } //INFO.dwPriceGuid, //rINFO.wItemCode, //rINFO.wCategoryID, //rINFO.dwPrice sCACHEITEM_REPORT_INFO_MINORVER& rINFO = pNTF->m_INFO; sSIG_REPORTFROMMASTERS SIG; //SIG.MasterIP() = this->GetMaster SIG.SessionRef() = pServerSession; memset( &SIG.INFO(), 0, sizeof(SIG.INFO()) ); SIG.INFO().dwPriceGuid = rINFO.dwPriceGuid; SIG.INFO().wItemCode = rINFO.wItemCode; SIG.INFO().byCategoryID = rINFO.byCategoryID; SIG.INFO().dwPrice = rINFO.dwPrice; WORK_KEY wkKEY = SolarAuthServer::GetMainFrame()->GetReportWorkKey(); WorkLoadManager::OnMsg( &SIG, wkKEY ); //MessageOut( eCRITICAL_LOG, _T( "Received CacheItem Purchase Info" ) ); }