/******************************************************************************* * * (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); }