309 lines
9.1 KiB
C++
309 lines
9.1 KiB
C++
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
|
||
|
* TITLE: POWRPAGE.CPP
|
||
|
* VERSION: 1.0
|
||
|
* AUTHOR: jsenior
|
||
|
* DATE: 10/28/1998
|
||
|
*
|
||
|
********************************************************************************
|
||
|
*
|
||
|
* CHANGE LOG:
|
||
|
*
|
||
|
* DATE REV DESCRIPTION
|
||
|
* ---------- ------- ----------------------------------------------------------
|
||
|
* 10/28/1998 jsenior Original implementation.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
#include <assert.h>
|
||
|
|
||
|
#include "PowrPage.h"
|
||
|
#include "debug.h"
|
||
|
|
||
|
#include "ItemFind.h"
|
||
|
#include "resource.h"
|
||
|
#include "usbutil.h"
|
||
|
|
||
|
const DWORD PowerHelpIds[]=
|
||
|
{
|
||
|
IDC_STATIC, IDH_NOHELP, //hub information text - help not needed
|
||
|
IDC_SELF_POWER, idh_devmgr_hub_self_power, //selfpowered or bus powered
|
||
|
IDC_POWER_AVAIL, idh_devmgr_hub_power_avail, //total power available text
|
||
|
IDC_DESCRIPTION, idh_devmgr_hub_devices_on_this_hub, //description of list box
|
||
|
IDC_LIST_DEVICES, idh_devmgr_hub_list_devices, //the list box for hub devices
|
||
|
IDC_REFRESH, idh_devmgr_hub_refresh_button,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
VOID
|
||
|
PowerPage::Initialize()
|
||
|
{
|
||
|
dlgResource = IDD_POWER;
|
||
|
hLstDevices = NULL;
|
||
|
HelpIds = (const DWORD *) PowerHelpIds;
|
||
|
}
|
||
|
|
||
|
BOOL PowerPage::OnInitDialog()
|
||
|
{
|
||
|
LV_COLUMN column;
|
||
|
RECT rect;
|
||
|
TCHAR buf[MAX_PATH];
|
||
|
|
||
|
if (preItem) {
|
||
|
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION);
|
||
|
//
|
||
|
// Make the Refresh button go away
|
||
|
//
|
||
|
HWND hRefresh;
|
||
|
if (NULL != (hRefresh =GetDlgItem(hwnd, IDC_REFRESH)) ) {
|
||
|
SetWindowLong(hRefresh,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hRefresh, GWL_STYLE) | WS_DISABLED)
|
||
|
& ~WS_VISIBLE);
|
||
|
}
|
||
|
} else if (!deviceInfoSet && !deviceInfoData) {
|
||
|
//
|
||
|
// Make the Refresh button go away and make the Close button visible
|
||
|
//
|
||
|
HWND hButton;
|
||
|
if (NULL != (hButton =GetDlgItem(hwnd, IDC_REFRESH)) ) {
|
||
|
SetWindowLong(hButton,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hButton, GWL_STYLE) | WS_DISABLED) &
|
||
|
~WS_VISIBLE);
|
||
|
}
|
||
|
if (NULL != (hButton =GetDlgItem(hwnd, IDC_POWER_CLOSE)) ) {
|
||
|
SetWindowLong(hButton,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hButton, GWL_STYLE) | WS_VISIBLE) &
|
||
|
~WS_DISABLED);
|
||
|
}
|
||
|
// if (!RegisterForDeviceNotification(hwnd))
|
||
|
// MessageBox(hwnd,TEXT("Error"),TEXT("Dynamic refresh unavailable"),MB_OK);
|
||
|
} else {
|
||
|
// RegisterForDeviceNotification(hwnd);
|
||
|
}
|
||
|
|
||
|
hLstDevices = GetDlgItem(hwnd, IDC_LIST_DEVICES);
|
||
|
|
||
|
ListView_SetImageList(hLstDevices, imageList.ImageList(), LVSIL_SMALL);
|
||
|
|
||
|
ZeroMemory(&column, sizeof(LV_COLUMN));
|
||
|
|
||
|
column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
|
||
|
column.fmt = LVCFMT_LEFT;
|
||
|
LoadString(gHInst, IDS_DEVICE_DESCRIPTION, buf, MAX_PATH);
|
||
|
column.pszText = buf;
|
||
|
GetClientRect(hLstDevices, &rect);
|
||
|
column.cx = (int)(.7*(rect.right - rect.left));
|
||
|
|
||
|
// ListView_InsertColumn(hLstDevices, 0, &column);
|
||
|
SendMessage(hLstDevices, LVM_INSERTCOLUMN, (WPARAM)0, (LPARAM)&column);
|
||
|
|
||
|
ZeroMemory(&column, sizeof(LV_COLUMN));
|
||
|
|
||
|
column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
|
||
|
column.fmt = LVCFMT_LEFT;
|
||
|
LoadString(gHInst, IDS_POWER_CONSUMED, buf, MAX_PATH);
|
||
|
column.pszText = buf;
|
||
|
GetClientRect(hLstDevices, &rect);
|
||
|
column.cx = (int) (.3*(rect.right - rect.left));
|
||
|
|
||
|
// ListView_InsertColumn(hLstDevices, 1, &column);
|
||
|
SendMessage(hLstDevices, LVM_INSERTCOLUMN, (WPARAM)1, (LPARAM)&column);
|
||
|
|
||
|
Refresh();
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
PowerPage::OnCommand(INT wNotifyCode,
|
||
|
INT wID,
|
||
|
HWND hCtl)
|
||
|
{
|
||
|
if (wNotifyCode == BN_CLICKED) {
|
||
|
if (wID == IDC_REFRESH) {
|
||
|
Refresh();
|
||
|
return FALSE;
|
||
|
} else if (wID == IDC_POWER_CLOSE) {
|
||
|
/* if (hDevNotify) {
|
||
|
UnregisterDeviceNotification(hDevNotify);
|
||
|
UnregisterDeviceNotification(hHubNotify);
|
||
|
hDevNotify = NULL;
|
||
|
}*/
|
||
|
EndDialog(hwnd, wID);
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
PowerPage::OnNotify(HWND hDlg, int nID, LPNMHDR pnmh)
|
||
|
{
|
||
|
switch (nID) {
|
||
|
case IDC_LIST_DEVICES:
|
||
|
OnNotifyListDevices(hDlg, pnmh);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
PowerPage::OnNotifyListDevices(HWND hDlg, LPNMHDR pnmh)
|
||
|
{
|
||
|
if (pnmh->code == NM_DBLCLK) {
|
||
|
//
|
||
|
// Display properties on this specific device on double click
|
||
|
//
|
||
|
DisplayPPSelectedListItem(hwnd, hLstDevices);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PowerPage::Refresh()
|
||
|
{
|
||
|
UsbItem *usbItem = 0, *hub;
|
||
|
LVITEM item;
|
||
|
int i=0; //, size;
|
||
|
TCHAR buf[MAX_PATH], formatString[MAX_PATH];
|
||
|
// CWaitCursor wait;
|
||
|
|
||
|
//
|
||
|
// Clear all UI components
|
||
|
//
|
||
|
ListView_DeleteAllItems(hLstDevices);
|
||
|
|
||
|
if (preItem) {
|
||
|
hub = preItem;
|
||
|
} else {
|
||
|
if (deviceName.empty()) {
|
||
|
if (!GetDeviceName()) {
|
||
|
goto PowerPageRefreshError;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Recreate the rootItem
|
||
|
//
|
||
|
if (rootItem) {
|
||
|
DeleteChunk(rootItem);
|
||
|
delete rootItem;
|
||
|
}
|
||
|
rootItem = new UsbItem;
|
||
|
AddChunk(rootItem);
|
||
|
hub = rootItem;
|
||
|
if (deviceInfoData) {
|
||
|
if (!hub->EnumerateHub(deviceName,
|
||
|
&imageList,
|
||
|
deviceInfoData->DevInst,
|
||
|
NULL,
|
||
|
UsbItem::UsbItemType::Hub)) {
|
||
|
goto PowerPageRefreshError;
|
||
|
}
|
||
|
} else {
|
||
|
if (!hub->EnumerateHub(deviceName,
|
||
|
&imageList,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
UsbItem::UsbItemType::Hub)) {
|
||
|
goto PowerPageRefreshError;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ZeroMemory(&item, sizeof(LVITEM));
|
||
|
item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
|
||
|
|
||
|
if (hub->child) {
|
||
|
for (usbItem = hub->child, i = 0;
|
||
|
usbItem;
|
||
|
usbItem = usbItem->sibling, i++) {
|
||
|
|
||
|
if (!usbItem->IsDescriptionValidDevice()) {
|
||
|
i--;
|
||
|
continue;
|
||
|
}
|
||
|
item.iItem = i;
|
||
|
item.iImage = usbItem->imageIndex;
|
||
|
item.lParam = (LPARAM) usbItem;
|
||
|
assert(usbItem->configInfo != NULL);
|
||
|
item.pszText = (LPTSTR) usbItem->configInfo->deviceDesc.c_str();
|
||
|
ListView_InsertItem(hLstDevices, &item);
|
||
|
|
||
|
if (usbItem->ComputePower()) {
|
||
|
LoadString(gHInst, IDS_POWER_CONSUMPTION, formatString, MAX_PATH);
|
||
|
UsbSprintf(buf, formatString, usbItem->power);
|
||
|
} else {
|
||
|
LoadString(gHInst, IDS_UNKNOWN, buf, MAX_PATH);
|
||
|
}
|
||
|
ListView_SetItemText(hLstDevices, i, 1, buf);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (hub->NumPorts() - hub->NumChildren() > 0) {
|
||
|
//
|
||
|
// Add an item indicating the number of ports available
|
||
|
//
|
||
|
item.iItem = i;
|
||
|
item.iImage = -1;
|
||
|
item.lParam = (LPARAM) NULL;
|
||
|
LoadString(gHInst, IDS_PORTS_AVAILABLE, formatString, MAX_PATH);
|
||
|
UsbSprintf(buf, formatString, hub->NumPorts() - hub->NumChildren());
|
||
|
item.pszText = buf;
|
||
|
ListView_InsertItem(hLstDevices, &item);
|
||
|
|
||
|
LoadString(gHInst, IDS_POWER_CONSUMPTION, formatString, MAX_PATH);
|
||
|
UsbSprintf(buf, formatString, 0);
|
||
|
ListView_SetItemText(hLstDevices, i, 1, buf);
|
||
|
}
|
||
|
|
||
|
LoadString(gHInst, IDS_TOTAL_POWER, formatString, MAX_PATH);
|
||
|
UsbSprintf(buf, formatString, hub->PortPower());
|
||
|
SetTextItem(hwnd, IDC_POWER_AVAIL, buf);
|
||
|
|
||
|
if (hub->PortPower() > 100) {
|
||
|
SetTextItem(hwnd, IDC_SELF_POWER, IDS_POWER_SELF);
|
||
|
} else {
|
||
|
SetTextItem(hwnd, IDC_SELF_POWER, IDS_POWER_BUS);
|
||
|
}
|
||
|
return;
|
||
|
PowerPageRefreshError:
|
||
|
//
|
||
|
// The hub is malfunctioning. Show the property page as disabled.
|
||
|
//
|
||
|
HWND hButton;
|
||
|
if (NULL != (hButton = GetDlgItem(hwnd, IDC_REFRESH)) ) {
|
||
|
SetWindowLong(hButton,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hButton, GWL_STYLE) | WS_DISABLED));
|
||
|
}
|
||
|
if (NULL != (hButton = GetDlgItem(hwnd, IDC_LIST_DEVICES)) ) {
|
||
|
SetWindowLong(hButton,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hButton, GWL_STYLE) | WS_DISABLED));
|
||
|
}
|
||
|
if (NULL != (hButton = GetDlgItem(hwnd, IDC_DESCRIPTION)) ) {
|
||
|
SetWindowLong(hButton,
|
||
|
GWL_STYLE,
|
||
|
(GetWindowLong(hButton, GWL_STYLE) | WS_DISABLED));
|
||
|
}
|
||
|
SetTextItem(hwnd, IDC_POWER_AVAIL, TEXT(""));
|
||
|
SetTextItem(hwnd, IDC_SELF_POWER, IDS_POWER_MALFUNCTIONING);
|
||
|
}
|
||
|
|
||
|
HPROPSHEETPAGE PowerPage::Create()
|
||
|
{
|
||
|
//
|
||
|
// Make sure that this is indeed a hub
|
||
|
//
|
||
|
if (deviceName.empty()) {
|
||
|
if (!GetDeviceName()) {
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
return UsbPropertyPage::Create();
|
||
|
}
|
||
|
|
||
|
|