DragonNest/Server/ServiceManagerEx/ServiceManagerEx.cpp

552 lines
29 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>// ServiceManagerEx.cpp : ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O<EFBFBD>O <EFBFBD>c<EFBFBD> <EFBFBD>R0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>`/}<EFBFBD> <EFBFBD>l<EFBFBD>r<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
//
#include "stdafx.h"
#include "ServiceManagerEx.h"
#include "MainFrm.h"
#include "ServiceManagerExDoc.h"
#include "ServiceManagerExView.h"
#include "ServiceServer.h"
#include "Log.h"
#include "DataManager.h"
#include "DNBAM.h"
#include "IniFile.h"
#include "Version.h"
#include "MainSplit.h"
#include "LogViewDisplayer.h"
#include "LogBuilder.h"
#include "LogSplit.h"
#include "Scheduler.h"
#include "ServerReporter.h"
#include <sstream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
extern TServiceManagerConfig g_Config;
extern CServiceServer * g_pServiceServer;
extern CLog g_Log;
extern CLog s_CountLog;
extern CLog g_ExceptionReportLog;
extern CLog g_DBDelayLog;
extern CLog s_ExcuteLog;
extern CLog g_GameDelayLog;
extern CLog g_VillageDelayLog;
extern CLog g_DBErrorLog;
extern CLog g_DBSystemErrorLog;
extern CLog g_MonitorLog;
extern CLog g_FileLog;
// ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O <EFBFBD>l
q<EFBFBD>O d<EFBFBD><EFBFBD>O{v<EFBFBD>~ CAboutDlg <EFBFBD>c<EFBFBD>b <EFBFBD>`<EFBFBD>x<EFBFBD>mj<EFBFBD><EFBFBD>O.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// <EFBFBD>c<EFBFBD>b <EFBFBD>`<EFBFBD>x US^c<EFBFBD>x<EFBFBD>mj<EFBFBD><EFBFBD>O.
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV $v<EFBFBD>v<EFBFBD>mj<EFBFBD><EFBFBD>O.
// Y<EFBFBD>l<EFBFBD>mj<EFBFBD><EFBFBD>O.
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CServiceManagerExApp
BEGIN_MESSAGE_MAP(CServiceManagerExApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CServiceManagerExApp::OnAppAbout)
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ab<EFBFBD>j<EFBFBD><EFBFBD> <EFBFBD>z<EFBFBD>~ <EFBFBD>]<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>mj<EFBFBD><EFBFBD>O.
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
// <EFBFBD><EFBFBD><EFBFBD> br\ rl<EFBFBD>l <EFBFBD><EFBFBD>mj<EFBFBD><EFBFBD>O.
ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// CServiceManagerExApp <EFBFBD>y<EFBFBD>]
CServiceManagerExApp::CServiceManagerExApp()
: m_pLogDisplayer(NULL), m_hMutex(NULL)
{
// TODO: <EFBFBD>TAb<EFBFBD>O <EFBFBD>y<EFBFBD>] <EFBFBD>Q[<EFBFBD>+u wJU<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// InitInstance<EFBFBD>O [<EFBFBD>5u T8Y<EFBFBD> <EFBFBD>jAb<EFBFBD>b /}<EFBFBD><EFBFBD><EFBFBD> Exyd<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
}
CServiceManagerExApp::~CServiceManagerExApp()
{
}
// !<EFBFBD><EFBFBD><EFBFBD> CServiceManagerExApp <EFBFBD>O w<EFBFBD>mj<EFBFBD><EFBFBD>O.
CServiceManagerExApp theApp;
int CServiceManagerExApp::ExitInstance(){
//<EFBFBD><EFBFBD>
_ MQ<EFBFBD>NUO<EFBFBD>x <EFBFBD><EFBFBD>z <EFBFBD><EFBFBD>~ <EFBFBD>w/}
g_Log.SetDisplayer(NULL);
m_GSMServer.Close();
if(g_pServiceServer)
g_pServiceServer->Close();
SAFE_DELETE(g_pServiceServer);
SAFE_DELETE(m_pLogDisplayer);
m_Scheduler.Clear();
m_ConfigEx.Reset();
::ReleaseMutex(m_hMutex);
return CWinApp::ExitInstance();
}
// CServiceManagerExApp <EFBFBD>jAb<EFBFBD>b
BOOL CServiceManagerExApp::InitInstance()
{
m_hMutex = ::CreateMutex(NULL, TRUE, L"ServiceManagerEx");
if (::GetLastError() == ERROR_ALREADY_EXISTS)
{
::AfxMessageBox(L"ServiceManagerEx is already running.");
return FALSE;
}
SetMiniDump();
LoadConfigEx();
CLogBuilder::Initialize();
// ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O <EFBFBD>ij<EFBFBD>vQ<EFBFBD><EFBFBD>ؘJU ComCtl32.dll <EFBFBD>n<EFBFBD>P 6 ^c<EFBFBD>`<EFBFBD> d<EFBFBD><EFBFBD>O<EFBFBD>z<EFBFBD>T <EFBFBD>S<EFBFBD>gP <EFBFBD><EFBFBD>%<EFBFBD><EFBFBD><EFBFBD>
// d<EFBFBD><EFBFBD>O<EFBFBD>zch<EFBFBD>^ $v<EFBFBD>l<EFBFBD>z<EFBFBD>~ Hr<EFBFBD>_, Windows XP <EFBFBD>`<EFBFBD>O<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>[<EFBFBD><EFBFBD>w InitCommonControlsEx()JU <EFBFBD><EFBFBD>8Y<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// InitCommonControlsEx()+u d<EFBFBD><EFBFBD>O<EFBFBD>z$v <EFBFBD><EFBFBD>hd <EFBFBD><EFBFBD><EFBFBD> 6r8u P<EFBFBD> <EFBFBD>~<EFBFBD>Vj<EFBFBD><EFBFBD>O.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O<EFBFBD>O<EFBFBD><EFBFBD> d<EFBFBD><EFBFBD>ON [<EFBFBD>5u <EFBFBD>P<EFBFBD>O grؘ9<EFBFBD> <EFBFBD>R0<EFBFBD><EFBFBD><EFBFBD>+u hV<EFBFBD>z<EFBFBD>zch<EFBFBD>^
// ^c <EFBFBD>N<h<EFBFBD> rl<EFBFBD>l<EFBFBD>z<EFBFBD>~<EFBFBD>wwW.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// OLE |b^c<EFBFBD>[<EFBFBD>w<EFBFBD>^+u <EFBFBD>jAb<EFBFBD>b<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>jAb<EFBFBD>b
// ^c8u Ab<EFBFBD>t<EFBFBD> d<EFBFBD><EFBFBD>O<EFBFBD>z$v <EFBFBD><EFBFBD><EFBFBD>~ %_<EFBFBD><EFBFBD> ҉R<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>r <EFBFBD>QAb+u 4N^c<EFBFBD>Yd
// R<EFBFBD>0<EFBFBD><EFBFBD>O<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>8Y <EFBFBD>~<EFBFBD>~ o<EFBFBD>l <EFBFBD>jAb<EFBFBD>b
// Θ<EFBFBD>Q<EFBFBD> <EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>ywQ <EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// <EFBFBD>y<EFBFBD>[ rl<EFBFBD>l^c <EFBFBD>S<EFBFBD>SI{ m<EFBFBD>$v<EFBFBD><EFBFBD>ؘ<EFBFBD>^ P<EFBFBD>+u <EFBFBD>QHr<EFBFBD>z<EFBFBD>~<EFBFBD>wwW.
// TODO: ^c <EFBFBD>]<EFBFBD>x<EFBFBD>Q<EFBFBD> <EFBFBD><EFBFBD>d<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>~ <EFBFBD>pAm<EFBFBD>r ^c<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>{
// )R<EFBFBD>O<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Oh<EFBFBD><EFBFBD> P<EFBFBD><EFBFBD>l<EFBFBD>ywQ <EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
SetRegistryKey(_T("<00><><EFBFBD>b ȉ<>O Gj<47><6A>
_O <EFBFBD>NǏd<EFBFBD><EFBFBD>O<EFBFBD><EFBFBD> <EFBFBD>y<EFBFBD>]I{ ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O"));
LoadStdProfileSettings(4); // MRU+u hV<EFBFBD>z<EFBFBD>z<EFBFBD>T <EFBFBD><EFBFBD><EFBFBD> INI <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>S<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>[<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O<EFBFBD>r <EFBFBD>]<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>re Y<EFBFBD> <EFBFBD>k<EFBFBD>^<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O. <EFBFBD>]<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>re Y<EFBFBD>{
// <EFBFBD>]<EFBFBD><EFBFBD>, Gjm<EFBFBD><EFBFBD>p <EFBFBD><EFBFBD> <EFBFBD>h p<EFBFBD> d<EFBFBD>^c<EFBFBD>r wi,d _N<EFBFBD> <EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CServiceManagerExDoc),
RUNTIME_CLASS(CMainFrame), // <EFBFBD>g SDI Gjm<EFBFBD><EFBFBD>p <EFBFBD><EFBFBD><EFBFBD>mj<EFBFBD><EFBFBD>O.
RUNTIME_CLASS(CServiceManagerExView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// <EFBFBD><EFBFBD><EFBFBD> 9Y <EFBFBD>, DDE, <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>QAb<EFBFBD>O <EFBFBD>c<EFBFBD> <EFBFBD>uޘ4N<EFBFBD> Y<EFBFBD>] <EFBFBD>vM|<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// <EFBFBD>uޘ4N<EFBFBD>O $v<EFBFBD>lI{ <EFBFBD><EFBFBD> <EFBFBD>S<EFBFBD><EFBFBD><EFBFBD><EFBFBD>yd<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O^c /RegServer, /Register, /Unregserver <EFBFBD><EFBFBD><EFBFBD>~ /Unregister<EFBFBD><EFBFBD> <EFBFBD>w/}I{ Hr<EFBFBD>_ FALSE+u <EFBFBD><EFBFBD>8R<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
if (!InitServiceManager())
return FALSE;
//Sleep(1000);
if (!CreateDisplayer())
return FALSE;
BuildSchedule();
BuildView();
RefreshStateView();
// <EFBFBD><EFBFBD> <EFBFBD>z1U6r <EFBFBD>jAb<EFBFBD>b{h<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ^c+u <EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>z<EFBFBD>~ <EFBFBD><EFBFBD>US^<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
m_pMainWnd->SetWindowTextW(L"ServiceManagerEx");
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
// <EFBFBD>z<EFBFBD>Vd<EFBFBD>JU PN<EFBFBD> Hr<EFBFBD>_<EFBFBD>O6r DragAcceptFiles+u <EFBFBD><EFBFBD>MQ<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
// SDI ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD>~ ProcessShellCommand v<EFBFBD><EFBFBD>O ^c<EFBFBD>w<EFBFBD> <EFBFBD><EFBFBD>MQ^c <EFBFBD>`<EFBFBD>y<EFBFBD>ywQ <EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
return TRUE;
}
bool CServiceManagerExApp::LoadConfig()
{
wstring wszFileName = L"./Config/DNServiceManager.ini"; // <EFBFBD><EFBFBD>`
if (!g_IniFile.Open(wszFileName.c_str())){
g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\n", wszFileName.c_str());
return false;
}
memset(&g_Config, 0, sizeof(TServiceManagerConfig));
g_IniFile.GetValue(L"Region", L"RegionInfo", g_Config.wszRegion);
g_IniFile.GetValue(L"Connection", L"NetLauncherPort", &g_Config.nLauncherPort);
g_IniFile.GetValue(L"Connection", L"ServicePort", &g_Config.nServicePort);
g_IniFile.GetValue(L"Connection", L"ServicePatcherPort", &g_Config.nServicePatcherPort);
g_IniFile.GetValue(L"Connection", L"GSMPort", &g_Config.nGSMPort);
g_IniFile.GetValue(L"Connection", L"MonitorPort", &g_Config.nMonitorPort);
g_IniFile.GetValue(L"GSMInfo", L"IP", g_Config.wszGSMIP, IPLENMAX);
g_IniFile.GetValue(L"GSMInfo", L"CodePage", g_Config.wszGSMCodePage);
g_IniFile.GetValue(L"PatchInfo", L"BaseUrl", g_Config.wszPatchBaseURL);
g_IniFile.GetValue(L"PatchInfo", L"PatchUrl", g_Config.wszPatchURL);
g_IniFile.GetValue(L"PatchInfo", L"PatchDir", g_Config.wszPatchDir);
g_IniFile.GetValue(L"ReserveNoticeInfo", L"FileName", g_Config.wszNoticePath);
strcpy_s(g_Config.szVersion, szServiceManagerVersion);
g_Log.Log(LogType::_FILELOG, L"## LauncherPort:%d, ServicePort:%d GsmPort:%d ESMPort:%d MonitorPort:%d\r\n", g_Config.nLauncherPort, g_Config.nServicePort, g_Config.nGSMPort, g_Config.nServicePatcherPort, g_Config.nMonitorPort);
g_Log.Log(LogType::_FILELOG, L"## ServiceManager Version : %S\r\n", szServiceManagerVersion);
if (_access("./System", 0) == -1)
{
mkdir("./System");
}
return true;
}
void CServiceManagerExApp::LoadConfigEx()
{
m_ConfigEx.SetDefault();
m_ConfigEx.LoadConfig();
}
void CServiceManagerExApp::ReloadConfigEx()
{
LoadConfigEx();
ClearSchedule();
BuildSchedule();
}
bool CServiceManagerExApp::CreateDisplayer()
{
CLogSplit& logSplit = ((CMainFrame*)GetMainWnd())->GetLogSplit();
m_pLogDisplayer = new CLogViewDisplayer(&logSplit);
g_Log.SetDisplayer(m_pLogDisplayer);
return true;
}
bool CServiceManagerExApp::InitServiceManager()
{
//SetMiniDump();
//ASSERT(m_pLogDisplayer);
g_Log.Init(L"ServiceManager", LOGTYPE_CRT_FILE_DAY);
s_CountLog.Init(L"LogCount", LOGTYPE_FILE_DAY);
g_ExceptionReportLog.Init(L"ExceptionReport", LOGTYPE_FILE_DAY);
g_DBDelayLog.Init(L"DBDelay", LOGTYPE_FILE_DAY);
s_ExcuteLog.Init(L"Excute", LOGTYPE_FILE_DAY);
g_GameDelayLog.Init(L"GameDelay", LOGTYPE_FILE_DAY);
g_VillageDelayLog.Init(L"VillageDelay", LOGTYPE_FILE_DAY);
g_DBErrorLog.Init(L"DBError", LOGTYPE_FILE_DAY);
g_DBSystemErrorLog.Init(L"DBSystemError", LOGTYPE_FILE_DAY);
g_MonitorLog.Init(L"MonitorLog", LOGTYPE_FILE_DAY);
g_FileLog.Init(L"ServiceManager", LOGTYPE_FILE_DAY);
if (LoadConfig() == false)
return false;
int nSocketCount = 1000;
if (!_wcsicmp(g_Config.wszRegion, L"KR") || !_wcsicmp(g_Config.wszRegion, L"KOR") || !_wcsicmp(g_Config.wszRegion, L"DEV"))
setlocale(LC_ALL, "Korean");
else if (!_wcsicmp(g_Config.wszRegion, L"CH") || !_wcsicmp(g_Config.wszRegion, L"CHN"))
{
setlocale(LC_ALL, "chinese-simplified");
nSocketCount = 3000;
}
else if (!_wcsicmp(g_Config.wszRegion, L"JP") || !_wcsicmp(g_Config.wszRegion, L"JPN"))
setlocale(LC_ALL, "japanese");
else if (!_wcsicmp(g_Config.wszRegion, L"US") || !_wcsicmp(g_Config.wszRegion, L"USA"))
setlocale(LC_ALL, "us");
//#if defined(_KR)
// g_pBAM = new CDNBAM;
// if (!g_pBAM) return;
//#endif // #if defined(_KR)
#ifdef _UNICODE
g_pServiceManager = new CServiceManager(this);
#else
char szIP[IPLENMAX], szCode[256];
WideCharToMultiByte(CP_ACP, 0, g_Config.wszGSMIP, -1, szIP, IPLENMAX, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, g_Config.wszGSMCodePage, -1, szCode, IPLENMAX, NULL, NULL);
g_pServiceManager = new CServiceManager(szIP, szCode);
#endif
if (!g_pServiceManager)
return false;
//g_pServiceManager->InitializeCommand();
g_pServiceServer = new CServiceServer();
if (!g_pServiceServer)
return false;
if (!g_pServiceServer->Initialize(nSocketCount, g_Config.nLauncherPort, g_Config.nServicePort, g_Config.nServicePatcherPort, g_Config.nMonitorPort))
{
ErrorMessage(L"Service server initialize failed.");
return false;
}
if (!m_GSMServer.Open(g_Config.nGSMPort))
{
ErrorMessage(L"Already used GSM port. Program will exit.");
return false;
}
return true;
}
void CServiceManagerExApp::BuildView()
{
((CMainFrame*)GetMainWnd())->BuildView();
}
void CServiceManagerExApp::RefreshView()
{
((CMainFrame*)GetMainWnd())->RefreshView();
}
void CServiceManagerExApp::RefreshStateView()
{
((CMainFrame*)GetMainWnd())->RefreshStateView();
}
BOOL CServiceManagerExApp::OnIdle(LONG lCount)
{
m_Scheduler.Update();
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.Update();
::Sleep(1);
return TRUE;
}
void CServiceManagerExApp::OnPatchStart()
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnPatchStart();
}
void CServiceManagerExApp::OnPatchProgress(int id, const wchar_t* key, unsigned long progress, unsigned long progressMax)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnPatchProgress(id, key, progress, progressMax);
}
void CServiceManagerExApp::OnPatchEnd(bool succeeded)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnPatchEnd(succeeded);
}
void CServiceManagerExApp::OnUnzipProgress(int id, const wchar_t* filename, unsigned long progress, unsigned long progressMax)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnUnzipProgress(id, filename, progress, progressMax);
}
void CServiceManagerExApp::OnWorldMaxUser(int id, int maxUser)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnWorldMaxUser(id, maxUser);
}
void CServiceManagerExApp::OnPatchFail(int id, const wchar_t* msg)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnPatchFail(id, msg);
}
void CServiceManagerExApp::OnPatchCompleted(int id)
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnPatchCompleted(id);
}
void CServiceManagerExApp::OnCommandPatch()
{
CMainSplit& mainSplit = ((CMainFrame*)GetMainWnd())->GetMainSplit();
mainSplit.OnCommandPatch();
}
// <EFBFBD>c<EFBFBD>b <EFBFBD>`<EFBFBD>x+u ҉R<EFBFBD><EFBFBD>zAb <EFBFBD>V<EFBFBD> ȉ<EFBFBD>O Gj<EFBFBD><EFBFBD>
_O <EFBFBD><EFBFBD>mj<EFBFBD><EFBFBD>O.
void CServiceManagerExApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
BOOL CServiceManagerExApp::PreTranslateMessage(MSG* pMsg)
{
// TODO: <EFBFBD>TAb<EFBFBD>O oP<EFBFBD><EFBFBD>bI{ <EFBFBD>Q[<EFBFBD>+u wJU <EFBFBD>h/<EFBFBD><EFBFBD><EFBFBD>~ Ab/Y <EFBFBD>R0<EFBFBD><EFBFBD><EFBFBD>+u <EFBFBD><EFBFBD>MQ<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD>O.
return CWinApp::PreTranslateMessage(pMsg);
}
bool CServiceManagerExApp::ReportExceptionToClipboard()
{
g_Log.Log(LogType::_NORMAL, L"Starting report build to clipboard.\n");
ServerReport::CServerReporter reporter;
wstring report;
reporter.Report(m_ConfigEx.serverReportDays, m_ConfigEx.serverReportDetail, report);
if (!SaveToClipboard(report))
return false;
g_Log.Log(LogType::_NORMAL, L"Copy to Clipboard completed.\n");
return true;
}
bool CServiceManagerExApp::ReportExceptionToBuffer(size_t days, OUT wstring& buffer)
{
g_Log.Log(LogType::_NORMAL, L"Starting report build to buffer.\n");
ServerReport::CServerReporter reporter;
reporter.Report(days, m_ConfigEx.serverReportDetail, buffer);
g_Log.Log(LogType::_NORMAL, L"Buffer set completed.\n");
return true;
}
bool CServiceManagerExApp::ReportExceptionToFile(const wstring& filename)
{
g_Log.Log(LogType::_NORMAL, L"Starting report build to file.\n");
ServerReport::CServerReporter reporter;
wstring report;
reporter.Report(m_ConfigEx.serverReportDays, m_ConfigEx.serverReportDetail, report);
HANDLE file = 0;
try
{
file = CreateFile(filename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
throw;
DWORD written_size;
if (!WriteFile(file, report.c_str(), (DWORD)report.size(), &written_size, NULL))
throw;
CloseHandle(file);
}
catch (...)
{
CloseHandle(file);
g_Log.Log(LogType::_ERROR, L"Copy to file failed.\n");
return false;
}
g_Log.Log(LogType::_NORMAL, L"Copy to file completed.\n");
return true;
}
bool CServiceManagerExApp::SaveToClipboard(const wstring& report)
{
if (!OpenClipboard(NULL))
{
g_Log.Log(LogType::_ERROR, L"Copy to Clipboard failed. (open)\n");
return false;
}
if (!EmptyClipboard())
{
g_Log.Log(LogType::_ERROR, L"Copy to Clipboard failed. (empty)\n");
return false;
}
size_t size = report.length() * sizeof(wchar_t);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, size + sizeof(wchar_t));
if (!hMem)
{
CloseClipboard();
g_Log.Log(LogType::_ERROR, L"Copy to Clipboard failed. (alloc)\n");
return false;
}
wchar_t* pBuf = (wchar_t*)GlobalLock(hMem);
::memcpy(pBuf, report.c_str(), size);
GlobalUnlock(hMem);
if (!::SetClipboardData(CF_UNICODETEXT, hMem))
{
GlobalFree(hMem);
CloseClipboard();
g_Log.Log(LogType::_ERROR, L"Copy to Clipboard failed. (set)\n");
return false;
}
GlobalFree(hMem);
CloseClipboard();
return true;
}
void CServiceManagerExApp::BuildSchedule()
{
CTime curTime = CTime::GetCurrentTime();
for each (const ScheduleJob* pScheduleJob in m_ConfigEx.schedules)
{
SimpleScheduler::CScheduleObj* pScheduleObj = SimpleScheduler::CScheduler::GenerateScheduleObj(this, curTime, pScheduleJob);
if (!pScheduleObj)
continue;
m_Scheduler.Register(pScheduleObj);
}
}
void CServiceManagerExApp::ClearSchedule()
{
m_Scheduler.Clear();
}