/*++ 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 #include #include #include "mbctype.h" #include #include "pdhidef.h" #include "pdhdlgs.h" #include "datasrc.h" #include "pdhmsg.h" #include "strings.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 ( IN HWND hDlg, IN WORD wNotifyMsg, IN WORD wCtrlId ) { int nShowEdit = FALSE; int nShowBrowseBtn = FALSE; int nShowRegBtn = FALSE; int nShowWbemBtn = 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: return TRUE; } 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); return TRUE; default: return FALSE; } } STATIC_BOOL DataSrcDlg_BROWSE_LOG_FILES ( IN HWND hDlg, IN WORD wNotifyMsg, IN HWND hWndControl ) { WCHAR szEditBoxString[SMALL_BUFFER_SIZE]; DWORD cchStringLen = SMALL_BUFFER_SIZE; UNREFERENCED_PARAMETER (hWndControl); switch (wNotifyMsg) { case BN_CLICKED: // get the current filename SendDlgItemMessageW (hDlg, IDC_LOG_FILE_EDIT, WM_GETTEXT, (WPARAM)SMALL_BUFFER_SIZE, (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); } return TRUE; default: return FALSE; } } STATIC_BOOL DataSrcDlg_OK ( IN HWND hDlg, IN WORD wNotifyMsg, IN HWND hWndControl ) { PPDHI_DATA_SOURCE_INFO pInfo; HCURSOR hOldCursor; DWORD dwFileNameLength; LPWSTR szStringPtr; 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) { szStringPtr = pInfo->szDataSourceFile; lstrcpyW (pInfo->szDataSourceFile, cszWMI); pInfo->cchBufferLength = dwFileNameLength; } else { // buffer is too small for the file name // so return the required size but no string *pInfo->szDataSourceFile = 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 = 0; pInfo->cchBufferLength = 0; } else { assert (FALSE); // no button is pressed. } } 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 = 0; pInfo->cchBufferLength = dwFileNameLength; } } SetCursor (hOldCursor); EndDialog (hDlg, IDOK); } else { // unable to locate data block so no data can be returned. EndDialog (hDlg, IDCANCEL); } return TRUE; default: return FALSE; } } STATIC_BOOL DataSrcDlg_CANCEL ( IN HWND hDlg, IN WORD wNotifyMsg, IN HWND hWndControl ) { UNREFERENCED_PARAMETER (hWndControl); switch (wNotifyMsg) { case BN_CLICKED: EndDialog (hDlg, IDCANCEL); return TRUE; default: return FALSE; } } STATIC_BOOL DataSrcDlg_HELP_BTN ( IN HWND hDlg, IN WORD wNotifyMsg, IN HWND hWndControl ) { UNREFERENCED_PARAMETER (hDlg); UNREFERENCED_PARAMETER (wNotifyMsg); UNREFERENCED_PARAMETER (hWndControl); return FALSE; } STATIC_BOOL DataSrcDlg_WM_INITDIALOG ( IN HWND hDlg, IN WPARAM wParam, IN 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 (wcsncmp(pInfo->szDataSourceFile, cszWBEM, lstrlenW(cszWBEM)) == 0) { szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWBEM)]; } else { szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWMI)]; } } else { szDisplayString = &pInfo->szDataSourceFile[0]; } 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 ( IN HWND hDlg, IN WPARAM wParam, IN LPARAM lParam ) { WORD wNotifyMsg; wNotifyMsg = HIWORD(wParam); switch (LOWORD(wParam)) { // select on the control ID case IDOK: return DataSrcDlg_OK (hDlg, wNotifyMsg, (HWND)lParam); case IDCANCEL: return DataSrcDlg_CANCEL (hDlg, wNotifyMsg, (HWND)lParam); case IDC_HELP_BTN: return DataSrcDlg_HELP_BTN (hDlg, wNotifyMsg, (HWND)lParam); case IDC_BROWSE_LOG_FILES: return DataSrcDlg_BROWSE_LOG_FILES (hDlg, wNotifyMsg, (HWND)lParam); case IDC_CURRENT_ACTIVITY: case IDC_DATA_FROM_LOG_FILE: case IDC_PERF_REG: case IDC_WBEM_NS: return DataSrcDlg_RadioButton (hDlg, wNotifyMsg, LOWORD(wParam)); default: return FALSE; } } STATIC_BOOL DataSrcDlg_WM_SYSCOMMAND ( IN HWND hDlg, IN WPARAM wParam, IN LPARAM lParam ) { UNREFERENCED_PARAMETER (lParam); switch (wParam) { case SC_CLOSE: EndDialog (hDlg, IDOK); return TRUE; default: return FALSE; } } STATIC_BOOL DataSrcDlg_WM_CLOSE ( IN HWND hDlg, IN WPARAM wParam, IN LPARAM lParam ) { UNREFERENCED_PARAMETER (hDlg); UNREFERENCED_PARAMETER (wParam); UNREFERENCED_PARAMETER (lParam); return TRUE; } STATIC_BOOL DataSrcDlg_WM_DESTROY ( IN HWND hDlg, IN WPARAM wParam, IN LPARAM lParam ) { UNREFERENCED_PARAMETER (hDlg); UNREFERENCED_PARAMETER (wParam); UNREFERENCED_PARAMETER (lParam); return TRUE; } INT_PTR CALLBACK DataSrcDlgProc ( IN HWND hDlg, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) { INT iCtrlID; BOOL bReturn = FALSE; iCtrlID = GetDlgCtrlID ( (HWND) wParam ); switch (message) { case WM_INITDIALOG: return DataSrcDlg_WM_INITDIALOG (hDlg, wParam, lParam); case WM_COMMAND: return DataSrcDlg_WM_COMMAND (hDlg, wParam, lParam); case WM_SYSCOMMAND: return DataSrcDlg_WM_SYSCOMMAND (hDlg, wParam, lParam); case WM_CLOSE: return DataSrcDlg_WM_CLOSE (hDlg, wParam, lParam); case WM_DESTROY: return DataSrcDlg_WM_DESTROY (hDlg, wParam, lParam); case WM_CONTEXTMENU: { if ( 0 != iCtrlID ) { TCHAR pszHelpFilePath[MAX_PATH * 2]; UINT nLen; nLen = GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH); lstrcpy(&pszHelpFilePath[nLen], _T("\\help\\sysmon.hlp") ); bReturn = WinHelp( (HWND) wParam, pszHelpFilePath, HELP_CONTEXTMENU, (DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap); } return bReturn; } case WM_HELP: { // Only display help for known context IDs. TCHAR pszHelpFilePath[MAX_PATH * 2]; UINT nLen; LPHELPINFO pInfo = NULL; pInfo = (LPHELPINFO)lParam; nLen = GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH); if ( nLen == 0 ) { // Report error. } lstrcpy(&pszHelpFilePath[nLen], _T("\\help\\sysmon.hlp") ); if (pInfo->iContextType == HELPINFO_WINDOW){ bReturn = WinHelp ( pInfo->hItemHandle, pszHelpFilePath, HELP_WM_HELP, (DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap); } return bReturn; } default: return FALSE; } } 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] = 0; szDataSource[0] = wTest; dwTest--; wTest = szDataSource[dwTest]; szDataSource[dwTest] = 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 memcpy (&szLocalPath[0], szDataSource, (dwLocalLength * sizeof(WCHAR))); } 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 { memcpy (szDataSource, &szLocalPath[0], (dwLocalLength * sizeof(WCHAR))); } __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; } } } if (szLocalPath != NULL) { 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 = G_ALLOC ((dwLocalLength * sizeof(WCHAR))); if (szWideBuffer != NULL) { MultiByteToWideChar(_getmbcp(), 0, szDataSource, lstrlenA(szDataSource), (LPWSTR) szWideBuffer, dwLocalLength); 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 == 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; }