765 lines
20 KiB
C++
765 lines
20 KiB
C++
|
|
// BaseErrorLogView.cpp : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
#include "stdafx.h"
|
|||
|
|
#include "ServiceMonitor.h"
|
|||
|
|
#include "BaseErrorLogView.h"
|
|||
|
|
#include "BasePartitionView.h"
|
|||
|
|
|
|||
|
|
#include "MainFrm.h"
|
|||
|
|
|
|||
|
|
IMPLEMENT_DYNCREATE(CBaseErrorLogView, CBaseView)
|
|||
|
|
|
|||
|
|
CBaseErrorLogView::CBaseErrorLogView()
|
|||
|
|
: CBaseView(CBaseErrorLogView::IDD)
|
|||
|
|
{
|
|||
|
|
m_IsInitialized = FALSE;
|
|||
|
|
|
|||
|
|
m_IsClose = FALSE;
|
|||
|
|
|
|||
|
|
for (int aIndex = 0 ; EV_ELT_CNT > aIndex ; ++aIndex) {
|
|||
|
|
m_OldGridListSubProc[aIndex] = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_TabIconTick = 0;
|
|||
|
|
m_DoAlert = FALSE;
|
|||
|
|
|
|||
|
|
m_Report.str(L"");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CBaseErrorLogView::~CBaseErrorLogView()
|
|||
|
|
{
|
|||
|
|
m_IsClose = TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::DoDataExchange(CDataExchange* pDX)
|
|||
|
|
{
|
|||
|
|
CFormView::DoDataExchange(pDX);
|
|||
|
|
DDX_Control(pDX, IDC_MONERRITELIST, m_GridList[EV_ELT_ITE]);
|
|||
|
|
DDX_Control(pDX, IDC_MONERRECPLIST, m_GridList[EV_ELT_ECP]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BEGIN_MESSAGE_MAP(CBaseErrorLogView, CFormView)
|
|||
|
|
ON_WM_CREATE()
|
|||
|
|
ON_WM_SIZE()
|
|||
|
|
ON_WM_LBUTTONDOWN()
|
|||
|
|
ON_WM_TIMER()
|
|||
|
|
ON_WM_DESTROY()
|
|||
|
|
ON_BN_CLICKED(IDC_ERRITELISTCLEAR, &CBaseErrorLogView::OnBnClickedErrIteListClear)
|
|||
|
|
ON_BN_CLICKED(IDC_ERRECPLISTCLEAR, &CBaseErrorLogView::OnBnClickedErrEcpListClear)
|
|||
|
|
ON_WM_PAINT()
|
|||
|
|
ON_NOTIFY(NM_CUSTOMDRAW, IDC_MONERRITELIST, OnCustomDrawErrIteList)
|
|||
|
|
ON_NOTIFY(NM_CUSTOMDRAW, IDC_MONERRECPLIST, OnCustomDrawErrEcpList)
|
|||
|
|
END_MESSAGE_MAP()
|
|||
|
|
|
|||
|
|
|
|||
|
|
// CBaseErrorLogView <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
|
|||
|
|
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
void CBaseErrorLogView::AssertValid() const
|
|||
|
|
{
|
|||
|
|
CFormView::AssertValid();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifndef _WIN32_WCE
|
|||
|
|
void CBaseErrorLogView::Dump(CDumpContext& dc) const
|
|||
|
|
{
|
|||
|
|
CFormView::Dump(dc);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#endif //_DEBUG
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::DrawTitle(CDC* pDC)
|
|||
|
|
{
|
|||
|
|
if (!pDC)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
Graphics aGraphics((*pDC));
|
|||
|
|
aGraphics.SetSmoothingMode(SmoothingModeHighQuality);
|
|||
|
|
|
|||
|
|
CRect aRect;
|
|||
|
|
GetClientRect(&aRect);
|
|||
|
|
|
|||
|
|
// Draw Title
|
|||
|
|
{
|
|||
|
|
// Service Monitor Internal Error Log
|
|||
|
|
{
|
|||
|
|
// Gradient Line
|
|||
|
|
{
|
|||
|
|
LinearGradientBrush aBrush(
|
|||
|
|
Rect(
|
|||
|
|
aRect.left + EV_UIS_TITLELINE_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X),
|
|||
|
|
EV_UIS_TITLELINE_HGT
|
|||
|
|
),
|
|||
|
|
Color(100, 221, 221, 221),
|
|||
|
|
Color(255, 120, 120, 120),
|
|||
|
|
180.0f,
|
|||
|
|
FALSE
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
aGraphics.FillRectangle(
|
|||
|
|
&aBrush,
|
|||
|
|
aRect.left + EV_UIS_TITLELINE_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2 + 1) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X),
|
|||
|
|
EV_UIS_TITLELINE_HGT
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Draw Text
|
|||
|
|
{
|
|||
|
|
LOGFONT aLogFont;
|
|||
|
|
::memset(&aLogFont, 0x00, sizeof(aLogFont));
|
|||
|
|
_tcsncpy_s(aLogFont.lfFaceName, _T("Arial"), LF_FACESIZE);
|
|||
|
|
aLogFont.lfCharSet = DEFAULT_CHARSET;
|
|||
|
|
aLogFont.lfHeight = 20;
|
|||
|
|
aLogFont.lfWeight = FW_EXTRABOLD;
|
|||
|
|
|
|||
|
|
CFont aNewFont;
|
|||
|
|
VERIFY(aNewFont.CreateFontIndirect(&aLogFont));
|
|||
|
|
CFont* aOldFont = pDC->SelectObject(&aNewFont);
|
|||
|
|
|
|||
|
|
COLORREF aOldTxColor = pDC->SetTextColor(RGB(255, 255, 255));
|
|||
|
|
int aOldBkMode = pDC->SetBkMode(TRANSPARENT);
|
|||
|
|
|
|||
|
|
CRect aRect(
|
|||
|
|
EV_UIS_TITLELINE_PAD_X + EV_UIS_TITLETEXT_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X + EV_UIS_TITLETEXT_PAD_X),
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y + EV_UIS_TITLELINE_HGT + EV_UIS_TITLELINE_PAD_Y
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
pDC->DrawText(_T("Service Monitor Internal Error Log"), &aRect, DT_LEFT | DT_VCENTER);
|
|||
|
|
|
|||
|
|
pDC->SetTextColor(aOldTxColor);
|
|||
|
|
pDC->SetBkMode(aOldBkMode);
|
|||
|
|
|
|||
|
|
pDC->SelectObject(aOldFont);
|
|||
|
|
aNewFont.DeleteObject();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Service Exception Log
|
|||
|
|
{
|
|||
|
|
// Gradient Line
|
|||
|
|
{
|
|||
|
|
LinearGradientBrush aBrush(
|
|||
|
|
Rect(
|
|||
|
|
aRect.left + EV_UIS_TITLELINE_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_HGT + (EV_UIS_ERRORLOGECPVIEW_PAD_Y * 2) - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X),
|
|||
|
|
EV_UIS_TITLELINE_HGT
|
|||
|
|
),
|
|||
|
|
Color(100, 221, 221, 221),
|
|||
|
|
Color(255, 120, 120, 120),
|
|||
|
|
180.0f,
|
|||
|
|
FALSE
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
aGraphics.FillRectangle(
|
|||
|
|
&aBrush,
|
|||
|
|
aRect.left + EV_UIS_TITLELINE_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_HGT + (EV_UIS_ERRORLOGECPVIEW_PAD_Y * 2) - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2 + 1) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X),
|
|||
|
|
EV_UIS_TITLELINE_HGT
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Draw Text
|
|||
|
|
{
|
|||
|
|
LOGFONT aLogFont;
|
|||
|
|
::memset(&aLogFont, 0x00, sizeof(aLogFont));
|
|||
|
|
_tcsncpy_s(aLogFont.lfFaceName, _T("Arial"), LF_FACESIZE);
|
|||
|
|
aLogFont.lfCharSet = DEFAULT_CHARSET;
|
|||
|
|
aLogFont.lfHeight = 20;
|
|||
|
|
aLogFont.lfWeight = FW_EXTRABOLD;
|
|||
|
|
|
|||
|
|
CFont aNewFont;
|
|||
|
|
VERIFY(aNewFont.CreateFontIndirect(&aLogFont));
|
|||
|
|
CFont* aOldFont = pDC->SelectObject(&aNewFont);
|
|||
|
|
|
|||
|
|
COLORREF aOldTxColor = pDC->SetTextColor(RGB(255, 255, 255));
|
|||
|
|
int aOldBkMode = pDC->SetBkMode(TRANSPARENT);
|
|||
|
|
|
|||
|
|
CRect aRect(
|
|||
|
|
EV_UIS_TITLELINE_PAD_X + EV_UIS_TITLETEXT_PAD_X,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_HGT + (EV_UIS_ERRORLOGECPVIEW_PAD_Y * 2) - EV_UIS_TITLELINE_PAD_Y,
|
|||
|
|
aRect.right - ((EV_UIS_ERRORLOGVIEW_PAD_A * 2) + EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_TITLELINE_PAD_X + EV_UIS_TITLETEXT_PAD_X),
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_HGT + (EV_UIS_ERRORLOGECPVIEW_PAD_Y * 2) + EV_UIS_TITLELINE_HGT + EV_UIS_TITLELINE_PAD_Y
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
pDC->DrawText(_T("Service Exception Log"), &aRect, DT_LEFT | DT_VCENTER);
|
|||
|
|
|
|||
|
|
pDC->SetTextColor(aOldTxColor);
|
|||
|
|
pDC->SetBkMode(aOldBkMode);
|
|||
|
|
|
|||
|
|
pDC->SelectObject(aOldFont);
|
|||
|
|
aNewFont.DeleteObject();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::AddGridList(INT pErrorCode, LPCTSTR pMsg, BOOL pDoAlert)
|
|||
|
|
{
|
|||
|
|
if(!pMsg) return;
|
|||
|
|
|
|||
|
|
CListCtrl* aGridList = &m_GridList[EV_ELT_ITE];
|
|||
|
|
if(!aGridList) return;
|
|||
|
|
|
|||
|
|
BeginWaitCursor();
|
|||
|
|
aGridList->LockWindowUpdate();
|
|||
|
|
|
|||
|
|
LV_ITEM aLvItem;
|
|||
|
|
aLvItem.mask = LVIF_TEXT | LVIF_PARAM;
|
|||
|
|
aLvItem.cchTextMax = 0;
|
|||
|
|
aLvItem.lParam = 0;
|
|||
|
|
aLvItem.iItem = aGridList->GetItemCount();
|
|||
|
|
aLvItem.iSubItem = 0;
|
|||
|
|
|
|||
|
|
TCHAR sBuffer[MAX_PATH*2] = { _T('\0'), };
|
|||
|
|
|
|||
|
|
// Date
|
|||
|
|
SYSTEMTIME aSystemTime;
|
|||
|
|
::GetLocalTime(&aSystemTime);
|
|||
|
|
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%04d-%02d-%02d %02d:%02d:%02d"),
|
|||
|
|
aSystemTime.wYear,
|
|||
|
|
aSystemTime.wMonth,
|
|||
|
|
aSystemTime.wDay,
|
|||
|
|
aSystemTime.wHour,
|
|||
|
|
aSystemTime.wMinute,
|
|||
|
|
aSystemTime.wSecond
|
|||
|
|
);
|
|||
|
|
aLvItem.pszText = sBuffer;
|
|||
|
|
|
|||
|
|
int nRtnValue = aGridList->InsertItem(&aLvItem);
|
|||
|
|
if(-1 == nRtnValue) return;
|
|||
|
|
|
|||
|
|
// Error Code
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%d"), pErrorCode);
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
// Message
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), pMsg);
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
aGridList->UnlockWindowUpdate();
|
|||
|
|
EndWaitCursor();
|
|||
|
|
|
|||
|
|
// Grid List <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>
|
|||
|
|
CRect aRect;
|
|||
|
|
aGridList->GetItemRect(aGridList->GetItemCount() - 1, &aRect, LVIR_BOUNDS);
|
|||
|
|
aGridList->Scroll(CSize(0, aRect.bottom));
|
|||
|
|
|
|||
|
|
if (pDoAlert)
|
|||
|
|
{
|
|||
|
|
m_DoAlert = TRUE;
|
|||
|
|
|
|||
|
|
CMainFrame* pMainFrame = static_cast<CServiceMonitorApp*>(::AfxGetApp())->GetMainFrame();
|
|||
|
|
if(pMainFrame)
|
|||
|
|
pMainFrame->SetAlert(TRUE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::AddGridList(INT pServerID, CHAR pServerType, INT nWorldID[WORLDCOUNTMAX], EF_SERVERSTATE pServerState, INT pExceptionCode, LPCTSTR pDetail, BOOL pDoAlert)
|
|||
|
|
{
|
|||
|
|
if (pServerID == EV_SERVERID_DEF)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (!CHECK_LIMIT(pServerState, EV_SVS_CNT))
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if(!nWorldID)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if(!pDetail)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
CListCtrl* aGridList = &m_GridList[EV_ELT_ECP];
|
|||
|
|
|
|||
|
|
if (!aGridList)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
BeginWaitCursor();
|
|||
|
|
//aGridList->LockWindowUpdate();
|
|||
|
|
|
|||
|
|
LV_ITEM aLvItem;
|
|||
|
|
aLvItem.mask = LVIF_TEXT | LVIF_PARAM;
|
|||
|
|
aLvItem.cchTextMax = 0;
|
|||
|
|
aLvItem.lParam = 0;
|
|||
|
|
aLvItem.iItem = aGridList->GetItemCount();
|
|||
|
|
aLvItem.iSubItem = 0;
|
|||
|
|
aLvItem.lParam = pServerID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
TCHAR sBuffer[MAX_PATH*2] = { _T('\0'), };
|
|||
|
|
|
|||
|
|
// Date
|
|||
|
|
SYSTEMTIME aSystemTime;
|
|||
|
|
::GetLocalTime(&aSystemTime);
|
|||
|
|
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%04d-%02d-%02d %02d:%02d:%02d"),
|
|||
|
|
aSystemTime.wYear,
|
|||
|
|
aSystemTime.wMonth,
|
|||
|
|
aSystemTime.wDay,
|
|||
|
|
aSystemTime.wHour,
|
|||
|
|
aSystemTime.wMinute,
|
|||
|
|
aSystemTime.wSecond
|
|||
|
|
);
|
|||
|
|
aLvItem.pszText = sBuffer;
|
|||
|
|
|
|||
|
|
int nRtnValue = aGridList->InsertItem(&aLvItem);
|
|||
|
|
if(-1 == nRtnValue)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// Server ID
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%d"), pServerID);
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
// Server Type
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), (CHECK_LIMIT(pServerType, EV_SVT_CNT))?(g_ServerTypeFullName[pServerType]):(_T("N/A")));
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
// World ID
|
|||
|
|
{
|
|||
|
|
if (EV_WORLDID_DEF != nWorldID[0]) {
|
|||
|
|
sBuffer[0] = _T('\0');
|
|||
|
|
for (int aIndex = 0 ; WORLDCOUNTMAX > aIndex ; ++aIndex) {
|
|||
|
|
if (EV_WORLDID_DEF == nWorldID[aIndex]) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (0 < aIndex) {
|
|||
|
|
_tcscat_s(sBuffer, _T(", "));
|
|||
|
|
}
|
|||
|
|
_tcscat_s(sBuffer, CVarArg<MAX_PATH>(_T("%d"), nWorldID[aIndex]));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), _T("N/A"));
|
|||
|
|
}
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Server State
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%d (%s)"), pServerState, (CHECK_LIMIT(pServerState, EV_SVS_CNT)?(g_ServerStateName[pServerState]):(_T("N/A"))));
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
// Exception Code
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%d (%s)"), pExceptionCode, g_ExceptionReportName[pExceptionCode]);
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
// Detail
|
|||
|
|
_sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), pDetail);
|
|||
|
|
aGridList->SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer);
|
|||
|
|
|
|||
|
|
//aGridList->UnlockWindowUpdate();
|
|||
|
|
EndWaitCursor();
|
|||
|
|
|
|||
|
|
// Grid List <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>
|
|||
|
|
CRect aRect;
|
|||
|
|
aGridList->GetItemRect(aGridList->GetItemCount() - 1, &aRect, LVIR_BOUNDS);
|
|||
|
|
aGridList->Scroll(CSize(0, aRect.bottom));
|
|||
|
|
|
|||
|
|
if (pDoAlert) {
|
|||
|
|
m_DoAlert = TRUE;
|
|||
|
|
|
|||
|
|
CMainFrame* aMainFrame = static_cast<CServiceMonitorApp*>(::AfxGetApp())->GetMainFrame();
|
|||
|
|
if (aMainFrame)
|
|||
|
|
aMainFrame->SetAlert(TRUE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::ShowOperatingResult (INT nCmd, INT nRet)
|
|||
|
|
{
|
|||
|
|
CString ResultText;
|
|||
|
|
|
|||
|
|
if (nRet == ERROR_NONE)
|
|||
|
|
ResultText += CVarArg<MAX_PATH>(_T("Success [Command:%d]\n"), nCmd);
|
|||
|
|
else
|
|||
|
|
ResultText += CVarArg<MAX_PATH>(_T("Error [Command:%d Result:%d]\n"), nCmd, nRet);
|
|||
|
|
|
|||
|
|
::AfxMessageBox(ResultText);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// CBaseErrorLogView <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
|
|||
|
|
|
|||
|
|
int CBaseErrorLogView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|||
|
|
{
|
|||
|
|
if (CFormView::OnCreate(lpCreateStruct) == -1)
|
|||
|
|
return -1;
|
|||
|
|
|
|||
|
|
// TODO: <20><><EFBFBD> Ư<><C6AF>ȭ<EFBFBD><C8AD> <20>ۼ<EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnSize(UINT nType, int cx, int cy)
|
|||
|
|
{
|
|||
|
|
CFormView::OnSize(nType, cx, cy);
|
|||
|
|
|
|||
|
|
CRect aRect;
|
|||
|
|
GetClientRect(&aRect);
|
|||
|
|
|
|||
|
|
// TODO: <20><><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
if (m_IsInitialized) {
|
|||
|
|
m_LayoutManager.OnSize(cx,cy);
|
|||
|
|
|
|||
|
|
// Draw Title
|
|||
|
|
{
|
|||
|
|
CClientDC aDC(this);
|
|||
|
|
|
|||
|
|
DrawTitle(&aDC);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> Ư<><C6AF>ȭ<EFBFBD><C8AD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
CRect aRect;
|
|||
|
|
GetClientRect(&aRect);
|
|||
|
|
|
|||
|
|
if (!m_IsInitialized) {
|
|||
|
|
m_IsInitialized = TRUE;
|
|||
|
|
|
|||
|
|
// Image List
|
|||
|
|
{
|
|||
|
|
VERIFY(m_ImageList.Create(IDB_IMG_SMALL, 16, 11, RGB(255,0,255)));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Grid Control
|
|||
|
|
{
|
|||
|
|
// Service Monitor Internal Error Log
|
|||
|
|
{
|
|||
|
|
int aColNo = 0;
|
|||
|
|
|
|||
|
|
CListCtrl* aGridList = &m_GridList[EV_ELT_ITE];
|
|||
|
|
if(!aGridList)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Date"), LVCFMT_LEFT, 140);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Error Code"), LVCFMT_LEFT, 80);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Message"), LVCFMT_LEFT, 1300);
|
|||
|
|
|
|||
|
|
aGridList->SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT);
|
|||
|
|
|
|||
|
|
|
|||
|
|
aGridList->MoveWindow(
|
|||
|
|
aRect.left + EV_UIS_ERRORLOGVIEW_PAD_A,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y,
|
|||
|
|
aRect.right - (EV_UIS_ERRORLOGVIEW_PAD_A * 2),
|
|||
|
|
EV_UIS_ERRORLOGITEVIEW_HGT,
|
|||
|
|
TRUE
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Service Exception Log
|
|||
|
|
{
|
|||
|
|
int aColNo = 0;
|
|||
|
|
|
|||
|
|
CListCtrl* aGridList = &m_GridList[EV_ELT_ECP];
|
|||
|
|
if(!aGridList)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Date"), LVCFMT_LEFT, 140);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Server ID"), LVCFMT_LEFT, 80);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Server Type"), LVCFMT_LEFT, 80);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("World ID"), LVCFMT_LEFT, 80);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Server State"), LVCFMT_LEFT, 100);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Exception Code"), LVCFMT_LEFT, 200);
|
|||
|
|
aGridList->InsertColumn(aColNo++, _T("Detail"), LVCFMT_LEFT, 840);
|
|||
|
|
|
|||
|
|
aGridList->SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT);
|
|||
|
|
|
|||
|
|
aGridList->MoveWindow(
|
|||
|
|
aRect.left + EV_UIS_ERRORLOGVIEW_PAD_A,
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y + EV_UIS_ERRORLOGITEVIEW_HGT + EV_UIS_ERRORLOGECPVIEW_PAD_Y,
|
|||
|
|
aRect.right - (EV_UIS_ERRORLOGVIEW_PAD_A * 2),
|
|||
|
|
aRect.bottom - (aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y + EV_UIS_ERRORLOGITEVIEW_HGT + EV_UIS_ERRORLOGECPVIEW_PAD_Y + EV_UIS_ERRORLOGVIEW_PAD_A),
|
|||
|
|
TRUE
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Button(s)
|
|||
|
|
{
|
|||
|
|
// Service Monitor Internal Error Log
|
|||
|
|
GetDlgItem(IDC_ERRITELISTCLEAR)->MoveWindow(
|
|||
|
|
aRect.right - (EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_ERRORLOGVIEW_PAD_A),
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y - (EV_UIS_ERRORLOGCLEARBUTTON_HGT + EV_UIS_ERRORLOGCLEARBUTTON_GAP),
|
|||
|
|
EV_UIS_ERRORLOGCLEARBUTTON_WTH,
|
|||
|
|
EV_UIS_ERRORLOGCLEARBUTTON_HGT,
|
|||
|
|
TRUE
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// Service Exception Log
|
|||
|
|
GetDlgItem(IDC_ERRECPLISTCLEAR)->MoveWindow(
|
|||
|
|
aRect.right - (EV_UIS_ERRORLOGCLEARBUTTON_WTH + EV_UIS_ERRORLOGVIEW_PAD_A),
|
|||
|
|
aRect.top + EV_UIS_ERRORLOGITEVIEW_PAD_Y + EV_UIS_ERRORLOGITEVIEW_HGT + EV_UIS_ERRORLOGECPVIEW_PAD_Y - (EV_UIS_ERRORLOGCLEARBUTTON_HGT + EV_UIS_ERRORLOGCLEARBUTTON_GAP),
|
|||
|
|
EV_UIS_ERRORLOGCLEARBUTTON_WTH,
|
|||
|
|
EV_UIS_ERRORLOGCLEARBUTTON_HGT,
|
|||
|
|
TRUE
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Layout Manager
|
|||
|
|
{
|
|||
|
|
m_LayoutManager.Attach(this);
|
|||
|
|
m_LayoutManager.TieChild(IDC_MONERRITELIST, OX_LMS_TOP | OX_LMS_LEFT | OX_LMS_RIGHT, OX_LMT_SAME);
|
|||
|
|
m_LayoutManager.TieChild(IDC_MONERRECPLIST, OX_LMS_TOP | OX_LMS_BOTTOM | OX_LMS_LEFT | OX_LMS_RIGHT, OX_LMT_SAME);
|
|||
|
|
m_LayoutManager.TieChild(IDC_ERRITELISTCLEAR, OX_LMS_RIGHT, OX_LMT_SAME);
|
|||
|
|
m_LayoutManager.TieChild(IDC_ERRECPLISTCLEAR, OX_LMS_RIGHT, OX_LMT_SAME);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SetTimer(EV_TMD_SHOWERRORLOG, g_TimerInterval[EV_TMD_SHOWERRORLOG - EV_TIMERID_DEF], NULL);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnLButtonDown(UINT nFlags, CPoint point)
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
CFormView::OnLButtonDown(nFlags, point);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BOOL CBaseErrorLogView::PreCreateWindow(CREATESTRUCT& cs)
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> Ư<><C6AF>ȭ<EFBFBD><C8AD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
cs.style &= ~(WS_HSCROLL | WS_VSCROLL);
|
|||
|
|
|
|||
|
|
return CFormView::PreCreateWindow(cs);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnTimer(UINT_PTR nIDEvent)
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
|
|||
|
|
if (m_IsClose)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
switch(nIDEvent)
|
|||
|
|
{
|
|||
|
|
case EV_TMD_SHOWERRORLOG:
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (m_DoAlert) {
|
|||
|
|
CBasePartitionView* pPartitionView = GetPartitionView();
|
|||
|
|
if (!pPartitionView)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (pPartitionView->GetActivePageIndex() == GetPageIndex()) {
|
|||
|
|
m_DoAlert = FALSE;
|
|||
|
|
pPartitionView->SetPageImageIndex(GetPageIndex(), EV_IML_ERRORLOG);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if ((++m_TabIconTick) % 2) {
|
|||
|
|
pPartitionView->SetPageImageIndex(GetPageIndex(), EV_IML_ALERT);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pPartitionView->SetPageImageIndex(GetPageIndex(), EV_IML_ERRORLOG);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CFormView::OnTimer(nIDEvent);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnDestroy()
|
|||
|
|
{
|
|||
|
|
CFormView::OnDestroy();
|
|||
|
|
|
|||
|
|
// TODO: <20><><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
KillTimer(EV_TMD_SHOWERRORLOG);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnBnClickedErrIteListClear()
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
if (IDOK != ::AfxMessageBox(_T("Are you sure to clear list ?"), MB_ICONQUESTION | MB_OKCANCEL | MB_DEFBUTTON2)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ClearGridList(EV_ELT_ITE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnBnClickedErrEcpListClear()
|
|||
|
|
{
|
|||
|
|
// TODO: <20><><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
|
|||
|
|
if (IDOK != ::AfxMessageBox(_T("Are you sure to clear list ?"), MB_ICONQUESTION | MB_OKCANCEL | MB_DEFBUTTON2)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ClearGridList(EV_ELT_ECP);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnPaint()
|
|||
|
|
{
|
|||
|
|
CPaintDC dc(this); // device context for painting
|
|||
|
|
// TODO: <20><><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
|
|||
|
|
// <20><EFBFBD><D7B8><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> CBaseView::OnPaint()<29><>(<28><>) ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽÿ<CABD>.
|
|||
|
|
|
|||
|
|
DrawTitle(&dc);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnCustomDrawErrIteList(NMHDR* pNMHDR, LRESULT* pResult)
|
|||
|
|
{
|
|||
|
|
const LPNMLVCUSTOMDRAW lplvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
|
|||
|
|
|
|||
|
|
switch(lplvcd->nmcd.dwDrawStage) {
|
|||
|
|
case CDDS_PREPAINT:
|
|||
|
|
*pResult = CDRF_NOTIFYITEMDRAW;
|
|||
|
|
break;
|
|||
|
|
case CDDS_ITEMPREPAINT:
|
|||
|
|
{
|
|||
|
|
*pResult = CDRF_DODEFAULT;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
*pResult = CDRF_DODEFAULT;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::OnCustomDrawErrEcpList(NMHDR* pNMHDR, LRESULT* pResult)
|
|||
|
|
{
|
|||
|
|
const LPNMLVCUSTOMDRAW lplvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
|
|||
|
|
|
|||
|
|
switch(lplvcd->nmcd.dwDrawStage) {
|
|||
|
|
case CDDS_PREPAINT:
|
|||
|
|
*pResult = CDRF_NOTIFYITEMDRAW;
|
|||
|
|
break;
|
|||
|
|
case CDDS_ITEMPREPAINT:
|
|||
|
|
{
|
|||
|
|
*pResult = CDRF_DODEFAULT;
|
|||
|
|
|
|||
|
|
TCHAR aItemText[64] = { _T('\0'), };
|
|||
|
|
|
|||
|
|
CListCtrl* aGridList = &m_GridList[EV_ELT_ECP];
|
|||
|
|
if(!aGridList)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// Exception Code
|
|||
|
|
{
|
|||
|
|
aGridList->GetItemText(static_cast<int>(lplvcd->nmcd.dwItemSpec), 5, aItemText, _countof(aItemText));
|
|||
|
|
INT aExceptionCode = static_cast<INT>(_ttoi(aItemText));
|
|||
|
|
|
|||
|
|
if (!aExceptionCode) {
|
|||
|
|
lplvcd->clrText = g_ServiceExceptionLogColor[0][0];
|
|||
|
|
lplvcd->clrTextBk = g_ServiceExceptionLogColor[0][1];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
lplvcd->clrText = g_ServiceExceptionLogColor[1][0];
|
|||
|
|
lplvcd->clrTextBk = g_ServiceExceptionLogColor[1][1];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Server State
|
|||
|
|
{
|
|||
|
|
aGridList->GetItemText(static_cast<int>(lplvcd->nmcd.dwItemSpec), 4, aItemText, _countof(aItemText));
|
|||
|
|
EF_SERVERSTATE aServerState = static_cast<EF_SERVERSTATE>(_ttoi(aItemText));
|
|||
|
|
|
|||
|
|
switch(aServerState) {
|
|||
|
|
case EV_SVS_TMNT:
|
|||
|
|
{
|
|||
|
|
lplvcd->clrText = g_ServiceExceptionLogColor[2][0];
|
|||
|
|
lplvcd->clrTextBk = g_ServiceExceptionLogColor[2][1];
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
*pResult = CDRF_DODEFAULT;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::SetPartitionView(CBasePartitionView* pView)
|
|||
|
|
{
|
|||
|
|
m_pPartitionView = pView;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CBasePartitionView* CBaseErrorLogView::GetPartitionView()
|
|||
|
|
{
|
|||
|
|
return m_pPartitionView;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::RecvReportData(const wchar_t* szReport)
|
|||
|
|
{
|
|||
|
|
m_Report << szReport;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CBaseErrorLogView::SaveToClipboard()
|
|||
|
|
{
|
|||
|
|
const std::wstring&report = m_Report.str();
|
|||
|
|
|
|||
|
|
if (!OpenClipboard())
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (!EmptyClipboard())
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
size_t size = report.length() * sizeof(wchar_t);
|
|||
|
|
|
|||
|
|
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, size + sizeof(wchar_t));
|
|||
|
|
if (!hMem)
|
|||
|
|
{
|
|||
|
|
CloseClipboard();
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
wchar_t* pBuf = (wchar_t*)GlobalLock(hMem);
|
|||
|
|
::memcpy(pBuf, report.c_str(), size);
|
|||
|
|
GlobalUnlock(hMem);
|
|||
|
|
|
|||
|
|
if (!::SetClipboardData(CF_UNICODETEXT, hMem))
|
|||
|
|
{
|
|||
|
|
CloseClipboard();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CloseClipboard();
|
|||
|
|
|
|||
|
|
m_Report.str(L"");
|
|||
|
|
|
|||
|
|
//::AfxMessageBox(_T("Ready to use clipboard!"), MB_ICONINFORMATION);
|
|||
|
|
|
|||
|
|
|
|||
|
|
SHELLEXECUTEINFO sei;
|
|||
|
|
memset(&sei, 0, sizeof(sei));
|
|||
|
|
sei.cbSize = sizeof(sei);
|
|||
|
|
sei.lpFile = L"notepad.exe";
|
|||
|
|
sei.hwnd = NULL;
|
|||
|
|
sei.lpVerb = L"open";
|
|||
|
|
sei.nShow = SW_SHOW;
|
|||
|
|
ShellExecuteEx(&sei);
|
|||
|
|
|
|||
|
|
Sleep(100);
|
|||
|
|
|
|||
|
|
keybd_event(VK_CONTROL, 0, 0, 0);
|
|||
|
|
keybd_event('V', 0, 0, 0);
|
|||
|
|
keybd_event('V', 0, KEYEVENTF_KEYUP, 0);
|
|||
|
|
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|