// SubControlProcMakeDump.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "ServiceMonitor.h" #include "SubControlProcMakeDump.h" #include "ControlDialog.h" #include "NetConnection.h" #define DNPRJSAFE // DNPrjSafe.h Á¦¿Ü #include "CriticalSection.h" #include "DNPacket.h" #include "DNServerDef.h" #include "DNServerPacket.h" // CSubControlProcMakeDump ´ëÈ­ »óÀÚÀÔ´Ï´Ù. IMPLEMENT_DYNAMIC(CSubControlProcMakeDump, CSubControlBaseView) CSubControlProcMakeDump::CSubControlProcMakeDump(CWnd* pParent /*=NULL*/) : CSubControlBaseView(EV_CTT_PROCMAKEDUMP, CSubControlProcMakeDump::IDD, pParent) { m_OldGridListSubProc = NULL; m_pSession = NULL; } CSubControlProcMakeDump::~CSubControlProcMakeDump() { } void CSubControlProcMakeDump::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_PROCMAKEDUMPLIST, m_GridList); } BEGIN_MESSAGE_MAP(CSubControlProcMakeDump, CSubControlBaseView) ON_WM_PAINT() ON_WM_SIZE() ON_BN_CLICKED(IDC_PROCMAKEDUMPREQUEST, &CSubControlProcMakeDump::OnBnClickedProcMakeDumpRequest) ON_WM_DESTROY() ON_COMMAND(ID_POPUP_PROCMAKEDUMP_DELETEITEM, &CSubControlProcMakeDump::OnPopupProcMakeDumpDeleteItem) END_MESSAGE_MAP() void CSubControlProcMakeDump::OnOK() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. // CDialog::OnOK(); } void CSubControlProcMakeDump::OnCancel() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. // CDialog::OnCancel(); } void CSubControlProcMakeDump::UpdateData() { ClearGridList(); m_ListServ.clear(); CControlDialog* aControlDialog = static_cast(GetParent()->GetParent()); if (!aControlDialog) return; TP_LISTSERVAUTO aListServ; aControlDialog->GetServerList(aListServ); TP_LISTSERVAUTO_CTR aIt = aListServ.begin(); for (; aListServ.end() != aIt ; ++aIt) { const SERVERINFO* aServerInfo = (&(*aIt)); if (!aServerInfo) return; if(!aServerInfo->IsSet()) return; AddGridList(aServerInfo); m_ListServ.insert(TP_LISTSERV::value_type(aServerInfo->m_ServerID, (*aServerInfo))); } } void CSubControlProcMakeDump::AddGridList(const SERVERINFO* pServerInfo) { if (!pServerInfo) return; if(!pServerInfo->IsSet()) return; BeginWaitCursor(); m_GridList.LockWindowUpdate(); LV_ITEM aLvItem; aLvItem.mask = LVIF_TEXT | LVIF_PARAM; aLvItem.cchTextMax = 0; aLvItem.lParam = 0; aLvItem.iItem = m_GridList.GetItemCount(); aLvItem.iSubItem = 0; aLvItem.lParam = pServerInfo->m_ServerID; // ÃßÈÄ ºü¸¥ Á¤º¸ °Ë»öÀ» À§ÇØ ÆÄ¶ó¸ÞÅÍ·Î ÁöÁ¤ TCHAR sBuffer[MAX_PATH*2] = { _T('\0'), }; // Server ID _sntprintf_s(sBuffer, _countof(sBuffer), _T("%d"), pServerInfo->m_ServerID); aLvItem.pszText = sBuffer; int nRtnValue = m_GridList.InsertItem(&aLvItem); if (-1 == nRtnValue) return; // Server Type _sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), g_ServerTypeFullName[pServerInfo->m_ServerType]); m_GridList.SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer); // World ID { if (EV_WORLDID_DEF != pServerInfo->m_WorldID[0]) { sBuffer[0] = _T('\0'); for (int aIndex = 0 ; WORLDCOUNTMAX > aIndex ; ++aIndex) { if (EV_WORLDID_DEF == pServerInfo->m_WorldID[aIndex]) { break; } if (0 < aIndex) { _tcscat_s(sBuffer, _T(", ")); } _tcscat_s(sBuffer, CVarArg(_T("%d"), pServerInfo->m_WorldID[aIndex])); } } else { _sntprintf_s(sBuffer, _countof(sBuffer), _T("%s"), _T("N/A")); } m_GridList.SetItemText(aLvItem.iItem, ++aLvItem.iSubItem, sBuffer); } m_GridList.UnlockWindowUpdate(); EndWaitCursor(); } // CSubControlProcMakeDump ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù. BOOL CSubControlProcMakeDump::OnInitDialog() { CSubControlBaseView::OnInitDialog(); // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. CRect aRect; GetClientRect(&aRect); // Control ListView { int aColNo = 0; m_GridList.InsertColumn(aColNo++, _T("Server ID"), LVCFMT_LEFT, 80); m_GridList.InsertColumn(aColNo++, _T("Server Type"), LVCFMT_LEFT, 120); m_GridList.InsertColumn(aColNo++, _T("World ID"), LVCFMT_LEFT, 80); m_GridList.MoveWindow( aRect.left + EV_UIS_LIST_PAD_X, aRect.top + EV_UIS_LIST_PAD_TOP, EV_UIS_LIST_WTH, aRect.bottom - (aRect.top + EV_UIS_LIST_PAD_TOP + EV_UIS_LIST_PAD_Y), TRUE ); } // Group Box { GetDlgItem(IDC_PROCMAKEDUMPGROUP)->MoveWindow( aRect.left + EV_UIS_LIST_PAD_X + EV_UIS_LIST_WTH + EV_UIS_GROUP_GAP_X, aRect.top + EV_UIS_GROUP_PAD_TOP, aRect.right - (aRect.left + EV_UIS_LIST_PAD_X + EV_UIS_LIST_WTH + EV_UIS_GROUP_GAP_X + EV_UIS_GROUP_PAD_X), aRect.bottom - (aRect.top + EV_UIS_GROUP_PAD_TOP + EV_UIS_GROUP_PAD_Y), TRUE ); } // Button { GetDlgItem(IDC_PROCMAKEDUMPREQUEST)->MoveWindow( aRect.left + (EV_UIS_LIST_WTH + (EV_UIS_LIST_PAD_X * 2) + EV_UIS_REQUESTBUTTON_PAD_A), aRect.bottom - (EV_UIS_REQUESTBUTTON_HGT + (EV_UIS_REQUESTBUTTON_PAD_A * 2)), aRect.right - (aRect.left + EV_UIS_LIST_WTH + (EV_UIS_LIST_PAD_X * 2) + EV_UIS_REQUESTBUTTON_PAD_A * 3), EV_UIS_REQUESTBUTTON_HGT, TRUE ); } // Layout Manager { m_LayoutManager.Attach(this); m_LayoutManager.TieChild(IDC_PROCMAKEDUMPLIST, OX_LMS_TOP | OX_LMS_BOTTOM | OX_LMS_LEFT, OX_LMT_SAME); m_LayoutManager.TieChild(IDC_PROCMAKEDUMPGROUP, OX_LMS_TOP | OX_LMS_BOTTOM | OX_LMS_LEFT | OX_LMS_RIGHT, OX_LMT_SAME); m_LayoutManager.TieChild(IDC_PROCMAKEDUMPREQUEST, OX_LMS_BOTTOM | OX_LMS_LEFT | OX_LMS_RIGHT, OX_LMT_SAME); } // Grid List Subclassing { m_OldGridListSubProc = reinterpret_cast(SetWindowLongPtr(GetDlgItem(IDC_PROCMAKEDUMPLIST)->GetSafeHwnd(), GWL_WNDPROC, reinterpret_cast(GridListSubProc))); } return TRUE; // return TRUE unless you set the focus to a control // ¿¹¿Ü: OCX ¼Ó¼º ÆäÀÌÁö´Â FALSE¸¦ ¹ÝÈ¯ÇØ¾ß ÇÕ´Ï´Ù. } BOOL CSubControlProcMakeDump::PreTranslateMessage(MSG* pMsg) { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. switch(pMsg->message) { case WM_KEYDOWN: { switch(pMsg->wParam) { case VK_ESCAPE: GetParent()->GetParent()->ShowWindow(SW_HIDE); return TRUE; // ESC Ű·Î ºÎ¸ð ÅÇ ÄÁÆ®·ÑÀÇ ºÎ¸ð ´ëÈ­»óÀÚ¸¦ ¼û±è // break; } } break; } return CDialog::PreTranslateMessage(pMsg); } void CSubControlProcMakeDump::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. // ±×¸®±â ¸Þ½ÃÁö¿¡ ´ëÇØ¼­´Â CSubControlBaseView::OnPaint()À»(¸¦) È£ÃâÇÏÁö ¸¶½Ê½Ã¿À. } void CSubControlProcMakeDump::OnSize(UINT nType, int cx, int cy) { CSubControlBaseView::OnSize(nType, cx, cy); // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. m_LayoutManager.OnSize(cx,cy); } void CSubControlProcMakeDump::OnBnClickedProcMakeDumpRequest() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. // ³×Æ®¿öÅ© ¿¬°á, ±¸¼ºÁ¤º¸ ±¸Ãà ¿©ºÎ üũ if (! m_pSession) return; if (!m_pSession->IsConnect()) { ::AfxMessageBox(_T("Session is not connected !"), MB_ICONINFORMATION | MB_OK); return; } if (m_ListServ.empty()) { ::AfxMessageBox(_T("Server list is empty !"), MB_ICONINFORMATION | MB_OK); return; } if (SERVERMONITOR_LEVEL_SUPERADMIN > m_pSession->GetMonitorLevel()) { ::AfxMessageBox(_T("You have no authority to request"), MB_ICONWARNING | MB_OK); return; } if (IDOK != ::AfxMessageBox(_T("Are you sure to request ?"), MB_ICONQUESTION | MB_OKCANCEL)) { return; } TSMMakeDump aReq; aReq.cCount = 0; TP_LISTSERV_CTR aIt = m_ListServ.begin(); for (; m_ListServ.end() != aIt ; ++aIt) { const SERVERINFO* aServerInfo = (&(aIt->second)); if (!aServerInfo) return; if(!aServerInfo->IsSet()) return; aReq.nSID[aReq.cCount++] = aServerInfo->m_ServerID; if (_countof(aReq.nSID) <= aReq.cCount) { ::AfxMessageBox(CVarArg(_T("Item count you requested is over %d.\n\novered item will be ignored."), _countof(aReq.nSID)), MB_ICONWARNING | MB_OK); break; } } if (0 < aReq.cCount) { m_pSession->SendData(MONITOR2MANAGER_MAKEDUMP, 0, reinterpret_cast(&aReq), (static_cast((sizeof(aReq) - (sizeof(aReq.nSID[0]) * (_countof(aReq.nSID) - aReq.cCount)))&ULONG_MAX))); } else { ASSERT(0); } GetParent()->GetParent()->ShowWindow(SW_HIDE); } void CSubControlProcMakeDump::DoPopupMenu() { CMenu aPopMenu; VERIFY(aPopMenu.LoadMenu(IDR_PROCMAKEDUMP_POPUP)); // set default item MENUITEMINFO aItemInfo = { sizeof(MENUITEMINFO) }; aItemInfo.fMask = MIIM_STATE; aItemInfo.fState = MFS_DEFAULT; ::SetMenuItemInfo(aPopMenu.m_hMenu, ID_POPUP_PROCMAKEDUMP_DELETEITEM, FALSE, &aItemInfo); CPoint aPosMouse; GetCursorPos(&aPosMouse); // show menu SendMessage(WM_NCACTIVATE, FALSE); aPopMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, aPosMouse.x, aPosMouse.y, this); } LRESULT CALLBACK CSubControlProcMakeDump::GridListSubProc(HWND hWnd, UINT pMessage, WPARAM wParam, LPARAM lParam) { CSubControlProcMakeDump* aParent = static_cast(CWnd::FromHandlePermanent(::GetParent(hWnd))); ASSERT(NULL != aParent); COXGridList* aThis = static_cast(CWnd::FromHandlePermanent(hWnd)); ASSERT(NULL != aThis); switch(pMessage) { case WM_RBUTTONDOWN: { aParent->DoPopupMenu(); } break; case WM_KEYDOWN: { switch(wParam) { case VK_DELETE: { if (::IsWindowEnabled(hWnd)) { aParent->DeleteCurSelItem(); } } break; } } break; } return CallWindowProc(aParent->m_OldGridListSubProc, hWnd, pMessage, wParam, lParam); } void CSubControlProcMakeDump::OnDestroy() { CSubControlBaseView::OnDestroy(); // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if (m_OldGridListSubProc) { SetWindowLongPtr(GetDlgItem(IDC_PROCMAKEDUMPLIST)->GetSafeHwnd(), GWL_WNDPROC, reinterpret_cast(m_OldGridListSubProc)); m_OldGridListSubProc = NULL; } } void CSubControlProcMakeDump::OnPopupProcMakeDumpDeleteItem() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. DeleteCurSelItem(); } void CSubControlProcMakeDump::DeleteCurSelItem() { if (0 >= m_GridList.GetSelCount()) { return; } TP_LISTAUTO aList; CString aText = _T("Are you sure to delete this item(s) ?\n\n"); for (int aIndex = 0 ; m_GridList.GetItemCount() > aIndex ; ++aIndex) { if (!m_GridList.IsSelected(aIndex)) { continue; } INT aServerID = static_cast(m_GridList.GetItemData(aIndex)); ASSERT(0 < aServerID); aText += CVarArg(_T("Server ID : %d\n"), aServerID); aList.push_back(TP_LISTELEM(aIndex, aServerID)); } if (IDOK != ::AfxMessageBox(aText, MB_ICONQUESTION | MB_OKCANCEL)) { return; } std::sort(aList.begin(), aList.end(), CSortList()); for (TP_LISTAUTO_CTR aIt = aList.begin() ; aList.end() != aIt ; ++aIt) { m_ListServ.erase(static_cast(aIt->second)); m_GridList.DeleteItem(static_cast(aIt->first)); } }