windows-nt/Source/XPSP1/NT/admin/controls/smonctrl/srcprop.cpp
2020-09-26 16:20:57 +08:00

1926 lines
63 KiB
C++

/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
srcprop.cpp
Abstract:
Implementation of the source property page.
--*/
#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <sql.h>
#include <pdhmsg.h>
#include <pdhp.h>
#include "polyline.h"
#include "utils.h"
#include "smonmsg.h"
#include "strids.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] = _T('\0');
m_szSqlLogSetName[0] = _T('\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;
USES_CONVERSION
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 {
#if UNICODE
nChar = lstrlen(bstrPath) + 1;
#else
nChar = (wcslen(bstrPath) + 1) * 2; // * 2???
#endif
pInfo->pszPath = new TCHAR [nChar];
if ( NULL == pInfo->pszPath ) {
delete pInfo;
SysFreeString(bstrPath);
bReturn = FALSE;
break;
}
#if UNICODE
lstrcpy(pInfo->pszPath, bstrPath);
#else
WideCharToMultiByte(CP_ACP, 0, bstrPath, nChar,
pInfo->pszPath, nChar, NULL, NULL);
#endif
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] != _T('\0') ) {
lstrcpyn (
m_szSqlDsnName,
W2T( bstrTemp ), min(SQL_MAX_DSN_LENGTH, lstrlen (W2T(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] != _T('\0') ) {
lstrcpyn (
m_szSqlLogSetName,
W2T( bstrTemp ), min(MAX_PATH-1, lstrlen (W2T(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 = (LPWSTR) malloc(ulLogListBufLen * sizeof(WCHAR));
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;
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];
if ( NULL != pObj ) {
// Get pointer to actual object for internal methods
pPrivObj = (CImpISystemMonitor*)pObj;
}
}
if ( NULL != hwndLogFileList && NULL != pPrivObj ) {
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 ( _T('\0') == m_szSqlDsnName[0] ) {
uiMessage = IDS_NO_SQL_DSN_ERR;
} else if ( _T('\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) malloc(ulLogListBufLen * sizeof(WCHAR));
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(T2W(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(T2W(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; i<iLogFileCnt; i++) {
pInfo = (PLogItemInfo)LBData(hwndLogFileList,i);
// If new item, create it now
if (pInfo->pItem == NULL) {
// The following code inits the pItem field of pInfo.
#if UNICODE
bstrTemp = SysAllocString(T2W(pInfo->pszPath));
if ( NULL != bstrTemp ) {
hr = pPrivObj->AddLogFile(bstrTemp, &pInfo->pItem);
SysFreeString (bstrTemp);
bstrTemp = NULL;
} else {
hr = E_OUTOFMEMORY;
}
#else
INT nChar = lstrlen(pInfo->pszPath);
LPWSTR pszPathW = new WCHAR [nChar + 1];
if (pszPathW) {
MultiByteToWideChar(CP_ACP, 0, pInfo->pszPath, nChar+1, pszPathW, nChar+1);
bstrTemp = SysAllocString(pszPathW);
if ( NULL != bstrTemp ) {
hr = pPrivObj->AddLogFile(bstrTemp, &pInfo->pItem);
SysFreeString (bstrTemp);
bstrTemp = NULL;
} else {
hr = E_OUTOFMEMORY;
}
delete pszPathW;
} else {
hr = E_OUTOFMEMORY;
}
#endif
}
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 = (LPWSTR) malloc(ulLogListBufLen * sizeof(WCHAR));
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;
TCHAR szLogFile[MAX_PATH];
LPCTSTR pszTestFile = NULL;
PLogItemInfo pInfo = NULL;
TCHAR* pszMessage = NULL;
TCHAR szSystemMessage[MAX_PATH];
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; iIndex<iLogFileCnt; iIndex++) {
pInfo = (PLogItemInfo)LBData(hwndLogFileList,iIndex);
if ( NULL != pInfo ) {
pszTestFile = pInfo->pszPath;
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 TCHAR [ ( 2*lstrlen(pszTestFile) ) + MAX_PATH];
if ( NULL != pszMessage ) {
_stprintf (
pszMessage,
ResourceString(uiErrorMessageID),
pszTestFile,
pszTestFile );
MessageBox (
m_hDlg,
pszMessage,
ResourceString(IDS_APP_NAME),
MB_OK | MB_ICONSTOP );
delete pszMessage;
}
}
} else {
pszMessage = new TCHAR [lstrlen(pszTestFile) + 2*MAX_PATH];
if ( NULL != pszMessage ) {
_stprintf (
pszMessage,
ResourceString(IDS_MULTILOG_CHECKTYPE_ERR),
pszTestFile );
FormatSystemMessage (
dwStatus, szSystemMessage, MAX_PATH );
lstrcat ( pszMessage, 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;
LPTSTR 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 TCHAR [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:
{
TCHAR 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) ) {
if ( iFolderBufLen > lstrlen ( ResourceString ( IDS_DEFAULT_LOG_FILE_FOLDER ) ) ) {
lstrcpy ( szDefaultFolderBuff, 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);
} else {
}
}
}
if ( NULL != szBrowseBuffer ) {
szBrowseBuffer[0] = L'\0';
pdhstat = PdhSelectDataSource(
m_hDlg,
PDH_FLAGS_FILE_BROWSER_ONLY,
szBrowseBuffer,
&cchBrowseBuffer);
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 TCHAR [lstrlen( szBrowseBuffer ) + 1];
// TodoLogFiles: Multi-log file support
if ( NULL != pInfo->pszPath ) {
INT iIndex = 0;
lstrcpy(pInfo->pszPath, 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:
{
TCHAR szDsnName[SQL_MAX_DSN_LENGTH + 1];
INT iSel;
HWND hDsnCombo;
szDsnName[0] = _T('\0');
hDsnCombo = GetDlgItem ( m_hDlg, IDC_DSN_COMBO);
if ( NULL != hDsnCombo ) {
iSel = (INT)CBSelection ( hDsnCombo );
if ( LB_ERR != iSel ) {
CBString(
hDsnCombo,
iSel,
szDsnName);
if ( 0 != lstrcmpi ( m_szSqlDsnName, szDsnName ) ) {
lstrcpyn (
m_szSqlDsnName,
szDsnName,
min ( SQL_MAX_DSN_LENGTH, lstrlen(szDsnName)+1 ) );
m_bSqlDsnChg = TRUE;
InitSqlLogSetList();
OnSqlDataChange();
fChange = TRUE;
}
}
}
}
break;
case IDC_LOGSET_COMBO:
{
TCHAR szLogSetName[MAX_PATH];
INT iSel;
HWND hLogSetCombo;
szLogSetName[0] = _T('\0');
hLogSetCombo = GetDlgItem ( m_hDlg, IDC_LOGSET_COMBO);
if ( NULL != hLogSetCombo ) {
iSel = (INT)CBSelection ( hLogSetCombo );
if ( LB_ERR != iSel ) {
CBString (
hLogSetCombo,
iSel,
szLogSetName );
if ( ( 0 != lstrcmpi ( m_szSqlLogSetName, szLogSetName ) )
&& ( 0 != lstrcmpi ( szLogSetName, ResourceString ( IDS_LOGSET_NOT_FOUND ) ) ) ) {
lstrcpyn (
m_szSqlLogSetName,
szLogSetName,
min ( MAX_PATH - 1, lstrlen(szLogSetName)+1 ) );
m_bSqlLogSetChg = TRUE;
OnSqlDataChange();
fChange = TRUE;
}
}
}
}
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 ) {
TCHAR szMessage[2*MAX_PATH];
BSTR bstrPath;
int iResult;
pObj = m_ppISysmon[0];
pObj->get_LogFileName ( &bstrPath );
// Todo: Still use LogfileName from object? Build log file set?
if ( bstrPath ) {
if ( bstrPath[0] ) {
lstrcpy ( szMessage, 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 = (LPWSTR) malloc(ulLogListBufLen * sizeof(WCHAR));
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;
LPTSTR szLogFileList = NULL;
LPTSTR szCurrentLogFile;
ULONG LogFileListSize = 0;
HWND hwndLogFileList = NULL;
INT iLogFileCount;
INT iLogFileIndex;
PLogItemInfo pInfo;
BOOLEAN bSqlLogSet =
(BST_CHECKED == IsDlgButtonChecked(m_hDlg,IDC_SRC_SQL));
TCHAR szDsnName[SQL_MAX_DSN_LENGTH + 1];
TCHAR szLogSetName[SQL_MAX_DSN_LENGTH + 1];
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[0] = _T('\0');
szLogSetName[0] = _T('\0');
hDsnCombo = GetDlgItem ( m_hDlg, IDC_DSN_COMBO);
if ( NULL != hDsnCombo ) {
iSel = (INT)CBSelection ( hDsnCombo );
if ( LB_ERR != iSel ) {
CBString (
hDsnCombo,
iSel,
szDsnName);
hLogSetCombo = GetDlgItem ( m_hDlg, IDC_LOGSET_COMBO);
if ( NULL != hLogSetCombo ) {
iSel = (INT)CBSelection ( hLogSetCombo );
if ( LB_ERR != 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 = (LPTSTR) malloc(LogFileListSize * sizeof(TCHAR));
if (szLogFileList) {
if (bSqlLogSet) {
ZeroMemory(szLogFileList, LogFileListSize * sizeof(TCHAR));
_stprintf(szLogFileList, _T("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) {
lstrcpy(szCurrentLogFile, pInfo->pszPath);
szCurrentLogFile += lstrlen(pInfo->pszPath);
* szCurrentLogFile = _T('\0');
szCurrentLogFile ++;
}
}
* szCurrentLogFile = _T('\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;
}
}
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;
TCHAR szTmpName[SQL_MAX_DSN_LENGTH + 1];
hWnd = GetDlgItem(m_hDlg, IDC_DSN_COMBO);
if ( NULL != hWnd ) {
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,
sizeof(szTmpName),
NULL,
NULL,
0,
NULL);
while (SQL_SUCCEEDED(retcode)) {
CBAdd(hWnd, szTmpName);
ZeroMemory ( szTmpName, sizeof(szTmpName) );
retcode = SQLDataSources(henv,
SQL_FETCH_NEXT,
szTmpName,
sizeof(szTmpName),
NULL,
NULL,
0,
NULL);
}
DsnCount = CBNumItems(hWnd) - 1;
if (DsnCount >= 0) {
if ( m_szSqlDsnName[0] != _T('\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);
}
}
}
void
CSourcePropPage::InitSqlLogSetList(void)
{
PDH_STATUS pdhStatus = ERROR_SUCCESS;
INT iLogSetIndex = 0;
LPTSTR pLogSetList = NULL;
DWORD dwBufferLen = 0;
LPTSTR pLogSetPtr = NULL;
HWND hwndLogSetCombo = NULL;
LPTSTR szTmpName = NULL;
INT iBufAllocCount = 0;
INT iMaxNameLen = 0;
INT iCurrentNameLen = 0;
if ( _T('\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 = (LPTSTR) new TCHAR[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 != _T('\0');
pLogSetPtr += ( iCurrentNameLen + 1))
{
CBAdd(hwndLogSetCombo, pLogSetPtr);
iCurrentNameLen = lstrlen(pLogSetPtr);
if ( iMaxNameLen < iCurrentNameLen ) {
iMaxNameLen = iCurrentNameLen;
}
}
iLogSetIndex = CBNumItems(hwndLogSetCombo) - 1;
if (iLogSetIndex >= 0) {
if ( m_szSqlLogSetName[0] != _T('\0')) {
szTmpName = new TCHAR[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 TCHAR[iMaxNameLen+1];
if ( NULL != szTmpName ) {
lstrcpy(szTmpName, 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 TCHAR[iMaxNameLen+1];
if ( NULL != szTmpName ) {
lstrcpy(szTmpName, 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 = (LPTSTR) szLogFileList;
for ( iLogFileIndex = 0; iLogFileIndex < iLogFileCount; iLogFileIndex++ ) {
pInfo = (PLogItemInfo)LBData(hwndLogFileList,iLogFileIndex);
szThisLogFile = pInfo->pszPath;
lstrcpy(szLogFileCurrent, 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;
}