windows-nt/Source/XPSP1/NT/shell/osshell/cpls/usb/proppage.cpp

444 lines
12 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: PROPPAGE.CPP
* VERSION: 1.0
* AUTHOR: jsenior
* DATE: 10/28/1998
*
********************************************************************************
*
* CHANGE LOG:
*
* DATE REV DESCRIPTION
* ---------- ------- ----------------------------------------------------------
* 10/28/1998 jsenior Original implementation.
*
*******************************************************************************/
#include "BandPage.h"
#include "PowrPage.h"
#include "debug.h"
HANDLE UsbPropertyPage::hInst = (HANDLE) 0;
UsbPropertyPage::UsbPropertyPage(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData) :
deviceInfoSet(DeviceInfoSet), deviceInfoData(DeviceInfoData), imageList()
{
preItem = 0;
hWndParent = NULL;
rootItem = NULL;
}
UsbPropertyPage::UsbPropertyPage(HWND HWndParent, LPCSTR DeviceName) :
deviceInfoSet(0), deviceInfoData(0), imageList()
{
WCHAR realName[MAX_PATH];
if (MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
DeviceName,
-1,
realName,
MAX_PATH)) {
deviceName = realName;
}
preItem = 0;
hWndParent = HWndParent;
rootItem = NULL;
}
UsbPropertyPage::UsbPropertyPage(UsbItem *item) :
deviceInfoSet(0), deviceInfoData(0), imageList()
{
preItem = item;
hWndParent = NULL;
rootItem = NULL;
}
HPROPSHEETPAGE UsbPropertyPage::Create()
{
//
// Add the Port Settings property page
//
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USECALLBACK; // | PSP_HASHELP;
psp.hInstance = (HINSTANCE) hInst;
psp.pszTemplate = MAKEINTRESOURCE(dlgResource);
//
// following points to the dlg window proc
//
psp.pfnDlgProc = StaticDialogProc;
psp.lParam = (LPARAM) this;
//
// Following points to the control callback of the dlg window proc.
// The callback gets called before creation/after destruction of the page
//
psp.pfnCallback = StaticDialogCallback;
//
// Allocate the actual page
//
return CreatePropertySheetPage(&psp);
}
UINT CALLBACK
UsbPropertyPage::StaticDialogCallback(HWND Hwnd,
UINT Msg,
LPPROPSHEETPAGE Page)
{
UsbPropertyPage *that;
that = (UsbPropertyPage*) Page->lParam;
switch (Msg) {
case PSPCB_CREATE:
return TRUE; // return TRUE to continue with creation of page
case PSPCB_RELEASE:
DeleteChunk(that);
delete that;
CheckMemory();
return 0; // return value ignored
default:
break;
}
return TRUE;
}
BOOL
UsbPropertyPage::OnContextMenu(HWND HwndControl,
WORD Xpos,
WORD Ypos)
{
WinHelp(HwndControl,
TEXT(HELPFILE),
HELP_CONTEXTMENU,
(USBULONG_PTR) HelpIds);
return FALSE;
}
void
UsbPropertyPage::OnHelp(HWND ParentHwnd,
LPHELPINFO HelpInfo)
{
if (HelpInfo->iContextType == HELPINFO_WINDOW) {
WinHelp((HWND) HelpInfo->hItemHandle,
TEXT(HELPFILE),
HELP_WM_HELP,
(USBULONG_PTR) HelpIds);
}
}
USBINT_PTR APIENTRY UsbPropertyPage::StaticDialogProc(IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam)
{
UsbPropertyPage *that;
that = (UsbPropertyPage *) UsbGetWindowLongPtr(hDlg, USBDWLP_USER);
if (!that && uMessage != WM_INITDIALOG)
return FALSE; //DefDlgProc(hDlg, uMessage, wParam, lParam);
switch (uMessage) {
case WM_COMMAND:
return that->OnCommand(HIWORD(wParam),
LOWORD(wParam),
(HWND) lParam);
case WM_INITDIALOG:
that = (UsbPropertyPage *) ((LPPROPSHEETPAGE)lParam)->lParam;
UsbSetWindowLongPtr(hDlg, USBDWLP_USER, (USBLONG_PTR) that);
that->hwnd = hDlg;
return that->OnInitDialog();
case WM_NOTIFY:
return that->OnNotify(hDlg, (int) wParam, (LPNMHDR) lParam);
case WM_CONTEXTMENU:
return that->OnContextMenu((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
case WM_HELP:
that->OnHelp(hDlg, (LPHELPINFO) lParam);
break;
default:
break;
}
return that->ActualDialogProc(hDlg, uMessage, wParam, lParam);
}
BOOL UsbPropertyPage::OnNotify(HWND hDlg, int nID, LPNMHDR pnmh)
{
switch (pnmh->code) {
//
// Sent when the user clicks on Apply OR OK !!
//
case PSN_APPLY:
//
// Do what ever action is necessary
//
UsbSetWindowLongPtr(hwnd, USBDWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
default:
break;
}
return TRUE;
}
BOOL
UsbPropertyPage::GetDeviceName()
{
HKEY hDeviceKey;
DWORD dwBufferSize, dwError;
WCHAR szBuffer[MAX_PATH];
//
// Open the device key for the source device instance, and retrieve its
// "SymbolicName" value.
//
hDeviceKey = SetupDiOpenDevRegKey(deviceInfoSet,
deviceInfoData,
DICS_FLAG_GLOBAL,
0,
DIREG_DEV,
KEY_ALL_ACCESS);
if (INVALID_HANDLE_VALUE == hDeviceKey) {
goto GetDeviceNameError;
}
dwBufferSize = sizeof(szBuffer);
dwError = RegQueryValueEx(hDeviceKey,
_T("SymbolicName"),
NULL,
NULL,
(PBYTE)szBuffer,
&dwBufferSize);
if(ERROR_SUCCESS != dwError) {
goto GetDeviceNameError;
}
deviceName = szBuffer;
RegCloseKey(hDeviceKey);
return TRUE;
GetDeviceNameError:
if (hDeviceKey != INVALID_HANDLE_VALUE) {
RegCloseKey(hDeviceKey);
}
return FALSE;
}
void
UsbPropertyPage::DisplayPPSelectedListItem(HWND main, HWND hList)
{
LVITEM item;
BOOL b;
int itemIndex = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
ZeroMemory(&item, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = itemIndex;
b = ListView_GetItem(hList, &item);
if (!b) {
return;
}
ShowPropertyPage(main, (UsbItem*) item.lParam);
}
void
UsbPropertyPage::DisplayPPSelectedTreeItem(HWND main, HWND hList)
{
TVITEM item;
BOOL b;
ZeroMemory(&item, sizeof(TVITEM));
if (NULL == (item.hItem = TreeView_GetSelection(hList))) {
return;
}
item.mask = TVIF_PARAM;
b = TreeView_GetItem(hList, &item);
if (!b) {
return;
}
ShowPropertyPage(main, (UsbItem*) item.lParam);
}
#ifdef WINNT
typedef USBINT_PTR (FAR *DeviceProp)(HWND, LPCTSTR, LPCTSTR, BOOL);
void
UsbPropertyPage::ShowPropertyPage(HWND parent, UsbItem *usbItem)
{
HINSTANCE h;
DeviceProp p;
TCHAR buf[MAX_PATH];
if (usbItem != NULL) {
CM_Get_Device_ID(usbItem->configInfo->devInst,
buf,
MAX_PATH,
NULL);
h = LoadLibrary(TEXT("devmgr.dll"));
if (h) {
p = (DeviceProp) GetProcAddress(h, "DevicePropertiesW");
if (p) {
p (parent, NULL, buf, FALSE);
}
FreeLibrary(h);
}
}
}
#else
void
UsbPropertyPage::ShowPropertyPage(HWND HWndParent, UsbItem *usbItem)
{
CHAR buf[MAX_PATH];
ULONG len = MAX_PATH;
CONFIGRET cfgRet;
HKEY hDevKey;
if (usbItem != NULL) {
if (CR_SUCCESS != (cfgRet =
CM_Open_DevNode_Key(usbItem->configInfo->devInst,
KEY_QUERY_VALUE,
CM_REGISTRY_HARDWARE,
RegDisposition_OpenExisting,
&hDevKey,
0))) {
return;
}
len = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(hDevKey,
_T("SymbolicName"),
NULL,
NULL,
(LPBYTE) &buf,
&len)) {
RegCloseKey(hDevKey);
return;
}
if (usbItem->itemType == UsbItem::UsbItemType::HCD) {
BandwidthPage *band;
band = new BandwidthPage(HWndParent, buf);
AddChunk(band);
if (!band) {
return;
}
band->CreateIndependent();
DeleteChunk(band);
delete band;
} else if (usbItem->itemType == UsbItem::UsbItemType::RootHub ||
usbItem->itemType == UsbItem::UsbItemType::Hub) {
PowerPage *power;
power = new PowerPage(HWndParent, buf);
AddChunk(power);
if (!power) {
return;
}
power->CreateIndependent();
DeleteChunk(power);
delete power;
} /*else {
GenericPage *generic;
generic = new GenericPage(HWndParent, buf);
AddChunk(generic);
if (!generic) {
return;
}
generic->CreateIndependent();
DeleteChunk(generic);
delete generic;
} */
}
}
#endif
VOID
UsbPropertyPage::CreateAsChild(HWND HWndParent,
HWND hCreateOn,
UsbItem *item)
{
RECT rc;
POINT *p = (POINT*) &rc;
GetWindowRect(hCreateOn, &rc);
ScreenToClient(HWndParent, p++);
ScreenToClient(HWndParent, p);
if (NULL != (hwnd = CreateDialogParam(gHInst,
MAKEINTRESOURCE(dlgResource),
HWndParent,
AppletDialogProc,
(LPARAM) this))) {
SetWindowPos(hwnd,
hCreateOn,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
SWP_SHOWWINDOW);
}
}
VOID
UsbPropertyPage::CreateIndependent()
{
int error;
if (-1 == DialogBoxParam(gHInst,
MAKEINTRESOURCE(dlgResource),
hWndParent,
AppletDialogProc,
(LPARAM) this)) {
error = GetLastError();
}
}
BOOL UsbPropertyPage::DestroyChild()
{
if (hwnd) {
return DestroyWindow(hwnd);
}
//
// If there's nothing to destroy, then in a way we've been successful
//
return TRUE;
}
USBINT_PTR APIENTRY UsbPropertyPage::AppletDialogProc(IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam)
{
UsbPropertyPage *that;
switch (uMessage) {
case WM_INITDIALOG:
that = (UsbPropertyPage *) lParam;
UsbSetWindowLongPtr(hDlg, USBDWLP_USER, (USBLONG_PTR) that);
that->hwnd = hDlg;
return that->OnInitDialog();
default:
break;
}
return StaticDialogProc(hDlg, uMessage, wParam, lParam);
}