*
* 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
SP_CLASSIMAGELIST_DATA ImageListData;
PWSTR pDeviceStatusText;
HANDLE hProcessHeap;
+HDEVINFO hDevInfoTypes;
typedef BOOL (WINAPI *PINSTALL_NEW_DEVICE)(HWND, LPGUID, PDWORD);
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;
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;
}
case PSN_WIZBACK:
{
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE);
+ SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_ISCONNECTEDPAGE);
return TRUE;
}
}
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;
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)
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);
}
}
break;
- case WM_COMMAND:
- {
-
- }
- break;
-
case WM_NOTIFY:
{
LPNMHDR lpnm = (LPNMHDR)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;
}
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;
}
{
/* Set title font */
SendDlgItemMessage(hwndDlg, IDC_FINISHTITLE, WM_SETFONT, (WPARAM)hTitleFont, (LPARAM)TRUE);
- /* Set status text */
- SetWindowText(GetDlgItem(hwndDlg, IDC_HWSTATUSEDIT), pDeviceStatusText);
}
break;
{
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;
}
}
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;
case PSN_WIZBACK:
{
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
+ SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
return TRUE;
}
}
case PSN_WIZBACK:
{
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
+ SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, IDD_SELECTWAYPAGE);
return TRUE;
}
}