/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORP., 1993-1995 * TITLE: BNDWIDTH.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 "PropPage.h" #include "itemfind.h" #include "debug.h" #include "usbutil.h" void UsbBandwidthPopup::AddIsoDevicesToListView(UsbItem *controller, int iIndent) { UINT interruptBW; LVITEM item; TCHAR buf[MAX_PATH]; UsbItem *usbItem; ZeroMemory(&item, sizeof(LVITEM)); item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE | LVIF_INDENT; item.iIndent = iIndent; UsbItemActionFindIsoDevices find; controller->child->Walk(find); // // Put the devices in that use very little bandwidth first so that they // will be shuffled to the bottom when the high consumption devices are // added. // UsbItemList& isoDevices = find.GetIsoDevices(); for (usbItem = isoDevices.begin() ? *isoDevices.Current() : NULL; usbItem; usbItem = isoDevices.next() ? *isoDevices.Current() : NULL) { item.iImage = usbItem->imageIndex; item.lParam = (LPARAM) usbItem; assert(usbItem->configInfo != NULL); item.pszText = (LPTSTR) usbItem->configInfo->deviceDesc.c_str(); UsbSprintf(buf, TEXT("%d%%"), usbItem->bandwidth); ListView_InsertItem(hListDevices, &item); ListView_SetItemText(hListDevices, 0, 1, buf); } // // Add an item indicating that the system always uses 10% // item.iItem = 0; ImageList.GetClassImageIndex(MyComputerClass, &item.iImage); item.lParam = (LPARAM) controller; LoadString(gHInst, IDS_BANDWIDTH_CONTROLLER_RSRVD, buf, MAX_PATH); item.pszText = buf; ListView_InsertItem(hListDevices, &item); interruptBW = 10 + UsbItem::CalculateBWPercent(find.InterruptBW()); wsprintf(buf,_T("%d%%"),interruptBW); ListView_SetItemText(hListDevices, 0, 1, buf); } BOOL UsbBandwidthPopup::Refresh() { PUSB_ACQUIRE_INFO acquireInfo = 0; UsbItem *controller; LVITEM item; TCHAR buf[MAX_PATH]; TCHAR formatString[MAX_PATH]; // CWaitCursor wait; // // Clear all UI components, and then recreate the rootItem // ListView_DeleteAllItems(hListDevices); if (rootItem) { DeleteChunk(rootItem); delete rootItem; } rootItem = new UsbItem; AddChunk(rootItem); acquireInfo = GetControllerName(WmiHandle, InstanceName.c_str()); if (!acquireInfo) { goto BandwidthRefreshError; } if (!rootItem->EnumerateAll(&ImageList)) { goto BandwidthRefreshError; } acquireInfo = (PUSB_ACQUIRE_INFO) LocalFree(acquireInfo); // // Set the notification using the name of the offending device // LoadString(gHInst, IDS_BANDWIDTH_NOTIFICATION, formatString, MAX_PATH); UsbSprintf(buf, formatString, deviceItem.configInfo->deviceDesc.c_str(), UsbItem::CalculateBWPercent(ConnectionNotification->RequestedBandwidth)); if (!SetTextItem(hWnd, IDC_BANDWIDTH_NOTIFICATION, buf)) { goto BandwidthRefreshError; } ZeroMemory(&item, sizeof(LVITEM)); item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; if (rootItem->NumChildren() == 1) { // // Computer only has one controller installed // if (!SetTextItem(hWnd, IDC_BANDWIDTH_EXPLANATION, IDS_BW_EXPLANATION) || !SetTextItem(hWnd, IDC_BANDWIDTH_RECOMMENDATION, IDS_BW_RECOMMENDATION)) { goto BandwidthRefreshError; } AddIsoDevicesToListView(rootItem->child, 0); } else if (rootItem->NumChildren() > 1) { // // Computer has multiple controllers on board. Yeehaw! // LoadString(gHInst, IDS_BANDWIDTH_RECOMMENDATION, formatString, MAX_PATH); UsbSprintf(buf, formatString, deviceItem.configInfo->deviceDesc.c_str()); if (!SetTextItem(hWnd, IDC_BANDWIDTH_RECOMMENDATION, buf) || !SetTextItem(hWnd, IDC_BANDWIDTH_EXPLANATION, IDS_BW_EXPLANATION)) { goto BandwidthRefreshError; } // // Change the column text from "Device" to "Controller" // LV_COLUMN column; ZeroMemory(&column, sizeof(LV_COLUMN)); column.mask = LVCF_TEXT; LoadString(gHInst, IDS_CONTROLLER, buf, MAX_PATH); column.pszText = buf; ListView_SetColumn(hListDevices, 0, &column); // // Iterate through the controllers and find out how much bandwidth is // being used on each. Display this in a list view control. // for (controller = rootItem->child; controller != NULL; controller = controller->sibling) { AddIsoDevicesToListView(controller, 1); item.iItem = 0; item.iImage = controller->imageIndex; item.lParam = (LPARAM) controller; item.pszText = (LPTSTR) controller->configInfo->deviceDesc.c_str(); ListView_InsertItem(hListDevices, &item); } } return TRUE; BandwidthRefreshError: if (acquireInfo) { LocalFree(acquireInfo); } return FALSE; } BOOL UsbBandwidthPopup::OnInitDialog(HWND HWnd) { hWnd = HWnd; LV_COLUMN column; RECT rect; HANDLE hExclamation; HICON hIcon; TCHAR buf[MAX_PATH]; // // Set the Icon to an exclamation mark // if (NULL == (hIcon = LoadIcon(NULL, (LPTSTR) IDI_EXCLAMATION)) || NULL == (hExclamation = GetDlgItem(hWnd, IDC_ICON_BANDWIDTH))) { return FALSE; } SendMessage((HWND) hExclamation, STM_SETICON, (WPARAM) hIcon, NULL); hListDevices = GetDlgItem(HWnd, IDC_LIST_CONTROLLERS); ListView_SetImageList(hListDevices, ImageList.ImageList(), LVSIL_SMALL); // // Add columns to the list box // ZeroMemory(&column, sizeof(LV_COLUMN)); column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; column.fmt = LVCFMT_LEFT; LoadString(gHInst, IDS_DEVICE, buf, MAX_PATH); column.pszText = buf; GetClientRect(hListDevices, &rect); column.cx = (int) (.65*(rect.right - rect.left)); ListView_InsertColumn(hListDevices, 0, &column); ZeroMemory(&column, sizeof(LV_COLUMN)); column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; column.fmt = LVCFMT_LEFT; LoadString(gHInst, IDS_BANDWIDTH_CONSUMED, buf, MAX_PATH); column.pszText = buf; GetClientRect(hListDevices, &rect); column.cx = (int) (.35*(rect.right - rect.left)); ListView_InsertColumn(hListDevices, 1, &column); return Refresh(); } BOOL UsbBandwidthPopup::OnCommand(INT wNotifyCode, INT wID, HWND hCtl) { switch (wID) { case IDOK: EndDialog(hWnd, wID); return TRUE; case IDC_BW_REFRESH: Refresh(); return TRUE; } return FALSE; } BOOL UsbBandwidthPopup::IsPopupStillValid() { USB_BUS_NOTIFICATION busNotification; USBINFO((_T("Names %s, %s!\n"), deviceItem.configInfo->deviceDesc.c_str(), LastDeviceName.c_str())); if (!GetBusNotification(WmiHandle, &busNotification)) { USBERROR((_T("Failed to get bus notification!\n"))); return FALSE; } // // Is this the same scenario? // if (deviceItem.configInfo->deviceDesc == LastDeviceName && busNotification.ConsumedBandwidth == LastBandwidthConsumed && ConnectionNotification->RequestedBandwidth == LastBandwidthRequested) { USBWARN((_T("Same scenario!!!"))); return FALSE; } // // Change the scenario. // LastDeviceName = deviceItem.configInfo->deviceDesc; LastBandwidthConsumed = busNotification.ConsumedBandwidth; LastBandwidthRequested = ConnectionNotification->RequestedBandwidth; // // Is this notification still relevant? // USBINFO((_T("Bandwidth consumed %x, requested %x, total %x!\n"), busNotification.ConsumedBandwidth, ConnectionNotification->RequestedBandwidth, busNotification.TotalBandwidth)); if (busNotification.ConsumedBandwidth + ConnectionNotification->RequestedBandwidth < busNotification.TotalBandwidth) { USBWARN((_T("Got BW notification when there was no need!\n"))); return FALSE; } return TRUE; } UsbString UsbBandwidthPopup::LastDeviceName = _T(""); ULONG UsbBandwidthPopup::LastBandwidthRequested = 0; ULONG UsbBandwidthPopup::LastBandwidthConsumed = 0;