/*++ Copyright (C) 1996-1999 Microsoft Corporation Module Name: srcprop.cpp Abstract: Implementation of the source property page. --*/ #include "polyline.h" #include #include #include #include #include #include #include "utils.h" #include "smonmsg.h" #include "unihelpr.h" #include "winhelpr.h" #include "odbcinst.h" #include "smonid.h" #include "srcprop.h" CSourcePropPage::CSourcePropPage() : m_pTimeRange ( NULL ), m_eDataSourceType ( sysmonCurrentActivity ), m_hDataSource(H_REALTIME_DATASOURCE), m_pInfoDeleted ( NULL ), m_bLogFileChg ( FALSE ), m_bSqlDsnChg ( FALSE ), m_bSqlLogSetChg ( FALSE ), m_bRangeChg ( FALSE ), m_bDataSourceChg ( FALSE ) { m_uIDDialog = IDD_SRC_PROPP_DLG; m_uIDTitle = IDS_SRC_PROPP_TITLE; m_szSqlDsnName[0] = L'\0'; m_szSqlLogSetName[0] = L'\0'; } CSourcePropPage::~CSourcePropPage( void ) { return; } /* * CSourcePropPage::Init * * Purpose: * Performs initialization operations that might fail. * * Parameters: * None * * Return Value: * BOOL TRUE if initialization successful, FALSE * otherwise. */ BOOL CSourcePropPage::Init(void) { BOOL bResult; bResult = RegisterTimeRangeClass(); return bResult; } BOOL CSourcePropPage::InitControls ( void ) { BOOL bResult = FALSE; HWND hwndTimeRange; // create time range object attached to dialog control hwndTimeRange = GetDlgItem(m_hDlg, IDC_TIMERANGE); if ( NULL != hwndTimeRange ) { m_pTimeRange = new CTimeRange(hwndTimeRange); if (m_pTimeRange) { bResult = m_pTimeRange->Init(); if ( FALSE == bResult ) { delete m_pTimeRange; m_pTimeRange = NULL; } } } return bResult; } void CSourcePropPage::DeinitControls ( void ) { HWND hwndLogFileList = NULL; INT iIndex; INT iLogFileCnt = 0;; PLogItemInfo pInfo = NULL; ISystemMonitor *pObj; CImpISystemMonitor *pPrivObj; pObj = m_ppISysmon[0]; pPrivObj = (CImpISystemMonitor*)pObj; // Hide the log view start and stop bars on the graph pPrivObj->SetLogViewTempRange( MIN_TIME_VALUE, MAX_TIME_VALUE ); // delete time range object attached to dialog control if (m_pTimeRange != NULL) { delete m_pTimeRange; m_pTimeRange = NULL; } hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCnt = LBNumItems(hwndLogFileList); for (iIndex = 0; iIndex < iLogFileCnt; iIndex++ ) { pInfo = (PLogItemInfo)LBData(hwndLogFileList,iIndex); if ( NULL != pInfo ) { if ( NULL != pInfo->pItem ) { pInfo->pItem->Release(); } if (NULL != pInfo->pszPath ) { delete [] pInfo->pszPath; } delete pInfo; } } } return; } /* * CSourcePropPage::GetProperties * */ BOOL CSourcePropPage::GetProperties(void) { BOOL bReturn = TRUE; DWORD dwStatus = ERROR_SUCCESS; ISystemMonitor *pObj = NULL; CImpISystemMonitor *pPrivObj = NULL; BSTR bstrPath; DATE date; LPWSTR szLogFileList = NULL; ULONG ulLogListBufLen = 0; BOOL bIsValidLogFile = FALSE; BOOL bIsValidLogFileRange = TRUE; ILogFileItem *pItem = NULL; PLogItemInfo pInfo = NULL; BSTR bstrTemp = NULL; INT iLogFile = 0; INT iIndex = 0; INT nChar = 0; if (m_cObjects == 0) { bReturn = FALSE; } else { pObj = m_ppISysmon[0]; // Get pointer to actual object for internal methods pPrivObj = (CImpISystemMonitor*)pObj; } if ( NULL == pObj || NULL == pPrivObj ) { bReturn = FALSE; } else { // Set the data source type pObj->get_DataSourceType (&m_eDataSourceType); CheckRadioButton( m_hDlg, IDC_SRC_REALTIME, IDC_SRC_SQL, IDC_SRC_REALTIME + m_eDataSourceType - 1); SetSourceControlStates(); while (SUCCEEDED(pPrivObj->LogFile(iLogFile, &pItem))) { // Create LogItemInfo to hold the log file item and path pInfo = new LogItemInfo; if ( NULL == pInfo ) { bReturn = FALSE; break; } ZeroMemory ( pInfo, sizeof(LogItemInfo) ); pInfo->pItem = pItem; if ( FAILED ( pItem->get_Path( &bstrPath ) ) ) { bReturn = FALSE; delete pInfo; break; } else { nChar = lstrlen(bstrPath) + 1; pInfo->pszPath = new WCHAR [nChar]; if ( NULL == pInfo->pszPath ) { delete pInfo; SysFreeString(bstrPath); bReturn = FALSE; break; } StringCchCopy(pInfo->pszPath, nChar, bstrPath); SysFreeString(bstrPath); } // Add the log file name to the list box iIndex = AddItemToFileListBox(pInfo); if ( LB_ERR == iIndex ) { bReturn = FALSE; delete [] pInfo->pszPath; delete pInfo; break; } iLogFile++; } // Get SQL DSN name, populate list box. pObj->get_SqlDsnName(&bstrTemp); memset ( m_szSqlDsnName, 0, sizeof (m_szSqlDsnName) ); if ( NULL != bstrTemp ) { if ( bstrTemp[0] != L'\0' ) { lstrcpyn ( m_szSqlDsnName, bstrTemp, min(SQL_MAX_DSN_LENGTH + 1, lstrlen (bstrTemp)+1) ); } SysFreeString (bstrTemp); bstrTemp = NULL; } InitSqlDsnList(); // Get SQL log set name, populate list box. pObj->get_SqlLogSetName(&bstrTemp); memset ( m_szSqlLogSetName, 0, sizeof (m_szSqlLogSetName) ); if ( NULL != bstrTemp ) { if ( bstrTemp[0] != L'\0' ) { lstrcpyn ( m_szSqlLogSetName, bstrTemp, min(SLQ_MAX_LOG_SET_NAME_LEN+1, lstrlen (bstrTemp)+1) ); } SysFreeString (bstrTemp); } InitSqlLogSetList(); if ( m_eDataSourceType == sysmonLogFiles || m_eDataSourceType == sysmonSqlLog) { pPrivObj->GetLogFileRange(&m_llBegin, &m_llEnd); m_pTimeRange->SetBeginEnd(m_llBegin, m_llEnd); pObj->get_LogViewStart(&date); VariantDateToLLTime(date, &m_llStart); pObj->get_LogViewStop(&date); VariantDateToLLTime(date, &m_llStop); m_pTimeRange->SetStartStop(m_llStart, m_llStop); // OpenLogFile sets BeginEnd, StartStop values in the // time range control, if the file and range are valid. dwStatus = OpenLogFile (); if ( ERROR_SUCCESS == dwStatus ) { bIsValidLogFile = TRUE; bIsValidLogFileRange = TRUE; } else { bIsValidLogFile = FALSE; bIsValidLogFileRange = FALSE; m_llStart = MIN_TIME_VALUE; m_llStop = MAX_TIME_VALUE; if ( sysmonLogFiles == m_eDataSourceType ) { BuildLogFileList ( m_hDlg, NULL, &ulLogListBufLen ); szLogFileList = new WCHAR[ulLogListBufLen]; if ( NULL != szLogFileList ) { BuildLogFileList ( m_hDlg, szLogFileList, &ulLogListBufLen ); } } if ( NULL != szLogFileList || sysmonSqlLog == m_eDataSourceType ) { DisplayDataSourceError ( m_hDlg, dwStatus, m_eDataSourceType, szLogFileList, m_szSqlDsnName, m_szSqlLogSetName ); if ( NULL != szLogFileList ) { delete [] szLogFileList; szLogFileList = NULL; ulLogListBufLen = 0; } } } } else { bIsValidLogFile = FALSE; bIsValidLogFileRange = FALSE; m_llStart = MIN_TIME_VALUE; m_llStop = MAX_TIME_VALUE; } // Set the start and stop time bars invisible or not, depending on time range pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); SetTimeRangeCtrlState ( bIsValidLogFile, bIsValidLogFileRange ); // Clear change flags m_bInitialTimeRangePending = !bIsValidLogFileRange; m_bLogFileChg = FALSE; m_bSqlDsnChg = FALSE; m_bSqlLogSetChg = FALSE; m_bRangeChg = FALSE; m_bDataSourceChg = FALSE; bReturn = TRUE; } return bReturn; } /* * CSourcePropPage::SetProperties * */ BOOL CSourcePropPage::SetProperties(void) { ISystemMonitor* pObj = NULL; CImpISystemMonitor* pPrivObj = NULL; BOOL bIsValidLogFile = TRUE; BOOL bIsValidLogFileRange = TRUE; DWORD dwStatus = ERROR_SUCCESS; LPWSTR szLogFileList = NULL; ULONG ulLogListBufLen = 0; PLogItemInfo pInfo = NULL; PLogItemInfo pInfoNext = NULL; DATE date; BOOL bReturn = TRUE; HWND hwndLogFileList = NULL; INT iLogFileCnt = 0; INT i; UINT uiMessage = 0; HRESULT hr = NOERROR; BOOL bNewFileIsValid = TRUE; BSTR bstrTemp = NULL; USES_CONVERSION hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( 0 != m_cObjects ) { pObj = m_ppISysmon[0]; // Get pointer to actual object for internal methods pPrivObj = (CImpISystemMonitor*)pObj; } if (pObj == NULL || pPrivObj == NULL) { return FALSE; } if ( NULL != hwndLogFileList) { iLogFileCnt = LBNumItems(hwndLogFileList); // Validate properties if (m_eDataSourceType == sysmonLogFiles ) { if ( 0 == iLogFileCnt ) { uiMessage = IDS_NOLOGFILE_ERR; } else { // Check validity of existing files. // LogFilesAreValid displays any errors. LogFilesAreValid ( NULL, bNewFileIsValid, bReturn ); } } else if ( m_eDataSourceType == sysmonSqlLog ){ if ( L'\0' == m_szSqlDsnName[0] ) { uiMessage = IDS_NO_SQL_DSN_ERR; } else if ( L'\0' == m_szSqlLogSetName[0] ) { uiMessage = IDS_NO_SQL_LOG_SET_ERR; } } if ( 0 != uiMessage ) { MessageBox(m_hDlg, ResourceString(uiMessage), ResourceString(IDS_APP_NAME), MB_OK | MB_ICONEXCLAMATION); bReturn = FALSE; } if ( !bReturn ) { bIsValidLogFile = FALSE; // Todo: Set log file time range? } if ( m_eDataSourceType == sysmonLogFiles || m_eDataSourceType == sysmonSqlLog) { if ( bReturn && m_bInitialTimeRangePending ) { // If log file or SQL specified, but range has not been determined // Try to open it now and get the range dwStatus = OpenLogFile(); if ( ERROR_SUCCESS == dwStatus ) { bIsValidLogFile = TRUE; bIsValidLogFileRange = TRUE; m_bInitialTimeRangePending = FALSE; } else { bReturn = FALSE; bIsValidLogFile = FALSE; bIsValidLogFileRange = FALSE; m_llStart = MIN_TIME_VALUE; m_llStop = MAX_TIME_VALUE; if ( sysmonLogFiles == m_eDataSourceType ) { BuildLogFileList ( m_hDlg, NULL, &ulLogListBufLen ); szLogFileList = (LPWSTR) new WCHAR [ulLogListBufLen]; if ( NULL != szLogFileList ) { BuildLogFileList ( m_hDlg, szLogFileList, &ulLogListBufLen ); } } if ( NULL != szLogFileList || sysmonSqlLog == m_eDataSourceType ) { DisplayDataSourceError ( m_hDlg, dwStatus, m_eDataSourceType, szLogFileList, m_szSqlDsnName, m_szSqlLogSetName ); if ( NULL != szLogFileList ) { delete [] szLogFileList; szLogFileList = NULL; ulLogListBufLen = 0; } } } } // Set the start and stop time bars invisible or not, depending on time range pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); SetTimeRangeCtrlState ( bIsValidLogFile, bIsValidLogFileRange ); } } // Remove all deleted log files from the control. // Get first object if ( bReturn ) { if (m_bLogFileChg || m_bSqlDsnChg || m_bSqlLogSetChg ) { // Always set the log source to null data source before modifying the log file list // or database fields. // TodoLogFiles: This can leave the user with state different than before, in the // case of log file load failure. pObj->put_DataSourceType ( sysmonNullDataSource ); m_bDataSourceChg = TRUE; } if ( m_bSqlDsnChg) { bstrTemp = SysAllocString(m_szSqlDsnName); if ( NULL != bstrTemp ) { hr = pObj->put_SqlDsnName(bstrTemp); } else { hr = E_OUTOFMEMORY; } SysFreeString (bstrTemp); bstrTemp = NULL; bReturn = SUCCEEDED ( hr ); } if ( bReturn && m_bSqlLogSetChg) { bstrTemp = SysAllocString(m_szSqlLogSetName); if ( NULL != bstrTemp ) { hr = pObj->put_SqlLogSetName(bstrTemp); } else { hr = E_OUTOFMEMORY; } SysFreeString (bstrTemp); bstrTemp = NULL; bReturn = SUCCEEDED ( hr ); } if (m_bLogFileChg) { // Remove all items in the delete list from the control. pInfo = m_pInfoDeleted; while ( NULL != pInfo ) { // If this counter exists in the control if ( NULL != pInfo->pItem ) { // Tell control to remove it // Always set the log source to CurrentActivity before modifying the log file list. pPrivObj->DeleteLogFile(pInfo->pItem); // Release the local reference pInfo->pItem->Release(); } // Free the path string delete [] pInfo->pszPath; // Delete the Info structure and point to the next one pInfoNext = pInfo->pNextInfo; delete pInfo; pInfo = pInfoNext; } m_pInfoDeleted = NULL; // For each item for (i=0; ipItem == NULL) { // The following code inits the pItem field of pInfo. bstrTemp = SysAllocString(pInfo->pszPath); if ( NULL != bstrTemp ) { hr = pPrivObj->AddLogFile(bstrTemp, &pInfo->pItem); SysFreeString (bstrTemp); bstrTemp = NULL; } else { hr = E_OUTOFMEMORY; } } if ( FAILED ( hr) ) { break; } } bReturn = SUCCEEDED ( hr ); } if ( bReturn && m_bDataSourceChg ) { // This covers CurrentActivity as well as log files, database hr = pObj->put_DataSourceType(m_eDataSourceType); bReturn = SUCCEEDED ( hr ); if ( SUCCEEDED ( hr ) ) { m_bDataSourceChg = FALSE; m_bLogFileChg = FALSE; m_bSqlDsnChg = FALSE; m_bSqlLogSetChg = FALSE; } else { if ( sysmonLogFiles == m_eDataSourceType || sysmonSqlLog == m_eDataSourceType ) { // Display error messages, then retry in // Current Activity data source type. // TodoLogFiles: Message re: data source set to CurrentActivity if // put_DataSourceType failed. if ( sysmonLogFiles == m_eDataSourceType ) { BuildLogFileList ( m_hDlg, NULL, &ulLogListBufLen ); szLogFileList = new WCHAR [ulLogListBufLen]; if ( NULL != szLogFileList ) { BuildLogFileList ( m_hDlg, szLogFileList, &ulLogListBufLen ); } } if ( NULL != szLogFileList || sysmonSqlLog == m_eDataSourceType ) { DisplayDataSourceError ( m_hDlg, (DWORD)hr, m_eDataSourceType, szLogFileList, m_szSqlDsnName, m_szSqlLogSetName ); if ( NULL != szLogFileList ) { delete [] szLogFileList; szLogFileList = NULL; ulLogListBufLen = 0; } } } // m_hDataSource should always be cleared unless in OpenLogFile method. assert ( H_REALTIME_DATASOURCE == m_hDataSource ); // TodoLogFiles: Need separate method to handle all changes necesary // when the log source type changes. if ( sysmonCurrentActivity != m_eDataSourceType ) { m_eDataSourceType = sysmonCurrentActivity; CheckRadioButton( m_hDlg, IDC_SRC_REALTIME, IDC_SRC_SQL, IDC_SRC_REALTIME + m_eDataSourceType - 1); m_bDataSourceChg = TRUE; SetSourceControlStates(); SetTimeRangeCtrlState ( FALSE, FALSE ); hr = pObj->put_DataSourceType ( m_eDataSourceType ); bReturn = SUCCEEDED ( hr ); m_bDataSourceChg = FALSE; m_bLogFileChg = FALSE; m_bSqlDsnChg = FALSE; m_bSqlLogSetChg = FALSE; } // else setting to Current Activity failed. } } if ( bReturn ) { if (m_eDataSourceType == sysmonLogFiles || m_eDataSourceType == sysmonSqlLog) pPrivObj->SetLogFileRange(m_llBegin, m_llEnd); else pObj->UpdateGraph(); } else { SetFocus(GetDlgItem(m_hDlg, IDC_ADDFILE)); } if (bReturn && m_bRangeChg && ( m_eDataSourceType == sysmonLogFiles || m_eDataSourceType == sysmonSqlLog)) { // With active logs, the begin/end points might have changed. pPrivObj->SetLogFileRange(m_llBegin, m_llEnd); // Always set Stop time first, to handle live logs. LLTimeToVariantDate(m_llStop, &date); pObj->put_LogViewStop(date); LLTimeToVariantDate(m_llStart, &date); pObj->put_LogViewStart(date); // Set the start and stop time bars visible in the graph pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); m_bRangeChg = FALSE; } } else { bReturn = FALSE; } return bReturn; } void CSourcePropPage::LogFilesAreValid ( PLogItemInfo pNewInfo, BOOL& rbNewIsValid, BOOL& rbExistingIsValid ) { DWORD dwStatus = ERROR_SUCCESS; INT iIndex; INT iLogFileCnt = 0; HWND hwndLogFileList = NULL; WCHAR szLogFile[MAX_PATH + 1]; LPCWSTR pszTestFile = NULL; PLogItemInfo pInfo = NULL; WCHAR* pszMessage = NULL; WCHAR szSystemMessage[MAX_PATH + 1]; DWORD dwType = PDH_LOG_TYPE_BINARY; UINT uiErrorMessageID = 0; rbNewIsValid = TRUE; rbExistingIsValid = TRUE; hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCnt = LBNumItems(hwndLogFileList); } if ( NULL != pNewInfo && NULL != hwndLogFileList ) { if ( NULL != pNewInfo->pszPath ) { // Check for duplicates. for (iIndex = 0; iIndex < iLogFileCnt; iIndex++ ) { LBGetText(hwndLogFileList, iIndex, szLogFile); if ( 0 == lstrcmpi ( pNewInfo->pszPath, szLogFile ) ) { MessageBox( m_hDlg, ResourceString(IDS_DUPL_LOGFILE_ERR), ResourceString(IDS_APP_NAME), MB_OK | MB_ICONWARNING); iIndex = LB_ERR; rbNewIsValid = FALSE; break; } } // Validate added log file type if multiple log files if ( rbNewIsValid && 0 < iLogFileCnt ) { // Validate the new file dwType = PDH_LOG_TYPE_BINARY; pszTestFile = pNewInfo->pszPath; if ( NULL != pszTestFile ) { dwStatus = PdhGetLogFileType ( pszTestFile, &dwType ); if ( ERROR_SUCCESS == dwStatus ) { if ( PDH_LOG_TYPE_BINARY != dwType ) { if ( (DWORD)ePdhLogTypeRetiredBinary == dwType ) { uiErrorMessageID = IDS_MULTILOG_BIN_TYPE_ADD_ERR; } else { uiErrorMessageID = IDS_MULTILOG_TEXT_TYPE_ADD_ERR; } rbNewIsValid = FALSE; } } else { // bad dwStatus error message handled below rbNewIsValid = FALSE; } } } } else { rbNewIsValid = FALSE; assert ( FALSE ); } } // Validate existing files if the new count will be > 1 if ( rbNewIsValid && ( NULL != pNewInfo || iLogFileCnt > 1 ) ) { dwType = PDH_LOG_TYPE_BINARY; for (iIndex=0; iIndexpszPath; if ( NULL != pszTestFile ) { dwStatus = PdhGetLogFileType ( pszTestFile, &dwType ); if ( PDH_LOG_TYPE_BINARY != dwType ) { rbExistingIsValid = FALSE; break; } } } } if ( ERROR_SUCCESS == dwStatus ) { if ( PDH_LOG_TYPE_BINARY != dwType ) { if ( (DWORD)ePdhLogTypeRetiredBinary == dwType ) { uiErrorMessageID = IDS_MULTILOG_BIN_TYPE_ERR; } else { uiErrorMessageID = IDS_MULTILOG_TEXT_TYPE_ERR; } rbExistingIsValid = FALSE; } } else { rbExistingIsValid = FALSE; } } if ( ( !rbNewIsValid || !rbExistingIsValid ) && NULL != pszTestFile ) { iIndex = LB_ERR; // Check dwStatus of PdhGetLogFileType call. if ( ERROR_SUCCESS == dwStatus ) { if ( PDH_LOG_TYPE_BINARY != dwType ) { assert ( 0 != uiErrorMessageID ); pszMessage = new WCHAR [ ( 2*lstrlen(pszTestFile) ) + RESOURCE_STRING_BUF_LEN + 1]; if ( NULL != pszMessage ) { StringCchPrintf(pszMessage, ( 2*lstrlen(pszTestFile) ) + RESOURCE_STRING_BUF_LEN + 1, ResourceString(uiErrorMessageID), pszTestFile, pszTestFile ); MessageBox ( m_hDlg, pszMessage, ResourceString(IDS_APP_NAME), MB_OK | MB_ICONSTOP ); delete [] pszMessage; } } } else { pszMessage = new WCHAR [lstrlen(pszTestFile) + MAX_PATH + RESOURCE_STRING_BUF_LEN+1]; if ( NULL != pszMessage ) { StringCchPrintf( pszMessage, lstrlen(pszTestFile) + MAX_PATH + RESOURCE_STRING_BUF_LEN + 1, ResourceString(IDS_MULTILOG_CHECKTYPE_ERR), pszTestFile ); FormatSystemMessage ( dwStatus, szSystemMessage, MAX_PATH ); StringCchCat(pszMessage, lstrlen(pszTestFile) + MAX_PATH + RESOURCE_STRING_BUF_LEN + 1, szSystemMessage ); MessageBox ( m_hDlg, pszMessage, ResourceString(IDS_APP_NAME), MB_OK | MB_ICONSTOP); delete [] pszMessage; } } } return; } INT CSourcePropPage::AddItemToFileListBox ( IN PLogItemInfo pNewInfo ) /*++ Routine Description: AddItemToFileListBox adds a log file's path name to the dialog list box and attaches a pointer to the log file's LogItemInfo structure as item data. It also adjusts the horizontal scroll of the list box. Arguments: pInfo - Pointer to log file's LogItemInfo structure Return Value: List box index of added log file (LB_ERR on failure) --*/ { INT iIndex = LB_ERR; HWND hwndLogFileList = NULL; DWORD dwItemExtent = 0; HDC hDC = NULL; BOOL bNewIsValid; BOOL bExistingAreValid; hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != pNewInfo && NULL != hwndLogFileList ) { LogFilesAreValid ( pNewInfo, bNewIsValid, bExistingAreValid ); if ( bNewIsValid && NULL != pNewInfo->pszPath ) { iIndex = (INT)LBAdd ( hwndLogFileList, pNewInfo->pszPath ); LBSetSelection( hwndLogFileList, iIndex); if ( LB_ERR != iIndex && LB_ERRSPACE != iIndex ) { LBSetData(hwndLogFileList, iIndex, pNewInfo); hDC = GetDC ( hwndLogFileList ); if ( NULL != hDC ) { dwItemExtent = (DWORD)TextWidth ( hDC, pNewInfo->pszPath ); if (dwItemExtent > m_dwMaxHorizListExtent) { m_dwMaxHorizListExtent = dwItemExtent; LBSetHorzExtent ( hwndLogFileList, dwItemExtent ); } ReleaseDC ( hwndLogFileList, hDC ); } OnLogFileChange(); } else { iIndex = LB_ERR ; } } } return iIndex; } BOOL CSourcePropPage::RemoveItemFromFileListBox ( void ) /*++ Routine Description: RemoveItemFromFileListBox removes the currently selected log file from the dialog's log file name listbox. It adds the item to the deletion list, so the actual log file can be deleted from the control when (and if) the changes are applied. The routine selects selects the next log file in the listbox if there is one, and adjusts the horizontal scroll appropriately. Arguments: None. Return Value: None. --*/ { BOOL bChanged = FALSE; HWND hWnd; INT iIndex; PLogItemInfo pInfo = NULL; LPWSTR szBuffer = NULL; DWORD dwItemExtent = 0; INT iCurrentBufLen = 0; INT iTextLen; HDC hDC = NULL; // Get selected index hWnd = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); iIndex = LBSelection(hWnd); if ( LB_ERR != iIndex ) { // Get selected item info pInfo = (PLogItemInfo)LBData(hWnd, iIndex); // Move it to the "Deleted" list. pInfo->pNextInfo = m_pInfoDeleted; m_pInfoDeleted = pInfo; // Remove the string from the list box. LBDelete(hWnd, iIndex); // Select next item if possible, else the previous if (iIndex == LBNumItems(hWnd)) { iIndex--; } LBSetSelection( hWnd, iIndex); hDC = GetDC ( hWnd ); if ( NULL != hDC ) { // Clear the max horizontal extent and recalculate m_dwMaxHorizListExtent = 0; for ( iIndex = 0; iIndex < (INT)LBNumItems ( hWnd ); iIndex++ ) { iTextLen = (INT)LBGetTextLen ( hWnd, iIndex ); if ( iTextLen >= iCurrentBufLen ) { if ( NULL != szBuffer ) { delete [] szBuffer; szBuffer = NULL; } iCurrentBufLen = iTextLen + 1; szBuffer = new WCHAR [iCurrentBufLen]; } if ( NULL != szBuffer ) { LBGetText ( hWnd, iIndex, szBuffer ); dwItemExtent = (DWORD)TextWidth ( hDC, szBuffer ); if (dwItemExtent > m_dwMaxHorizListExtent) { m_dwMaxHorizListExtent = dwItemExtent; } } } LBSetHorzExtent ( hWnd, m_dwMaxHorizListExtent ); ReleaseDC ( hWnd, hDC ); } if ( NULL != szBuffer ) { delete [] szBuffer; } bChanged = TRUE; OnLogFileChange(); } return bChanged; } void CSourcePropPage::OnLogFileChange ( void ) { HWND hwndLogFileList = NULL; INT iLogFileCnt = 0; BOOL bIsValidDataSource = FALSE; m_bLogFileChg = TRUE; m_bInitialTimeRangePending = TRUE; hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCnt = LBNumItems(hwndLogFileList); } bIsValidDataSource = (iLogFileCnt > 0); if (m_eDataSourceType == sysmonLogFiles) { DialogEnable(m_hDlg, IDC_REMOVEFILE, ( bIsValidDataSource ) ); } SetTimeRangeCtrlState( bIsValidDataSource, FALSE ); } void CSourcePropPage::OnSqlDataChange ( void ) { BOOL bIsValidDataSource = FALSE; assert ( sysmonSqlLog == m_eDataSourceType ); m_bInitialTimeRangePending = TRUE; bIsValidDataSource = 0 < lstrlen ( m_szSqlDsnName ) && 0 < lstrlen ( m_szSqlLogSetName ); SetTimeRangeCtrlState( bIsValidDataSource, FALSE ); } void CSourcePropPage::DialogItemChange(WORD wID, WORD wMsg) { ISystemMonitor *pObj = NULL; CImpISystemMonitor *pPrivObj = NULL; HWND hwndCtrl = NULL; BOOL fChange = FALSE; DataSourceTypeConstants eNewDataSourceType; HWND hwndLogFileList = NULL; INT iLogFileCnt = 0;; BOOL bIsValidDataSource; switch(wID) { case IDC_SRC_REALTIME: case IDC_SRC_LOGFILE: case IDC_SRC_SQL: // Check which button is involved eNewDataSourceType = (DataSourceTypeConstants)(wID - IDC_SRC_REALTIME + 1); // If state changed if ( wMsg == BN_CLICKED && eNewDataSourceType != m_eDataSourceType) { // Set change flags and update the radio button m_bDataSourceChg = TRUE; fChange = TRUE; m_eDataSourceType = eNewDataSourceType; CheckRadioButton( m_hDlg, IDC_SRC_REALTIME, IDC_SRC_SQL, IDC_SRC_REALTIME + m_eDataSourceType - 1); SetSourceControlStates(); pObj = m_ppISysmon[0]; if ( NULL != m_ppISysmon[0] ) { pPrivObj = (CImpISystemMonitor*) pObj; } if ( NULL != pPrivObj ) { bIsValidDataSource = FALSE; hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCnt = LBNumItems(hwndLogFileList); } if ( sysmonLogFiles == m_eDataSourceType && iLogFileCnt > 0) { bIsValidDataSource = (iLogFileCnt > 0); if ( bIsValidDataSource ) { SetFocus(GetDlgItem(m_hDlg, IDC_ADDFILE)); } } else if ( sysmonSqlLog == m_eDataSourceType ) { bIsValidDataSource = ( 0 < lstrlen ( m_szSqlDsnName ) ) && ( 0 < lstrlen ( m_szSqlLogSetName ) ); } // else current activity, so no valid data source if ( bIsValidDataSource ) { // Set the start and stop time bars visible in the graph pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); } else { // Set the start and stop time bars invisible in the graph pPrivObj->SetLogViewTempRange( MIN_TIME_VALUE, MAX_TIME_VALUE ); } } m_bDataSourceChg = TRUE; } break; case IDC_REMOVEFILE: fChange = RemoveItemFromFileListBox(); break; case IDC_ADDFILE: { WCHAR szDefaultFolderBuff[MAX_PATH + 1]; LPWSTR szBrowseBuffer = NULL; INT iFolderBufLen; PDH_STATUS pdhstat; LogItemInfo* pInfo = NULL; DWORD cchLen = 0; DWORD cchBrowseBuffer = 0; szDefaultFolderBuff[0] = L'\0'; iFolderBufLen = MAX_PATH; if ( ERROR_SUCCESS != LoadDefaultLogFileFolder(szDefaultFolderBuff, &iFolderBufLen ) ) { StringCchCopy(szDefaultFolderBuff, MAX_PATH + 1, ResourceString ( IDS_DEFAULT_LOG_FILE_FOLDER ) ); } // // Expand environment strings. // cchLen = ExpandEnvironmentStrings ( szDefaultFolderBuff, NULL, 0 ); if ( 0 < cchLen ) { // // cchLen includes space for null. // cchBrowseBuffer = max ( cchLen, MAX_PATH + 1 ); szBrowseBuffer = new WCHAR [ cchBrowseBuffer ]; szBrowseBuffer[0] = L'\0'; if ( NULL != szBrowseBuffer ) { cchLen = ExpandEnvironmentStrings ( szDefaultFolderBuff, szBrowseBuffer, cchBrowseBuffer ); if ( 0 < cchLen && cchLen <= cchBrowseBuffer ) { SetCurrentDirectory(szBrowseBuffer); } } } if ( NULL != szBrowseBuffer ) { szBrowseBuffer[0] = L'\0'; pdhstat = PdhSelectDataSource( m_hDlg, PDH_FLAGS_FILE_BROWSER_ONLY, szBrowseBuffer, &cchBrowseBuffer); // Todo: Error message if file name is too long. if ( (ERROR_SUCCESS != pdhstat) || szBrowseBuffer [0] == L'\0' ) { delete [] szBrowseBuffer; szBrowseBuffer = NULL; break; } // Load file name into edit control pInfo = new LogItemInfo; if ( NULL != pInfo ) { ZeroMemory ( pInfo, sizeof(LogItemInfo) ); // // Make own copy of path name string // pInfo->pszPath = new WCHAR [lstrlen( szBrowseBuffer ) + 1]; if ( NULL != pInfo->pszPath ) { INT iIndex = 0; StringCchCopy(pInfo->pszPath, lstrlen( szBrowseBuffer ) + 1, szBrowseBuffer); iIndex = AddItemToFileListBox ( pInfo ); fChange = ( LB_ERR != iIndex ); if (!fChange) { // Todo: error message delete [] pInfo->pszPath; delete pInfo; } } else { // Todo: error message delete pInfo; } } // Todo: error message } if ( NULL != szBrowseBuffer ) { delete [] szBrowseBuffer; } break; } /* // Doesn't do anything case IDC_LIST_LOGFILENAME: // If selection changed if (wMsg == LBN_SELCHANGE) { // TodoLogFiles: Selection change won't matter when multi-file support fChange = TRUE; OnLogFileChange(); // Get selected index hwndCtrl = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); iIndex = LBSelection(hwndCtrl); } break; */ case IDC_DSN_COMBO: { WCHAR* szDsnName = NULL; INT iSel; HWND hDsnCombo; LRESULT lresultDsnLen; if (wMsg == CBN_CLOSEUP) { hDsnCombo = GetDlgItem ( m_hDlg, IDC_DSN_COMBO); if ( NULL != hDsnCombo ) { iSel = (INT)CBSelection ( hDsnCombo ); if ( LB_ERR != iSel ) { lresultDsnLen = (INT)CBStringLen ( hDsnCombo, iSel ); if ( lresultDsnLen < INT_MAX ) { szDsnName = new WCHAR[lresultDsnLen+1]; if ( NULL != szDsnName ) { szDsnName[0] = L'\0'; CBString( hDsnCombo, iSel, szDsnName); szDsnName[lresultDsnLen] = L'\0'; if ( 0 != lstrcmpi ( m_szSqlDsnName, szDsnName ) ) { lstrcpyn ( m_szSqlDsnName, szDsnName, min ( SQL_MAX_DSN_LENGTH+1, lstrlen(szDsnName)+1 ) ); m_bSqlDsnChg = TRUE; InitSqlLogSetList(); OnSqlDataChange(); fChange = TRUE; } delete [] szDsnName; } } } } } break; } case IDC_LOGSET_COMBO: { WCHAR* szLogSetName = NULL; INT iSel; HWND hLogSetCombo; LRESULT lresultLogSetLen; if (wMsg == CBN_CLOSEUP) { hLogSetCombo = GetDlgItem ( m_hDlg, IDC_LOGSET_COMBO); if ( NULL != hLogSetCombo ) { iSel = (INT)CBSelection ( hLogSetCombo ); if ( LB_ERR != iSel ) { lresultLogSetLen = CBStringLen ( hLogSetCombo, iSel ); if ( lresultLogSetLen < INT_MAX ) { szLogSetName = new WCHAR[lresultLogSetLen+1]; if ( NULL != szLogSetName ) { szLogSetName[0] = L'\0'; CBString ( hLogSetCombo, iSel, szLogSetName ); szLogSetName[lresultLogSetLen] = L'\0'; if ( ( 0 != lstrcmpi ( m_szSqlLogSetName, szLogSetName ) ) && ( 0 != lstrcmpi ( szLogSetName, ResourceString ( IDS_LOGSET_NOT_FOUND ) ) ) ) { lstrcpyn ( m_szSqlLogSetName, szLogSetName, min ( SLQ_MAX_LOG_SET_NAME_LEN + 1, lstrlen(szLogSetName)+1 ) ); m_bSqlLogSetChg = TRUE; OnSqlDataChange(); fChange = TRUE; } delete [] szLogSetName; } } } } } break; } case IDC_TIMESELECTBTN: { DWORD dwStatus = ERROR_SUCCESS; BOOL bAttemptedReload = FALSE; hwndCtrl = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndCtrl ) { { CWaitCursor cursorWait; dwStatus = OpenLogFile (); } if ( SMON_STATUS_LOG_FILE_SIZE_LIMIT == dwStatus ) { WCHAR szMessage[RESOURCE_STRING_BUF_LEN + 1]; BSTR bstrPath; int iResult; pObj = m_ppISysmon[0]; pObj->get_LogFileName ( &bstrPath ); if ( bstrPath ) { if ( bstrPath[0] ) { StringCchCopy(szMessage, RESOURCE_STRING_BUF_LEN+1, ResourceString(IDS_LARGE_LOG_FILE_RELOAD) ); iResult = MessageBox( m_hDlg, szMessage, ResourceString(IDS_APP_NAME), MB_YESNO | MB_ICONEXCLAMATION); if ( IDYES == iResult ) { CWaitCursor cursorWait; dwStatus = OpenLogFile (); bAttemptedReload = TRUE; } } SysFreeString(bstrPath); } } if ( ERROR_SUCCESS == dwStatus ) { m_bInitialTimeRangePending = FALSE; // Show graph log view start/stop time bars pObj = m_ppISysmon[0]; pPrivObj = (CImpISystemMonitor*)pObj; pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); SetTimeRangeCtrlState ( TRUE, TRUE ); m_bRangeChg = TRUE; fChange = TRUE; } else { // OpenLogFile failure if ( ( SMON_STATUS_LOG_FILE_SIZE_LIMIT == dwStatus ) && !bAttemptedReload ) { // Message already displayed, user chose not to continue. } else { LPWSTR szLogFileList = NULL; ULONG ulLogListBufLen = 0; if ( sysmonLogFiles == m_eDataSourceType ) { BuildLogFileList ( m_hDlg, NULL, &ulLogListBufLen ); szLogFileList = new WCHAR[ulLogListBufLen]; if ( NULL != szLogFileList ) { BuildLogFileList ( m_hDlg, szLogFileList, &ulLogListBufLen ); } } if ( NULL != szLogFileList || sysmonSqlLog == m_eDataSourceType ) { DisplayDataSourceError ( m_hDlg, dwStatus, m_eDataSourceType, szLogFileList, m_szSqlDsnName, m_szSqlLogSetName ); if ( NULL != szLogFileList ) { delete [] szLogFileList; szLogFileList = NULL; ulLogListBufLen = 0; } } } } } break; } case IDC_TIMERANGE: { m_llStart = m_pTimeRange->GetStart(); m_llStop = m_pTimeRange->GetStop(); // Show graph log view start/stop time bars pObj = m_ppISysmon[0]; pPrivObj = (CImpISystemMonitor*)pObj; pPrivObj->SetLogViewTempRange( m_llStart, m_llStop ); fChange = TRUE; m_bRangeChg = TRUE; break; } } if (fChange) SetChange(); } DWORD CSourcePropPage::OpenLogFile (void) { DWORD dwStatus = ERROR_SUCCESS; DWORD nBufSize; DWORD nLogEntries = 0; PDH_TIME_INFO TimeInfo; LPWSTR szLogFileList = NULL; LPWSTR szCurrentLogFile; ULONG LogFileListSize = 0; HWND hwndLogFileList = NULL; INT iLogFileCount = 0; INT iLogFileIndex; PLogItemInfo pInfo; BOOLEAN bSqlLogSet = (BST_CHECKED == IsDlgButtonChecked(m_hDlg,IDC_SRC_SQL)); WCHAR* szDsnName = NULL; WCHAR* szLogSetName = NULL; INT iSel; HWND hDsnCombo; HWND hLogSetCombo; memset (&TimeInfo, 0, sizeof(TimeInfo)); hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCount = LBNumItems(hwndLogFileList); } if (bSqlLogSet) { LogFileListSize = 0; szDsnName = new WCHAR[SQL_MAX_DSN_LENGTH+1]; szLogSetName = new WCHAR[SLQ_MAX_LOG_SET_NAME_LEN+1]; hDsnCombo = GetDlgItem ( m_hDlg, IDC_DSN_COMBO); hLogSetCombo = GetDlgItem ( m_hDlg, IDC_LOGSET_COMBO); if ( NULL != szDsnName && NULL != szLogSetName && NULL != hDsnCombo && NULL != hLogSetCombo ) { szDsnName[0] = L'\0'; szLogSetName[0] = L'\0'; iSel = (INT)CBSelection ( hDsnCombo ); if ( LB_ERR != iSel ) { if ( SQL_MAX_DSN_LENGTH >= CBStringLen( hDsnCombo, iSel ) ) { CBString ( hDsnCombo, iSel, szDsnName); iSel = (INT)CBSelection ( hLogSetCombo ); if ( LB_ERR != iSel ) { if ( SLQ_MAX_LOG_SET_NAME_LEN >= CBStringLen( hLogSetCombo, iSel ) ) { CBString( hLogSetCombo, iSel, szLogSetName); // Size includes 5 characters "SQL:" "!"and 2 nulls LogFileListSize = lstrlen(szDsnName) + lstrlen(szLogSetName) + 7; } } } } } } else { if ( NULL != hwndLogFileList ) { for (iLogFileIndex = 0; iLogFileIndex < iLogFileCount; iLogFileIndex ++) { pInfo = (PLogItemInfo) LBData(hwndLogFileList, iLogFileIndex); if (pInfo && pInfo->pszPath) { LogFileListSize += (lstrlen(pInfo->pszPath) + 1); } } LogFileListSize ++; } } szLogFileList = (LPWSTR) malloc(LogFileListSize * sizeof(WCHAR)); if (szLogFileList) { if (bSqlLogSet) { ZeroMemory(szLogFileList, LogFileListSize * sizeof(WCHAR)); StringCchPrintf(szLogFileList, LogFileListSize, L"SQL:%s!%s", szDsnName, szLogSetName); } else { if ( NULL != hwndLogFileList ) { szCurrentLogFile = szLogFileList; for (iLogFileIndex = 0; iLogFileIndex < iLogFileCount; iLogFileIndex ++) { pInfo = (PLogItemInfo) LBData(hwndLogFileList, iLogFileIndex); if (pInfo && pInfo->pszPath) { StringCchCopy(szCurrentLogFile,lstrlen(pInfo->pszPath) + 1, pInfo->pszPath); szCurrentLogFile += lstrlen(pInfo->pszPath); * szCurrentLogFile = L'\0'; szCurrentLogFile ++; } } * szCurrentLogFile = L'\0'; } } if ( m_hDataSource != H_REALTIME_DATASOURCE && m_hDataSource != H_WBEM_DATASOURCE) { PdhCloseLog(m_hDataSource, 0); m_hDataSource = H_REALTIME_DATASOURCE; } dwStatus = PdhBindInputDataSource(& m_hDataSource, szLogFileList); if ( ERROR_SUCCESS == dwStatus ) { // Get time and sample count info nBufSize = sizeof(TimeInfo); dwStatus = PdhGetDataSourceTimeRangeH( m_hDataSource, &nLogEntries, &TimeInfo, & nBufSize); PdhCloseLog(m_hDataSource, 0); m_hDataSource = H_REALTIME_DATASOURCE; } free(szLogFileList); szLogFileList = NULL; } else { dwStatus = ERROR_NOT_ENOUGH_MEMORY; } if (ERROR_NOT_ENOUGH_MEMORY == dwStatus ) { dwStatus = SMON_STATUS_LOG_FILE_SIZE_LIMIT; } if ( ERROR_SUCCESS == dwStatus ) { // Check that at least 2 samples exist: // If 0 samples, StartTime is 0, EndTime is 0 // If 1 sample, StartTime == EndTime if ( ( TimeInfo.StartTime < TimeInfo.EndTime ) && ( 1 < TimeInfo.SampleCount ) ){ // Load log time range into time range control m_llBegin = TimeInfo.StartTime; m_llEnd = TimeInfo.EndTime; // Limit view range to actual log file range if (m_llStop > m_llEnd ) { m_llStop = m_llEnd; } else if (m_llStop < m_llBegin ) { m_llStop = m_llBegin; } if (m_llStart < m_llBegin) m_llStart = m_llBegin; if (m_llStart > m_llStop) m_llStart = m_llStop; m_pTimeRange->SetBeginEnd(m_llBegin, m_llEnd); m_pTimeRange->SetStartStop(m_llStart, m_llStop); } else { dwStatus = SMON_STATUS_TOO_FEW_SAMPLES; } } if ( NULL != szDsnName ) { delete [] szDsnName; } if ( NULL != szLogSetName ) { delete [] szLogSetName; } return dwStatus; } void CSourcePropPage::SetTimeRangeCtrlState ( BOOL bIsValidLogFile, BOOL bIsValidLogFileRange ) { // Enable time range button if valid log file, even if log data is invalid. DialogEnable ( m_hDlg, IDC_TIMESELECTBTN, bIsValidLogFile ); // Set time range controls visible or not, depending on valid log file and data. DialogEnable ( m_hDlg, IDC_TIMERANGE, bIsValidLogFile && bIsValidLogFileRange ); DialogEnable ( m_hDlg, IDC_STATIC_TOTAL, bIsValidLogFile && bIsValidLogFileRange ); DialogEnable ( m_hDlg, IDC_STATIC_SELECTED, bIsValidLogFile && bIsValidLogFileRange ); } void CSourcePropPage::InitSqlDsnList(void) { HENV henv; RETCODE retcode; INT DsnCount = 0; HWND hWnd = NULL; WCHAR* szTmpName = NULL; hWnd = GetDlgItem(m_hDlg, IDC_DSN_COMBO); szTmpName = new WCHAR[SQL_MAX_DSN_LENGTH + 1]; if ( NULL != hWnd && NULL != szTmpName ) { if (SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, & henv))) { (void) SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); // Todo: NULL hWnd CBReset(hWnd); ZeroMemory ( szTmpName, sizeof(szTmpName) ); retcode = SQLDataSources(henv, SQL_FETCH_FIRST_SYSTEM, szTmpName, (SQL_MAX_DSN_LENGTH+1), NULL, NULL, 0, NULL); while (SQL_SUCCEEDED(retcode)) { CBAdd(hWnd, szTmpName); ZeroMemory ( szTmpName, sizeof(szTmpName) ); retcode = SQLDataSources(henv, SQL_FETCH_NEXT, szTmpName, (SQL_MAX_DSN_LENGTH+1), NULL, NULL, 0, NULL); } DsnCount = CBNumItems(hWnd) - 1; if (DsnCount >= 0) { if ( m_szSqlDsnName[0] != L'\0') { while (DsnCount >= 0) { CBString(hWnd, DsnCount, szTmpName); if (lstrcmpi(m_szSqlDsnName, szTmpName) == 0) { CBSetSelection(hWnd, DsnCount); break; } else { DsnCount --; } } // Todo: Clear m_szSqlDsnName if not in list? } else { DsnCount = -1; } } SQLFreeHandle(SQL_HANDLE_ENV, henv); } } if ( NULL!= szTmpName ) { delete [] szTmpName; } } void CSourcePropPage::InitSqlLogSetList(void) { PDH_STATUS pdhStatus = ERROR_SUCCESS; INT iLogSetIndex = 0; LPWSTR pLogSetList = NULL; DWORD dwBufferLen = 0; LPWSTR pLogSetPtr = NULL; HWND hwndLogSetCombo = NULL; LPWSTR szTmpName = NULL; INT iBufAllocCount = 0; INT iMaxNameLen = 0; INT iCurrentNameLen = 0; if ( L'\0' == m_szSqlDsnName[0] ) { goto Cleanup; } hwndLogSetCombo = GetDlgItem(m_hDlg, IDC_LOGSET_COMBO); if ( NULL == hwndLogSetCombo ) { goto Cleanup; } do { pdhStatus = PdhEnumLogSetNames( m_szSqlDsnName, pLogSetList, & dwBufferLen); if (pdhStatus == PDH_INSUFFICIENT_BUFFER || pdhStatus == PDH_MORE_DATA) { iBufAllocCount += 1; if (pLogSetList) { delete [] pLogSetList; pLogSetList = NULL; } pLogSetList = (LPWSTR) new WCHAR[dwBufferLen]; if (pLogSetList == NULL) { pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE; } } } while ( ( PDH_INSUFFICIENT_BUFFER == pdhStatus || PDH_MORE_DATA == pdhStatus ) && iBufAllocCount < 10 ); if (pdhStatus == ERROR_SUCCESS && pLogSetList != NULL) { CBReset(hwndLogSetCombo); for ( pLogSetPtr = pLogSetList; * pLogSetPtr != L'\0'; pLogSetPtr += ( iCurrentNameLen + 1)) { iCurrentNameLen = lstrlen(pLogSetPtr); // Ignore log set names that longer than the max allowed length. if ( iCurrentNameLen <= SLQ_MAX_LOG_SET_NAME_LEN ) { CBAdd(hwndLogSetCombo, pLogSetPtr); if ( iMaxNameLen < iCurrentNameLen ) { iMaxNameLen = iCurrentNameLen; } } } iLogSetIndex = CBNumItems(hwndLogSetCombo) - 1; if (iLogSetIndex >= 0) { if ( m_szSqlLogSetName[0] != L'\0') { szTmpName = new WCHAR[iMaxNameLen+1]; if ( NULL != szTmpName ) { while (iLogSetIndex >= 0) { CBString(hwndLogSetCombo, iLogSetIndex, szTmpName); if (lstrcmpi( m_szSqlLogSetName, szTmpName) == 0) { CBSetSelection(hwndLogSetCombo, iLogSetIndex); break; } else { iLogSetIndex --; } } } else { iLogSetIndex = -1; } } else { iLogSetIndex = -1; } // Todo: Clear m_szSqlLogSetName if not in list? } else { if ( 0 == CBNumItems(hwndLogSetCombo) ) { iMaxNameLen = lstrlen ( ResourceString(IDS_LOGSET_NOT_FOUND) ); szTmpName = new WCHAR[iMaxNameLen+1]; if ( NULL != szTmpName ) { StringCchCopy(szTmpName, iMaxNameLen+1, ResourceString(IDS_LOGSET_NOT_FOUND)); CBReset(hwndLogSetCombo); iLogSetIndex = (INT)CBAdd(hwndLogSetCombo, szTmpName); CBSetSelection( hwndLogSetCombo, iLogSetIndex); } } } } else { if ( 0 == CBNumItems(hwndLogSetCombo) ) { iMaxNameLen = lstrlen ( ResourceString(IDS_LOGSET_NOT_FOUND) ); szTmpName = new WCHAR[iMaxNameLen+1]; if ( NULL != szTmpName ) { StringCchCopy(szTmpName, iMaxNameLen+1, ResourceString(IDS_LOGSET_NOT_FOUND)); CBReset(hwndLogSetCombo); iLogSetIndex = (INT)CBAdd(hwndLogSetCombo, szTmpName); CBSetSelection( hwndLogSetCombo, iLogSetIndex); } } } Cleanup: if (pLogSetList) { delete [] pLogSetList; } if ( szTmpName ) { delete [] szTmpName; } return; } HRESULT CSourcePropPage::EditPropertyImpl( DISPID dispID ) { HRESULT hr = E_NOTIMPL; if ( DISPID_SYSMON_DATASOURCETYPE == dispID ) { if ( sysmonCurrentActivity == m_eDataSourceType ) { m_dwEditControl = IDC_SRC_REALTIME; } else if ( sysmonLogFiles == m_eDataSourceType ) { m_dwEditControl = IDC_SRC_LOGFILE; } else if ( sysmonSqlLog == m_eDataSourceType ) { m_dwEditControl = IDC_SRC_SQL; } hr = S_OK; } return hr; } void CSourcePropPage::SetSourceControlStates ( void ) { HWND hwndLogFileList = NULL; INT iLogFileCnt = 0; BOOL bIsValidDataSource = FALSE; if ( sysmonCurrentActivity == m_eDataSourceType ) { DialogEnable(m_hDlg, IDC_ADDFILE, FALSE); DialogEnable(m_hDlg, IDC_REMOVEFILE, FALSE); DialogEnable(m_hDlg, IDC_STATIC_DSN, FALSE); DialogEnable(m_hDlg, IDC_DSN_COMBO, FALSE); DialogEnable(m_hDlg, IDC_STATIC_LOGSET, FALSE); DialogEnable(m_hDlg, IDC_LOGSET_COMBO, FALSE); bIsValidDataSource = FALSE; } else if ( sysmonLogFiles == m_eDataSourceType ) { DialogEnable(m_hDlg, IDC_ADDFILE, TRUE); DialogEnable(m_hDlg, IDC_STATIC_DSN, FALSE); DialogEnable(m_hDlg, IDC_DSN_COMBO, FALSE); DialogEnable(m_hDlg, IDC_STATIC_LOGSET, FALSE); DialogEnable(m_hDlg, IDC_LOGSET_COMBO, FALSE); hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCnt = LBNumItems(hwndLogFileList); } bIsValidDataSource = (iLogFileCnt > 0); DialogEnable(m_hDlg, IDC_REMOVEFILE, ( bIsValidDataSource ) ); } else { assert ( sysmonSqlLog == m_eDataSourceType ); DialogEnable(m_hDlg, IDC_ADDFILE, FALSE); DialogEnable(m_hDlg, IDC_REMOVEFILE, FALSE); DialogEnable(m_hDlg, IDC_STATIC_DSN, TRUE); DialogEnable(m_hDlg, IDC_DSN_COMBO, TRUE); DialogEnable(m_hDlg, IDC_STATIC_LOGSET, TRUE); DialogEnable(m_hDlg, IDC_LOGSET_COMBO, TRUE); bIsValidDataSource = 0 < lstrlen ( m_szSqlDsnName ) && 0 < lstrlen ( m_szSqlLogSetName ); } m_bInitialTimeRangePending = TRUE; SetTimeRangeCtrlState( bIsValidDataSource, FALSE ); } DWORD CSourcePropPage::BuildLogFileList ( HWND /*hwndDlg*/, LPWSTR szLogFileList, ULONG* pulBufLen ) { DWORD dwStatus = ERROR_SUCCESS; ULONG ulListLen; HWND hwndLogFileList = NULL; INT iLogFileCount; INT iLogFileIndex; PLogItemInfo pInfo = NULL; LPCWSTR szThisLogFile = NULL; LPWSTR szLogFileCurrent = NULL; WCHAR cwComma = L','; if ( NULL != pulBufLen ) { ulListLen = 0; hwndLogFileList = DialogControl(m_hDlg, IDC_LIST_LOGFILENAME); if ( NULL != hwndLogFileList ) { iLogFileCount = LBNumItems(hwndLogFileList); if ( 0 < iLogFileCount ) { for ( iLogFileIndex = 0; iLogFileIndex < iLogFileCount; iLogFileIndex++ ) { pInfo = (PLogItemInfo)LBData(hwndLogFileList,iLogFileIndex); szThisLogFile = pInfo->pszPath; ulListLen += (lstrlen(szThisLogFile) + 1); } ulListLen ++; // for the single final NULL character. if ( ulListLen <= *pulBufLen ) { if ( NULL != szLogFileList ) { ZeroMemory(szLogFileList, (ulListLen * sizeof(WCHAR))); szLogFileCurrent = (LPWSTR) szLogFileList; for ( iLogFileIndex = 0; iLogFileIndex < iLogFileCount; iLogFileIndex++ ) { pInfo = (PLogItemInfo)LBData(hwndLogFileList,iLogFileIndex); szThisLogFile = pInfo->pszPath; StringCchCopy(szLogFileCurrent, lstrlen(szThisLogFile) + 1, szThisLogFile); szLogFileCurrent += lstrlen(szThisLogFile); *szLogFileCurrent = L'\0'; if ( (iLogFileIndex + 1) < iLogFileCount ) { // If comma delimited, replace the NULL char with a comma *szLogFileCurrent = cwComma; } szLogFileCurrent ++; } } } else if ( NULL != szLogFileList ) { dwStatus = ERROR_MORE_DATA; } } } *pulBufLen = ulListLen; } else { dwStatus = ERROR_INVALID_PARAMETER; assert ( FALSE ); } return dwStatus; }