2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: CNetConnectionPropertyUi: Network connection configuration dialog
5 * COPYRIGHT: Copyright 2008 Johannes Anderwald (johannes.anderwald@reactos.org)
10 CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
15 CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
18 m_pNCfg
->Uninitialize();
21 NcFreeNetconProperties(m_pProperties
);
25 AddItemToListView(HWND hDlgCtrl
, PNET_ITEM pItem
, LPWSTR szName
, BOOL bChecked
)
29 ZeroMemory(&lvItem
, sizeof(lvItem
));
30 lvItem
.mask
= LVIF_TEXT
| LVIF_PARAM
;
31 lvItem
.pszText
= szName
;
32 lvItem
.lParam
= (LPARAM
)pItem
;
33 lvItem
.iItem
= ListView_GetItemCount(hDlgCtrl
);
34 lvItem
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
);
35 ListView_SetCheckState(hDlgCtrl
, lvItem
.iItem
, bChecked
);
39 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
)
44 CComPtr
<IEnumNetCfgComponent
> pEnumCfg
;
46 hr
= pNCfg
->EnumComponents(&GUID_DEVCLASS_NET
, &pEnumCfg
);
47 if (FAILED_UNEXPECTEDLY(hr
))
52 CComPtr
<INetCfgComponent
> pNCg
;
53 hr
= pEnumCfg
->Next(1, &pNCg
, &Fetched
);
57 hr
= pNCg
->GetDisplayName(&pName
);
60 if (!_wcsicmp(pName
, m_pProperties
->pszwDeviceName
))
62 *pOut
= pNCg
.Detach();
72 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
)
75 CComPtr
<IEnumNetCfgComponent
> pENetCfg
;
77 DWORD dwCharacteristics
;
78 LPOLESTR pDisplayName
, pHelpText
;
82 hr
= pNCfg
->EnumComponents(CompGuid
, &pENetCfg
);
83 if (FAILED_UNEXPECTEDLY(hr
))
88 CComPtr
<INetCfgComponent
> pNCfgComp
;
89 CComPtr
<INetCfgComponentBindings
> pCompBind
;
90 CComPtr
<INetCfgComponent
> pAdapterCfgComp
;
92 hr
= pENetCfg
->Next(1, &pNCfgComp
, &Num
);
96 hr
= pNCfgComp
->GetCharacteristics(&dwCharacteristics
);
97 if (SUCCEEDED(hr
) && (dwCharacteristics
& NCF_HIDDEN
))
102 hr
= pNCfgComp
->GetDisplayName(&pDisplayName
);
103 hr
= pNCfgComp
->GetHelpText(&pHelpText
);
105 hr
= pNCfgComp
->QueryInterface(IID_PPV_ARG(INetCfgComponentBindings
, &pCompBind
));
108 if (GetINetCfgComponent(pNCfg
, &pAdapterCfgComp
))
110 hr
= pCompBind
->IsBoundTo(pAdapterCfgComp
);
116 pItem
= static_cast<NET_ITEM
*>(CoTaskMemAlloc(sizeof(NET_ITEM
)));
120 pItem
->dwCharacteristics
= dwCharacteristics
;
121 pItem
->szHelp
= pHelpText
;
122 pItem
->Type
= (NET_TYPE
)Type
;
123 pItem
->pNCfgComp
= pNCfgComp
.Detach();
124 pItem
->NumPropDialogOpen
= 0;
126 AddItemToListView(hDlgCtrl
, pItem
, pDisplayName
, bChecked
);
127 CoTaskMemFree(pDisplayName
);
132 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg
)
135 CComPtr
<INetCfg
> pNCfg
;
136 CComPtr
<INetCfgLock
> pNCfgLock
;
137 HWND hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
144 SendDlgItemMessageW(hwndDlg
, IDC_NETCARDNAME
, WM_SETTEXT
, 0, (LPARAM
)m_pProperties
->pszwDeviceName
);
145 if (m_pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
147 /* check show item on taskbar*/
148 SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_SETCHECK
, BST_CHECKED
, 0);
150 if (m_pProperties
->dwCharacter
& NCCF_NOTIFY_DISCONNECTED
)
152 /* check notify item */
153 SendDlgItemMessageW(hwndDlg
, IDC_NOTIFYNOCONNECTION
, BM_SETCHECK
, BST_CHECKED
, 0);
156 memset(&lc
, 0, sizeof(LV_COLUMN
));
157 lc
.mask
= LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
158 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
159 if (GetClientRect(hDlgCtrl
, &rc
))
161 lc
.mask
|= LVCF_WIDTH
;
162 lc
.cx
= rc
.right
- rc
.left
;
164 lc
.pszText
= (LPWSTR
)L
"";
165 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
)&lc
);
166 dwStyle
= (DWORD
) SendMessage(hDlgCtrl
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0);
167 dwStyle
= dwStyle
| LVS_EX_FULLROWSELECT
| LVS_EX_CHECKBOXES
;
168 SendMessage(hDlgCtrl
, LVM_SETEXTENDEDLISTVIEWSTYLE
, 0, dwStyle
);
170 hr
= CoCreateInstance(CLSID_CNetCfg
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(INetCfg
, &pNCfg
));
174 hr
= pNCfg
->QueryInterface(IID_PPV_ARG(INetCfgLock
, &pNCfgLock
));
175 hr
= pNCfgLock
->AcquireWriteLock(100, L
"", &pDisplayName
);
178 CoTaskMemFree(pDisplayName
);
182 hr
= pNCfg
->Initialize(NULL
);
183 if (FAILED_UNEXPECTEDLY(hr
))
187 m_NCfgLock
= pNCfgLock
;
189 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETCLIENT
, NET_TYPE_CLIENT
);
190 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETSERVICE
, NET_TYPE_SERVICE
);
191 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETTRANS
, NET_TYPE_PROTOCOL
);
193 ZeroMemory(&li
, sizeof(li
));
194 li
.mask
= LVIF_STATE
;
195 li
.stateMask
= (UINT
)-1;
196 li
.state
= LVIS_FOCUSED
|LVIS_SELECTED
;
197 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
201 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg
)
207 INetCfgComponent
*pNCfgComp
;
210 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
211 Count
= ListView_GetItemCount(hDlgCtrl
);
215 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
216 lvItem
.mask
= LVIF_PARAM
| LVIF_STATE
;
217 lvItem
.stateMask
= (UINT
)-1;
218 for (Index
= 0; Index
< Count
; Index
++)
220 lvItem
.iItem
= Index
;
221 if (SendMessageW(hDlgCtrl
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
))
223 if (lvItem
.state
& LVIS_SELECTED
)
228 if (!(lvItem
.state
& LVIS_SELECTED
))
233 pItem
= (PNET_ITEM
)lvItem
.lParam
;
234 pNCfgComp
= (INetCfgComponent
*)pItem
->pNCfgComp
;
235 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_QUERY_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
238 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_SHOW_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
244 CNetConnectionPropertyUi::LANPropertiesUIDlg(
254 CNetConnectionPropertyUi
* This
;
256 DWORD dwShowIcon
, dwNotifyDisconnect
;
265 page
= (PROPSHEETPAGE
*)lParam
;
266 This
= (CNetConnectionPropertyUi
*)page
->lParam
;
267 This
->InitializeLANPropertiesUIDlg(hwndDlg
);
268 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
271 lppl
= (LPNMLISTVIEW
) lParam
;
272 lppsn
= (LPPSHNOTIFY
) lParam
;
273 if (lppsn
->hdr
.code
== PSN_APPLY
)
275 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
278 hr
= This
->m_pNCfg
->Apply();
280 return PSNRET_INVALID
;
283 if (SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
288 if (SendDlgItemMessageW(hwndDlg
, IDC_NOTIFYNOCONNECTION
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
289 dwNotifyDisconnect
= 1;
291 dwNotifyDisconnect
= 0;
293 //NOTE: Windows write these setting with the undocumented INetLanConnection::SetInfo
294 if (StringFromCLSID((CLSID
)This
->m_pProperties
->guidId
, &pStr
) == ERROR_SUCCESS
)
296 swprintf(szKey
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
298 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKey
, 0, KEY_WRITE
, &hKey
) == ERROR_SUCCESS
)
300 RegSetValueExW(hKey
, L
"ShowIcon", 0, REG_DWORD
, (LPBYTE
)&dwShowIcon
, sizeof(DWORD
));
301 RegSetValueExW(hKey
, L
"IpCheckingEnabled", 0, REG_DWORD
, (LPBYTE
)&dwNotifyDisconnect
, sizeof(DWORD
));
306 return PSNRET_NOERROR
;
309 else if (lppsn
->hdr
.code
== PSN_CANCEL
)
311 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
314 hr
= This
->m_pNCfg
->Cancel();
316 return PSNRET_NOERROR
;
318 return PSNRET_INVALID
;
320 return PSNRET_NOERROR
;
323 if (lppl
->hdr
.code
== LVN_ITEMCHANGING
)
325 ZeroMemory(&li
, sizeof(li
));
326 li
.mask
= LVIF_PARAM
;
327 li
.iItem
= lppl
->iItem
;
328 if (!SendMessageW(lppl
->hdr
.hwndFrom
, LVM_GETITEMW
, 0, (LPARAM
)&li
))
331 pItem
= (PNET_ITEM
)li
.lParam
;
335 if (!(lppl
->uOldState
& LVIS_FOCUSED
) && (lppl
->uNewState
& LVIS_FOCUSED
))
337 /* new focused item */
338 if (pItem
->dwCharacteristics
& NCF_NOT_USER_REMOVABLE
)
339 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), FALSE
);
341 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), TRUE
);
343 if (pItem
->dwCharacteristics
& NCF_HAS_UI
)
344 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), TRUE
);
346 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), FALSE
);
348 SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_SETTEXT
, 0, (LPARAM
)pItem
->szHelp
);
353 if (LOWORD(wParam
) == IDC_PROPERTIES
)
355 This
= (CNetConnectionPropertyUi
*) GetWindowLongPtr(hwndDlg
, DWLP_USER
);
356 This
->ShowNetworkComponentProperties(hwndDlg
);
359 else if (LOWORD(wParam
) == IDC_CONFIGURE
)
361 LPOLESTR DeviceInstanceID
;
362 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
364 if (This
->GetDeviceInstanceID(&DeviceInstanceID
))
366 WCHAR wszCmd
[2*MAX_PATH
];
367 StringCbPrintfW(wszCmd
, sizeof(wszCmd
), L
"rundll32.exe devmgr.dll,DeviceProperties_RunDLL /DeviceID %s", DeviceInstanceID
);
368 CoTaskMemFree(DeviceInstanceID
);
371 PROCESS_INFORMATION pi
;
372 ZeroMemory(&si
, sizeof(si
));
374 if (!CreateProcessW(NULL
, wszCmd
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
377 CloseHandle(pi
.hProcess
);
378 CloseHandle(pi
.hThread
);
387 CNetConnectionPropertyUi::GetDeviceInstanceID(
388 OUT LPOLESTR
*DeviceInstanceID
)
390 LPOLESTR pStr
, pResult
;
393 WCHAR szKeyName
[2*MAX_PATH
];
394 WCHAR szInstanceID
[2*MAX_PATH
];
396 if (StringFromCLSID(m_pProperties
->guidId
, &pStr
) != ERROR_SUCCESS
)
398 // failed to convert guid to string
402 StringCbPrintfW(szKeyName
, sizeof(szKeyName
), L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
405 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKeyName
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
407 // failed to open key
411 dwInstanceID
= sizeof(szInstanceID
);
412 if (RegGetValueW(hKey
, NULL
, L
"PnpInstanceId", RRF_RT_REG_SZ
, NULL
, (PVOID
)szInstanceID
, &dwInstanceID
) == ERROR_SUCCESS
)
414 szInstanceID
[MAX_PATH
-1] = L
'\0';
415 pResult
= static_cast<LPOLESTR
>(CoTaskMemAlloc((wcslen(szInstanceID
) + 1) * sizeof(WCHAR
)));
418 wcscpy(pResult
, szInstanceID
);
419 *DeviceInstanceID
= pResult
;
430 CNetConnectionPropertyUi::AddPages(
432 LPFNADDPROPSHEETPAGE pfnAddPage
,
435 HPROPSHEETPAGE hProp
;
438 INITCOMMONCONTROLSEX initEx
;
440 initEx
.dwSize
= sizeof(initEx
);
441 initEx
.dwICC
= ICC_LISTVIEW_CLASSES
;
442 if (!InitCommonControlsEx(&initEx
))
445 hr
= m_pCon
->GetProperties(&m_pProperties
);
446 if (FAILED_UNEXPECTEDLY(hr
))
449 hProp
= InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES
), LANPropertiesUIDlg
, reinterpret_cast<LPARAM
>(this), NULL
);
452 ret
= (*pfnAddPage
)(hProp
, lParam
);
459 DestroyPropertySheetPage(hProp
);
467 CNetConnectionPropertyUi::GetIcon(
476 CNetConnectionPropertyUi::GetDeviceGuid(GUID
*pGuid
)
478 CopyMemory(pGuid
, &m_pProperties
->guidId
, sizeof(GUID
));
484 CNetConnectionPropertyUi::SetConnection(INetConnection
* pCon
)
495 CNetConnectionPropertyUi::Connect(
500 return E_POINTER
; //FIXME
502 if (dwFlags
& NCUC_NO_UI
)
503 return m_pCon
->Connect();
510 CNetConnectionPropertyUi::Disconnect(
515 swprintf(szBuffer
, L
"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags
);
516 MessageBoxW(NULL
, szBuffer
, NULL
, MB_OK
);