Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

715 lines
22 KiB

/*++
Copyright (C) 1995-1999 Microsoft Corporation
Module Name:
datasrc.c
Abstract:
data source selection dialog box functions
Revision History
Bob Watson (a-robw) Feb-95 Created
--*/
#include <windows.h>
#include "mbctype.h"
#include "strsafe.h"
#include <pdh.h>
#include "pdhidef.h"
#include "pdhdlgs.h"
#include "pdhmsg.h"
#include "strings.h"
#include "browsdlg.h"
//
// Constants used in this module
//
ULONG
PdhiDatasrcaulControlIdToHelpIdMap[] =
{
IDC_CURRENT_ACTIVITY, IDH_CURRENT_ACTIVITY,
IDC_DATA_FROM_LOG_FILE, IDH_DATA_FROM_LOG_FILE,
IDC_LOG_FILE_EDIT, IDH_LOG_FILE_EDIT,
0,0
};
STATIC_BOOL
DataSrcDlg_RadioButton(
HWND hDlg,
WORD wNotifyMsg,
WORD wCtrlId
)
{
int nShowEdit = FALSE;
int nShowBrowseBtn = FALSE;
int nShowRegBtn = FALSE;
int nShowWbemBtn = FALSE;
BOOL bReturn = FALSE;
switch (wNotifyMsg) {
case BN_CLICKED:
switch (wCtrlId) {
case IDC_CURRENT_ACTIVITY:
nShowEdit = FALSE;
nShowBrowseBtn = FALSE;
nShowRegBtn = TRUE;
nShowWbemBtn = TRUE;
break;
case IDC_DATA_FROM_LOG_FILE:
nShowEdit = TRUE;
nShowBrowseBtn = TRUE;
nShowRegBtn = FALSE;
nShowWbemBtn = FALSE;
break;
case IDC_PERF_REG:
case IDC_WBEM_NS:
bReturn = TRUE;
break;
}
if (! bReturn) {
EnableWindow(GetDlgItem(hDlg, IDC_LOG_FILE_EDIT), nShowEdit);
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_LOG_FILES), nShowBrowseBtn);
EnableWindow(GetDlgItem(hDlg, IDC_PERF_REG), nShowRegBtn);
EnableWindow(GetDlgItem(hDlg, IDC_WBEM_NS), nShowWbemBtn);
bReturn = TRUE;
}
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_BROWSE_LOG_FILES(
HWND hDlg,
WORD wNotifyMsg,
HWND hWndControl
)
{
BOOL bReturn = FALSE;
UNREFERENCED_PARAMETER(hWndControl);
switch (wNotifyMsg) {
case BN_CLICKED:
{
LPWSTR szEditBoxString = NULL;
DWORD cchStringLen = SMALL_BUFFER_SIZE;
szEditBoxString = G_ALLOC(cchStringLen * sizeof(WCHAR));
if (szEditBoxString != NULL) {
// get the current filename
SendDlgItemMessageW(hDlg,
IDC_LOG_FILE_EDIT,
WM_GETTEXT,
(WPARAM) cchStringLen,
(LPARAM) szEditBoxString);
if (PdhiBrowseDataSource(hDlg, szEditBoxString, & cchStringLen, TRUE)) {
// then update the edit box and set focus to it.
SendDlgItemMessageW(hDlg,
IDC_LOG_FILE_EDIT,
WM_SETTEXT,
(WPARAM) 0,
(LPARAM) szEditBoxString);
}
}
}
bReturn = TRUE;
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_OK(
HWND hDlg,
WORD wNotifyMsg,
HWND hWndControl
)
{
PPDHI_DATA_SOURCE_INFO pInfo;
HCURSOR hOldCursor;
DWORD dwFileNameLength;
BOOL bReturn = FALSE;
UNREFERENCED_PARAMETER(hWndControl);
switch (wNotifyMsg) {
case BN_CLICKED:
pInfo = (PPDHI_DATA_SOURCE_INFO) GetWindowLongPtrW (hDlg, DWLP_USER);
if (pInfo != NULL) {
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
// get data from dialog box
if (IsDlgButtonChecked(hDlg, IDC_CURRENT_ACTIVITY) == 1) {
if (IsDlgButtonChecked(hDlg, IDC_WBEM_NS) == 1) {
// then a WBEM Name Space is selected so get the name
pInfo->dwFlags = PDHI_DATA_SOURCE_WBEM_NAMESPACE;
dwFileNameLength = lstrlenW(cszWMI);
if (dwFileNameLength < pInfo->cchBufferLength) {
StringCchCopyW(pInfo->szDataSourceFile, pInfo->cchBufferLength, cszWMI);
pInfo->cchBufferLength = dwFileNameLength;
}
else {
// buffer is too small for the file name
// so return the required size but no string
* pInfo->szDataSourceFile = L'\0';
pInfo->cchBufferLength = dwFileNameLength;
}
}
else if (IsDlgButtonChecked (hDlg, IDC_PERF_REG) == 1) {
// then current activity is selected so set flags
pInfo->dwFlags = PDHI_DATA_SOURCE_CURRENT_ACTIVITY;
* pInfo->szDataSourceFile = L'\0';
pInfo->cchBufferLength = 0;
}
}
else if (IsDlgButtonChecked (hDlg, IDC_DATA_FROM_LOG_FILE) == 1) {
// then a log file is selected so get the log file name
pInfo->dwFlags = PDHI_DATA_SOURCE_LOG_FILE;
dwFileNameLength = (DWORD)SendDlgItemMessageW(hDlg, IDC_LOG_FILE_EDIT, WM_GETTEXTLENGTH, 0, 0);
if (dwFileNameLength < pInfo->cchBufferLength) {
pInfo->cchBufferLength = (DWORD) SendDlgItemMessageW(hDlg,
IDC_LOG_FILE_EDIT,
WM_GETTEXT,
(WPARAM) pInfo->cchBufferLength,
(LPARAM) pInfo->szDataSourceFile);
}
else {
// buffer is too small for the file name
// so return the required size but no string
* pInfo->szDataSourceFile = L'\0';
pInfo->cchBufferLength = dwFileNameLength;
}
}
SetCursor(hOldCursor);
EndDialog(hDlg, IDOK);
}
else {
// unable to locate data block so no data can be returned.
EndDialog(hDlg, IDCANCEL);
}
bReturn = TRUE;
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_CANCEL(
HWND hDlg,
WORD wNotifyMsg,
HWND hWndControl
)
{
BOOL bReturn = FALSE;
UNREFERENCED_PARAMETER(hWndControl);
switch (wNotifyMsg) {
case BN_CLICKED:
EndDialog(hDlg, IDCANCEL);
bReturn = TRUE;
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_HELP_BTN(
HWND hDlg,
WORD wNotifyMsg,
HWND hWndControl
)
{
UNREFERENCED_PARAMETER(hDlg);
UNREFERENCED_PARAMETER(wNotifyMsg);
UNREFERENCED_PARAMETER(hWndControl);
return FALSE;
}
STATIC_BOOL
DataSrcDlg_WM_INITDIALOG(
HWND hDlg,
WPARAM wParam,
LPARAM lParam
)
{
// LPARAM is the pointer to the structure used for the data source info
BOOL bReturn = TRUE;
PPDHI_DATA_SOURCE_INFO pInfo;
HCURSOR hOldCursor;
int nButton;
int nShowEdit;
int nShowBrowse;
int nShowRegBtn;
int nShowWbemBtn;
HWND hwndFocus;
LPWSTR szDisplayString;
UNREFERENCED_PARAMETER(wParam);
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
// must have a pointer to the information structure in the LPARAM
if (lParam == 0) {
SetLastError(PDH_INVALID_ARGUMENT);
EndDialog(hDlg, IDCANCEL);
goto INIT_EXIT;
}
pInfo = (PPDHI_DATA_SOURCE_INFO) lParam;
SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR) pInfo);
// initialize the dialog box settings
SendDlgItemMessageW(hDlg, IDC_LOG_FILE_EDIT, EM_LIMITTEXT, (WPARAM) MAX_PATH - 1, 0);
if (pInfo->dwFlags & PDHI_DATA_SOURCE_CURRENT_ACTIVITY) {
// check the correct radio button
nButton = IDC_PERF_REG;
nShowEdit = FALSE;
nShowBrowse = FALSE;
nShowRegBtn = TRUE;
nShowWbemBtn = TRUE;
hwndFocus = GetDlgItem(hDlg, IDC_PERF_REG);
}
else if (pInfo->dwFlags & PDHI_DATA_SOURCE_LOG_FILE) {
// check the correct radio button
nButton = IDC_DATA_FROM_LOG_FILE;
nShowEdit = TRUE;
nShowBrowse = TRUE;
nShowRegBtn = FALSE;
nShowWbemBtn = FALSE;
// load log file to edit window
SendDlgItemMessageW(hDlg, IDC_LOG_FILE_EDIT, WM_SETTEXT, (WPARAM) 0, (LPARAM) pInfo->szDataSourceFile);
hwndFocus = GetDlgItem(hDlg, IDC_LOG_FILE_EDIT);
}
else if (pInfo->dwFlags & PDHI_DATA_SOURCE_WBEM_NAMESPACE) {
// check the correct radio button
nButton = IDC_WBEM_NS;
nShowEdit = FALSE;
nShowBrowse = FALSE;
nShowRegBtn = TRUE;
nShowWbemBtn = TRUE;
// if the file name has a "WBEM:" in the front, then remove it
if (DataSourceTypeW(pInfo->szDataSourceFile) == DATA_SOURCE_WBEM) {
if (pInfo->szDataSourceFile[1] == L'B' || pInfo->szDataSourceFile[1] == L'b') {
// szDataSource begins with "WBEM:"
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWBEM)];
}
else {
// szDataSource begins with "WMI:"
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWMI)];
}
}
else {
szDisplayString = pInfo->szDataSourceFile;
}
hwndFocus = GetDlgItem(hDlg, IDC_WBEM_NS);
}
else {
// invalid selection
SetLastError(PDH_INVALID_ARGUMENT);
EndDialog(hDlg, IDCANCEL);
goto INIT_EXIT;
}
if (nShowEdit) {
// if this isn't selected, then set it so that it acts like the
// default
CheckRadioButton(hDlg, IDC_PERF_REG, IDC_WBEM_NS, IDC_PERF_REG);
CheckRadioButton(hDlg, IDC_CURRENT_ACTIVITY, IDC_DATA_FROM_LOG_FILE, IDC_DATA_FROM_LOG_FILE);
}
else {
CheckRadioButton(hDlg, IDC_CURRENT_ACTIVITY, IDC_DATA_FROM_LOG_FILE, IDC_CURRENT_ACTIVITY);
CheckRadioButton(hDlg, IDC_PERF_REG, IDC_WBEM_NS, nButton);
}
// disable the edit window and browser button
EnableWindow(GetDlgItem(hDlg, IDC_LOG_FILE_EDIT), nShowEdit);
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_LOG_FILES), nShowBrowse);
EnableWindow(GetDlgItem(hDlg, IDC_PERF_REG), nShowRegBtn);
EnableWindow(GetDlgItem(hDlg, IDC_WBEM_NS), nShowWbemBtn);
SetFocus(hwndFocus);
bReturn = FALSE;
INIT_EXIT:
// restore Cursor
SetCursor (hOldCursor);
return bReturn;
}
STATIC_BOOL
DataSrcDlg_WM_COMMAND(
HWND hDlg,
WPARAM wParam,
LPARAM lParam
)
{
BOOL bReturn = FALSE;
WORD wNotifyMsg = HIWORD(wParam);
switch (LOWORD(wParam)) { // select on the control ID
case IDOK:
bReturn = DataSrcDlg_OK (hDlg, wNotifyMsg, (HWND)lParam);
break;
case IDCANCEL:
bReturn = DataSrcDlg_CANCEL (hDlg, wNotifyMsg, (HWND)lParam);
break;
case IDC_HELP_BTN:
bReturn = DataSrcDlg_HELP_BTN (hDlg, wNotifyMsg, (HWND)lParam);
break;
case IDC_BROWSE_LOG_FILES:
bReturn = DataSrcDlg_BROWSE_LOG_FILES (hDlg, wNotifyMsg, (HWND)lParam);
break;
case IDC_CURRENT_ACTIVITY:
case IDC_DATA_FROM_LOG_FILE:
case IDC_PERF_REG:
case IDC_WBEM_NS:
bReturn = DataSrcDlg_RadioButton (hDlg, wNotifyMsg, LOWORD(wParam));
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_WM_SYSCOMMAND(
HWND hDlg,
WPARAM wParam,
LPARAM lParam
)
{
BOOL bReturn = FALSE;
UNREFERENCED_PARAMETER(lParam);
switch (wParam) {
case SC_CLOSE:
EndDialog(hDlg, IDOK);
bReturn = TRUE;
break;
default:
break;
}
return bReturn;
}
STATIC_BOOL
DataSrcDlg_WM_CLOSE(
HWND hDlg,
WPARAM wParam,
LPARAM lParam
)
{
UNREFERENCED_PARAMETER(hDlg);
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
return TRUE;
}
STATIC_BOOL
DataSrcDlg_WM_DESTROY(
HWND hDlg,
WPARAM wParam,
LPARAM lParam
)
{
UNREFERENCED_PARAMETER(hDlg);
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
return TRUE;
}
INT_PTR
CALLBACK
DataSrcDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
BOOL bReturn = FALSE;
switch (message) {
case WM_INITDIALOG:
bReturn = DataSrcDlg_WM_INITDIALOG(hDlg, wParam, lParam);
break;
case WM_COMMAND:
bReturn = DataSrcDlg_WM_COMMAND(hDlg, wParam, lParam);
break;
case WM_SYSCOMMAND:
bReturn = DataSrcDlg_WM_SYSCOMMAND(hDlg, wParam, lParam);
break;
case WM_CLOSE:
bReturn = DataSrcDlg_WM_CLOSE(hDlg, wParam, lParam);
break;
case WM_DESTROY:
bReturn = DataSrcDlg_WM_DESTROY(hDlg, wParam, lParam);
break;
case WM_CONTEXTMENU:
{
INT iCtrlID = GetDlgCtrlID((HWND) wParam);
if (0 != iCtrlID) {
LPWSTR pszHelpFilePath = NULL;
DWORD dwLen = 2 * (MAX_PATH + 1);
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
if (pszHelpFilePath != NULL) {
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
bReturn = WinHelpW((HWND) wParam,
pszHelpFilePath,
HELP_CONTEXTMENU,
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
}
G_FREE(pszHelpFilePath);
}
}
}
break;
case WM_HELP:
{
LPWSTR pszHelpFilePath = NULL;
DWORD dwLen = 2 * (MAX_PATH + 1);
LPHELPINFO pInfo = (LPHELPINFO) lParam;
if (pInfo->iContextType == HELPINFO_WINDOW) {
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
if (pszHelpFilePath != NULL) {
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
bReturn = WinHelpW((HWND) wParam,
pszHelpFilePath,
HELP_CONTEXTMENU,
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
}
G_FREE(pszHelpFilePath);
}
}
}
break;
default:
break;
}
return bReturn;
}
PDH_FUNCTION
PdhSelectDataSourceW(
IN HWND hWndOwner,
IN DWORD dwFlags,
IN LPWSTR szDataSource,
IN LPDWORD pcchBufferLength
)
{
PDHI_DATA_SOURCE_INFO dsInfo;
WCHAR wTest;
DWORD dwTest;
PDH_STATUS pdhStatus = ERROR_SUCCESS;
int nDlgBoxStatus;
LPWSTR szLocalPath;
DWORD dwLocalLength = 0;
// TODO post W2k1: PdhiBrowseDataSource should be in try_except
if (szDataSource == NULL || pcchBufferLength == NULL) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
else {
// test buffers and access
__try {
// test reading length buffer
dwLocalLength = * pcchBufferLength;
dwTest = dwLocalLength;
// try reading & writing to the first and last chars in the buffer
wTest = szDataSource[0];
szDataSource[0] = L'\0';
szDataSource[0] = wTest;
dwTest --;
wTest = szDataSource[dwTest];
szDataSource[dwTest] = L'\0';
szDataSource[dwTest] = wTest;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
}
if (pdhStatus == ERROR_SUCCESS) {
szLocalPath = G_ALLOC(dwLocalLength * sizeof(WCHAR));
if (szLocalPath == NULL) {
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
}
else {
// copy the caller's buffer to the local buffer
StringCchCopyW(szLocalPath, dwLocalLength, szDataSource);
}
if (pdhStatus == ERROR_SUCCESS) {
if (dwFlags & PDH_FLAGS_FILE_BROWSER_ONLY) {
PdhiBrowseDataSource( hWndOwner, (LPVOID) szDataSource, & dwLocalLength, TRUE);
}
else {
// show the selection dialog as well
if (* szDataSource == 0) {
// then using current activity
dsInfo.dwFlags = PDHI_DATA_SOURCE_CURRENT_ACTIVITY;
}
else {
if (IsWbemDataSource (szDataSource)) {
dsInfo.dwFlags = PDHI_DATA_SOURCE_WBEM_NAMESPACE;
}
else {
dsInfo.dwFlags = PDHI_DATA_SOURCE_LOG_FILE;
}
}
dsInfo.szDataSourceFile = szLocalPath;
dsInfo.cchBufferLength = dwLocalLength;
// call dialog box
nDlgBoxStatus = (INT) DialogBoxParamW((HINSTANCE) ThisDLLHandle,
MAKEINTRESOURCEW(IDD_DATA_SOURCE),
hWndOwner,
DataSrcDlgProc,
(LPARAM) & dsInfo);
if (nDlgBoxStatus == IDOK) {
pdhStatus = ERROR_SUCCESS;
dwLocalLength = dsInfo.cchBufferLength;
__try {
StringCchCopyW(szDataSource, dwLocalLength, szLocalPath);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
} // else, leave the caller's buffer alone
}
if (pdhStatus == ERROR_SUCCESS) {
__try {
* pcchBufferLength = dwLocalLength;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
}
}
G_FREE (szLocalPath);
}
return pdhStatus;
}
PDH_FUNCTION
PdhSelectDataSourceA(
IN HWND hWndOwner,
IN DWORD dwFlags,
IN LPSTR szDataSource,
IN LPDWORD pcchBufferLength
)
{
CHAR cTest;
DWORD dwTest;
PDH_STATUS pdhStatus = ERROR_SUCCESS;
LPWSTR szWideBuffer;
DWORD dwLocalLength = 0;
// TODO post W2k1: PdhiBrowseDataSource should be in try_except
if (szDataSource == NULL || pcchBufferLength == NULL) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
else {
// test buffers and access
__try {
// test reading length buffer
dwLocalLength = * pcchBufferLength;
dwTest = dwLocalLength;
// try reading & writing to the first and last chars in the buffer
cTest = szDataSource[0];
szDataSource[0] = '\0';
szDataSource[0] = cTest;
dwTest --;
cTest = szDataSource[dwTest];
szDataSource[dwTest] = '\0';
szDataSource[dwTest] = cTest;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
}
if (pdhStatus == ERROR_SUCCESS) {
if (dwFlags & PDH_FLAGS_FILE_BROWSER_ONLY) {
PdhiBrowseDataSource(hWndOwner, (LPVOID) szDataSource, & dwLocalLength, FALSE);
}
else {
// allocate a temporary bufer and convert the ANSI string to a wide
szWideBuffer = PdhiMultiByteToWideChar(_getmbcp(), szDataSource);
if (szWideBuffer != NULL) {
pdhStatus = PdhSelectDataSourceW(hWndOwner, dwFlags, szWideBuffer, & dwLocalLength);
if (pdhStatus == ERROR_SUCCESS) {
// if a null string was returned, then set the argument
// to null since the conversion routine will not convert
// a null wide string to a null ansi string.
if (* szWideBuffer == L'\0') {
* szDataSource = '\0';
}
else {
pdhStatus = PdhiConvertUnicodeToAnsi(_getmbcp(), szWideBuffer, szDataSource, & dwLocalLength);
}
}
G_FREE (szWideBuffer);
}
else {
// unable to allocate temporary buffer
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
}
}
if (pdhStatus == ERROR_SUCCESS || pdhStatus == PDH_MORE_DATA) {
__try {
* pcchBufferLength = dwLocalLength;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pdhStatus = PDH_INVALID_ARGUMENT;
}
}
}
return pdhStatus;
}