[KSPROXY]
[reactos.git] / reactos / dll / cpl / hdwwiz / hdwwiz.c
index dc1cab6..ac87583 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 /*
  * PROJECT:         ReactOS Add hardware control panel
@@ -34,6 +34,7 @@ HFONT hTitleFont;
 SP_CLASSIMAGELIST_DATA ImageListData;
 PWSTR pDeviceStatusText;
 HANDLE hProcessHeap;
+HDEVINFO hDevInfoTypes;
 
 typedef BOOL (WINAPI *PINSTALL_NEW_DEVICE)(HWND, LPGUID, PDWORD);
 
@@ -54,7 +55,7 @@ CreateTitleFont(VOID)
 
     LogFont = ncm.lfMessageFont;
     LogFont.lfWeight = FW_BOLD;
-    _tcscpy(LogFont.lfFaceName, _T("MS Shell Dlg"));
+    wcscpy(LogFont.lfFaceName, L"MS Shell Dlg");
 
     hdc = GetDC(NULL);
     FontSize = 12;
@@ -171,9 +172,9 @@ IsConnctedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                 case PSN_WIZNEXT:
                 {
                     if (SendDlgItemMessage(hwndDlg, IDC_NOTCONNECTED, BM_GETCHECK, 0, 0) == BST_CHECKED)
-                        SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_NOTCONNECTEDPAGE);
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_NOTCONNECTEDPAGE);
                     else
-                        SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
 
                     return TRUE;
                 }
@@ -243,7 +244,7 @@ NotConnectedPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
                 case PSN_WIZBACK:
                 {
-                    SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE);
+                    SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE);
                     return TRUE;
                 }
             }
@@ -309,13 +310,11 @@ InitProbeListPage(HWND hwndDlg)
     LoadString(hApplet, IDS_ADDNEWDEVICE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR));
 
     Item.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
-    Item.pszText    = (LPTSTR) szBuffer;
-    Item.iItem      = 0;
+    Item.pszText    = (LPWSTR) szBuffer;
+    Item.iItem      = (INT) ListView_GetItemCount(hList);
     Item.iImage     = -1;
     (VOID) ListView_InsertItem(hList, &Item);
 
-    (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);
-
     hDevInfo = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, 0);
 
     if (hDevInfo == INVALID_HANDLE_VALUE) return;
@@ -327,6 +326,8 @@ InitProbeListPage(HWND hwndDlg)
     DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
     for (Index = 0; TRUE; Index++)
     {
+        szBuffer[0] = L'\0';
+
         if (!SetupDiEnumDeviceInfo(hDevInfo, Index, &DevInfoData)) break;
 
         if (CM_Get_DevNode_Status_Ex(&ulStatus, &ulProblemNumber, DevInfoData.DevInst, 0, NULL) == CR_SUCCESS)
@@ -377,17 +378,21 @@ InitProbeListPage(HWND hwndDlg)
         pstrStatusText = (PWSTR)HeapAlloc(hProcessHeap, 0, sizeof(szStatusText));
         lstrcpy(pstrStatusText, szStatusText);
 
-        /* Set device name */
-        Item.pszText = (LPWSTR) szBuffer;
-        Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
-        Item.lParam = (LPARAM) pstrStatusText;
-        Item.iItem = (INT) ListView_GetItemCount(hList);
-        (VOID) ListView_InsertItem(hList, &Item);
+        if (szBuffer[0] != L'\0')
+        {
+            /* Set device name */
+            Item.pszText = (LPWSTR) szBuffer;
+            Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+            Item.lParam = (LPARAM) pstrStatusText;
+            Item.iItem = (INT) ListView_GetItemCount(hList);
+            (VOID) ListView_InsertItem(hList, &Item);
+        }
 
         DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
     }
 
     (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL);
+    (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);
     SetupDiDestroyDeviceInfoList(hDevInfo);
 }
 
@@ -405,12 +410,6 @@ ProbeListPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         }
         break;
 
-        case WM_COMMAND:
-        {
-
-        }
-        break;
-
         case WM_NOTIFY:
         {
             LPNMHDR lpnm = (LPNMHDR)lParam;
@@ -419,43 +418,32 @@ ProbeListPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
             {
                 case PSN_SETACTIVE:
                 {
-                    PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
+                    PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
                 }
                 break;
 
-                case NM_CLICK:
+                case PSN_WIZNEXT:
                 {
                     Index = (INT) SendMessage(GetDlgItem(hwndDlg, IDC_PROBELIST), LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
-                    if (Index != -1)
+                    if (Index == -1) Index = 0;
+
+                    if (Index == 0)
                     {
-                        PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
                     }
-                }
-                break;
-
-                case PSN_WIZNEXT:
-                {
-                    Index = (INT) SendMessage(GetDlgItem(hwndDlg, IDC_PROBELIST), LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
-                    if (Index != -1)
+                    else
                     {
-                        if (Index == 0)
-                        {
-                            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
-                        }
-                        else
-                        {
-                            LVITEM Item;
-                            PWSTR pts;
-
-                            ZeroMemory(&Item, sizeof(LV_ITEM));
-                            Item.mask = LVIF_PARAM;
-                            Item.iItem = Index;
-                            (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item);
-                            pts = (PWSTR) Item.lParam;
-                            wcscpy(pDeviceStatusText, pts);
-
-                            SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_HWSTATUSPAGE);
-                        }
+                        LVITEM Item;
+                        PWSTR pts;
+
+                        ZeroMemory(&Item, sizeof(LV_ITEM));
+                        Item.mask = LVIF_PARAM;
+                        Item.iItem = Index;
+                        (VOID) ListView_GetItem(GetDlgItem(hwndDlg, IDC_PROBELIST), &Item);
+                        pts = (PWSTR) Item.lParam;
+                        wcscpy(pDeviceStatusText, pts);
+
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_HWSTATUSPAGE);
                     }
                     return TRUE;
                 }
@@ -498,16 +486,22 @@ SelectWayPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                 case PSN_SETACTIVE:
                 {
                     PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK);
-                    SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_SETCHECK, 1, 1);
+                    if (SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
+                        SendDlgItemMessage(hwndDlg, IDC_MANUALLYINST, BM_SETCHECK, 0, 0);
+                    else
+                    {
+                        SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_SETCHECK, 1, 1);
+                        SendDlgItemMessage(hwndDlg, IDC_MANUALLYINST, BM_SETCHECK, 0, 0);
+                    }
                 }
                 break;
 
                 case PSN_WIZNEXT:
                 {
                     if (SendDlgItemMessage(hwndDlg, IDC_AUTOINSTALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
-                        SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRESSPAGE);
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROGRESSPAGE);
                     else
-                        SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_HWTYPESPAGE);
+                        SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_HWTYPESPAGE);
 
                     return TRUE;
                 }
@@ -528,8 +522,6 @@ DevStatusPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         {
             /* Set title font */
             SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
-            /* Set status text */
-            SetWindowText(GetDlgItem(hwndDlg, IDC_HWSTATUSEDIT), pDeviceStatusText);
         }
         break;
 
@@ -541,13 +533,16 @@ DevStatusPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
             {
                 case PSN_SETACTIVE:
                 {
+                    /* Set status text */
+                    SetWindowText(GetDlgItem(hwndDlg, IDC_HWSTATUSEDIT), pDeviceStatusText);
+
                     PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH | PSWIZB_BACK);
                 }
                 break;
 
                 case PSN_WIZBACK:
                 {
-                    SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
+                    SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_PROBELISTPAGE);
                     return TRUE;
                 }
             }
@@ -558,11 +553,174 @@ DevStatusPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
     return FALSE;
 }
 
+static INT
+EnumDeviceClasses(INT ClassIndex,
+                  LPWSTR DevClassName,
+                  LPWSTR DevClassDesc,
+                  BOOL *DevPresent,
+                  INT *ClassImage)
+{
+    GUID ClassGuid;
+    HKEY KeyClass;
+    WCHAR ClassName[MAX_STR_SIZE];
+    DWORD RequiredSize = MAX_STR_SIZE;
+    UINT Ret;
+
+    *DevPresent = FALSE;
+    *DevClassName = L'\0';
+
+    Ret = CM_Enumerate_Classes(ClassIndex,
+                               &ClassGuid,
+                               0);
+    if (Ret != CR_SUCCESS)
+    {
+        /* all classes enumerated */
+        if(Ret == CR_NO_SUCH_VALUE)
+        {
+            hDevInfoTypes = NULL;
+            return -1;
+        }
+
+        if (Ret == CR_INVALID_DATA)
+        {
+            ; /*FIXME: what should we do here? */
+        }
+
+        /* handle other errors... */
+    }
+
+    if (SetupDiClassNameFromGuid(&ClassGuid,
+                                 ClassName,
+                                 RequiredSize,
+                                 &RequiredSize))
+    {
+        lstrcpy(DevClassName, ClassName);
+    }
+
+    if (!SetupDiGetClassImageIndex(&ImageListData,
+                                   &ClassGuid,
+                                   ClassImage))
+    {
+        /* FIXME: can we do this?
+         * Set the blank icon: IDI_SETUPAPI_BLANK = 41
+         * it'll be image 24 in the imagelist */
+        *ClassImage = 24;
+    }
+
+    /* Get device info for all devices of a particular class */
+    hDevInfoTypes = SetupDiGetClassDevs(&ClassGuid,
+                                   NULL,
+                                   NULL,
+                                   DIGCF_PRESENT);
+    if (hDevInfoTypes == INVALID_HANDLE_VALUE)
+    {
+        hDevInfoTypes = NULL;
+        return 0;
+    }
+
+    KeyClass = SetupDiOpenClassRegKeyEx(&ClassGuid,
+                                        MAXIMUM_ALLOWED,
+                                        DIOCR_INSTALLER,
+                                        NULL,
+                                        0);
+    if (KeyClass != INVALID_HANDLE_VALUE)
+    {
+
+        LONG dwSize = MAX_STR_SIZE;
+
+        if (RegQueryValue(KeyClass,
+                          NULL,
+                          DevClassDesc,
+                          &dwSize) != ERROR_SUCCESS)
+        {
+            *DevClassDesc = L'\0';
+        }
+    }
+    else
+    {
+        return -3;
+    }
+
+    *DevPresent = TRUE;
+
+    RegCloseKey(KeyClass);
+
+    return 0;
+}
+
+static VOID
+InitHardWareTypesPage(HWND hwndDlg)
+{
+    HWND hList = GetDlgItem(hwndDlg, IDC_HWTYPESLIST);
+    WCHAR DevName[MAX_STR_SIZE];
+    WCHAR DevDesc[MAX_STR_SIZE];
+    BOOL DevExist = FALSE;
+    INT ClassRet, DevImage, Index = 0;
+    LV_COLUMN Column;
+    LV_ITEM Item;
+    RECT Rect;
+
+    if (!hList) return;
+
+    ZeroMemory(&Column, sizeof(LV_COLUMN));
+
+    GetClientRect(hList, &Rect);
+
+    Column.mask         = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
+    Column.fmt          = LVCFMT_LEFT;
+    Column.iSubItem     = 0;
+    Column.pszText      = NULL;
+    Column.cx           = Rect.right - GetSystemMetrics(SM_CXVSCROLL);
+    (VOID) ListView_InsertColumn(hList, 0, &Column);
+
+    ZeroMemory(&Item, sizeof(LV_ITEM));
+
+    do
+    {
+        ClassRet = EnumDeviceClasses(Index,
+                                     DevName,
+                                     DevDesc,
+                                     &DevExist,
+                                     &DevImage);
+
+        if ((ClassRet != -1) && (DevExist))
+        {
+            Item.mask   = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+            Item.iItem  = Index;
+            Item.iImage = DevImage;
+
+            if (DevDesc[0] != L'\0')
+                Item.pszText = (LPWSTR) DevDesc;
+            else
+                Item.pszText = (LPWSTR) DevName;
+
+            (VOID) ListView_InsertItem(hList, &Item);
+
+            /* kill InfoList initialized in EnumDeviceClasses */
+            if (hDevInfoTypes)
+            {
+                SetupDiDestroyDeviceInfoList(hDevInfoTypes);
+                hDevInfoTypes = NULL;
+            }
+        }
+        Index++;
+    }
+    while (ClassRet != -1);
+
+    (VOID) ListView_SetImageList(hList, ImageListData.ImageList, LVSIL_SMALL);
+}
+
 static INT_PTR CALLBACK
 HdTypesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     switch (uMsg)
     {
+        case WM_INITDIALOG:
+        {
+            InitHardWareTypesPage(hwndDlg);
+        }
+        break;
+
         case WM_NOTIFY:
         {
             LPNMHDR lpnm = (LPNMHDR)lParam;
@@ -577,7 +735,7 @@ HdTypesPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
                 case PSN_WIZBACK:
                 {
-                    SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
+                    SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
                     return TRUE;
                 }
             }
@@ -607,7 +765,7 @@ ProgressPageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
                 case PSN_WIZBACK:
                 {
-                    SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
+                    SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
                     return TRUE;
                 }
             }