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

124 lines
4.2 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: ENUMFAIL.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 UsbEnumFailPopup::Refresh()
{
TV_INSERTSTRUCT item;
int i=0; //, size;
PUSB_ACQUIRE_INFO acquireInfoController = 0;
BOOL result = FALSE;
TCHAR buf[MAX_PATH];
String hubName = HubAcquireInfo->Buffer;
//
// Set the window's title bar and the rest of the messages
//
LoadString(gHInst, IDS_ENUMERATION_FAILURE, buf, MAX_PATH);
SetWindowText(hWnd, buf);
if (!SetTextItem(hWnd, IDC_POWER_NOTIFICATION, IDS_ENUMFAIL_NOTIFICATION) ||
!SetTextItem(hWnd, IDC_POWER_EXPLANATION, IDS_ENUMFAIL_COURSE) ||
!SetTextItem(hWnd, IDC_POWER_RECOMMENDATION, IDS_ENUMFAIL_RECOMMENDATION)) {
goto OvercurrentRefreshError;
}
//
// Clear all UI components, and then recreate the rootItem
//
UsbTreeView_DeleteAllItems(hTreeDevices);
if (rootItem) {
DeleteChunk(rootItem);
delete rootItem;
}
rootItem = new UsbItem;
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);
if (rootItem->child) {
if (!deviceItem.configInfo->devInst) {
//
// 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);
}
} else {
//
// 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);
}
}
}
return result;
OvercurrentRefreshError:
if (acquireInfoController) {
LocalFree(acquireInfoController);
}
return FALSE;
}