- document and partly implement DevicePropertiesExA/W()
[reactos.git] / reactos / lib / devmgr / hwpage.c
index b596cac..bb42297 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-typedef VOID (WINAPI *PINITCOMMONCONTROLS)(VOID);
-
-typedef enum
-{
-    HWPD_STANDARDLIST = 0,
-    HWPD_LARGELIST,
-    HWPD_MAX = HWPD_LARGELIST
-} HWPAGE_DISPLAYMODE, *PHWPAGE_DISPLAYMODE;
-
 typedef struct _HWDEVINFO
 {
     struct _HWCLASSDEVINFO *ClassDevInfo;
     SP_DEVINFO_DATA DevInfoData;
+    BOOL HideDevice;
 } HWDEVINFO, *PHWDEVINFO;
 
 typedef struct _HWCLASSDEVINFO
@@ -135,55 +127,13 @@ DisplaySelectedDeviceProperties(IN PHARDWARE_PAGE_DATA hpd)
     HwDevInfo = (PHWDEVINFO)ListViewGetSelectedItemData(hpd->hWndDevList);
     if (HwDevInfo != NULL)
     {
-        PWSTR szDeviceInstanceId = NULL;
-        DWORD DeviceInstanceIdLen = 0;
-
-        /* find out how much size is needed for the buffer */
-        if (SetupDiGetDeviceInstanceId(HwDevInfo->ClassDevInfo->hDevInfo,
-                                       &HwDevInfo->DevInfoData,
-                                       NULL,
-                                       0,
-                                       &DeviceInstanceIdLen))
-        {
-            DPRINT1("SetupDiGetDeviceInterfaceDetail unexpectedly returned TRUE!\n");
-            goto Cleanup;
-        }
-
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-        {
-            goto Cleanup;
-        }
-
-        szDeviceInstanceId = HeapAlloc(GetProcessHeap(),
-                                       0,
-                                       DeviceInstanceIdLen * sizeof(WCHAR));
-        if (szDeviceInstanceId == NULL)
-        {
-            goto Cleanup;
-        }
-
-        /* read the device instance id */
-        if (!SetupDiGetDeviceInstanceId(HwDevInfo->ClassDevInfo->hDevInfo,
-                                        &HwDevInfo->DevInfoData,
-                                        szDeviceInstanceId,
-                                        DeviceInstanceIdLen,
-                                        &DeviceInstanceIdLen))
-        {
-            goto Cleanup;
-        }
-
-        /* display the properties dialog */
-        Ret = DeviceAdvancedProperties(hpd->hWnd,
-                                       NULL,
-                                       szDeviceInstanceId) >= 0;
-
-Cleanup:
-        if (szDeviceInstanceId != NULL)
-        {
-            HeapFree(GetProcessHeap(),
-                     0,
-                     szDeviceInstanceId);
-        }
+        Ret = DisplayDeviceAdvancedProperties(hpd->hWnd,
+                                              NULL,
+                                              HwDevInfo->ClassDevInfo->hDevInfo,
+                                              &HwDevInfo->DevInfoData,
+                                              hpd->hComCtl32,
+                                              NULL,
+                                              0) != -1;
     }
 
     return Ret;
@@ -205,30 +155,15 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd)
     if (HwDevInfo != NULL)
     {
         /* update static controls */
-        CONFIGRET cRet;
-        DWORD RegDataType;
-        ULONG DataSize;
         WCHAR szBuffer[256];
         LPWSTR szFormatted = NULL;
 
         /* get the manufacturer string */
-        if (!SetupDiGetDeviceRegistryProperty(HwDevInfo->ClassDevInfo->hDevInfo,
-                                              &HwDevInfo->DevInfoData,
-                                              SPDRP_MFG,
-                                              &RegDataType,
-                                              (PBYTE)szBuffer,
-                                              sizeof(szBuffer),
-                                              NULL) ||
-            RegDataType != REG_SZ)
-        {
-            szBuffer[0] = L'\0';
-            LoadString(hDllInstance,
-                       IDS_UNKNOWN,
-                       szBuffer,
-                       sizeof(szBuffer) / sizeof(szBuffer[0]));
-        }
-        /* FIXME - check string for NULL termination! */
-        if (LoadAndFormatString(hDllInstance,
+        if (GetDeviceManufacturerString(HwDevInfo->ClassDevInfo->hDevInfo,
+                                        &HwDevInfo->DevInfoData,
+                                        szBuffer,
+                                        sizeof(szBuffer) / sizeof(szBuffer[0])) &&
+            LoadAndFormatString(hDllInstance,
                                 IDS_MANUFACTURER,
                                 &szFormatted,
                                 szBuffer) != 0)
@@ -240,46 +175,11 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd)
         }
 
         /* get the location string */
-        DataSize = sizeof(szBuffer);
-        cRet = CM_Get_DevNode_Registry_Property(HwDevInfo->DevInfoData.DevInst,
-                                                CM_DRP_LOCATION_INFORMATION,
-                                                &RegDataType,
-                                                szBuffer,
-                                                &DataSize,
-                                                0);
-        if (cRet != CR_SUCCESS ||
-            RegDataType != REG_SZ)
-        {
-            szBuffer[0] = L'\0';
-            LoadString(hDllInstance,
-                       IDS_UNKNOWN,
-                       szBuffer,
-                       sizeof(szBuffer) / sizeof(szBuffer[0]));
-        }
-        /* FIXME - check string for NULL termination! */
-
-        if (szBuffer[0] >= L'0' && szBuffer[0] <= L'9')
-        {
-            /* convert the string to an integer value and create a
-               formatted string */
-            ULONG ulLocation = (ULONG)wcstoul(szBuffer,
-                                              NULL,
-                                              10);
-            if (LoadAndFormatString(hDllInstance,
-                                    IDS_LOCATIONSTR,
-                                    &szFormatted,
-                                    ulLocation,
-                                    szBuffer) != 0)
-            {
-                wcsncpy(szBuffer,
-                        szFormatted,
-                        (sizeof(szBuffer) / sizeof(szBuffer[0])) - 1);
-                szBuffer[(sizeof(szBuffer) / sizeof(szBuffer[0])) - 1] = L'\0';
-                LocalFree((HLOCAL)szFormatted);
-            }
-        }
-
-        if (LoadAndFormatString(hDllInstance,
+        if (GetDeviceLocationString(HwDevInfo->DevInfoData.DevInst,
+                                    0,
+                                    szBuffer,
+                                    sizeof(szBuffer) / sizeof(szBuffer[0])) &&
+            LoadAndFormatString(hDllInstance,
                                 IDS_LOCATION,
                                 &szFormatted,
                                 szBuffer) != 0)
@@ -290,13 +190,11 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd)
             LocalFree((HLOCAL)szFormatted);
         }
 
-        /* FIXME - get the device status text */
-        LoadString(hDllInstance,
-                   IDS_UNKNOWN,
-                   szBuffer,
-                   sizeof(szBuffer) / sizeof(szBuffer[0]));
-
-        if (LoadAndFormatString(hDllInstance,
+        if (GetDeviceStatusString(HwDevInfo->DevInfoData.DevInst,
+                                  NULL,
+                                  szBuffer,
+                                  sizeof(szBuffer) / sizeof(szBuffer[0])) &&
+            LoadAndFormatString(hDllInstance,
                                 IDS_STATUS,
                                 &szFormatted,
                                 szBuffer) != 0)
@@ -380,7 +278,7 @@ BuildDevicesList(IN PHARDWARE_PAGE_DATA hpd)
         ClassDevInfo->hDevInfo = SetupDiGetClassDevs(&ClassDevInfo->Guid,
                                                      NULL,
                                                      hpd->hWnd,
-                                                     DIGCF_PRESENT);
+                                                     DIGCF_PRESENT | DIGCF_PROFILE);
         if (ClassDevInfo->hDevInfo != INVALID_HANDLE_VALUE)
         {
             DWORD MemberIndex = 0;
@@ -394,6 +292,8 @@ BuildDevicesList(IN PHARDWARE_PAGE_DATA hpd)
                                          MemberIndex++,
                                          &DevInfoData))
             {
+                BOOL HideDevice = FALSE;
+
                 if (ClassDevInfo->HwDevInfo != NULL)
                 {
                     PHWDEVINFO HwNewDevInfo = HeapReAlloc(GetProcessHeap(),
@@ -424,9 +324,15 @@ BuildDevicesList(IN PHARDWARE_PAGE_DATA hpd)
                     }
                 }
 
+                /* Find out if the device should be hidden by default */
+                IsDeviceHidden(DevInfoData.DevInst,
+                               NULL,
+                               &HideDevice);
+
                 /* save all information for the current device */
                 ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount].ClassDevInfo = ClassDevInfo;
-                ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount++].DevInfoData = DevInfoData;
+                ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount].DevInfoData = DevInfoData;
+                ClassDevInfo->HwDevInfo[ClassDevInfo->ItemCount++].HideDevice = HideDevice;
             }
         }
 
@@ -457,29 +363,16 @@ FillDevicesListViewControl(IN PHARDWARE_PAGE_DATA hpd)
 
             while (HwDevInfo != LastHwDevInfo)
             {
-                DWORD RegDataType;
                 INT iItem;
                 LVITEM li;
 
                 /* get the device name */
-                if ((SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
-                                                      &HwDevInfo->DevInfoData,
-                                                      SPDRP_FRIENDLYNAME,
-                                                      &RegDataType,
-                                                      (PBYTE)szBuffer,
-                                                      sizeof(szBuffer),
-                                                      NULL) ||
-                     SetupDiGetDeviceRegistryProperty(ClassDevInfo->hDevInfo,
-                                                      &HwDevInfo->DevInfoData,
-                                                      SPDRP_DEVICEDESC,
-                                                      &RegDataType,
-                                                      (PBYTE)szBuffer,
-                                                      sizeof(szBuffer),
-                                                      NULL)) &&
-                    RegDataType == REG_SZ)
+                if (!HwDevInfo->HideDevice &&
+                    GetDeviceDescriptionString(ClassDevInfo->hDevInfo,
+                                               &HwDevInfo->DevInfoData,
+                                               szBuffer,
+                                               sizeof(szBuffer) / sizeof(szBuffer[0])))
                 {
-                    /* FIXME - check string for NULL termination! */
-
                     li.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT | LVIF_IMAGE;
                     li.iItem = ItemCount;
                     li.iSubItem = 0;
@@ -496,17 +389,16 @@ FillDevicesListViewControl(IN PHARDWARE_PAGE_DATA hpd)
                         ItemCount++;
 
                         /* get the device type for the second column */
-                        if (SetupDiGetClassDescription(&ClassDevInfo->Guid,
-                                                       szBuffer,
-                                                       sizeof(szBuffer) / sizeof(szBuffer[0]),
-                                                       NULL))
+                        if (GetDeviceTypeString(&HwDevInfo->DevInfoData,
+                                                szBuffer,
+                                                sizeof(szBuffer) / sizeof(szBuffer[0])))
                         {
                             li.mask = LVIF_TEXT;
                             li.iItem = iItem;
                             li.iSubItem = 1;
 
                             ListView_SetItem(hpd->hWndDevList,
-                                             &li);                  
+                                             &li);
                         }
                     }
                 }
@@ -775,6 +667,7 @@ HardwareDlgProc(IN HWND hwndDlg,
                 IN LPARAM lParam)
 {
     PHARDWARE_PAGE_DATA hpd;
+    INT_PTR Ret = FALSE;
 
     hpd = (PHARDWARE_PAGE_DATA)GetWindowLongPtr(hwndDlg,
                                                 DWL_USER);
@@ -802,6 +695,12 @@ HardwareDlgProc(IN HWND hwndDlg,
                             }
                             break;
                         }
+
+                        case NM_DBLCLK:
+                        {
+                            DisplaySelectedDeviceProperties(hpd);
+                            break;
+                        }
                     }
                 }
                 break;
@@ -915,6 +814,7 @@ HardwareDlgProc(IN HWND hwndDlg,
                     EnableTroubleShoot(hpd,
                                        GetWindowTextLength(hwndDlg) != 0);
                 }
+                Ret = TRUE;
                 break;
             }
 
@@ -949,7 +849,7 @@ HardwareDlgProc(IN HWND hwndDlg,
         }
     }
 
-    return FALSE;
+    return Ret;
 }
 
 
@@ -969,6 +869,8 @@ HardwareDlgProc(IN HWND hwndDlg,
  * RETURN VALUE
  *   Returns the handle of the hardware page window that has been created or
  *   NULL if it failed.
+ *
+ * @implemented
  */
 HWND
 WINAPI
@@ -978,7 +880,6 @@ DeviceCreateHardwarePageEx(IN HWND hWndParent,
                            IN HWPAGE_DISPLAYMODE DisplayMode)
 {
     PHARDWARE_PAGE_DATA hpd;
-    PINITCOMMONCONTROLS pInitCommonControls;
 
     /* allocate the HARDWARE_PAGE_DATA structure. Make sure it is
        zeroed because the initialization code assumes that in
@@ -1006,21 +907,12 @@ DeviceCreateHardwarePageEx(IN HWND hWndParent,
         }
 
         /* load comctl32.dll dynamically */
-        hpd->hComCtl32 = LoadLibrary(TEXT("comctl32.dll"));
+        hpd->hComCtl32 = LoadAndInitComctl32();
         if (hpd->hComCtl32 == NULL)
         {
             goto Cleanup;
         }
 
-        /* initialize the common controls */
-        pInitCommonControls = (PINITCOMMONCONTROLS)GetProcAddress(hpd->hComCtl32,
-                                                                  "InitCommonControls");
-        if (pInitCommonControls == NULL)
-        {
-            goto Cleanup;
-        }
-        pInitCommonControls();
-
         /* create the dialog */
         hWnd = CreateDialogParam(hDllInstance,
                                  MAKEINTRESOURCE(IDD_HARDWARE), 
@@ -1065,10 +957,7 @@ Cleanup:
  *   Returns the handle of the hardware page window that has been created or
  *   NULL if it failed.
  *
- * REVISIONS
- *
- * NOTE
- *
+ * @implemented
  */
 HWND
 WINAPI