2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "ServiceServer.h"
|
|
|
|
|
|
#include "ServiceManager.h"
|
|
|
|
|
|
#include "DNConfig.h"
|
|
|
|
|
|
#include "Log.h"
|
|
|
|
|
|
#include "IniFile.h"
|
|
|
|
|
|
#include "StringUtil.h"
|
|
|
|
|
|
#include "SpinBuffer.h"
|
|
|
|
|
|
#include "csvreader.h"
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
#include "ServiceManagerEx.h"
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_KRAZ)
|
|
|
|
|
|
#include "DNActozShield.h"
|
|
|
|
|
|
#endif // #if defined(_KRAZ)
|
|
|
|
|
|
|
|
|
|
|
|
extern CLog g_ExceptionReportLog;
|
|
|
|
|
|
extern CLog s_ExcuteLog;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _SERVICEMANAGER_EX )
|
|
|
|
|
|
extern CLog g_FileLog;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
static TCHAR * pOffLine = { _T("Offline") };
|
|
|
|
|
|
static TCHAR * pOnline = { _T("Online") };
|
|
|
|
|
|
static TCHAR * pCreate = { _T("Create") };
|
|
|
|
|
|
static TCHAR * pTerminated = { _T("Terminated") };
|
|
|
|
|
|
|
|
|
|
|
|
static TCHAR * pBlack = { _T("Black") };
|
|
|
|
|
|
static TCHAR * pGreen = { _T("Green") };
|
|
|
|
|
|
static TCHAR * pYellow = { _T("Yellow") };
|
|
|
|
|
|
static TCHAR * pRed = { _T("Red") };
|
|
|
|
|
|
static TCHAR * pDefault = { _T("Default") };
|
|
|
|
|
|
|
|
|
|
|
|
const TCHAR * ConvertState(int nState)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (nState)
|
|
|
|
|
|
{
|
|
|
|
|
|
case _SERVICE_STATE_OFFLINE: return pOffLine;
|
|
|
|
|
|
case _SERVICE_STATE_CREATE: return pCreate;
|
|
|
|
|
|
case _SERVICE_STATE_ONLINE: return pOnline;
|
|
|
|
|
|
case _SERVICE_STATE_TERMINATED: return pTerminated;
|
|
|
|
|
|
|
|
|
|
|
|
default: return pDefault;
|
|
|
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
extern TServiceManagerConfig g_Config;
|
|
|
|
|
|
CServiceManager * g_pServiceManager = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
CServiceManager::CServiceManager(CServiceManagerExApp* pApp)
|
|
|
|
|
|
: m_pApp(pApp)
|
|
|
|
|
|
#else
|
|
|
|
|
|
CServiceManager::CServiceManager()
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
{
|
|
|
|
|
|
memset(m_szProcess, 0, sizeof(m_szProcess));
|
|
|
|
|
|
m_UrlUpdater.UpdaterInit(g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->LoadUser() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"MonitorUser.xml LoadFail\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->LoadStruct() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[CServiceManager] CDataManager::GetInstance()->LoadStruct() == false");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <int> vSIDList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetCommandList(&vSIDList);
|
|
|
|
|
|
for (int i = 0; i < (int)vSIDList.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand(vSIDList[i]);
|
|
|
|
|
|
if (MakeServiceList(pExe->nSID, pExe->nAssignedLauncherID, pExe->wszType) == false)
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[CServiceManager] MakeServiceList(pExe->nSID, pExe->nAssignedLauncherID, pExe->wszType) == false");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MakeWorldList();
|
|
|
|
|
|
|
|
|
|
|
|
char szNotice[256];
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, g_Config.wszNoticePath, -1, szNotice, 256, NULL, NULL);
|
|
|
|
|
|
if (_access(szNotice, 0) != -1)
|
|
|
|
|
|
m_ReservedNotice.LoadNotice(szNotice);
|
|
|
|
|
|
|
|
|
|
|
|
std::string strCmd;
|
|
|
|
|
|
strCmd = g_Config.szVersion;
|
|
|
|
|
|
ToLowerA(strCmd);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> tokens;
|
|
|
|
|
|
TokenizeA(strCmd, tokens, ".");
|
|
|
|
|
|
|
|
|
|
|
|
m_nMajorVersion = atoi(tokens[0].c_str());
|
|
|
|
|
|
m_nMinorVersion = atoi(tokens[1].c_str());
|
|
|
|
|
|
|
|
|
|
|
|
m_nPatchID = 0;
|
|
|
|
|
|
m_nContainerVersion = 0;
|
|
|
|
|
|
m_bCloseService = false;
|
|
|
|
|
|
m_nTerminateDBTick = 0;
|
|
|
|
|
|
|
|
|
|
|
|
m_bHttpSendFail = false;
|
|
|
|
|
|
m_nHttpFailTick = 0;
|
|
|
|
|
|
m_pStoredPacketBuffer = new (std::nothrow) CRawSpinBuffer( 1, 1024*1024*10 );
|
|
|
|
|
|
m_nRunBatchID = 0;
|
|
|
|
|
|
m_nStopBatchID = 0;
|
|
|
|
|
|
|
|
|
|
|
|
m_CmdTable.lpFarmUpdate = CServiceManager::UpdateFarm;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<SERVERTYPE_MAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_nLastMonitorReportedTick[i] = 0;
|
|
|
|
|
|
m_vServerDelayMIDs[i].clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_KRAZ)
|
|
|
|
|
|
g_pActozShield = new CDNActozShield;
|
|
|
|
|
|
if (g_pActozShield)
|
|
|
|
|
|
g_pActozShield->Init();
|
|
|
|
|
|
#endif // #if defined(_KRAZ)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CServiceManager::~CServiceManager()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
for (std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii).second);
|
|
|
|
|
|
m_LauncherSessionList.clear();
|
|
|
|
|
|
|
|
|
|
|
|
for (std::map <UINT, CServiceSession*>::iterator ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii).second);
|
|
|
|
|
|
m_ServiceSessionList.clear();
|
|
|
|
|
|
|
|
|
|
|
|
for (std::map <int, sServiceState*>::iterator ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii).second);
|
|
|
|
|
|
m_ServiceList.clear();
|
|
|
|
|
|
|
|
|
|
|
|
for (std::vector <CPatcherSession*>::iterator ii = m_vPatcherSessionList.begin(); ii != m_vPatcherSessionList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii));
|
|
|
|
|
|
m_vPatcherSessionList.clear();
|
|
|
|
|
|
m_PatcherSessionList.clear();
|
|
|
|
|
|
delete m_pStoredPacketBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_KRAZ)
|
|
|
|
|
|
SAFE_DELETE(g_pActozShield);
|
|
|
|
|
|
#endif // #if defined(_KRAZ)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::MakeRandomException()
|
|
|
|
|
|
{
|
|
|
|
|
|
return;//rlkt_test
|
|
|
|
|
|
|
|
|
|
|
|
switch (rand()%4)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendExceptionReport(1004, _EXCEPTIONTYPE_ROOMCRASH, NULL);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendExceptionReport(1004, _EXCEPTIONTYPE_SESSIONCRASH, NULL);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendExceptionReport(1004, _EXCEPTIONTYPE_ROOMDESTRUCTOR, NULL);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendExceptionReport(1000, _EXCEPTIONTYPE_DBMW_DELAYED, "DataBase MiddleWare Delayed Over 60Second");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::IdleProcess()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_ServiceCloser.IdleProcess())
|
|
|
|
|
|
{
|
|
|
|
|
|
TerminateServiceAll();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_ReservedNotice.IdleProcess();
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
ULONG nCurTick = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
static int nCount = 0;
|
|
|
|
|
|
if (nCount%12 == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ServiceItor;
|
|
|
|
|
|
for (ServiceItor = m_ServiceList.begin(); ServiceItor != m_ServiceList.end(); ServiceItor++)
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,%s"), (*ServiceItor).second->nSID, ConvertState((*ServiceItor).second->nState));
|
|
|
|
|
|
}
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ServiceItor;
|
|
|
|
|
|
for (ServiceItor = m_ServiceList.begin(); ServiceItor != m_ServiceList.end(); ServiceItor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ServiceItor).second->nState == _SERVICE_STATE_CREATE)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ServiceItor).second->nCreateTime > 0 && (*ServiceItor).second->nCreateTime + (5 * 60 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii2;
|
|
|
|
|
|
for (ii2 = m_ServiceSessionList.begin(); ii2 != m_ServiceSessionList.end(); ii2++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ServiceItor).first == (*ii2).second->GetMID())
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii2).second->DetachConnection(L"CreateOverTime");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <int> vList;
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator sessionitor;
|
|
|
|
|
|
for (sessionitor = m_ServiceSessionList.begin(); sessionitor != m_ServiceSessionList.end(); sessionitor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*sessionitor).second->IsCompleteConnected(nCurTick) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*sessionitor).second->DetachConnection(L"IncompleteConnect");
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (sessionitor = m_ServiceSessionList.begin(); sessionitor != m_ServiceSessionList.end(); sessionitor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*sessionitor).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nServiceRet = (*sessionitor).second->IdleProcess(nCurTick);
|
|
|
|
|
|
if (nServiceRet != SERVICEPROCESS_NONE)
|
|
|
|
|
|
{
|
|
|
|
|
|
vList.push_back((*sessionitor).second->GetMID());
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"VillageServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
g_ExceptionReportLog.Log(LogType::_FILELOG, L"VillageServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ((*sessionitor).second->GetType() == MANAGED_TYPE_GAME)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nServiceRet = (*sessionitor).second->IdleProcess(nCurTick);
|
|
|
|
|
|
if (nServiceRet == SERVICEPROCESS_NONE)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (nServiceRet == SERVICEPROCESS_FAULTSAFE)
|
|
|
|
|
|
{
|
|
|
|
|
|
vList.push_back((*sessionitor).second->GetMID());
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"GameServer FaultSafe SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ((*sessionitor).second->GetLastReportTime() > 0 && (*sessionitor).second->GetLastReportTime() + (120 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*sessionitor).second->GetLastDelayedTime() <= 0 || (*sessionitor).second->GetLastDelayedTime() + (120 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*sessionitor).second->SetLastDelayedTime(timeGetTime());
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"GameServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
g_ExceptionReportLog.Log(LogType::_FILELOG, L"GameServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((*sessionitor).second->GetLastReportTime() + (3 * 60 * 1000) < nCurTick)
|
|
|
|
|
|
vList.push_back((*sessionitor).second->GetMID());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ((*sessionitor).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*sessionitor).second->IdleProcess(nCurTick);
|
|
|
|
|
|
if ((*sessionitor).second->GetLastReportTime() > 0 && (*sessionitor).second->GetLastReportTime() + (120 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LoginServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
g_ExceptionReportLog.Log(LogType::_FILELOG, L"LoginServer Report Delayed Over120 Second SID[%d]\n", (*sessionitor).second->GetMID());
|
|
|
|
|
|
|
|
|
|
|
|
(*sessionitor).second->SetLastDelayedTime(timeGetTime());
|
|
|
|
|
|
if ((*sessionitor).second->GetLastDelayedTime() <= 0)
|
|
|
|
|
|
MakeDumEach((*sessionitor).second->GetMID());
|
|
|
|
|
|
|
|
|
|
|
|
else if ((*sessionitor).second->GetLastDelayedTime() + (2 * 60 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
vList.push_back((*sessionitor).second->GetMID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vList.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bterminateFalg = TerminateServiceEachForceAsync(vList[i]);
|
|
|
|
|
|
if (bterminateFalg == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Already Req Terminate [SID%d]\n", vList[i]);
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator sitor;
|
|
|
|
|
|
for (sitor = m_ServiceSessionList.begin(); sitor != m_ServiceSessionList.end(); sitor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*sitor).second->GetMID() == vList[i])
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Detach Connection [SID%d]\n", (*sitor).second->GetMID());
|
|
|
|
|
|
(*sitor).second->DetachConnection(L"TerminateForce FaultSafe");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_CloseServieList.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <_CLOSESERVICE>::iterator ii;
|
|
|
|
|
|
for (ii = m_CloseServieList.begin(); ii != m_CloseServieList.end(); )
|
|
|
|
|
|
{
|
|
|
|
|
|
_CLOSESERVICE close = (*ii);
|
|
|
|
|
|
if ((close.nTerminateTick > 0 && close.nTerminateTick + (_CLOSE_REPORTED_SERVICE_WAITING_TIME) < nCurTick) ||
|
|
|
|
|
|
(close.nInsertTick + (_CLOSE_SERVICE_WAITING_TIME) < nCurTick))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ih = m_ServiceList.find(close.nMID);
|
|
|
|
|
|
if (ih != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
sServiceState * pService = (*ih).second;
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ij = m_LauncherSessionList.find(pService->nManagedLauncherID);
|
|
|
|
|
|
if (ij != m_LauncherSessionList.end())
|
|
|
|
|
|
(*ij).second->SendTerminateProcess(pService->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
ii = m_CloseServieList.erase(ii);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_CloseServieList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"AllService Close After Terminate Process OK\n");
|
|
|
|
|
|
if (m_bCloseService)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process After DBServerClose Start\n");
|
|
|
|
|
|
m_bCloseService = false;
|
|
|
|
|
|
if (m_nTerminateDBTick <= 0)
|
|
|
|
|
|
m_nTerminateDBTick = timeGetTime() + 10 * 1000;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_nTerminateDBTick > 0 && m_nTerminateDBTick > nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
TerminateServiceDB(NULL, true);
|
|
|
|
|
|
m_nTerminateDBTick = 0;
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process After DBServerClose End\n");
|
|
|
|
|
|
SendPacketToGsm(_T("msg=ServiceClose"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator netItor;
|
|
|
|
|
|
for (netItor = m_LauncherSessionList.begin(); netItor != m_LauncherSessionList.end(); netItor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*netItor).second->GetPingTick() <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*netItor).second->GetCreateTick() + (60 * 1000) < nCurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
StopEachLauncherAsync((*netItor).second->GetSessionID());
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ULONG nGap = 0;
|
|
|
|
|
|
if (nCurTick > (*netItor).second->GetPingTick())
|
|
|
|
|
|
nGap = nCurTick - (*netItor).second->GetPingTick();
|
|
|
|
|
|
else if (nCurTick < (*netItor).second->GetPingTick())
|
|
|
|
|
|
nGap = (*netItor).second->GetPingTick() - nCurTick;
|
|
|
|
|
|
|
|
|
|
|
|
if (nGap > (20 * 60 * 1000))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"PingDelay [GAP:%d][Cur:%d][Ping:%d]\n", nGap, nCurTick, (*netItor).second->GetPingTick());
|
|
|
|
|
|
(*netItor).second->DetachConnection(L"PingDelay");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, ULONG>::iterator testItor;
|
|
|
|
|
|
if (m_LaunchetTestList.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (testItor = m_LaunchetTestList.begin(); testItor != m_LaunchetTestList.end(); )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCurTick > (*testItor).second + (30 * 1000))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"NetLauncher ping return delayed [NID:%d]\n", (*testItor).first);
|
|
|
|
|
|
testItor = m_LaunchetTestList.erase(testItor);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
testItor++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int i=0; i<SERVERTYPE_MAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCurTick > m_nLastMonitorReportedTick[i] + 3000)
|
|
|
|
|
|
{
|
|
|
|
|
|
ReportToMonitorServerDelay(i);
|
|
|
|
|
|
m_nLastMonitorReportedTick[i] = nCurTick;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SyncTaskProcess()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeSpinBufferSwitch Scope( m_pStoredPacketBuffer );
|
|
|
|
|
|
|
|
|
|
|
|
char * pBuffer = Scope.pGetBuffer();
|
|
|
|
|
|
UINT uiSize = Scope.uiGetSize();
|
|
|
|
|
|
|
|
|
|
|
|
while(uiSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
_SYNCGSMTASK * pTask = (_SYNCGSMTASK*)pBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
if (m_HttpUpdater.QueryPost(g_Config.wszGSMIP, NULL, NULL, g_Config.wszGSMCodePage, pTask->szMsg, pTask->nSize - sizeof(short)) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bHttpSendFail = true;
|
|
|
|
|
|
m_nHttpFailTick = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"GSM Send Error %S\n", pTask->szMsg);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uiSize -= pTask->nSize;
|
|
|
|
|
|
pBuffer += pTask->nSize;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CLauncherSession * CServiceManager::AddLauncherSession(const char * pIP, unsigned short nPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
int nID = CDataManager::GetInstance()->VerifyNetLauncher(_inet_addr(pIP));
|
|
|
|
|
|
if (nID > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.find(nID) != m_LauncherSessionList.end())
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
CLauncherSession * pSession = new CLauncherSession();
|
|
|
|
|
|
pSession->SetSessionID(nID);
|
|
|
|
|
|
pSession->SetIp(pIP);
|
|
|
|
|
|
m_LauncherSessionList[nID] = pSession;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
g_FileLog.Log(LogType::_FILELOG, "Connected NetLauncher IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#else
|
|
|
|
|
|
printf("Connected NetLauncher IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
SendPacketToGsm(_T("msg=NInfo,%d,Online"), pSession->GetSessionID());
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->GetLauncherCount() == (int)m_LauncherSessionList.size())
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Launcher Connected\n");
|
|
|
|
|
|
|
|
|
|
|
|
return pSession;
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, "Connect Failed NetLauncher IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#else
|
|
|
|
|
|
printf("Connect Failed NetLauncher IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CServiceSession * CServiceManager::AddServiceSession(const char * pIP, unsigned short nPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
int nID = CDataManager::GetInstance()->VerifyNetLauncher(_inet_addr(pIP));
|
|
|
|
|
|
if (nID <= 0) //<2F><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>常 <20><EFBFBD><DEBD>ϴ<EFBFBD>.
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
CServiceSession * pSession = new CServiceSession;
|
|
|
|
|
|
if (pSession)
|
|
|
|
|
|
{
|
|
|
|
|
|
static int s_nID = 0;
|
|
|
|
|
|
_ASSERT(m_ServiceSessionList.find(s_nID) == m_ServiceSessionList.end());
|
|
|
|
|
|
pSession->SetSessionID(s_nID);
|
|
|
|
|
|
pSession->SetIp(pIP);
|
|
|
|
|
|
m_ServiceSessionList[s_nID] = pSession;
|
|
|
|
|
|
s_nID++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return pSession;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CPatcherSession * CServiceManager::AddPatcherSession(const char * pIP, unsigned short nPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (VerifyPatcher(pIP) == false) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
int nID = CDataManager::GetInstance()->VerifyNetLauncher(_inet_addr(pIP));
|
|
|
|
|
|
if (nID > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.find(nID) != m_PatcherSessionList.end())
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
CPatcherSession * pSession = new CPatcherSession;
|
|
|
|
|
|
if (!pSession) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SetSessionID(nID);
|
|
|
|
|
|
pSession->SetIp(pIP);
|
|
|
|
|
|
|
|
|
|
|
|
m_vPatcherSessionList.push_back(pSession);
|
|
|
|
|
|
pSession->SetPatcherServiceID(nID);
|
|
|
|
|
|
m_PatcherSessionList[nID] = pSession;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
g_FileLog.Log(LogType::_FILELOG, "Connect NetLauncherPatcher Service IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#else
|
|
|
|
|
|
printf("Connect NetLauncherPatcher Service IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->GetLauncherCount() == (int)m_PatcherSessionList.size())
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All ESM Connected\n");
|
|
|
|
|
|
return pSession;
|
|
|
|
|
|
}
|
|
|
|
|
|
//printf("Connect Failed UnManaged NetLauncherPatcher Service IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CMonitorSession * CServiceManager::AddMonitorSession(const char * pIP, unsigned short nPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
CMonitorSession * pSession = new CMonitorSession;
|
|
|
|
|
|
if (!pSession) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
static int nMonitorID = 1;
|
|
|
|
|
|
pSession->SetSessionID(nMonitorID++);
|
|
|
|
|
|
pSession->SetIp(pIP);
|
|
|
|
|
|
|
|
|
|
|
|
m_MonitorSessionList.push_back(pSession);
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, "Connect MonitorSession IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#else
|
|
|
|
|
|
printf("Connect MonitorSession IP[%s] Port[%d]\n", pIP, nPort);
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
return pSession;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::DelConnection(CConnection * pCon, eConnectionKey eConType)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
if (eConType == CONNECTIONKEY_LAUNCHER)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.find(pCon->GetSessionID());
|
|
|
|
|
|
if (ii != m_LauncherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
CLauncherSession * pSession = (*ii).second;
|
|
|
|
|
|
int nID = (*ii).second->GetSessionID();
|
|
|
|
|
|
//DeleteManagedService(nID);
|
|
|
|
|
|
m_LauncherSessionList.erase(ii);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher DisConnected NID:[%d] IP:[%S]\n", nID, pCon->GetIp());
|
|
|
|
|
|
m_PatchWatcher.DelWatchContent(nID);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.size() <=0)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Launcher Disconnet\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LivePatcher.IsStarted())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatchFailed\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (eConType == CONNECTIONKEY_SERVICEMANAGER)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii = m_ServiceSessionList.find(pCon->GetSessionID());
|
|
|
|
|
|
if (ii != m_ServiceSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
CServiceSession * pSession = (*ii).second;
|
|
|
|
|
|
int nSID = 0;
|
|
|
|
|
|
sServiceState * pState = GetServiceStateByServiceSession((*ii).second->GetSessionID());
|
|
|
|
|
|
if (pState)
|
|
|
|
|
|
{
|
|
|
|
|
|
pState->Init();
|
|
|
|
|
|
nSID = pState->nSID;
|
|
|
|
|
|
}
|
|
|
|
|
|
else //pState<74><65> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α׳<CEB1><D7B3><EFBFBD>
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[Session:%d, MID %d] DelConnection Failed\n", pSession->GetSessionID(), pSession->GetMID());
|
|
|
|
|
|
|
|
|
|
|
|
if (m_AutoRestartList.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <int>::iterator ir;
|
|
|
|
|
|
for (ir = m_AutoRestartList.begin(); ir != m_AutoRestartList.end(); )
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ir) == nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
StartServiceEachAsync(nSID);
|
|
|
|
|
|
ir = m_AutoRestartList.erase(ir);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
ir++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_ServiceSessionList.erase(ii);
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,Offline"), nSID);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LivePatcher.IsStarted())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatchFailed!!!!!!!!!!! Check Service!!!!!!\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_ServiceSessionList.empty())
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Service Closed\n");
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (eConType == CONNECTIONKEY_SERVICEPATCHER)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <CPatcherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_vPatcherSessionList.begin(); ii != m_vPatcherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pCon->GetSessionID() == (*ii)->GetSessionID())
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ih = m_PatcherSessionList.find((*ii)->GetPSID());
|
|
|
|
|
|
if (ih != m_PatcherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vPatcherSessionList.erase(ii);
|
|
|
|
|
|
m_PatcherSessionList.erase(ih);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (eConType == CONNECTIONKEY_SERVERMONITOR)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <CMonitorSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_MonitorSessionList.begin(); ii != m_MonitorSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pCon->GetSessionID() == (*ii)->GetSessionID())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_MonitorSessionList.erase(ii);
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"ServiceMonitor Disconnected IP:[%S]\n", pCon->GetIp());
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ParseCommand(const char* pCmd, char* pRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nRet = g_pServiceManager->Parse(pCmd, pRet);
|
|
|
|
|
|
if (nRet != 0)
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"%s", nRet == -1 ? L"Argument Insufficiency\n" : L"Unkown Message\n");
|
|
|
|
|
|
else if (strlen(pCmd) > 0)
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"ConsoleCmd [%S]\n", pCmd);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::Parse(const char * pCmd, char * pRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
WCHAR wszTemp[2048];
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, pCmd, -1, wszTemp, 2048);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring strCmd;
|
|
|
|
|
|
strCmd = wszTemp;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::wstring> wtokens;
|
|
|
|
|
|
TokenizeW(strCmd, wtokens, L"|");
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> tokens;
|
|
|
|
|
|
char szTemp[2048];
|
|
|
|
|
|
for (int i = 0; i < (int)wtokens.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, wtokens[i].c_str(), -1, szTemp, 2048, NULL, NULL);
|
|
|
|
|
|
std::string strTemp = szTemp;
|
|
|
|
|
|
tokens.push_back(strTemp);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (tokens.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!stricmp(tokens[0].c_str(), "makeselfdump"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (g_pServiceServer)
|
|
|
|
|
|
g_pServiceServer->StoreMiniDump();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "testgsm"))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wstrTemp;
|
|
|
|
|
|
ToWideString(tokens[1], wstrTemp);
|
|
|
|
|
|
|
|
|
|
|
|
g_pServiceManager->SendPacketToGsm(const_cast<TCHAR*>(wstrTemp.c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "reload"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ReLoadStruct())
|
|
|
|
|
|
SendUpdateNotice(SERVERMONITOR_UPDATENOTICE_SERVERINFO);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "reloaduser")) ReLoadUser();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "resetclose")) ResetCloseService();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "start")) StartServiceAll(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "starteach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
bool bForcePatch = false;
|
|
|
|
|
|
if (tokens.size() > 2)
|
|
|
|
|
|
bForcePatch = tokens[2] == "true" ? true : false;
|
|
|
|
|
|
StartServiceEach(atoi(tokens[1].c_str()), bForcePatch, pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "starteachbylauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
StartServiceEachbyLauncher(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopforce")) TerminateServiceForce(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopforceeach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
TerminateServiceEachForce(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopforceeachbylauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
TerminateServiceForceEachbyLauncher(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopall"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
TerminateServiceAll(pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
TerminateServiceAll(pRet, atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "cancelstop")) CancelTerminateProcess();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopdb")) TerminateServiceDB(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopeach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
TerminateServiceEach(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopeachbylauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
TerminateServiceEachbyLauncher(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchurl"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
PatchUpdateUrl(tokens[1].c_str(), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchstruct")) PatchStruct(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchinfo"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchInfo(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchInfo(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchsystem"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchSystem(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchSystem(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchconfig"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchConfig(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchConfig(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchexe"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchExe(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchExe(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchfull"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchFull(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchFull(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchapply")) PatchApply(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "infocopy"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
InfoCopy(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
InfoCopy(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patch"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
Patch(tokens[1].c_str(), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchdyncode")) PatchDyncode();
|
|
|
|
|
|
//<2F>۾<EFBFBD> <20><>ü<EFBFBD><C3BC> ext<78><74>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>߱<EFBFBD><DFB1><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>߿<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchcash")) PatchExt();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "cancelpatchcash")) CancelExtPatch();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "filelist"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
RecvFileList(tokens[1].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "notice"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 3)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeWorld(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), tokens[3].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "noticeall"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeWholeWorld(atoi(tokens[1].c_str()), tokens[2].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "noticechannel"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeChannel(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), atoi(tokens[3].c_str()), tokens[4].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "noticeserver"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeServer(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), atoi(tokens[3].c_str()), tokens[4].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "noticezone"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeZone(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), atoi(tokens[3].c_str()), tokens[4].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "cancelnotice"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
NoticeCancel(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "worldmaxuser"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 3)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
WorldMaxuserControl(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "channelcontrol"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
int nChannelPopulation = tokens.size() == 5 ? atoi(tokens[4].c_str()) : -1;
|
|
|
|
|
|
bool bIsOpen = !stricmp(tokens[3].c_str(), "true");
|
|
|
|
|
|
ChannelControl(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), bIsOpen, nChannelPopulation);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "populationcontrol"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 3)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
PopulationControl(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), tokens[3] == "true" ? true : false);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "affinitycontrol"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 3)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
GameAffinityControl(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), atoi(tokens[3].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "eventupdate")) EventUpdate();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "configupdate")) SimpleConfigUpdate();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "makedumpall")) MakeDumpAll();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "makedumpeach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
MakeDumEach(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "reservenotice"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
ReserveNoticeUpdate(tokens[1].c_str(), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "userban"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
UserBanbyCharacterName(tokens[1].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "userbanid"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
UserBanbyAccountDBID(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "restraint"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
UserRestraint(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "startlauncher")) StartLauncher(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stoplauncher")) StopLauncher(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "starteachlauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
StartEachLauncher(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopeachlauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
StopEachLauncher(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchlauncher")) PatchNetLauncher(pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchlaunchereach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
PatchNetLauncherEach(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "checkpatch")) CheckPatch();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "clearpatch")) Clearpatch();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "checklauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
CheckNetLauncher();
|
|
|
|
|
|
else
|
|
|
|
|
|
CheckNetLauncher(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "testlauncher"))
|
|
|
|
|
|
{
|
|
|
|
|
|
TestLauncher(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "checktestlauncher")) CheckTestLauncher();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "reloaddyncode")) ReloadDyncode();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "checkalivelauncher")) CheckAliveNetLauncher();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "selectjoin"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring szWStr;
|
|
|
|
|
|
ToWideString(tokens[3], szWStr);
|
|
|
|
|
|
|
|
|
|
|
|
SelectJoin(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), szWStr.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "clearselectjoin"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
ClearSelectJoin(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "updatesale")) UpdateSaleData();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchbatch"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
PatchBatch(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
PatchBatch(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "runbatch")) RunBatch(0, pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "runbatcheach"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() <= 1)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
RunBatch(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopbatch"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
StopBatch(0, pRet);
|
|
|
|
|
|
else
|
|
|
|
|
|
StopBatch(atoi(tokens[1].c_str()), pRet);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "checkbatch"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
CheckBatch();
|
|
|
|
|
|
else
|
|
|
|
|
|
CheckBatch(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "userbanfile"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
UpdateBanFile(tokens[1].c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "farmupdate"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pRet == NULL)
|
|
|
|
|
|
ReqUpdateFarm();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "farmupdated"))
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "farmstart"))
|
|
|
|
|
|
{
|
|
|
|
|
|
StartFarm();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "guildwarupdate"))
|
|
|
|
|
|
{
|
|
|
|
|
|
UpdateGuildWarSchedule();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "createdb"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
else
|
|
|
|
|
|
SendCreatEachDB(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "reloadguildwar"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() >= 2)
|
|
|
|
|
|
SendReloadGuildwar(atoi(tokens[1].c_str()));
|
|
|
|
|
|
else
|
|
|
|
|
|
SendReloadGuildwar(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "changelimitmax"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 3)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
SendChangeLimiteItemMax(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "refreshguildware"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
else
|
|
|
|
|
|
SendUpdateGuildWare(atoi(tokens[1].c_str()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "patchesm"))
|
|
|
|
|
|
PatchESM(0, pRet);
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "startesm"))
|
|
|
|
|
|
StartESM();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopesm"))
|
|
|
|
|
|
StopESM();
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "updateworldpvproom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
SendUpdateWorldPvPRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "creategambleroom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tokens.size() < 4)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
SendCreateGambleRoom(atoi(tokens[1].c_str()), atoi(tokens[2].c_str()), atoi(tokens[3].c_str()), atoi(tokens[4].c_str()) );
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "stopgambleroom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
SendStopGambleRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "delgambleroom"))
|
|
|
|
|
|
{
|
|
|
|
|
|
SendDelGambleRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!stricmp(tokens[0].c_str(), "updatedwcstatus"))
|
|
|
|
|
|
{
|
|
|
|
|
|
SendUpdateDWCStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReLoadStruct()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->LoadStruct() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"DataLoad Failed\n");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ClearList();
|
|
|
|
|
|
std::vector <int> vSIDList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetCommandList(&vSIDList);
|
|
|
|
|
|
for (int i = 0; i < (int)vSIDList.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand(vSIDList[i]);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
{
|
|
|
|
|
|
CServiceSession * pServiceSession = NULL;
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator sessionitor;
|
|
|
|
|
|
for (sessionitor = m_ServiceSessionList.begin(); sessionitor != m_ServiceSessionList.end(); sessionitor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*sessionitor).second->GetMID() == pExe->nSID)
|
|
|
|
|
|
pServiceSession = (*sessionitor).second;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (MakeServiceList(pExe->nSID, pExe->nAssignedLauncherID, pExe->wszType, pServiceSession == NULL ? false : true) == false)
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[ReLoadStruct] Fail MakeServiceList");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MakeWorldList();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TServerExcuteData> vExeList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetExeCommandList((*ii).second->GetSessionID(), &vExeList);
|
|
|
|
|
|
bool bOther = CDataManager::GetInstance()->IsNeedOtherExcutePath((*ii).second->GetSessionID());
|
|
|
|
|
|
(*ii).second->SendManagingExeItem(&vExeList, bOther);
|
|
|
|
|
|
|
|
|
|
|
|
std::list <char> lList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetAssingedPatchTypeList((*ii).second->GetSessionID(), &lList);
|
|
|
|
|
|
(*ii).second->SendConnectedResult(&lList, g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_PatcherSessionList.begin(); ih != m_PatcherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendConnectedResult(g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"ReDataLoad OK\n");
|
|
|
|
|
|
m_nContainerVersion++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReLoadUser()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (CDataManager::GetInstance()->LoadUser())
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"MonitorUser.xml Load Failed\n");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::CheckMonitorLogin(const char * pID, const char * pPass, int & nMonitorLevel, TP_SMVERSION Version)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (GET_SM_VERSION() != Version) return ERROR_SM_LOGINFAIL_VERSIONUNMATCHED;
|
|
|
|
|
|
|
|
|
|
|
|
bool bDuplicate = false;
|
|
|
|
|
|
int nTempMonitorLevel = SERVERMONITOR_LEVEL_NONE;
|
|
|
|
|
|
nMonitorLevel = SERVERMONITOR_LEVEL_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
bool bRet = CDataManager::GetInstance()->CheckMonitorUser(pID, pPass, nTempMonitorLevel, bDuplicate);
|
|
|
|
|
|
if (bRet && bDuplicate == false) //<2F>ߺ<EFBFBD><DFBA>α<EFBFBD><CEB1><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (strcmp("eyeadmin", pID))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <CMonitorSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_MonitorSessionList.begin(); ii != m_MonitorSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!strcmp((*ii)->GetMonitorID(), "eyeadmin")) continue;
|
|
|
|
|
|
if ((*ii)->GetMonitorLevel() == nTempMonitorLevel)
|
|
|
|
|
|
return ERROR_SM_LOGINFAIL_LEVEL_DUPLICATED;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
nMonitorLevel = nTempMonitorLevel;
|
|
|
|
|
|
return bRet == true ? ERROR_NONE : ERROR_SM_LOGINFAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CalcPageSize(int &nFirst, int &nLast, BYTE cOffSet, BYTE cPageNum, int nMaxSize, int nWholeCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nLastPageNum = nWholeCount/((cOffSet <= 0 || cOffSet > nMaxSize) ? nMaxSize : cOffSet);
|
|
|
|
|
|
cPageNum = nLastPageNum < cPageNum ? nLastPageNum : cPageNum;
|
|
|
|
|
|
|
|
|
|
|
|
nFirst = cPageNum * cOffSet;
|
|
|
|
|
|
nLast = nFirst + cOffSet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendExceptionReport(int nSID, int nExceptionType, const char * pDetail)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
ReportToMonitorServiceState(nSID, _SERVICE_STATE_ONLINE, nExceptionType, pDetail);
|
|
|
|
|
|
SendPacketToGsm(_T("msg=pInfo,%d,Exception,%d"), nSID, nExceptionType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendUpdateNotice(int nNotice)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <CMonitorSession*>::iterator im;
|
|
|
|
|
|
for (im = m_MonitorSessionList.begin(); im != m_MonitorSessionList.end(); im++)
|
|
|
|
|
|
(*im)->SendUpdateNotice(nNotice);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetMeritList(int nContainerVersion, int nLastRecvID, BYTE & cIsLast, short & cCount, sMonitorChannelMeritInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
nWholeCount = (int)m_ChannelMerit.size();
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
if (GetContainerVersion() != nContainerVersion) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, TMeritInfo>::iterator ii;
|
|
|
|
|
|
//ii = nLastRecvID <= 0 ? m_ChannelMerit.begin() : m_ChannelMerit.find(nLastRecvID);
|
|
|
|
|
|
if (nLastRecvID <= 0)
|
|
|
|
|
|
ii = m_ChannelMerit.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ChannelMerit.find(nLastRecvID);
|
|
|
|
|
|
if (ii == m_ChannelMerit.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == m_ChannelMerit.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (cCount = 0; ii != m_ChannelMerit.end(); ii++, cCount++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cCount >= _MERITSEND_CALCSIZE || cCount >= nDestCountMax) break;
|
|
|
|
|
|
TMeritInfo * pMeritInfo = &(*ii).second;
|
|
|
|
|
|
pInfo[cCount].nID = pMeritInfo->nID;
|
|
|
|
|
|
pInfo[cCount].nMeritType = pMeritInfo->nMeritType;
|
|
|
|
|
|
pInfo[cCount].nExtendValue = pMeritInfo->nExtendValue;
|
|
|
|
|
|
pInfo[cCount].nMinLevel = pMeritInfo->nMinLevel;
|
|
|
|
|
|
pInfo[cCount].nMaxLevel = pMeritInfo->nMaxLevel;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = m_ChannelMerit.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetNetLauncherList(int nContainerVersion, int nLastRecvLauncherID, BYTE & cIsLast, short & cCount, sMonitorNetLauncherInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
std::map <int, TNetLauncherInfo> vList;
|
|
|
|
|
|
std::map <int, TNetLauncherInfo>::iterator ii;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vList);
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = (int)vList.size();
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
if (GetContainerVersion() != nContainerVersion) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
//ii = nLastRecvLauncherID <= 0 ? vList.begin() : vList.find(nLastRecvLauncherID);
|
|
|
|
|
|
if (nLastRecvLauncherID <= 0)
|
|
|
|
|
|
ii = vList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = vList.find(nLastRecvLauncherID);
|
|
|
|
|
|
if (ii == vList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == vList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (cCount = 0; ii != vList.end(); ii++, cCount++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cCount > _NETLAUNCHER_CALCSIZE || cCount >= nDestCountMax) break;
|
|
|
|
|
|
TNetLauncherInfo * pNLInfo = &(*ii).second;
|
|
|
|
|
|
pInfo[cCount].nID = pNLInfo->nNID;
|
|
|
|
|
|
STRCPYW(pInfo[cCount].wszIP, IPLENMAX, pNLInfo->wszIP);
|
|
|
|
|
|
STRCPYW(pInfo[cCount].wszPublicIP, IPLENMAX, pNLInfo->wszPublicIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = vList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetServerList(int nContainerVersion, int nLastRecvSID, BYTE & cIsLast, short & cCount, sMonitorServerInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = (int)m_ServiceList.size();
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
if (GetContainerVersion() != nContainerVersion) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
//ii = nLastRecvSID <= 0 ? m_ServiceList.begin() : m_ServiceList.find(nLastRecvSID);
|
|
|
|
|
|
if (nLastRecvSID <= 0)
|
|
|
|
|
|
ii = m_ServiceList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ServiceList.find(nLastRecvSID);
|
|
|
|
|
|
if (ii == m_ServiceList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == m_ServiceList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (cCount = 0; ii != m_ServiceList.end(); ii++, cCount++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cCount >= _SERVERINFO_CALCSIZE || cCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
pInfo[cCount].nSID = (*ii).second->nSID;
|
|
|
|
|
|
pInfo[cCount].nManagedLauncherID = (*ii).second->nManagedLauncherID;
|
|
|
|
|
|
pInfo[cCount].nServerState = (*ii).second->nState;
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, (*ii).second->szType, -1, pInfo[cCount].szType, NAMELENMAX, NULL, NULL);
|
|
|
|
|
|
pInfo[cCount].nServerType = GetServerType((*ii).second->szType);
|
|
|
|
|
|
STRCPYA(pInfo[cCount].szResourceRevision, 32, (*ii).second->szResource);
|
|
|
|
|
|
STRCPYA(pInfo[cCount].szExeVersion, SERVERVERSIONMAX, (*ii).second->szVersion);
|
|
|
|
|
|
memcpy(pInfo[cCount].cWorldIDs, (*ii).second->cWorldIDs, sizeof(pInfo[cCount].cWorldIDs));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = m_ServiceList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetChannelList(int nContainerVersion, INT64 nLastRecvCHID, BYTE & cIsLast, short & cCount, sMonitorChannelInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = (int)m_ChannelList.size();
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
if (GetContainerVersion() != nContainerVersion) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <INT64, tMonitorChannelInfo>::iterator ii;
|
|
|
|
|
|
//ii = nLastRecvCHID <= 0 ? m_ChannelList.begin() : m_ChannelList.find(nLastRecvCHID);
|
|
|
|
|
|
if (nLastRecvCHID <= 0)
|
|
|
|
|
|
ii = m_ChannelList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ChannelList.find(nLastRecvCHID);
|
|
|
|
|
|
if (ii == m_ChannelList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == m_ChannelList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (cCount = 0; ii != m_ChannelList.end(); ii++, cCount++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cCount >= _CHANNEL_CALCSIZE || cCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
tMonitorChannelInfo * pChInfo = &(*ii).second;
|
|
|
|
|
|
pInfo[cCount].nSID = pChInfo->nManagedID;
|
|
|
|
|
|
pInfo[cCount].nWorldID = pChInfo->nWorldID;
|
|
|
|
|
|
pInfo[cCount].nChannelID = pChInfo->Info.nChannelID;
|
|
|
|
|
|
pInfo[cCount].nMapIdx = pChInfo->Info.nMapIdx;
|
|
|
|
|
|
pInfo[cCount].nMaxUserCount = pChInfo->Info.nMaxUserCount;
|
|
|
|
|
|
pInfo[cCount].nChannelAttribute = pChInfo->Info.nChannelAttribute;
|
|
|
|
|
|
CDataManager::GetInstance()->GetChannelMapName(pChInfo->Info.nMapIdx, pInfo[cCount].wszMapName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = m_ChannelList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::GetMangedIDList(std::vector <int> &vList)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nMID = (*ii).second->GetMID();
|
|
|
|
|
|
vList.push_back(nMID);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetWorldInfo(int nContainerVersion, BYTE & cCount, sMonitorWorldInfo * pInfo)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sMonitorWorldInfo>::iterator ii;
|
|
|
|
|
|
for (ii = m_WorldInfo.begin(); ii != m_WorldInfo.end(); ii++)
|
|
|
|
|
|
memcpy(&pInfo[cCount++], &(*ii).second, sizeof(sMonitorWorldInfo));
|
|
|
|
|
|
|
|
|
|
|
|
return (int)m_WorldInfo.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetLoginUpdateList(int nLastRecvLoginSID, BYTE & cIsLast, short & nCount, sUserCountInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, int> TempSIDList;
|
|
|
|
|
|
std::map <UINT, int>::iterator ii;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = GetServiceCount(MANAGED_TYPE_LOGIN, &TempSIDList);
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
//ii = nLastRecvLoginSID <= 0 ? TempSIDList.begin() : TempSIDList.find(nLastRecvLoginSID);
|
|
|
|
|
|
if (nLastRecvLoginSID <= 0)
|
|
|
|
|
|
ii = TempSIDList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = TempSIDList.find(nLastRecvLoginSID);
|
|
|
|
|
|
if (ii == TempSIDList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == TempSIDList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ih;
|
|
|
|
|
|
for (int i = 0; ii != TempSIDList.end(); ii++, i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCount >= _LOGINUPDATE_CALCSIZE || nCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetMID() == (*ii).first)
|
|
|
|
|
|
{
|
|
|
|
|
|
pInfo[nCount].nSID = (*ih).second->GetMID();
|
|
|
|
|
|
pInfo[nCount].nUserCount = (*ih).second->m_nLoginUserCount;
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = TempSIDList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetVillageUpdateList(INT64 nLastRecvCHID, BYTE & cIsLast, BYTE & cCount, sChannelUpdateInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = (int)m_ChannelList.size();
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <INT64, tMonitorChannelInfo>::iterator ii;
|
|
|
|
|
|
//ii = nLastRecvCHID <= 0 ? m_ChannelList.begin() : m_ChannelList.find(nLastRecvCHID);
|
|
|
|
|
|
if (nLastRecvCHID <= 0)
|
|
|
|
|
|
ii = m_ChannelList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ChannelList.find(nLastRecvCHID);
|
|
|
|
|
|
if (ii == m_ChannelList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == m_ChannelList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (cCount = 0; ii != m_ChannelList.end(); ii++, cCount++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cCount >= _VILLAGEUPDATE_CALCSIZE || cCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
tMonitorChannelInfo * pChInfo = &(*ii).second;
|
|
|
|
|
|
pInfo[cCount].nSID = pChInfo->nManagedID;
|
|
|
|
|
|
pInfo[cCount].bShow = pChInfo->Info.bShow;
|
|
|
|
|
|
pInfo[cCount].bVisibility = pChInfo->Info.bVisibility;
|
|
|
|
|
|
pInfo[cCount].nChannelID = pChInfo->Info.nChannelID;
|
|
|
|
|
|
pInfo[cCount].nChannelUserCount = pChInfo->Info.nCurrentUserCount;
|
|
|
|
|
|
pInfo[cCount].nLimitLevel = pChInfo->Info.nLimitLevel;
|
|
|
|
|
|
pInfo[cCount].nMeritBonusID = pChInfo->Info.nMeritBonusID;
|
|
|
|
|
|
pInfo[cCount].nServerID = pChInfo->Info.nServerID;
|
|
|
|
|
|
pInfo[cCount].cThreadID = pChInfo->Info.cThreadID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = m_ChannelList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetGameUpdateList(int nLastRecvGameSID, BYTE & cIsLast, short & nCount, sGameUserInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, int> TempSIDList;
|
|
|
|
|
|
std::map <UINT, int>::iterator ii;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = GetServiceCount(MANAGED_TYPE_GAME, &TempSIDList);
|
|
|
|
|
|
if (nWholeCount <= 0) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
//ii = nLastRecvGameSID <= 0 ? TempSIDList.begin() : TempSIDList.find(nLastRecvGameSID);
|
|
|
|
|
|
if (nLastRecvGameSID <= 0)
|
|
|
|
|
|
ii = TempSIDList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = TempSIDList.find(nLastRecvGameSID);
|
|
|
|
|
|
if (ii == TempSIDList.end()) return nWholeCount;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == TempSIDList.end()) return nWholeCount;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ih;
|
|
|
|
|
|
for (int i = 0; ii != TempSIDList.end(); ii++, i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCount >= _GAMEUPDATE_CALCSIZE || nCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetMID() == (*ii).first)
|
|
|
|
|
|
{
|
|
|
|
|
|
pInfo[nCount].nSID = (*ih).second->GetMID();
|
|
|
|
|
|
pInfo[nCount].nUserCount = (*ih).second->m_nGameUserCount;
|
|
|
|
|
|
pInfo[nCount].cIsOpened = (*ih).second->m_bZeroPopulation == true ? false : true;
|
|
|
|
|
|
pInfo[nCount].nRoomCount = (*ih).second->m_nGameRoomCount;
|
|
|
|
|
|
pInfo[nCount].nTotalRoomCount = (*ih).second->m_nTotalRoomCount;
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = TempSIDList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetFarmUpdateList(short nFarmCount, short & nCount, TFarmStatus * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
bool bAddFarm = false;
|
|
|
|
|
|
nCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<WORLDCOUNTMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, std::vector<TFarmStatus>>::iterator managed_itor;
|
|
|
|
|
|
for (managed_itor = m_FarmStatus[i].begin(); managed_itor != m_FarmStatus[i].end(); managed_itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<TFarmStatus>::iterator farm_itor = managed_itor->second.begin();
|
|
|
|
|
|
for (; farm_itor != managed_itor->second.end(); farm_itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFarmStatus& pStatus = *farm_itor;
|
|
|
|
|
|
|
|
|
|
|
|
nFarmCount--;
|
|
|
|
|
|
|
|
|
|
|
|
if (pStatus.nFarmDBID > 0 && nFarmCount < 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCount >= _FARMUPDATE_CALCSIZE || nCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
pInfo[nCount].bActivate = pStatus.bActivate;
|
|
|
|
|
|
pInfo[nCount].nFarmDBID = pStatus.nFarmDBID;
|
|
|
|
|
|
pInfo[nCount].nManagedID = pStatus.nManagedID;
|
|
|
|
|
|
pInfo[nCount].nFarmCurUserCount = pStatus.nFarmCurUserCount;
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetServerStateList(int nLastRecvSID, BYTE & cIsLast, short & nCount, sServerStateInfo * pInfo, int nDestCountMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWholeCount;
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = 1;
|
|
|
|
|
|
|
|
|
|
|
|
nWholeCount = (int)m_ServiceList.size();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
//ii = nLastRecvSID <= 0 ? m_ServiceList.begin() : m_ServiceList.find(nLastRecvSID);
|
|
|
|
|
|
if (nLastRecvSID <= 0)
|
|
|
|
|
|
ii = m_ServiceList.begin();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ServiceList.find(nLastRecvSID);
|
|
|
|
|
|
if (ii == m_ServiceList.end()) return 0;
|
|
|
|
|
|
ii++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ii == m_ServiceList.end()) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; ii != m_ServiceList.end(); ii++, i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCount >= _SERVERSTATE_CALCSIZE || nCount >= nDestCountMax) break;
|
|
|
|
|
|
|
|
|
|
|
|
pInfo[nCount].nServerState = (*ii).second->nState;
|
|
|
|
|
|
pInfo[nCount].nSID = (*ii).second->nSID;
|
|
|
|
|
|
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cIsLast = m_ServiceList.end() == ii ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
return nWholeCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "GsmCmdProcess.h"
|
|
|
|
|
|
int CServiceManager::StartServiceAll(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsCloseService(0))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Terminate Process Busy");
|
|
|
|
|
|
return ERROR_SM_TERMINATE_BUSY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//Start Service Batch Flow
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.size() != CDataManager::GetInstance()->GetLauncherCnt())
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TNetLauncherInfo> vList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vList);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator itorlauncher;
|
|
|
|
|
|
for (itorlauncher = m_LauncherSessionList.begin(); itorlauncher != m_LauncherSessionList.end(); itorlauncher++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TNetLauncherInfo>::iterator itorv;
|
|
|
|
|
|
for (itorv = vList.begin(); itorv != vList.end(); )
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*itorv).nNID == (*itorlauncher).second->GetSessionID())
|
|
|
|
|
|
itorv = vList.erase(itorv);
|
|
|
|
|
|
else
|
|
|
|
|
|
itorv++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vList.size(); i++)
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Launcher Connection Insufficiency NID[%d] NIP[%s]\n", vList[i].nNID, vList[i].wszIP);
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "StartServiceAll Failed Launcher Connection Insufficiency");
|
|
|
|
|
|
return ERROR_SM_NETLAUNCHER_INSUFFISIENCY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendInfoCopy(CDataManager::GetInstance()->IsNeedOtherExcutePath((*ih).first));
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nState == _SERVICE_STATE_OFFLINE || (*ii).second->nState == _SERVICE_STATE_TERMINATED)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand((*ii).second->nSID);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
ExcuteProcess(pExe);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceAll Failed SID[%d]\n", (*ii).second->nSID);
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "StartServiceAll Failed");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceAll OK\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "StartServiceAll OK");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::StartServiceEach(int nSID, bool bForcePatch, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsCloseService(nSID))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Terminate Process Busy");
|
|
|
|
|
|
return ERROR_SM_TERMINATE_BUSY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
bool bRet = false;
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand(nSID);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
bRet = ExcuteProcess(pExe, bForcePatch);
|
|
|
|
|
|
|
|
|
|
|
|
if (bRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceEach OK\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "StartServiceEach OK");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceEach Failed\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "StartServiceEach Failed");
|
|
|
|
|
|
return ERROR_SM_STARTEACH_FAILED;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::StartServiceEachbyLauncher(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
CLauncherSession * pSession = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetSessionID() == nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession = (*ih).second;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"NetLauncher not Found\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "NetLauncher not Found");
|
|
|
|
|
|
return ERROR_SM_SELECTED_NETLAUNCHER_NOTFOUND;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand((*ii).second->nSID);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pExe->nAssignedLauncherID == nNID)
|
|
|
|
|
|
ExcuteProcess(pExe);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ResetCloseService(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <_CLOSESERVICE>::iterator ii;
|
|
|
|
|
|
for (ii = m_CloseServieList.begin(); ii != m_CloseServieList.end(); )
|
|
|
|
|
|
ii = m_CloseServieList.erase(ii);
|
|
|
|
|
|
m_CloseServieList.clear();
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceForce(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendTerminateProcess((*ii).second->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
|
|
|
|
|
|
EjectForce();
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Service Terminated Force\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceAll Force Ok");
|
|
|
|
|
|
m_bCloseService = false;
|
|
|
|
|
|
|
|
|
|
|
|
SendPacketToGsm(_T("msg=Farm,0"));
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceEachForce(int nSID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
/*if (IsService(nSID) == false)
|
|
|
|
|
|
return ERROR_SM_TERMINATE_SERVICE_NOTFOUND;*/
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendTerminateProcess(nSID);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"TerminateServiceEach Force Ok\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceEach Force Ok");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::TerminateServiceEachForceAsync(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendTerminateProcess(nSID, true);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <int>::iterator itor;
|
|
|
|
|
|
for (itor = m_AutoRestartList.begin(); itor != m_AutoRestartList.end(); itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*itor) == nSID)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"TerminateServiceEach Force Ok\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (itor == m_AutoRestartList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_AutoRestartList.push_back(nSID);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StartServiceEachAsync(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (IsCloseService(nSID))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bRet = false;
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand(nSID);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
bRet = ExcuteProcess(pExe, false);
|
|
|
|
|
|
|
|
|
|
|
|
if (bRet)
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceEach OK\n");
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"StartServiceEach Failed\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceAll(char * pMsg, int nAfterClose)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsCloseService(0))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Terminate Process Busy");
|
|
|
|
|
|
return ERROR_SM_TERMINATE_BUSY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"There Is No TerminateSessions\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "There Is No TerminateSessions");
|
|
|
|
|
|
return ERROR_SM_NETLAUNCHER_NOTFOUND;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPacketToGsm(_T("msg=Farm,0"));
|
|
|
|
|
|
|
|
|
|
|
|
if (nAfterClose > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
__time64_t _tCloseTime;
|
|
|
|
|
|
if (m_ServiceCloser.IsClosing(_tCloseTime) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_ServiceCloser.ServiceClose(nAfterClose))
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"Service Will Close [Min:%d] Later\n", nAfterClose);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Error TerminateProcess Already On\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wcscmp((*ii).second->szType, L"DB") && wcscmp((*ii).second->szType, L"Log")
|
|
|
|
|
|
&& wcscmp((*ii).second->szType, L"Village") && wcscmp((*ii).second->szType, L"Game") && wcscmp((*ii).second->szType, L"Master") \
|
|
|
|
|
|
&& wcscmp((*ii).second->szType, L"Login"))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendTerminateProcess((*ii).second->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetType() == MANAGED_TYPE_VILLAGE || (*ih).second->GetType() == MANAGED_TYPE_GAME || (*ih).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ih).second->SendCloseService();
|
|
|
|
|
|
|
|
|
|
|
|
_CLOSESERVICE close;
|
|
|
|
|
|
memset(&close, 0, sizeof(close));
|
|
|
|
|
|
|
|
|
|
|
|
close.nMID = (*ih).second->GetMID();
|
|
|
|
|
|
close.nInsertTick = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
m_CloseServieList.push_back(close);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EjectServiceAll();
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Service Terminated (without db, village, game)\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceAll (without dbvillage, game) Ok");
|
|
|
|
|
|
m_bCloseService = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceDB(char * pMsg, bool bWithOutLock)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsCloseService(0))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Terminate Process Busy");
|
|
|
|
|
|
return ERROR_SM_TERMINATE_BUSY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"There Is No TerminateSessions\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "There Is No TerminateSessions");
|
|
|
|
|
|
return ERROR_SM_NETLAUNCHER_NOTFOUND;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bWithOutLock == false)
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!wcscmp((*ii).second->szType, L"DB") || !wcscmp((*ii).second->szType, L"Log") || !wcscmp((*ii).second->szType, L"Master"))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendTerminateProcess((*ii).second->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bWithOutLock == false)
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
|
|
|
|
|
|
EjectServiceDB();
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"DB Service Terminated [Callby:%s]\n", bWithOutLock == true ? L"IdleProcess" : L"ConsolCmd");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceDB Ok");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceEach(int nSID, char * pMsg, bool bReCreate)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsCloseService(nSID))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Terminate Process Busy\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Terminate Process Busy");
|
|
|
|
|
|
return ERROR_SM_TERMINATE_BUSY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetMID() == nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetType() == MANAGED_TYPE_VILLAGE || (*ih).second->GetType() == MANAGED_TYPE_GAME || (*ih).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ih).second->SendCloseService();
|
|
|
|
|
|
|
|
|
|
|
|
_CLOSESERVICE close;
|
|
|
|
|
|
memset(&close, 0, sizeof(close));
|
|
|
|
|
|
|
|
|
|
|
|
close.nMID = (*ih).second->GetMID();
|
|
|
|
|
|
close.nInsertTick = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
m_CloseServieList.push_back(close);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendTerminateProcess(nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bReCreate)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <int>::iterator itor;
|
|
|
|
|
|
for (itor = m_AutoRestartList.begin(); itor != m_AutoRestartList.end(); itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*itor) == nSID)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (itor == m_AutoRestartList.end())
|
|
|
|
|
|
m_AutoRestartList.push_back(nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceEach Ok");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceEachbyLauncher(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wcscmp((*ii).second->szType, L"DB") && wcscmp((*ii).second->szType, L"Log")
|
|
|
|
|
|
&& wcscmp((*ii).second->szType, L"Village") && wcscmp((*ii).second->szType, L"Game") \
|
|
|
|
|
|
&& wcscmp((*ii).second->szType, L"Login"))
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendTerminateProcess((*ii).second->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nManagedLauncherID == nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetMID() == (*ii).second->nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetType() == MANAGED_TYPE_VILLAGE || (*ih).second->GetType() == MANAGED_TYPE_GAME || (*ih).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ih).second->SendCloseService();
|
|
|
|
|
|
|
|
|
|
|
|
_CLOSESERVICE close;
|
|
|
|
|
|
memset(&close, 0, sizeof(close));
|
|
|
|
|
|
|
|
|
|
|
|
close.nMID = (*ih).second->GetMID();
|
|
|
|
|
|
close.nInsertTick = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
m_CloseServieList.push_back(close);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ij;
|
|
|
|
|
|
for (ij = m_LauncherSessionList.begin(); ij != m_LauncherSessionList.end(); ij++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ij).second->GetSessionID() == nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ij).second->SendTerminateProcess((*ii).second->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "TerminateServiceEachbyLauncher Ok");
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::TerminateServiceForceEachbyLauncher(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
CLauncherSession * pSession = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->GetSessionID() == nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession = (*ih).second;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"NetLauncher not Found\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "NetLauncher not Found");
|
|
|
|
|
|
return ERROR_SM_NETLAUNCHER_NOTFOUND;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SendTerminateProcess();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::CancelTerminateProcess()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_ServiceCloser.CancelServiceClose())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"Cancel TerminateProcess\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No TerminateProcess\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchESM(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchESM Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchESM Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPatch(nNID, L"ESM", m_nPatchID++);
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "ESM Patch OK");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::StartESM()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendStartESM();
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::StopESM()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendStopESM();
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeWholeWorld(int nSec, const char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeMassage(_NOTICETYPE_WORLD, 0, 0, 0, nSec, pMsg);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeWorld(int nMasterMID, int nSec, const char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterMID && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeMassage(_NOTICETYPE_WORLD, 0, 0, 0, nSec, pMsg);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeServer(int nMasterMID, int nMID, int nSec, const char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterMID && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeMassage(_NOTICETYPE_EACHSERVER, nMID, 0, 0, nSec, pMsg);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeChannel(int nMasterMID, int nChannelID, int nSec, const char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if (((*ii).second->GetMID() == nMasterMID || nMasterMID == -1) && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeMassage(_NOTICETYPE_CHANNEL, 0, nChannelID, 0, nSec, pMsg);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeZone(int nMasterMID, int nMapIdx, int nSec, const char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if (((*ii).second->GetMID() == nMasterMID || nMasterMID == -1) && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeMassage(_NOTICETYPE_ZONE, 0, 0, nMapIdx, nSec, pMsg);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::NoticeCancel(int nMasterMID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if (((*ii).second->GetMID() == nMasterMID || nMasterMID == -1) && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendNoticeCancel();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::MakeDumpAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendMakeDump();
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::MakeDumEach(int nMID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return ERROR_SM_NETLAUNCHER_NOTFOUND;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
bool bRet = false;
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMID)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendMakeDump();
|
|
|
|
|
|
bRet = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
|
|
|
|
|
|
return bRet == true ? ERROR_NONE : ERROR_SM_MAKEDUMP_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::WorldMaxuserControl(int nMasterMID, UINT nChangeMaxuser)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii, ih;
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
|
|
|
|
|
if ((*ih).second->GetMID() == nMasterMID && (*ih).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ih).second->SendChangeWorldMaxuser(nChangeMaxuser);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::PopulationControl(int nMasterMID, int nControlMID, bool bZeroPopulation)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii, ih;
|
|
|
|
|
|
for (ih = m_ServiceSessionList.begin(); ih != m_ServiceSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
|
|
|
|
|
if ((*ih).second->GetMID() == nMasterMID && (*ih).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ұ<EFBFBD>
|
|
|
|
|
|
if ((*ii).second->GetMID() == nControlMID)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (MANAGED_TYPE_VILLAGE == (*ii).second->GetType() || MANAGED_TYPE_GAME == (*ii).second->GetType())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_ExceptionReportLog.Log(LogType::_FILELOG, L"ConnectRate GameServer SID[%d] BlockFlag[%s]\n", (*ii).second->GetMID(), bZeroPopulation == true ? L"TRUE" : L"FALSE");
|
|
|
|
|
|
(*ih).second->SendPopulationControl((*ii).second->GetType(), (*ii).second->GetMID(), bZeroPopulation);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT(); //<2F>̿ܿ<CCBF> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_SM_GAMECONTROL_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::ChannelControl(int nMasterMID, int nChannelID, bool bVisibility, int nChannelPopulation)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bFlag = false;
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterMID && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendChannelControl(nChannelID, bVisibility, nChannelPopulation);
|
|
|
|
|
|
bFlag = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
|
|
|
|
|
|
return bFlag == true ? ERROR_NONE : ERROR_SM_CHANNELCONTROL_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GameAffinityControl(int nMasterMID, int nGameMID, int nType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nType != _GAMESERVER_AFFINITYTYPE_NORMAL && nType != _GAMESERVER_AFFINITYTYPE_HYBRYD && nType != _GAMESERVER_AFFINITYTYPE_PVP)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterMID && (*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendGameAffinity(nGameMID, nType);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::EventUpdate()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendUpdateEvent(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈó<C6AE><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ƿ<F0B8A3B9> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SimpleConfigUpdate()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendUpdateSimpleConfig();
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReserveNoticeUpdate(const char * pURL, char * pRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pURL == NULL)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (strstr (pURL, "http"))
|
|
|
|
|
|
{
|
|
|
|
|
|
char szCurPath[MAX_PATH];
|
|
|
|
|
|
GetCurrentDirectoryA(sizeof(szCurPath), szCurPath);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrUrl;
|
|
|
|
|
|
ToWideString(const_cast<CHAR*>(pURL), wstrUrl);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrDest;
|
|
|
|
|
|
ToWideString(szCurPath, wstrDest);
|
|
|
|
|
|
wstrDest.append(L"\\");
|
|
|
|
|
|
wstrDest.append(g_Config.wszNoticePath);
|
|
|
|
|
|
|
|
|
|
|
|
if (_waccess(wstrDest.c_str(), 0) != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DeleteFileW(wstrDest.c_str()) == 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DownLoad
|
|
|
|
|
|
if (m_UrlUpdater.UrlUpdateUrl(wstrUrl.c_str(), wstrDest.c_str()))
|
|
|
|
|
|
{
|
|
|
|
|
|
char szNotice[FILENAME_MAX];
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, g_Config.wszNoticePath, -1, szNotice, 256, NULL, NULL);
|
|
|
|
|
|
if (_access(szNotice, 0) != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_ReservedNotice.LoadNotice(szNotice))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_IniFile.SetValue(L"ReserveNoticeInfo", L"FileName", g_Config.wszNoticePath);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
WCHAR szTemp[FILENAME_MAX];
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, pURL, -1, szTemp, FILENAME_MAX);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Update Reserved Notice [URL:%s]\n", szTemp);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_UrlUpdater.UrlUpdateEach(szTemp, szTemp, true))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_ReservedNotice.LoadNotice(pURL))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_IniFile.SetValue(L"ReserveNoticeInfo", L"FileName", szTemp);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"ReserveNotice Download Fail [URL:%s]\n", szTemp);
|
|
|
|
|
|
if (pRet)
|
|
|
|
|
|
strcpy_s(pRet, 256, "ReserveNotice Load Fail CheckURL\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UserRestraint(UINT nAccountDBID, char * pRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendUserRestraint(nAccountDBID);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UserBanbyCharacterName(const char * pName)
|
|
|
|
|
|
{
|
|
|
|
|
|
WCHAR wszName[NAMELENMAX];
|
|
|
|
|
|
memset(wszName, 0, sizeof(wszName));
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, pName, -1, wszName, NAMELENMAX);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendUserBan(wszName, 0, _BANTYPE_CHARACTERNAME);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UserBanbyCharacterName(const WCHAR * pwszName)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendUserBan(pwszName, 0, _BANTYPE_CHARACTERNAME);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UserBanbyAccountDBID(UINT nAccountDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendUserBan(NULL, nAccountDBID, _BANTYPE_ACCOUNTID);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UserBanbyAccountName(const WCHAR * pwszName)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendUserBan(pwszName, 0, _BANTYPE_ACCOUNTNAME);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//use http
|
|
|
|
|
|
void CServiceManager::PatchUpdateUrl(const char * pUrl, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchList Update Fail");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszPath[256];
|
|
|
|
|
|
memset(wszPath, 0, sizeof(wszPath));
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, pUrl, -1, wszPath, 256);
|
|
|
|
|
|
|
|
|
|
|
|
wcscpy_s(g_Config.wszPatchURL, wszPath);
|
|
|
|
|
|
g_IniFile.SetValue(L"PatchInfo", L"PatchUrl", wszPath);
|
|
|
|
|
|
|
|
|
|
|
|
m_UrlUpdater.UpdaterInit(g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TServerExcuteData> vExeList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetExeCommandList((*ii).second->GetSessionID(), &vExeList);
|
|
|
|
|
|
bool bOther = CDataManager::GetInstance()->IsNeedOtherExcutePath((*ii).second->GetSessionID());
|
|
|
|
|
|
(*ii).second->SendManagingExeItem(&vExeList, bOther);
|
|
|
|
|
|
|
|
|
|
|
|
std::list <char> lList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetAssingedPatchTypeList((*ii).second->GetSessionID(), &lList);
|
|
|
|
|
|
(*ii).second->SendConnectedResult(&lList, g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_PatcherSessionList.begin(); ih != m_PatcherSessionList.end(); ih++)
|
|
|
|
|
|
(*ih).second->SendConnectedResult(g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchList Updated");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchStruct(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_UrlUpdater.UrlUpdate(L"ServerStruct", L"System", false))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ReLoadStruct())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "ServerStruct Patched");
|
|
|
|
|
|
SendUpdateNotice(SERVERMONITOR_UPDATENOTICE_SERVERINFO);
|
|
|
|
|
|
return ;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, _T("ServerStruct Patched Failed\n"));
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "ServerStruct Patched Failed");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, _T("Struct Patch Failed [URLDown]\n"));
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Struct Patch Failed [URLDown]");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchInfo(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchInfo Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchInfo Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPatch(nNID, _T("Info"), m_nPatchID++);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, _T("Send NetLauncher Info Patch\n"));
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send NetLauncher Info Patch");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchSystem(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchSystem Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchSystem Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPatch(nNID, _T("System"), m_nPatchID++);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, _T("Send NetLauncher System Patch\n"));
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send NetLauncher System Patch");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchConfig(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchConfig Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchConfig Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPatch(nNID, _T("Config"), m_nPatchID++);
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, _T("Send NetLauncher Config Patch\n"));
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send NetLauncher Config Patch");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchExe(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchExe Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchExe Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
else
|
|
|
|
|
|
SendPatch(nNID, _T("Exe"), m_nPatchID++);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchFull(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"PatchFull Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchFull Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(_SERVICEMANAGER_EX)
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> <20><><EFBFBD>İ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>ϰڳİ<DAB3> <20><><EFBFBD>
|
|
|
|
|
|
if(!IsStartAllLauncherAndContinue())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"PatchFull Fail try later");
|
|
|
|
|
|
SetPatchComplete(false);
|
|
|
|
|
|
m_pApp->OnPatchEnd(false);
|
|
|
|
|
|
return ;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined(_SERVICEMANAGER_EX)
|
|
|
|
|
|
|
|
|
|
|
|
SendPatchStart(nNID);
|
|
|
|
|
|
SendPatch(nNID, L"Config", m_nPatchID);
|
|
|
|
|
|
SendPatch(nNID, L"Info", m_nPatchID);
|
|
|
|
|
|
SendPatch(nNID, L"System", m_nPatchID);
|
|
|
|
|
|
SendPatch(nNID, L"Exe", m_nPatchID);
|
|
|
|
|
|
SendPatch(nNID, L"Res", m_nPatchID);
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
SendPatch(nNID, L"Bat", m_nPatchID);
|
|
|
|
|
|
#endif // #if defined(_CH)
|
|
|
|
|
|
SendPatchEnd(nNID);
|
|
|
|
|
|
SendInfoCopy(nNID);
|
|
|
|
|
|
m_nPatchID++;
|
|
|
|
|
|
#if defined(_SERVICEMANAGER_EX)
|
|
|
|
|
|
SetPatchComplete(true);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchApply(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No Launcher");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TerminateServiceAll();
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendPatchApply();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Patch Apply OK");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::InfoCopy(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendInfoCopy(nNID);
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request NetLauncher InfoCopy");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::Patch(const char * pUrl, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih;
|
|
|
|
|
|
for (ih = m_LauncherSessionList.begin(); ih != m_LauncherSessionList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatchWatcher.AddWatchContent(m_nPatchID, (*ih).second->GetSessionID(), L"Url"))
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ih).second->SendPatchByUrl(m_nPatchID, pUrl, L"Url", false, NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
m_nPatchID++;
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Patch By Url");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchBatch(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchBatch Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchBatch Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendPatch(nNID, L"Bat", m_nPatchID++);
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Batch Patch OK");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::RunBatch(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_RunBatchWatcher.HasWatchingSpec())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Batch Run Fail");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (m_RunBatchWatcher.AddWatchSpec(m_nRunBatchID, (*ii).second->GetSessionID(), L"RunBat"))
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendBatchRun(m_nRunBatchID);
|
|
|
|
|
|
(*ii).second->SetBatch(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
m_nRunBatchID++;
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Batch Run OK");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StopBatch(int nNID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (m_StopBatchWatcher.AddWatchSpec(m_nStopBatchID, (*ii).second->GetSessionID(), L"StopBat"))
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendBatchStop(m_nStopBatchID);
|
|
|
|
|
|
(*ii).second->SetBatch(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
++m_nStopBatchID;
|
|
|
|
|
|
|
|
|
|
|
|
m_RunBatchWatcher.ClearWatchingSpec();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Batch Stop OK");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//for chn
|
|
|
|
|
|
void CServiceManager::PatchDyncode(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"PatchDynCodeBin Fail try later");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "PatchDynCodeBin Fail try later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.empty())
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Launcher\n");
|
|
|
|
|
|
else
|
|
|
|
|
|
SendPatch(0, _T("DynCodeBin"), m_nPatchID++);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReloadDyncode(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsService() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"No Service\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No Service");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_GAME || (*ii).second->GetType() == MANAGED_TYPE_VILLAGE || (*ii).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendReloadDynCode();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//for extpatch
|
|
|
|
|
|
void CServiceManager::PatchExt()
|
|
|
|
|
|
{
|
|
|
|
|
|
//live ext<78><74>ġ<EFBFBD><C4A1> <20>ٸ<EFBFBD> <20><>ġ<EFBFBD>÷ο<C3B7><CEBF><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> ó<><C3B3><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> (<28><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> GSM<53><4D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LivePatcher.IsStarted())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Already Live Ext Patching PatchFailed\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrTemp;
|
|
|
|
|
|
wstrTemp = L"msg=RequestFileList,";
|
|
|
|
|
|
wstrTemp += g_Config.wszPatchURL;
|
|
|
|
|
|
wstrTemp += L"/ext";
|
|
|
|
|
|
|
|
|
|
|
|
if (SendPacketToGsm(wstrTemp.c_str()))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LivePatcher.StartPatch() == false)
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Already Live Ext Patching PatchFailed\n");
|
|
|
|
|
|
|
|
|
|
|
|
g_pServiceManager->SendDelExt();
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Live Ext Patch Start\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"ext patch err\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CancelExtPatch()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::RecvFileList(const char * pUrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F>ش<EFBFBD> Url<72><6C><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD> <20>´<DEB4>!
|
|
|
|
|
|
if (pUrl == NULL)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
char szCurPath[MAX_PATH];
|
|
|
|
|
|
GetCurrentDirectoryA(sizeof(szCurPath), szCurPath);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrUrl;
|
|
|
|
|
|
ToWideString(const_cast<CHAR*>(pUrl), wstrUrl);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrDest;
|
|
|
|
|
|
ToWideString(szCurPath, wstrDest);
|
|
|
|
|
|
wstrDest.append(L"\\FileList.csv");
|
|
|
|
|
|
|
|
|
|
|
|
if (_waccess(wstrDest.c_str(), 0) != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DeleteFileW(wstrDest.c_str()) == 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_UrlUpdater.UrlUpdateUrl(wstrUrl.c_str(), wstrDest.c_str()))
|
|
|
|
|
|
{
|
|
|
|
|
|
TCHAR * pFile = NULL;
|
|
|
|
|
|
pFile = ReadFile(L"FileList.csv");
|
|
|
|
|
|
if (pFile)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LivePatcher.LoadPatchList(pFile) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LoadPatchList Fail\n");
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
SAFE_DELETEARRAY(pFile);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
SAFE_DELETEARRAY(pFile);
|
|
|
|
|
|
m_LivePatcher.SendLivePatch();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"PatchFileList LoadFail Path[%s]\n", wstrDest.c_str());
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::CompleteLivePatchItem(int nPatchID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LivePatcher.IsStarted())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LivePatcher.RecvCompleteItem(nPatchID))
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǸ<CFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>Ŵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>鿡<EFBFBD><E9BFA1> <20>ε<EFBFBD><CEB5>϶<EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"LivePatch Ext DownLoadComplete\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (IsService() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatch Ext Live Patch Reload Failed No Service\n");
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"LivePatch Ext Live Patch Starting...\n");
|
|
|
|
|
|
g_pServiceManager->SendCopyExt();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CompleteLiveExtCopy(bool bRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_LivePatcher.IsStarted())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (bRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>缭<EFBFBD><E7BCAD><EFBFBD><EFBFBD> ext<78><74><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ε<EFBFBD><CEB5>϶<EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>~
|
|
|
|
|
|
std::vector <int> vList;
|
|
|
|
|
|
GetMangedIDList(vList);
|
|
|
|
|
|
|
|
|
|
|
|
m_LivePatcher.SetReloadFlag(vList);
|
|
|
|
|
|
if (SendExtReload(0) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatch Ext Live Patch Failed! No Service\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20>ֿܼ<DCBC> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
m_LivePatcher.CancelPatch();
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatch Ext Live Patch Failed! Check ext files\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CompleteLiveExtReload(int nMID, bool bRet)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (bRet == false)
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatch Ext Live Reload Failed!!!!! CheckServer!!!!\n");
|
|
|
|
|
|
|
|
|
|
|
|
bool bReloadFlag = false;
|
|
|
|
|
|
if (m_LivePatcher.SetReloadResult(nMID, bRet, bReloadFlag))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"LivePatch Ext Live Reload Ret[%s]\n", (bReloadFlag) ? L"Success" : L"Failed");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendDelExt()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendLiveExtDel();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendCopyExt()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendLiveExtCopy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::SendExtReload(int nReLoadType)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_ServiceSessionList.empty())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendExtReload(nReLoadType);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//NetLauncher Service For GSM
|
|
|
|
|
|
void CServiceManager::StartLauncher(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
//Managed PatcherServiceOnly
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_PatcherSessionList.begin(); ii != m_PatcherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendStartNetLauncher();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Start NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StopLauncher(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsService())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"DragonNest Service Online Plz Try Later\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "DragonNest Service Online Plz Try Later");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_PatcherSessionList.begin(); ii != m_PatcherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendStopNetLauncher();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Stop NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StartEachLauncher(int nPSID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii = m_PatcherSessionList.find(nPSID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
(*ii).second->SendStartNetLauncher();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Start NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StopEachLauncher(int nPSID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii = m_PatcherSessionList.find(nPSID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
(*ii).second->SendStopNetLauncher();
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Stop NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StopEachLauncherAsync(int nPSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator itor = m_LauncherSessionList.find(nPSID);
|
|
|
|
|
|
if (itor != m_LauncherSessionList.end())
|
|
|
|
|
|
(*itor).second->DetachConnection(L"NetLauncher ProblemDetach");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii = m_PatcherSessionList.find(nPSID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
(*ii).second->SendStopNetLauncher();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//NetLauncher Patch
|
|
|
|
|
|
void CServiceManager::PatchNetLauncher(char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii;
|
|
|
|
|
|
std::vector <TNetLauncherInfo>::iterator itor;
|
|
|
|
|
|
|
|
|
|
|
|
//check
|
|
|
|
|
|
std::vector <TNetLauncherInfo> vList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vList);
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
for (itor = vList.begin(); itor != vList.end(); itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_PatcherSessionList.find((*itor).nNID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"LauncherPatcher Not Exists IP[%s]\n", (*itor).wszIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (vList.size() != nCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Launcher Patch Failed\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (IsService())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"DragonNest Service Online PatchFailed\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "DragonNest Service Online PatchFailed");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
for (ii = m_PatcherSessionList.begin(); ii != m_PatcherSessionList.end(); ii++)
|
|
|
|
|
|
(*ii).second->SendStopNetLauncher();
|
|
|
|
|
|
|
|
|
|
|
|
Sleep(500);
|
|
|
|
|
|
|
|
|
|
|
|
for (ii = m_PatcherSessionList.begin(); ii != m_PatcherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->SendNetLauncherPatch())
|
|
|
|
|
|
m_PatchWatcher.AddWatchContent(-1, (*ii).second->GetSessionID(), L"Net");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Patch NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchNetLauncherEach(int nID, char * pMsg)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatcherSessionList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"No PatcherService\n");
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "No PatcherService");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CPatcherSession*>::iterator ii;
|
|
|
|
|
|
std::vector <TNetLauncherInfo>::iterator itor;
|
|
|
|
|
|
|
|
|
|
|
|
//check
|
|
|
|
|
|
bool bCheck = false;
|
|
|
|
|
|
std::vector <TNetLauncherInfo> vList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vList);
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
ii = m_PatcherSessionList.find(nID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
for (itor = vList.begin(); itor != vList.end(); itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*itor).nNID == nID)
|
|
|
|
|
|
{
|
|
|
|
|
|
bCheck = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bCheck == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"LauncherPatcher Not Exists IP[%s]\n", ii == m_PatcherSessionList.end() ? "none" : (*ii).second->GetIp());
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ii = m_PatcherSessionList.find(nID);
|
|
|
|
|
|
if (ii != m_PatcherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendStopNetLauncher();
|
|
|
|
|
|
Sleep(500);
|
|
|
|
|
|
(*ii).second->SendNetLauncherPatch();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pMsg) strcpy(pMsg, "Send Request Patch NetLauncher");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::PatchedLauncher(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bComplete = false;
|
|
|
|
|
|
#if defined(_SERVICEMANAGER_EX)
|
|
|
|
|
|
bool bNIDComplete = false;
|
|
|
|
|
|
m_PatchWatcher.DelWatchContent(-1, nNID, L"Net", bComplete, bNIDComplete);
|
|
|
|
|
|
#else
|
|
|
|
|
|
m_PatchWatcher.DelWatchContent(-1, nNID, L"Net", bComplete);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
if (bComplete)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncherPatch Complete\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CheckPatch()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatchWatcher.HasWatchingContent() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"No Watching Patch Content\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::Clearpatch()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_PatchWatcher.ClearWatchingContent();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CheckNetLauncher(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (nNID == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TNetLauncherInfo> vTemp;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vTemp);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vTemp.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.find(vTemp[i].nNID);
|
|
|
|
|
|
if (ii == m_LauncherSessionList.end())
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher was not connected[ID:%d][IP:%s]\n", vTemp[i].nNID, vTemp[i].wszIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
const TNetLauncher * pLauncher = CDataManager::GetInstance()->GetLauncherInfobyID(nNID);
|
|
|
|
|
|
if (pLauncher)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher [ID:%d][PID:%d][WID:%d][IP:%s]\n", pLauncher->nID, pLauncher->nPID, pLauncher->nWID, pLauncher->szIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.find(nNID);
|
|
|
|
|
|
if (ii != m_LauncherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendReturnPing(-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CheckAliveNetLauncher()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_LauncherSessionList.size() <=0)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"All Launchers Closed\n");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher is alive [ID:%d][IP:%S]\n", (*ii).second->GetSessionID(), (*ii).second->GetIp());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::TestLauncher(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
ULONG nCurTick = timeGetTime();
|
|
|
|
|
|
m_LaunchetTestList.clear();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->SendReturnPing(0))
|
|
|
|
|
|
m_LaunchetTestList.insert(std::make_pair((*ii).second->GetSessionID(), nCurTick));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CheckBatch(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
// BatchWatcher<65><72><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CheckNetLauncheró<72><C3B3> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (nNID == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TNetLauncherInfo> vTemp;
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherIds(&vTemp);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vTemp.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.find(vTemp[i].nNID);
|
|
|
|
|
|
if (ii == m_LauncherSessionList.end())
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher was not connected[ID:%d][IP:%s]\n", vTemp[i].nNID, vTemp[i].wszIP);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (false == (*ii).second->IsBatch())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Batch was not completed [ID:%d][IP:%s]\n", vTemp[i].nNID, vTemp[i].wszIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
const TNetLauncher * pLauncher = CDataManager::GetInstance()->GetLauncherInfobyID(nNID);
|
|
|
|
|
|
if (pLauncher)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher [ID:%d][PID:%d][WID:%d][IP:%s]\n", pLauncher->nID, pLauncher->nPID, pLauncher->nWID, pLauncher->szIP);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"CheckBatch NID[%d] NotFound\n", nNID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii = m_LauncherSessionList.find(nNID);
|
|
|
|
|
|
if (ii != m_LauncherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (false == (*ii).second->IsBatch())
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Batch was not completed [ID:%d][IP:%s]\n", nNID, (*ii).second->GetIp());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::CreateServiceServer(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nState != _SERVICE_STATE_ONLINE || (*ii).second->nState != _SERVICE_STATE_CREATE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_CREATE;
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d]Service Created\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID);
|
|
|
|
|
|
int nState = (*ii).second->nState;
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->nCreateTime = timeGetTime();
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState(nSID, nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState(nSID, nState);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::OnlineServiceServer(int nSID, int nServiceSessionID, const char * pVersion, const char * pResVersion, CServiceSession * pSession, BYTE cWorldCount, BYTE * pWorldID, bool bFinalBuild)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::string strCmd;
|
|
|
|
|
|
strCmd = pVersion;
|
|
|
|
|
|
ToLowerA(strCmd);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> tokens;
|
|
|
|
|
|
TokenizeA(strCmd, tokens, ".");
|
|
|
|
|
|
|
|
|
|
|
|
if (tokens.size() < 2)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
int nMajorVersion = atoi(tokens[0].c_str());
|
|
|
|
|
|
int nMinorVersion = atoi(tokens[1].c_str());
|
|
|
|
|
|
|
|
|
|
|
|
if (nMajorVersion != m_nMajorVersion && nMinorVersion != m_nMinorVersion)
|
|
|
|
|
|
{
|
|
|
|
|
|
//TerminateServiceEachForce(nSID);
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"Server Version MisMatch ServiceManager[%S] Server[%S] IP[%S]\n", g_Config.szVersion, pVersion, pSession->GetIp());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nState == _SERVICE_STATE_ONLINE)
|
|
|
|
|
|
{
|
|
|
|
|
|
if((*ii).second->bIsReConnect == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->bIsReConnect = true;
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [Session:%d, ConnectedSession:%d] Reconnect Service\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pSession->GetSessionID(), (*ii).second->nServiceSessionID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [Session:%d, ConnectedSession:%d] Already Service Online\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pSession->GetSessionID(), (*ii).second->nServiceSessionID);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
#if defined( _SERVICEMANAGER_EX )
|
|
|
|
|
|
g_FileLog.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [Version:%S] [ResVersion:%S] [Session:%d] Service Online\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pVersion, pResVersion, pSession->GetSessionID());
|
|
|
|
|
|
#else
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [Version:%S] [ResVersion:%S] [Session:%d] Service Online\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pVersion, pResVersion, pSession->GetSessionID());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_ONLINE;
|
|
|
|
|
|
(*ii).second->nServiceSessionID = nServiceSessionID;
|
|
|
|
|
|
|
|
|
|
|
|
int nState = (*ii).second->nState;
|
|
|
|
|
|
//memcpy((*ii).second->cWorldIDs, pWorldID, cWorldCount);
|
|
|
|
|
|
strncpy ((*ii).second->szVersion, pVersion, SERVERVERSIONMAX);
|
|
|
|
|
|
(*ii).second->bFinalBuild = bFinalBuild;
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, pVersion, pResVersion);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::CheckAllServiceOnline()
|
|
|
|
|
|
{
|
|
|
|
|
|
for (std::map <int, sServiceState*>::iterator ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( ii->second->nState != _SERVICE_STATE_ONLINE )
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReportTerminateService(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
CLauncherSession * pLauncher = NULL;
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ih = m_LauncherSessionList.find((*ii).second->nManagedLauncherID);
|
|
|
|
|
|
if (ih != m_LauncherSessionList.end())
|
|
|
|
|
|
pLauncher = (*ih).second;
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_TERMINATED;
|
|
|
|
|
|
int nState = (*ii).second->nState;
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [IP:%S]Service Terminated\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pLauncher ? pLauncher->GetIp() : "0");
|
|
|
|
|
|
g_ExceptionReportLog.Log(LogType::_FILELOG, L"[LauncherReport [NLID:%d] [SID:%d] [IP:%S]Service Terminated\n", (*ii).second->nManagedLauncherID, (*ii).second->nSID, pLauncher ? pLauncher->GetIp() : "0");
|
|
|
|
|
|
|
|
|
|
|
|
//Ȥ<><C8A4> <20><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD>մϴ<D5B4>
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator is;
|
|
|
|
|
|
for (is = m_ServiceSessionList.begin(); is != m_ServiceSessionList.end(); is++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*is).second->GetMID() == nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*is).second->DetachConnection(L"terminated");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::EjectForce()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_OFFLINE;
|
|
|
|
|
|
(*ii).second->bIsReConnect = false;
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::EjectServiceAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wcscmp((*ii).second->szType, L"DB") && wcscmp((*ii).second->szType, L"Log"))
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_OFFLINE;
|
|
|
|
|
|
(*ii).second->bIsReConnect = false;
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::EjectServiceDB()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!wcscmp((*ii).second->szType, L"DB") || !wcscmp((*ii).second->szType, L"Log"))
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_OFFLINE;
|
|
|
|
|
|
(*ii).second->bIsReConnect = false;
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::EjectService(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nSID == nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->nState = _SERVICE_STATE_OFFLINE;
|
|
|
|
|
|
(*ii).second->bIsReConnect = false;
|
|
|
|
|
|
|
|
|
|
|
|
ReportToGSMServiceState((*ii).second->nSID, (*ii).second->nState, NULL, NULL);
|
|
|
|
|
|
ReportToMonitorServiceState((*ii).second->nSID, (*ii).second->nState);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <_CLOSESERVICE>::iterator ih;
|
|
|
|
|
|
for (ih = m_CloseServieList.begin(); ih != m_CloseServieList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).nMID == nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_CloseServieList.erase(ih);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateWorldMaxUser(TServiceWorldInfo * pPacket)
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sMonitorWorldInfo>::iterator ii = m_WorldInfo.find(pPacket->nWorldID);
|
|
|
|
|
|
if (ii != m_WorldInfo.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second.nWorldMaxUser = pPacket->nWorldMaxuser;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
sMonitorWorldInfo World;
|
|
|
|
|
|
memset(&World, 0, sizeof(World));
|
|
|
|
|
|
|
|
|
|
|
|
World.nWorldID = pPacket->nWorldID;
|
|
|
|
|
|
World.nWorldMaxUser = pPacket->nWorldMaxuser;
|
|
|
|
|
|
m_WorldInfo.insert(std::make_pair(pPacket->nWorldID, World));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
OnWorldMaxUser(pPacket->nWorldID, pPacket->nWorldMaxuser);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
m_nContainerVersion++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendUpdateNotice(SERVERMONITOR_UPDATENOTICE_WOLRDINFO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateMeritInfo(TServiceMeritInfo * pPacket)
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
m_ChannelMerit.clear();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, TMeritInfo>::iterator ii;
|
|
|
|
|
|
for (int i = 0; i < pPacket->cCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
ii = m_ChannelMerit.find(pPacket->Info[i].nID);
|
|
|
|
|
|
if (ii == m_ChannelMerit.end())
|
|
|
|
|
|
m_ChannelMerit.insert(std::make_pair(pPacket->Info[i].nID, pPacket->Info[i]));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_nContainerVersion++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SendUpdateNotice(SERVERMONITOR_UPDATENOTICE_MERITINFO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateChannelInfo(TServiceChannelInfo * pPacket)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool NeedNotice = false;
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <INT64, tMonitorChannelInfo>::iterator ii;
|
|
|
|
|
|
|
|
|
|
|
|
bool bNeedInclease = false;
|
|
|
|
|
|
tMonitorChannelInfo Info;
|
|
|
|
|
|
INT64 nKey = 0;
|
|
|
|
|
|
for (int i = 0; i < pPacket->cCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
nKey = MAKE_SM_SVRCHN(pPacket->nManagedID, pPacket->Info[i].nChannelID);
|
|
|
|
|
|
ii = m_ChannelList.find(nKey);
|
|
|
|
|
|
if (ii != m_ChannelList.end())
|
|
|
|
|
|
memcpy(&(*ii).second.Info, &pPacket->Info[i], sizeof(sChannelInfo));
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
memset(&Info, 0, sizeof(Info));
|
|
|
|
|
|
|
|
|
|
|
|
Info.nManagedID = pPacket->nManagedID;
|
|
|
|
|
|
Info.nWorldID = pPacket->nWorldID;
|
|
|
|
|
|
|
|
|
|
|
|
m_ChannelList.insert(std::make_pair(nKey, Info));
|
|
|
|
|
|
bNeedInclease = true;
|
|
|
|
|
|
NeedNotice = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bNeedInclease)
|
|
|
|
|
|
m_nContainerVersion++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (NeedNotice)
|
|
|
|
|
|
SendUpdateNotice(SERVERMONITOR_UPDATENOTICE_CHANNELINFO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetMasterSIDByChannelID(int nWorldID, int nChannelID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceList.begin(); ih != m_ServiceList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetServerType((*ih).second->szType) == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < WORLDCOUNTMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->cWorldIDs[i] <= 0) continue;
|
|
|
|
|
|
if ((*ih).second->cWorldIDs[i] == nWorldID)
|
|
|
|
|
|
return (*ih).second->nSID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::GetMasterSIDByGameSID(int nGameSID, int * pnMasterIDs)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
BYTE cWorldIDs[WORLDCOUNTMAX];
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nGameSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
memcpy(cWorldIDs, (*ii).second->cWorldIDs, sizeof(cWorldIDs));
|
|
|
|
|
|
else
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceList.begin(); ih != m_ServiceList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetServerType((*ih).second->szType) == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < WORLDCOUNTMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (cWorldIDs[i] <= 0) continue;
|
|
|
|
|
|
for (int h = 0; h < WORLDCOUNTMAX; h++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->cWorldIDs[h] <= 0) continue;
|
|
|
|
|
|
if (cWorldIDs[i] == (*ih).second->cWorldIDs[h])
|
|
|
|
|
|
pnMasterIDs[nCount++] = (*ih).first;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetDBWorldIDBySID (int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ih;
|
|
|
|
|
|
for (ih = m_ServiceList.begin(); ih != m_ServiceList.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetServerType((*ih).second->szType) == MANAGED_TYPE_DB)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < WORLDCOUNTMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ih).second->cWorldIDs[i] <= 0) continue;
|
|
|
|
|
|
if ((*ih).second->nSID == nSID)
|
|
|
|
|
|
return (*ih).second->cWorldIDs[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::LauncherReturn(int nNID, int nIdx, ULONG nReturnPing)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nIdx == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"NetLauncher ReturnPing [NID:%d][Gap:%d]\n", nNID, timeGetTime() - nReturnPing);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::map <int, ULONG>::iterator ii = m_LaunchetTestList.find(nNID);
|
|
|
|
|
|
if (ii != m_LaunchetTestList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LaunchetTestList.erase(ii);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::CheckTestLauncher()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
ULONG nCurTick = timeGetTime();
|
|
|
|
|
|
std::map <int, ULONG>::iterator testItor;
|
|
|
|
|
|
if (m_LaunchetTestList.size() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (testItor = m_LaunchetTestList.begin(); testItor != m_LaunchetTestList.end(); )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nCurTick > (*testItor).second + (30 * 1000))
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"NetLauncher ping return delayed [NID:%d]\n", (*testItor).first);
|
|
|
|
|
|
testItor = m_LaunchetTestList.erase(testItor);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
testItor++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"All Launcher Test OK\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SelectJoin(int nMasterSID, int nSID, const WCHAR * pwszCharacterName)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendSelectJoin(nSID, pwszCharacterName);
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"[SID:%d] Is not masterserver\n", nMasterSID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ClearSelectJoin(int nMasterSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetMID() == nMasterSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendClearSelectjoin();
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"[SID:%d] Is not masterserver\n", nMasterSID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendServiceClose(__time64_t _tOderedTime, __time64_t _tCloseTime)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_GAME || (*ii).second->GetType() == MANAGED_TYPE_VILLAGE || (*ii).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
(*ii).second->SendScheduleCloseService(_tOderedTime, _tCloseTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateSaleData()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_CASH || (*ii).second->GetType() == MANAGED_TYPE_DB || (*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
(*ii).second->SendUpdateSaleData();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateBanFile(const char * pUrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pUrl == NULL)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
char szCurPath[MAX_PATH];
|
|
|
|
|
|
GetCurrentDirectoryA(sizeof(szCurPath), szCurPath);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrUrl;
|
|
|
|
|
|
ToWideString(const_cast<CHAR*>(pUrl), wstrUrl);
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wstrDest;
|
|
|
|
|
|
ToWideString(szCurPath, wstrDest);
|
|
|
|
|
|
wstrDest.append(L"/BanFile.csv");
|
|
|
|
|
|
|
|
|
|
|
|
if (_waccess(wstrDest.c_str(), 0) != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DeleteFileW(wstrDest.c_str()) == 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_UrlUpdater.UrlUpdateUrl(wstrUrl.c_str(), wstrDest.c_str()))
|
|
|
|
|
|
{
|
|
|
|
|
|
eBanFileType eBanType = _BANTYPE_MAX;
|
|
|
|
|
|
std::vector <std_str> vBanList;
|
|
|
|
|
|
|
|
|
|
|
|
TCHAR * pFile = NULL;
|
|
|
|
|
|
pFile = ReadFile(L"BanFile.csv");
|
|
|
|
|
|
if (pFile) //<2F><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<std::wstring> tokens;
|
|
|
|
|
|
TokenizeW(pFile, tokens, L",");
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)tokens.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std_str strTempName = tokens[i];
|
|
|
|
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (strTempName == _SZACCOUNTNAMETYPE)
|
|
|
|
|
|
eBanType = _BANTYPE_ACCOUNTNAME;
|
|
|
|
|
|
else if (strTempName == _SZACCOUNTIDTYPE)
|
|
|
|
|
|
eBanType = _BANTYPE_ACCOUNTID;
|
|
|
|
|
|
else if (strTempName == _SZCHARACTERNAMETYPE)
|
|
|
|
|
|
eBanType = _BANTYPE_CHARACTERNAME;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"UserBanFile Seperater Err [:%S]\n", strTempName);
|
|
|
|
|
|
SAFE_DELETEARRAY(pFile);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (strTempName.size() > 0)
|
|
|
|
|
|
vBanList.push_back(strTempName);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETEARRAY(pFile);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <std_str>::iterator ii;
|
|
|
|
|
|
for (ii = vBanList.begin(); ii != vBanList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (eBanType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case _BANTYPE_ACCOUNTNAME:
|
|
|
|
|
|
UserBanbyAccountName((*ii).c_str());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case _BANTYPE_CHARACTERNAME:
|
|
|
|
|
|
UserBanbyCharacterName((*ii).c_str());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case _BANTYPE_ACCOUNTID:
|
|
|
|
|
|
UserBanbyAccountDBID(_wtoi((*ii).c_str()));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateFarm(int nWorldID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateFarm(nWorldID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::StartFarm()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateFarm(0, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReqUpdateFarm()
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=Farm,1"));
|
|
|
|
|
|
CGsmCmdProcess::GetInstance()->AddCmdProcess("msg=Farm,1", "farmupdated", m_CmdTable.lpFarmUpdate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateFarm()
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pServiceManager->UpdateFarm(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateFarmStatus (TServiceReportMaster* pPacket)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pPacket->nWorldID >= WORLDCOUNTMAX)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, std::vector<TFarmStatus>>& pFarmStatus = m_FarmStatus[pPacket->nWorldID];
|
|
|
|
|
|
|
|
|
|
|
|
pFarmStatus.clear();
|
|
|
|
|
|
|
|
|
|
|
|
for( int i=0; i<pPacket->cFarmCount; i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, std::vector<TFarmStatus>>::iterator managed_itor = pFarmStatus.find(pPacket->FarmStatus[i].nManagedID);
|
|
|
|
|
|
if( managed_itor == pFarmStatus.end() )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<TFarmStatus> vList;
|
|
|
|
|
|
vList.push_back(pPacket->FarmStatus[i]);
|
|
|
|
|
|
pFarmStatus.insert (std::make_pair(pPacket->FarmStatus[i].nManagedID, vList));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<TFarmStatus>::iterator farm_itor = managed_itor->second.begin();
|
|
|
|
|
|
|
|
|
|
|
|
bool bAddStatus = true;
|
|
|
|
|
|
for (; farm_itor != managed_itor->second.end(); farm_itor++)
|
|
|
|
|
|
{
|
|
|
|
|
|
TFarmStatus& pStatus = *farm_itor;
|
|
|
|
|
|
if (pStatus.nFarmDBID == pPacket->FarmStatus[i].nFarmDBID)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
bAddStatus = false;
|
|
|
|
|
|
if (pPacket->FarmStatus[i].bActivate)
|
|
|
|
|
|
pStatus.nFarmCurUserCount = pPacket->FarmStatus[i].nFarmCurUserCount;
|
|
|
|
|
|
else
|
|
|
|
|
|
pStatus.nFarmCurUserCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (bAddStatus)
|
|
|
|
|
|
managed_itor->second.push_back(pPacket->FarmStatus[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::UpdateGuildWarSchedule()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateGuildWarSchedule();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendUpdateGuildWare(int nGuildID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateGuildWare(nGuildID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::IsService()
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bFlag = false;
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->nState == _SERVICE_STATE_CREATE || (*ii).second->nState == _SERVICE_STATE_ONLINE)
|
|
|
|
|
|
{
|
|
|
|
|
|
bFlag = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
return bFlag;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::IsService(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bFlag = false;
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nState == _SERVICE_STATE_CREATE || (*ii).second->nState == _SERVICE_STATE_ONLINE)
|
|
|
|
|
|
bFlag = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
return bFlag;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReportServiceInfoLogin(int nSID, int nLoginUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=SInfo,%d,%d"), nSID, nLoginUser);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReportServiceInfoVillage(int nSID, UINT nUserCount, int nCnt, TVillageUserReport * pReport)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
INT64 nKey = 0;
|
|
|
|
|
|
for (int i = 0; i < nCnt; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
nKey = MAKE_SM_SVRCHN(nSID, pReport[i].nChannelID);
|
|
|
|
|
|
std::map <INT64, tMonitorChannelInfo>::iterator itor = m_ChannelList.find(nKey);
|
|
|
|
|
|
if (itor != m_ChannelList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
(*itor).second.Info.nCurrentUserCount = pReport[i].nChannelUserCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
char szCmdBuf[4096];
|
|
|
|
|
|
memset(szCmdBuf, 0, sizeof(szCmdBuf));
|
|
|
|
|
|
sprintf(szCmdBuf, "msg=SInfo,%d,%d,%d,", nSID, nUserCount, nCnt);
|
|
|
|
|
|
|
|
|
|
|
|
int nLen = (int)strlen(szCmdBuf);
|
|
|
|
|
|
memcpy_s(szCmdBuf + nLen, sizeof(szCmdBuf) - (nLen + 2), pReport, sizeof(TVillageUserReport) * nCnt);
|
|
|
|
|
|
SendPacketToGsm(szCmdBuf, nLen + sizeof(TVillageUserReport) * nCnt);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReportServiceMaster(int nSID, int nWorldID, UINT nWaitUserCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
SendPacketToGsm(L"msg=WInfo,%d,%d", nWorldID, nWaitUserCount);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ReportServiceInfoGame(int nSID, UINT nUserCount, UINT nRoomCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(L"msg=SInfo,%d,%d,%d", nSID, nUserCount, nRoomCount);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReportedServiceClosed(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"ReportedService Closed MID[%d]\n", nSID);
|
|
|
|
|
|
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::vector <_CLOSESERVICE>::iterator in;
|
|
|
|
|
|
for (in = m_CloseServieList.begin(); in != m_CloseServieList.end(); in++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*in).nMID == nSID)
|
|
|
|
|
|
(*in).nTerminateTick = timeGetTime();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::LauncherConnected(CLauncherSession * pSession)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
//1<><31>
|
|
|
|
|
|
std::vector <TServerExcuteData> vExeList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetExeCommandList(pSession->GetSessionID(), &vExeList);
|
|
|
|
|
|
bool bOther = CDataManager::GetInstance()->IsNeedOtherExcutePath(pSession->GetSessionID());
|
|
|
|
|
|
pSession->SendManagingExeItem(&vExeList, bOther);
|
|
|
|
|
|
|
|
|
|
|
|
//2<><32> <20><><EFBFBD><EFBFBD> <20>ٲٸ<D9B2> <20>ȵ<EFBFBD>~
|
|
|
|
|
|
std::list <char> lList;
|
|
|
|
|
|
CDataManager::GetInstance()->GetAssingedPatchTypeList(pSession->GetSessionID(), &lList);
|
|
|
|
|
|
pSession->SendConnectedResult(&lList, g_Config.wszPatchBaseURL, g_Config.wszPatchURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::VerifyPatcher(const char * pIP)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::vector <CPatcherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_vPatcherSessionList.begin(); ii != m_vPatcherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!strcmp((*ii)->GetIp(), pIP))
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::IsCloseService(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
if (nSID == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool bCheck = m_CloseServieList.empty() ? false : true;
|
|
|
|
|
|
return bCheck;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <_CLOSESERVICE>::iterator ii;
|
|
|
|
|
|
for (ii = m_CloseServieList.begin(); ii != m_CloseServieList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).nMID == nSID)
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::ExcuteProcess(const TServerExcuteData * pExe, bool bForcePatch)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
ii = m_LauncherSessionList.find(pExe->nAssignedLauncherID);
|
|
|
|
|
|
if (ii != m_LauncherSessionList.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
sServiceState * pState = GetServiceState(pExe->nSID);
|
|
|
|
|
|
if (pState && pState->nState != _SERVICE_STATE_CREATE && pState->nState != _SERVICE_STATE_ONLINE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendRunProcess(pExe->nSID, pExe->nCreateCount, pExe->nCreateIndex, pExe->wszType, pExe->wstrExcuteData.c_str(), bForcePatch);
|
|
|
|
|
|
s_ExcuteLog.Log(LogType::_FILELOG, L"ExcuteParam[%s]\n", pExe->wstrExcuteData.c_str());
|
|
|
|
|
|
pState->Init();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"Service Already Online SID[%d]\n", pExe->nSID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"NetLauncher Offline ID[%d]\n", pExe->nAssignedLauncherID);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::MakeServiceList(int nSID, int nNetLauncherID, const TCHAR * pType, bool bForce)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetServiceState(nSID) != NULL)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
sServiceState * pState = new sServiceState;
|
|
|
|
|
|
memset(pState, 0, sizeof(sServiceState));
|
|
|
|
|
|
|
|
|
|
|
|
pState->nSID = nSID;
|
|
|
|
|
|
pState->nManagedLauncherID = nNetLauncherID;
|
|
|
|
|
|
pState->nState = bForce == false ? _SERVICE_STATE_OFFLINE : _SERVICE_STATE_ONLINE;
|
|
|
|
|
|
_tcscpy_s(pState->szType, pType);
|
|
|
|
|
|
pState->bIsReConnect = false;
|
|
|
|
|
|
m_ServiceList[pState->nSID] = pState;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::MakeWorldList()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetServerType((*ii).second->szType) == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand((*ii).second->nSID);
|
|
|
|
|
|
if (pExe)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nWorldID = 0;
|
|
|
|
|
|
GetFirstRightIntValue(L"mwi", pExe->wstrExcuteData.c_str(), nWorldID);
|
|
|
|
|
|
(*ii).second->cWorldIDs[0] = nWorldID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
const TServerExcuteData * pExe = CDataManager::GetInstance()->GetCommand((*ii).second->nSID);
|
|
|
|
|
|
if (pExe == NULL) continue;
|
|
|
|
|
|
|
|
|
|
|
|
switch (GetServerType((*ii).second->szType))
|
|
|
|
|
|
{
|
|
|
|
|
|
//case MANAGED_TYPE_LOGIN:
|
|
|
|
|
|
/*case MANAGED_TYPE_DB:
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <std::wstring>::const_iterator ih;
|
|
|
|
|
|
for (ih = pExe->strMasterCon.begin(); ih != pExe->strMasterCon.end(); ih++)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<std::wstring> tokens;
|
|
|
|
|
|
TokenizeW((*ih), tokens, L" ");
|
|
|
|
|
|
|
|
|
|
|
|
if (_wtoi(tokens[0].c_str()) > 0)
|
|
|
|
|
|
(*ii).second->cWorldIDs[nCount++] = _wtoi(tokens[0].c_str());
|
|
|
|
|
|
else if (_wtoi(tokens[0].c_str()) <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nLast = _wtoi(tokens[1].c_str());
|
|
|
|
|
|
for (int i = 0; i < nLast; i++)
|
|
|
|
|
|
(*ii).second->cWorldIDs[nCount++] = i+1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;*/
|
|
|
|
|
|
case MANAGED_TYPE_DB:
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wstrTempWorld;
|
|
|
|
|
|
GetValueCount(L"wdb", pExe->wstrExcuteData, nCount);
|
|
|
|
|
|
for (int h = 0; h < nCount; h++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetRightValueByIndex(L"wdb", pExe->wstrExcuteData, h, wstrTempWorld))
|
|
|
|
|
|
(*ii).second->cWorldIDs[h] = _wtoi(wstrTempWorld.c_str());
|
|
|
|
|
|
else
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[MakeWorldList] Can't find wdb");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MANAGED_TYPE_VILLAGE:
|
|
|
|
|
|
{
|
|
|
|
|
|
int nVMID = 0;
|
|
|
|
|
|
if (GetFirstRightIntValue(L"vwid", pExe->wstrExcuteData.c_str(), nVMID) == false)
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[MakeWorldList] Can't find vwid");
|
|
|
|
|
|
(*ii).second->cWorldIDs[0] = nVMID;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MANAGED_TYPE_GAME:
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wstrTempWorld;
|
|
|
|
|
|
GetValueCount(L"gwid", pExe->wstrExcuteData, nCount);
|
|
|
|
|
|
for (int h = 0; h < nCount; h++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetRightValueByIndex(L"gwid", pExe->wstrExcuteData, h, wstrTempWorld))
|
|
|
|
|
|
(*ii).second->cWorldIDs[h] = _wtoi(wstrTempWorld.c_str());
|
|
|
|
|
|
else
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[MakeWorldList] Can't find gwid");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MANAGED_TYPE_CASH:
|
|
|
|
|
|
{
|
|
|
|
|
|
int nCashID = 0;
|
|
|
|
|
|
if (GetFirstRightIntValue(L"cwid", pExe->wstrExcuteData.c_str(), nCashID) == false)
|
|
|
|
|
|
_ASSERT_EXPR(0, L"[MakeWorldList] Can't find cwid");
|
|
|
|
|
|
(*ii).second->cWorldIDs[0] = nCashID;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sServiceState * CServiceManager::GetServiceState(int nSID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii = m_ServiceList.find(nSID);
|
|
|
|
|
|
if (ii != m_ServiceList.end())
|
|
|
|
|
|
return (*ii).second;
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sServiceState * CServiceManager::GetServiceStateByServiceSession(int nServiceSessionID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->nServiceSessionID == nServiceSessionID)
|
|
|
|
|
|
return (*ii).second;
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetNeedResType(int nNetLauncherID)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nRet = 0; //0 <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> 1 VillageRes 2 GameRes
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->nManagedLauncherID == nNetLauncherID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_tcsstr((*ii).second->szType, _T("Game")))
|
|
|
|
|
|
nRet = 2;
|
|
|
|
|
|
else if (_tcsstr((*ii).second->szType, _T("Login")) || _tcsstr((*ii).second->szType, _T("Master")) || _tcsstr((*ii).second->szType, _T("Village")) || _tcsstr((*ii).second->szType, _T("DB")))
|
|
|
|
|
|
nRet = nRet >= 2 ? 2 : 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return nRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::DeleteManagedService(int nNetLauncherID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->nManagedLauncherID == nNetLauncherID)
|
|
|
|
|
|
(*ii).second->Init();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ClearList()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, sServiceState*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceList.begin(); ii != m_ServiceList.end(); ii++)
|
|
|
|
|
|
SAFE_DELETE((*ii).second);
|
|
|
|
|
|
m_ServiceList.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendPatchStart(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->SendPatchStart();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendPatch(int nNID, const WCHAR * pKey, int nPatchID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if ((*ii).second->SendPatch(pKey, GetNeedResType((*ii).second->GetSessionID()), nPatchID))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_PatchWatcher.AddWatchContent(nPatchID, (*ii).second->GetSessionID(), pKey) == false)
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"SendPatch Fail Check netlauncher [NID:%d][IP:%S]\n", (*ii).second->GetSessionID(), (*ii).second->GetIp());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::SendPatchEachItem(int nNID, const WCHAR * pURL, const WCHAR * pDest)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
char szTempURL[512];
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, pURL, -1, szTempURL, 512, NULL, NULL);
|
|
|
|
|
|
if (m_PatchWatcher.AddWatchContent(m_nPatchID, (*ii).second->GetSessionID(), L"Live"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->SendPatchByUrl(m_nPatchID, szTempURL, L"Live", true, pDest) == false)
|
|
|
|
|
|
g_Log.Log(LogType::_ERROR, L"LivePatchError [NID:%d] [IP:%s] [Url:%s]\n", (*ii).second->GetSessionID(), (*ii).second->GetwszIp(), pURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
int nPatchTemp = m_nPatchID;
|
|
|
|
|
|
m_nPatchID++;
|
|
|
|
|
|
return nPatchTemp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendPatchEnd(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->SendPatchEnd();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendInfoCopy(int nNID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CLauncherSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_LauncherSessionList.begin(); ii != m_LauncherSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nNID > 0 && (*ii).second->GetSessionID() != nNID)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
(*ii).second->SendInfoCopy(CDataManager::GetInstance()->IsNeedOtherExcutePath((*ii).first));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendCreatEachDB(int nWorldID)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
(*ii).second->SendCreatEachDB(nWorldID);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendReloadGuildwar(int nWorldID)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_MASTER)
|
|
|
|
|
|
(*ii).second->SendReloadSchedule(nWorldID);
|
|
|
|
|
|
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendChangeLimiteItemMax(int nSN, int nLimitMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_CASH)
|
|
|
|
|
|
(*ii).second->SendChangeLimitedItemMax(nSN, nLimitMax);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::AmountTokenizedString(char * pExtStr, int nExtMaxSize, std::vector<std::string> &vStr, int nStartCount, int nEndCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nLen = 0;
|
|
|
|
|
|
for (int i = nStartCount; i < (int)vStr.size() && i < nEndCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nTempLen = (int)strlen(vStr[i].c_str());
|
|
|
|
|
|
if (nTempLen + nLen >= nExtMaxSize)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
_strcpy(pExtStr+nLen, vStr[i].c_str(), nTempLen);
|
|
|
|
|
|
nLen += nTempLen;
|
|
|
|
|
|
pExtStr[nLen++] = ' ';
|
|
|
|
|
|
}
|
|
|
|
|
|
if(nLen < nExtMaxSize)
|
|
|
|
|
|
pExtStr[nLen] = '\0';
|
|
|
|
|
|
else
|
|
|
|
|
|
return false;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetServiceCount(int nServiceType, std::map <UINT, int> * pmList)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Need Sync
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == nServiceType)
|
|
|
|
|
|
{
|
|
|
|
|
|
pmList->insert(std::make_pair((*ii).second->GetMID(), (*ii).second->GetType()));
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetVillageServiceCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
//Need Sync
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CServiceManager::GetGameServiceCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
//Need Sync
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_GAME)
|
|
|
|
|
|
nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::GetChannelInfo(int nChannelID, short & nMeritID, int & nLimitLevel, bool & bVisibility, bool & bShow)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Need Sync
|
|
|
|
|
|
std::map <INT64, tMonitorChannelInfo>::iterator ii;
|
|
|
|
|
|
for (ii = m_ChannelList.begin(); ii != m_ChannelList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second.Info.nChannelID == nChannelID)
|
|
|
|
|
|
{
|
|
|
|
|
|
nMeritID = (*ii).second.Info.nMeritBonusID;
|
|
|
|
|
|
nLimitLevel = (*ii).second.Info.nLimitLevel;
|
|
|
|
|
|
bVisibility = (*ii).second.Info.bVisibility;
|
|
|
|
|
|
bShow = (*ii).second.Info.bShow;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReportToGSMServiceState(int nSID, int nServiceState, const char * pVersion, const char * pRevision)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (nServiceState)
|
|
|
|
|
|
{
|
|
|
|
|
|
case _SERVICE_STATE_OFFLINE:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,Terminated"), nSID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case _SERVICE_STATE_CREATE:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,Create"), nSID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case _SERVICE_STATE_ONLINE:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,Online,%S,%S"), nSID, pVersion, pRevision);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case _SERVICE_STATE_TERMINATED:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPacketToGsm(_T("msg=PInfo,%d,Terminated"), nSID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReportToMonitorServiceState(int nSID, int nServiceState, int nServiceException, const char * pDetail)
|
|
|
|
|
|
{
|
|
|
|
|
|
//NeedSync
|
|
|
|
|
|
std::vector <CMonitorSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_MonitorSessionList.begin(); ii != m_MonitorSessionList.end(); ii++)
|
|
|
|
|
|
(*ii)->SendUpdateServerState(nSID, nServiceState, nServiceException, pDetail);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::AddServerDelayMID(int nType, int nMID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_vServerDelayMIDs[nType].size() > SERVICEMANAGER_SERVERDEALY_SIZE)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_vServerDelayMIDs[nType].push_back(nMID);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::ReportToMonitorServerDelay(int nType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_vServerDelayMIDs[nType].size() <= 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
//NeedSync
|
|
|
|
|
|
std::vector <CMonitorSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_MonitorSessionList.begin(); ii != m_MonitorSessionList.end(); ii++)
|
|
|
|
|
|
(*ii)->SendServerDelayInfo(nType, m_vServerDelayMIDs[nType]);
|
|
|
|
|
|
m_vServerDelayMIDs[nType].clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::SendPacketToGsm(const WCHAR * fmt, ...)
|
|
|
|
|
|
{
|
|
|
|
|
|
WCHAR buf[4096];
|
|
|
|
|
|
va_list arg;
|
|
|
|
|
|
va_start(arg, fmt);
|
|
|
|
|
|
_vsntprintf(buf, _countof(buf), fmt, arg);
|
|
|
|
|
|
|
|
|
|
|
|
char szMsg[4096];
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, buf, -1, szMsg, 4096, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
bool bRet = SendPacketToGsm(szMsg, (int)strlen(szMsg));
|
|
|
|
|
|
|
|
|
|
|
|
va_end(arg);
|
|
|
|
|
|
return bRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::SendPacketToGsm(char * fmt, int nSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_bHttpSendFail)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_nHttpFailTick + (60 * 1000) > timeGetTime())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bHttpSendFail = false;
|
|
|
|
|
|
m_nHttpFailTick = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_SYNCGSMTASK task;
|
|
|
|
|
|
memset(&task, 0, sizeof(_SYNCGSMTASK));
|
|
|
|
|
|
|
|
|
|
|
|
task.nSize = (short)(nSize + sizeof(short));
|
|
|
|
|
|
STRCPYA(task.szMsg, 4096, fmt);
|
|
|
|
|
|
|
|
|
|
|
|
m_pStoredPacketBuffer->Lock();
|
|
|
|
|
|
|
|
|
|
|
|
int nRet = m_pStoredPacketBuffer->Push(&task, task.nSize);
|
|
|
|
|
|
if (nRet < 0)
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
m_pStoredPacketBuffer->UnLock();
|
|
|
|
|
|
g_pServiceServer->AddSyncCall();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TCHAR * CServiceManager::ReadFile(const TCHAR * fname)
|
|
|
|
|
|
{
|
|
|
|
|
|
char * ptr;
|
|
|
|
|
|
int len;
|
|
|
|
|
|
|
|
|
|
|
|
FILE *fp;
|
|
|
|
|
|
fp = _tfopen(fname, _T("rb"));
|
|
|
|
|
|
if (fp == NULL)
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
fseek(fp, 0, SEEK_END);
|
|
|
|
|
|
len = ftell(fp);
|
|
|
|
|
|
if( len < 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
fseek(fp, 0, SEEK_SET);
|
|
|
|
|
|
ptr = new char [len+2];
|
|
|
|
|
|
fread(ptr, 1, len, fp);
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
|
|
|
|
ptr[len] = '\0';
|
|
|
|
|
|
ptr[len+1] = '\0';
|
|
|
|
|
|
|
|
|
|
|
|
static unsigned char _unicodeset[] = {
|
|
|
|
|
|
0xff, 0xfe
|
|
|
|
|
|
} ;
|
|
|
|
|
|
if (!memcmp(ptr, _unicodeset, 2))
|
|
|
|
|
|
{ // <09><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#ifdef UNICODE
|
|
|
|
|
|
TCHAR * wptr = new TCHAR [(len-2) / sizeof(TCHAR) + 1];
|
|
|
|
|
|
memcpy(wptr, &ptr[2], (len+2) - 2);
|
|
|
|
|
|
delete [] ptr;
|
|
|
|
|
|
return wptr;
|
|
|
|
|
|
#else
|
|
|
|
|
|
char * bptr = new char [len*2 + 1];
|
|
|
|
|
|
memset(bptr, 0, len*2 + 1);
|
|
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)&ptr[2], (len-2)/2, bptr, len*2 + 1, NULL, NULL);
|
|
|
|
|
|
delete [] ptr;
|
|
|
|
|
|
return bptr;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
} else
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef UNICODE
|
|
|
|
|
|
TCHAR * wptr = new TCHAR [len + 1];
|
|
|
|
|
|
memset(wptr, 0, sizeof(TCHAR) * (len+1));
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, ptr, len, wptr, len+1);
|
|
|
|
|
|
delete [] ptr;
|
|
|
|
|
|
return wptr;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return ptr;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendUpdateWorldPvPRoom()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateWorldPvPRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendCreateGambleRoom(int nRoomIndex, int nRegulation, int nGambleType, int nPrice )
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendCreateGambleRoom( nRoomIndex, nRegulation, nGambleType, nPrice);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendStopGambleRoom()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendStopGambleRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendDelGambleRoom()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendDelGambleRoom();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::SendUpdateDWCStatus()
|
|
|
|
|
|
{
|
|
|
|
|
|
ScopeLock <CSyncLock> sync(m_Sync);
|
|
|
|
|
|
|
|
|
|
|
|
std::map <UINT, CServiceSession*>::iterator ii;
|
|
|
|
|
|
for (ii = m_ServiceSessionList.begin(); ii != m_ServiceSessionList.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((*ii).second->GetType() == MANAGED_TYPE_VILLAGE || (*ii).second->GetType() == MANAGED_TYPE_LOGIN)
|
|
|
|
|
|
{
|
|
|
|
|
|
(*ii).second->SendUpdateDWCStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_SERVICEMANAGER_EX)
|
|
|
|
|
|
bool CServiceManager::IsStartAllLauncherAndContinue(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
int nNotConnectCnt = CDataManager::GetInstance()->GetLauncherCount() - (int)m_LauncherSessionList.size();
|
|
|
|
|
|
if(nNotConnectCnt > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( AfxMessageBox(L"Find Offline Launcher!\nPatch Conitnue?", MB_YESNO) == IDNO)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
bool CServiceManager::IsRunLauncher(void){
|
|
|
|
|
|
if(m_LauncherSessionList.empty())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
void CServiceManager::GetPartitionList(OUT vector<const TPartitionInfo*>& list) const
|
|
|
|
|
|
{
|
|
|
|
|
|
CDataManager::GetInstance()->GetPartitionList(list);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetPartitionText(OUT wchar_t text[256]) const
|
|
|
|
|
|
{
|
|
|
|
|
|
CDataManager::GetInstance()->GetPartitionText(text);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetWorldList(OUT vector<const TServerInfo*>& list) const
|
|
|
|
|
|
{
|
|
|
|
|
|
CDataManager::GetInstance()->GetWorldList(list);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetLauncherList(OUT vector<const TNetLauncher*>& list) const
|
|
|
|
|
|
{
|
|
|
|
|
|
CDataManager::GetInstance()->GetLauncherList(list);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetServiceServerList(OUT vector<const sServiceState*>& list) const
|
|
|
|
|
|
{
|
|
|
|
|
|
for each (map<int, sServiceState*>::value_type v in m_ServiceList)
|
|
|
|
|
|
{
|
|
|
|
|
|
list.push_back(v.second);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TDefaultServerInfo& CServiceManager::GetDefaultServerInfo() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return CDataManager::GetInstance()->GetDefaultServerInfo();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TDefaultDatabaseInfo& CServiceManager::GetDefaultDatabaseInfo() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return CDataManager::GetInstance()->GetDefaultDatabaseInfo();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TServerInfo* CServiceManager::GetWorldInfo(int id) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return CDataManager::GetInstance()->GetServerInfo(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TNetLauncher* CServiceManager::GetLauncherInfo(int id) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return CDataManager::GetInstance()->GetLauncherInfobyID(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TServerExcuteData* CServiceManager::GetServerExecuteData(int id) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return CDataManager::GetInstance()->GetCommand(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::GetActiveLaunchers(OUT vector<int>& list) const
|
|
|
|
|
|
{
|
|
|
|
|
|
for each (map<UINT, CLauncherSession*>::value_type v in m_LauncherSessionList)
|
|
|
|
|
|
{
|
|
|
|
|
|
list.push_back(v.first);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CServiceManager::IsLauncherConnected(int id) const
|
|
|
|
|
|
{
|
|
|
|
|
|
map<UINT, CLauncherSession*>::const_iterator it = m_LauncherSessionList.find(id);
|
|
|
|
|
|
if (it == m_LauncherSessionList.end())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnPatchStart()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnPatchStart();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnPatchProgress(int id, const wchar_t* key, unsigned long progress, unsigned long progressMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnPatchProgress(id, key, progress, progressMax);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnPatchEnd()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnPatchEnd(m_bPatchComplete);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnUnzipProgress(int id, const wchar_t* filename, unsigned long progress, unsigned long progressMax)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnUnzipProgress(id, filename, progress, progressMax);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnWorldMaxUser(int id, int maxUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnWorldMaxUser(id, maxUser);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnPatchFail(int id, const wchar_t* msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnPatchFail(id, msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnPatchCompleted(int id)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnPatchCompleted(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::BuildExceptionReport(size_t days, wstring& buffer) const
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->ReportExceptionToBuffer(days, buffer);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::OnCommandPatch()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pApp->OnCommandPatch();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CServiceManager::InitializeCommand()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Commands.clear();
|
|
|
|
|
|
|
|
|
|
|
|
m_Commands.insert(make_pair(L"makeselfdump", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"testgsm", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"reload", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"reloaduser", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"resetclose", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"start", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"starteach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"starteachbylauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopforce", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopforceeach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopforceeachbylauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopall", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"cancelstop", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopdb", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopeach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopeachbylauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchurl", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchstruct", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchinfo", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchsystem", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchconfig", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchexe", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchfull", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchapply", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"infocopy", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchdyncode", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchcash", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"cancelpatchcash", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"filelist", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"notice", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"noticeall", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"noticechannel", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"noticeserver", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"noticezone", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"cancelnotice", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"worldmaxuser", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"channelcontrol", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"populationcontrol", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"affinitycontrol", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"eventupdate", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"makedumpall", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"makedumpeach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"reservenotice", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"userban", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"userbanid", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"restraint", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"startlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stoplauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"starteachlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopeachlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchlaunchereach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"checkpatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"clearpatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"checklauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"testlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"checktestlauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"reloaddyncode", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"checkalivelauncher", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"selectjoin", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"clearselectjoin", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"updatesale", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"patchbatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"runbatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"runbatcheach", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"stopbatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"checkbatch", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"userbanfile", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"farmupdate", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"farmupdated", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"farmstart", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"guildwarupdate", 0));
|
|
|
|
|
|
m_Commands.insert(make_pair(L"createdb", 0));
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined (_SERVICEMANAGER_EX)
|