windows-nt/Source/XPSP1/NT/shell/osshell/cpls/usb/ovrcurnt.cpp
2020-09-26 16:20:57 +08:00

237 lines
8.1 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: OVRCURNT.CPP
* VERSION: 1.0
* AUTHOR: jsenior
* DATE: 10/28/1998
*
********************************************************************************
*
* CHANGE LOG:
*
* DATE REV DESCRIPTION
* ---------- ------- ----------------------------------------------------------
* 10/28/1998 jsenior Original implementation.
*
*******************************************************************************/
#include "usbpopup.h"
#include "itemfind.h"
#include "debug.h"
#include "usbutil.h"
//
// Refresh the contents of the treeview control.
// Find all hubs with unused ports on them. If there are none, find some which
// have devices requiring less than 100 mA.
//
BOOL UsbOvercurrentPopup::Refresh()
{
TV_INSERTSTRUCT item;
int i=0; //, size;
PUSB_ACQUIRE_INFO acquireInfoController = 0;
BOOL result = FALSE;
TCHAR buf[MAX_PATH], formatString[MAX_PATH];
HWND hReset;
String hubName = HubAcquireInfo->Buffer;
//
// Make the Reset button visible, since this is the overcurrent dialog
//
if (NULL != (hReset =GetDlgItem(hWnd, IDC_RESET_PORT)) ) {
SetWindowLong(hReset,
GWL_STYLE,
(GetWindowLong(hReset, GWL_STYLE) | WS_VISIBLE)
& ~WS_DISABLED);
}
//
// Set the window's title bar
//
LoadString(gHInst, IDS_CURRENT_LIMIT_EXCEEDED, buf, MAX_PATH);
SetWindowText(hWnd, buf);
//
// Clear all UI components, and then recreate the rootItem
//
UsbTreeView_DeleteAllItems(hTreeDevices);
if (rootItem) {
DeleteChunk(rootItem);
delete rootItem;
}
rootItem = new UsbItem;
if (!rootItem) {
USBERROR((_T("Out of memory!\n")));
goto OvercurrentRefreshError;
}
AddChunk(rootItem);
//
// Get the controller name and enumerate the tree
//
acquireInfoController = GetControllerName(WmiHandle,
InstanceName);
if (!acquireInfoController) {
goto OvercurrentRefreshError;
}
if (!rootItem->EnumerateController(0,
acquireInfoController->Buffer,
&ImageList,
0)) {
goto OvercurrentRefreshError;
}
acquireInfoController = (PUSB_ACQUIRE_INFO) LocalFree(acquireInfoController);
LoadString(gHInst, IDS_UNKNOWNDEVICE, buf, MAX_PATH);
LoadString(gHInst, IDS_UNKNOWNDEVICE, formatString, MAX_PATH);
if (deviceItem.IsUnusedPort() ||
!_tcscmp(deviceItem.configInfo->deviceDesc.c_str(), buf) ||
!_tcscmp(deviceItem.configInfo->deviceDesc.c_str(), formatString)) {
//
// The hub has eroneously removed the device prior to throwing the
// overcurrent notification
//
LoadString(gHInst,
IDS_OVERCURRENT_NOTIFICATION_UNKNOWN,
buf,
MAX_PATH);
} else {
//
// The device is still there
// Set the notification using the name of the offending device
//
LoadString(gHInst,
IDS_OVERCURRENT_NOTIFICATION,
formatString,
MAX_PATH);
UsbSprintf(buf, formatString, deviceItem.configInfo->deviceDesc.c_str());
}
if (!SetTextItem(hWnd, IDC_POWER_NOTIFICATION, buf) ||
!SetTextItem(hWnd, IDC_POWER_EXPLANATION, IDS_ENUMFAIL_COURSE) ||
!SetTextItem(hWnd, IDC_POWER_RECOMMENDATION, IDS_OVERCURRENT_RECOMMENDATION)) {
goto OvercurrentRefreshError;
}
if (rootItem->child) {
if (deviceItem.configInfo->devInst) {
//
// The device hasn't been removed by either the hub or the user yet
// Find the overcurrent device
//
UsbItemActionFindOvercurrentDevice f1(deviceItem.configInfo->devInst);
rootItem->Walk(f1);
if (f1.GetDevice()) {
//
// Device is still attached
//
result=InsertTreeItem (hTreeDevices,
rootItem->child,
TreeView_GetRoot(hTreeDevices),
&item,
TrueAlways,
UsbItemActionFindOvercurrentDevice::IsValid,
UsbItemActionFindOvercurrentDevice::IsExpanded);
}
}
if (!result) {
//
// Device has been removed by either the hub or the user. Find the
// hub that the device was attached to and highlight the port.
//
UsbItemActionFindOvercurrentHubPort f2(hubName, deviceItem.cxnAttributes.ConnectionIndex);
rootItem->Walk(f2);
if (f2.GetDevice()) {
result=InsertTreeItem (hTreeDevices,
rootItem->child,
TreeView_GetRoot(hTreeDevices),
&item,
TrueAlways,
UsbItemActionFindOvercurrentHubPort::IsValid,
UsbItemActionFindOvercurrentHubPort::IsExpanded);
}
}
}
return result;
OvercurrentRefreshError:
if (acquireInfoController) {
LocalFree(acquireInfoController);
}
return FALSE;
}
BOOL
UsbOvercurrentPopup::OnCommand(INT wNotifyCode,
INT wID,
HWND hCtl)
{
switch (wID) {
case IDC_RESET_PORT:
PUSB_CONNECTION_NOTIFICATION resetNotification;
ULONG size, res;
_try {
size = sizeof(USB_CONNECTION_NOTIFICATION);
resetNotification =
(PUSB_CONNECTION_NOTIFICATION) LocalAlloc(LMEM_ZEROINIT, size);
if (!resetNotification) {
//
// do something here
//
return FALSE;
}
resetNotification->NotificationType = ResetOvercurrent;
resetNotification->ConnectionNumber =
ConnectionNotification->ConnectionNumber;
res = WmiExecuteMethod(WmiHandle,
InstanceName.c_str(),
ResetOvercurrent,
size,
resetNotification,
&size,
resetNotification);
if (res != ERROR_SUCCESS) {
TCHAR szTitle[MAX_PATH], szMessage[MAX_PATH];
LoadString(gHInst, IDS_RESET_FAILED, szMessage, MAX_PATH);
LoadString(gHInst, IDS_USB_ERROR, szTitle, MAX_PATH);
MessageBox(hWnd, szMessage, szTitle, MB_OK | MB_USERICON);
}
}
_finally {
if (resetNotification) {
LocalFree(resetNotification);
}
EndDialog(hWnd, wID);
}
return TRUE;
case IDOK:
EndDialog(hWnd, wID);
return TRUE;
}
return FALSE;
}
BOOL
UsbOvercurrentPopup::CustomDialogWrap()
{
TCHAR unknownDevice[MAX_PATH], unknownHub[MAX_PATH];
LoadString(gHInst, IDS_UNKNOWNDEVICE, unknownDevice, MAX_PATH);
LoadString(gHInst, IDS_UNKNOWNHUB, unknownHub, MAX_PATH);
if (deviceItem.IsUnusedPort() ||
!_tcscmp(deviceItem.configInfo->deviceDesc.c_str(), unknownDevice) ||
!_tcscmp(deviceItem.configInfo->deviceDesc.c_str(), unknownHub)) {
return CustomDialog(IDD_INSUFFICIENT_POWER,
NIIF_ERROR,
IDS_OVERCURRENT_INITIAL_UNKNOWN,
IDS_CURRENT_LIMIT_EXCEEDED);
} else {
return CustomDialog(IDD_INSUFFICIENT_POWER,
NIIF_ERROR,
IDS_OVERCURRENT_INITIAL,
IDS_CURRENT_LIMIT_EXCEEDED);
}
}