//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: servmon.cpp // //-------------------------------------------------------------------------- #include "preDNSsn.h" #include #include "resource.h" #include "dnsutil.h" #include "DNSSnap.h" #include "snapdata.h" #include "server.h" #include "serverui.h" #ifdef DEBUG_ALLOCATOR #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #endif #define CDNSServerMonitoringPageHolder CDNSServerPropertyPageHolder #define MAX_STATISTICS_LINE_LEN 256 ///////////////////////////////////////////////////////////////////////////// int FormatDate(SYSTEMTIME* p, LPWSTR lpsz, int nCharMax) { return ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, p, NULL, lpsz, nCharMax); } int FormatTime(SYSTEMTIME* p, LPWSTR lpsz, int nCharMax) { return ::GetTimeFormat(LOCALE_USER_DEFAULT, 0, p, NULL, lpsz, nCharMax); } UINT LoadLabelsBlock(UINT nStringID, CString& szLabels, LPWSTR* szLabelArray) { UINT nLabelCount = 0; if (szLabels.LoadString(nStringID)) { ParseNewLineSeparatedString(szLabels.GetBuffer(1),szLabelArray, &nLabelCount); szLabels.ReleaseBuffer(); } return nLabelCount; } /////////////////////////////////////////////////////////////////////////////// // CDNSServer_TestPropertyPage CDNSServer_PollingIntervalEditGroup:: CDNSServer_PollingIntervalEditGroup(UINT nMinVal, UINT nMaxVal) : CDNSTimeIntervalEditGroup(nMinVal, nMaxVal) { } void CDNSServer_PollingIntervalEditGroup::OnEditChange() { m_pPage->SetDirty(TRUE); } void CTestResultsListCtrl::Initialize() { // get size of control to help set the column widths CRect controlRect; GetClientRect(controlRect); // get width of control, width of potential scrollbar, width needed for sub-item // string int controlWidth = controlRect.Width(); int scrollThumbWidth = ::GetSystemMetrics(SM_CXHTHUMB); // clean net width int nNetControlWidth = controlWidth - scrollThumbWidth - 12 * ::GetSystemMetrics(SM_CXBORDER); // fields widths int nWidth = nNetControlWidth/SVR_TEST_RESULT_LISTVIEW_NCOLS; // set up columns CString szHeaders; { AFX_MANAGE_STATE(AfxGetStaticModuleState()); szHeaders.LoadString(IDS_TEST_LISTVIEW_HEADERS); } ASSERT(!szHeaders.IsEmpty()); LPWSTR lpszArr[SVR_TEST_RESULT_LISTVIEW_NCOLS]; UINT n; ParseNewLineSeparatedString(szHeaders.GetBuffer(1), lpszArr, &n); szHeaders.ReleaseBuffer(); ASSERT(n == SVR_TEST_RESULT_LISTVIEW_NCOLS); for (int k=0; km_dwQueryFlags, &bPlainQuery, &bRecursiveQuery); UINT nState = 0; if (nItemIndex == 0 ) nState = LVIS_SELECTED | LVIS_FOCUSED; // have at least one item, select it VERIFY(-1 != InsertItem(LVIF_TEXT , nItemIndex, szDate, nState, 0, 0, NULL)); SetItemText(nItemIndex, 1, szTime); // TIME { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (pTestResult->m_dwAddressResolutionResult != 0) { CString szFailedOnNameResolution; szFailedOnNameResolution.LoadString(IDS_SERVER_TEST_RESULT_FAIL_ON_NAME_RES); if (bPlainQuery) SetItemText(nItemIndex, 2, szFailedOnNameResolution); if (bRecursiveQuery) SetItemText(nItemIndex, 3, szFailedOnNameResolution); } else { CString szFail; szFail.LoadString(IDS_SERVER_TEST_RESULT_FAIL); CString szPass; szPass.LoadString(IDS_SERVER_TEST_RESULT_PASS); if (bPlainQuery) SetItemText(nItemIndex, 2, (pTestResult->m_dwPlainQueryResult == 0)? szPass : szFail); if (bRecursiveQuery) SetItemText(nItemIndex, 3, (pTestResult->m_dwRecursiveQueryResult == 0)? szPass : szFail); } } } void CTestResultsListCtrl::UpdateEntry(CDNSServerTestQueryResult* pTestResult, int nItemIndex) { // have to update DATE and TIME WCHAR szDate[256]; WCHAR szTime[256]; FormatDate(pTestResult, szDate, 256); FormatTime(pTestResult, szTime, 256); VERIFY(SetItem(nItemIndex, // nItem 0, // nSubItem LVIF_TEXT, // nMask szDate, // lpszItem 0, // nImage 0, // nState 0, // nStateMask NULL // lParam )); CString szTemp; SetItemText(nItemIndex, 1, szTime); } void CTestResultsListCtrl::FormatDate(CDNSServerTestQueryResult* pTestResult, LPWSTR lpsz, int nCharMax) { VERIFY( nCharMax > ::FormatDate( &(pTestResult->m_queryTime), lpsz, nCharMax)); } void CTestResultsListCtrl::FormatTime(CDNSServerTestQueryResult* pTestResult, LPWSTR lpsz, int nCharMax) { VERIFY( nCharMax > ::FormatTime( &(pTestResult->m_queryTime), lpsz, nCharMax)); } BEGIN_MESSAGE_MAP(CDNSServer_TestPropertyPage, CPropertyPageBase) ON_BN_CLICKED(IDC_ENABLE_TESTING_CHECK, OnEnableTestingCheck) ON_BN_CLICKED(IDC_SIMPLE_QUERY_CHECK, OnQueryCheck) ON_BN_CLICKED(IDC_RECURSIVE_QUERY_CHECK, OnQueryCheck) ON_BN_CLICKED(IDC_TEST_NOW_BUTTON, OnTestNow) END_MESSAGE_MAP() CDNSServer_TestPropertyPage::CDNSServer_TestPropertyPage() : CPropertyPageBase(IDD_SERVMON_TEST_PAGE), m_pollingIntervalEditGroup(MIN_SERVER_TEST_INTERVAL, MAX_SERVER_TEST_INTERVAL) { } BOOL CDNSServer_TestPropertyPage::OnInitDialog() { CPropertyPageBase::OnInitDialog(); m_pollingIntervalEditGroup.m_pPage = this; VERIFY(m_pollingIntervalEditGroup.Initialize(this, IDC_POLLING_INT_EDIT, IDC_POLLING_INT_COMBO,IDS_TIME_INTERVAL_UNITS)); HWND hWnd = ::GetDlgItem(GetSafeHwnd(), IDC_POLLING_INT_EDIT); // Disable IME support on the controls ImmAssociateContext(hWnd, NULL); VERIFY(m_listCtrl.SubclassDlgItem(IDC_RESULTS_LIST, this)); m_listCtrl.Initialize(); SetUIData(); return TRUE; } void CDNSServer_TestPropertyPage::SetUIData() { CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder(); CDNSServerNode* pServerNode = pHolder->GetServerNode(); pServerNode->GetTestOptions(&m_testOptions); GetSimpleQueryCheck()->SetCheck(m_testOptions.m_bSimpleQuery); GetRecursiveQueryCheck()->SetCheck(m_testOptions.m_bRecursiveQuery); // // Check to see if this is a root server // BOOL bRoot = FALSE; DNS_STATUS err = ::ServerHasRootZone(pServerNode->GetRPCName(), &bRoot); if (err == 0 && bRoot) { // // Disable recursive queries on root server // GetRecursiveQueryCheck()->EnableWindow(FALSE); GetRecursiveQueryCheck()->SetCheck(FALSE); } CButton* pEnableTestingCheck = GetEnableTestingCheck(); if (!(m_testOptions.m_bSimpleQuery || m_testOptions.m_bRecursiveQuery)) { GetTestNowButton()->EnableWindow(FALSE); pEnableTestingCheck->EnableWindow(FALSE); pEnableTestingCheck->SetCheck(FALSE); m_pollingIntervalEditGroup.EnableUI(FALSE); } else { pEnableTestingCheck->SetCheck(m_testOptions.m_bEnabled); } m_pollingIntervalEditGroup.SetVal(m_testOptions.m_dwInterval); EnableControlsHelper(m_testOptions.m_bEnabled); PopulateList(); } void CDNSServer_TestPropertyPage::EnableControlsHelper(BOOL bEnable) { //GetSimpleQueryCheck()->EnableWindow(bEnable); //GetRecursiveQueryCheck()->EnableWindow(bEnable); m_pollingIntervalEditGroup.EnableUI(bEnable); } BOOL CDNSServer_TestPropertyPage::OnApply() { if (!IsDirty()) return TRUE; CDNSServerTestOptions newTestOptions; newTestOptions.m_bEnabled = GetEnableTestingCheck()->GetCheck(); newTestOptions.m_bSimpleQuery = GetSimpleQueryCheck()->GetCheck(); newTestOptions.m_bRecursiveQuery = GetRecursiveQueryCheck()->GetCheck(); newTestOptions.m_dwInterval = m_pollingIntervalEditGroup.GetVal(); if (newTestOptions == m_testOptions) return TRUE; // no need to update m_testOptions = newTestOptions; DNS_STATUS err = GetHolder()->NotifyConsole(this); if (err != 0) { DNSErrorDialog(err, IDS_MSG_SERVER_TEST_OPTIONS_UPDATE_FAILED); return FALSE; } else { SetDirty(FALSE); } return TRUE; } BOOL CDNSServer_TestPropertyPage::OnPropertyChange(BOOL, long*) { CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder(); CDNSServerNode* pServerNode = pHolder->GetServerNode(); pServerNode->ResetTestOptions(&m_testOptions); //if (err != 0) // pHolder->SetError(err); //return (err == 0); return FALSE; // no need to UI changes on this } void CDNSServer_TestPropertyPage::OnEnableTestingCheck() { SetDirty(TRUE); EnableControlsHelper(GetEnableTestingCheck()->GetCheck()); } void CDNSServer_TestPropertyPage::OnQueryCheck() { SetDirty(TRUE); BOOL bCanQuery = GetSimpleQueryCheck()->GetCheck() || GetRecursiveQueryCheck()->GetCheck(); GetTestNowButton()->EnableWindow(bCanQuery); CButton* pEnableTestingCheck = GetEnableTestingCheck(); pEnableTestingCheck->EnableWindow(bCanQuery); if (!bCanQuery) { GetTestNowButton()->EnableWindow(FALSE); pEnableTestingCheck->EnableWindow(FALSE); pEnableTestingCheck->SetCheck(FALSE); m_pollingIntervalEditGroup.EnableUI(FALSE); } } void CDNSServer_TestPropertyPage::OnTestNow() { CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder(); CDNSServerNode* pServerNode = pHolder->GetServerNode(); BOOL bSimpleQuery = GetSimpleQueryCheck()->GetCheck(); BOOL bRecursiveQuery = GetRecursiveQueryCheck()->GetCheck(); pHolder->GetComponentData()->PostMessageToTimerThread( WM_TIMER_THREAD_SEND_QUERY_TEST_NOW, (WPARAM)pServerNode, CDNSServerTestQueryResult::Pack(bSimpleQuery, bRecursiveQuery)); } void CDNSServer_TestPropertyPage::OnHaveTestData(LPARAM lParam) { TRACE(_T("CDNSServer_TestPropertyPage::OnHaveTestData(LPARAM lParam = %d)\n"), lParam); if (m_hWnd == NULL) return; // not page not created yet AddEntryToList((CDNSServerTestQueryResultList::addAction)lParam); SetFocus(); } void CDNSServer_TestPropertyPage::AddEntryToList(CDNSServerTestQueryResultList::addAction action) { CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder(); CDNSServerNode* pServerNode = pHolder->GetServerNode(); CDNSServerTestQueryResultList* pResultList = &(pServerNode->m_testResultList); int nCount = m_listCtrl.GetItemCount(); switch (action) { case CDNSServerTestQueryResultList::added: case CDNSServerTestQueryResultList::addedAndRemoved: { if (action == CDNSServerTestQueryResultList::addedAndRemoved) { ASSERT(nCount > 0); m_listCtrl.DeleteItem(nCount-1); } pResultList->Lock(); CDNSServerTestQueryResult* pTestResult = pResultList->GetHead(); m_listCtrl.InsertEntry(pTestResult, 0); pResultList->Unlock(); } break; case CDNSServerTestQueryResultList::changed: { ASSERT(nCount > 0); // for the moment just remove and add again pResultList->Lock(); CDNSServerTestQueryResult* pTestResult = pResultList->GetHead(); m_listCtrl.UpdateEntry(pTestResult, 0); pResultList->Unlock(); } break; }; } void CDNSServer_TestPropertyPage::PopulateList() { m_listCtrl.DeleteAllItems(); CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder(); CDNSServerNode* pServerNode = pHolder->GetServerNode(); CDNSServerTestQueryResultList* pResultList = &(pServerNode->m_testResultList); pResultList->Lock(); int k = 0; POSITION pos; for( pos = pResultList->GetHeadPosition(); pos != NULL; ) { CDNSServerTestQueryResult* pTestResult = pResultList->GetNext(pos); m_listCtrl.InsertEntry(pTestResult, k++); } pResultList->Unlock(); } /* /////////////////////////////////////////////////////////////////////////////// // CDNSServerMonitoringPageHolder CDNSServerMonitoringPageHolder::CDNSServerMonitoringPageHolder(CDNSRootData* pRootDataNode, CDNSServerNode* pServerNode, CComponentDataObject* pComponentData) : CPropertyPageHolderBase(pRootDataNode, pServerNode, pComponentData) { ASSERT(pRootDataNode == GetContainerNode()); m_bAutoDeletePages = FALSE; // we have the pages as embedded members AddPageToList((CPropertyPageBase*)&m_statisticsPage); AddPageToList((CPropertyPageBase*)&m_testPage); } */