8 /// {7007ACC5-3202-11D1-AAD2-00805FC1270E}
9 /// open network properties and wlan properties
21 DWORD dwCharacteristics
;
23 INetCfgComponent
*pNCfgComp
;
24 UINT NumPropDialogOpen
;
25 } NET_ITEM
, *PNET_ITEM
;
27 class CNetConnectionPropertyUi final
:
28 public INetConnectionConnectUi
,
29 public INetConnectionPropertyUi2
,
30 public INetLanConnectionUiInfo
33 CNetConnectionPropertyUi();
36 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
37 virtual ULONG WINAPI
AddRef();
38 virtual ULONG WINAPI
Release();
40 // INetConnectionPropertyUi2
41 virtual HRESULT WINAPI
AddPages(HWND hwndParent
, LPFNADDPROPSHEETPAGE pfnAddPage
, LPARAM lParam
);
42 virtual HRESULT WINAPI
GetIcon(DWORD dwSize
, HICON
*phIcon
);
44 // INetLanConnectionUiInfo
45 virtual HRESULT WINAPI
GetDeviceGuid(GUID
*pGuid
);
47 // INetConnectionConnectUi
48 virtual HRESULT WINAPI
SetConnection(INetConnection
* pCon
);
49 virtual HRESULT WINAPI
Connect(HWND hwndParent
, DWORD dwFlags
);
50 virtual HRESULT WINAPI
Disconnect(HWND hwndParent
, DWORD dwFlags
);
53 ~CNetConnectionPropertyUi();
55 BOOL
GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
);
56 VOID
EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
);
57 VOID
InitializeLANPropertiesUIDlg(HWND hwndDlg
);
58 VOID
ShowNetworkComponentProperties(HWND hwndDlg
);
59 BOOL
GetDeviceInstanceID(OUT LPOLESTR
*DeviceInstanceID
);
60 static INT_PTR CALLBACK
LANPropertiesUIDlg(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
62 INetConnection
* m_pCon
;
63 INetCfgLock
*m_NCfgLock
;
65 NETCON_PROPERTIES
* m_pProperties
;
69 CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
78 CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
82 m_pNCfg
->Uninitialize();
87 m_NCfgLock
->Release();
91 NcFreeNetconProperties(m_pProperties
);
96 InitializePropertySheetPage(LPWSTR resname
, DLGPROC dlgproc
, LPARAM lParam
, LPWSTR szTitle
)
100 memset(&ppage
, 0x0, sizeof(PROPSHEETPAGEW
));
101 ppage
.dwSize
= sizeof(PROPSHEETPAGEW
);
102 ppage
.dwFlags
= PSP_DEFAULT
;
103 ppage
.pszTemplate
= resname
;
104 ppage
.pfnDlgProc
= dlgproc
;
105 ppage
.lParam
= lParam
;
106 ppage
.hInstance
= netshell_hInstance
;
109 ppage
.dwFlags
|= PSP_USETITLE
;
110 ppage
.pszTitle
= szTitle
;
112 return CreatePropertySheetPageW(&ppage
);
116 AddItemToListView(HWND hDlgCtrl
, PNET_ITEM pItem
, LPWSTR szName
, BOOL bChecked
)
120 ZeroMemory(&lvItem
, sizeof(lvItem
));
121 lvItem
.mask
= LVIF_TEXT
| LVIF_PARAM
;
122 lvItem
.pszText
= szName
;
123 lvItem
.lParam
= (LPARAM
)pItem
;
124 lvItem
.iItem
= ListView_GetItemCount(hDlgCtrl
);
125 lvItem
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
);
126 ListView_SetCheckState(hDlgCtrl
, lvItem
.iItem
, bChecked
);
130 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
)
134 INetCfgComponent
* pNCg
;
136 IEnumNetCfgComponent
* pEnumCfg
;
138 hr
= pNCfg
->EnumComponents(&GUID_DEVCLASS_NET
, &pEnumCfg
);
144 while (pEnumCfg
->Next(1, &pNCg
, &Fetched
) == S_OK
)
146 hr
= pNCg
->GetDisplayName(&pName
);
149 if (!_wcsicmp(pName
, m_pProperties
->pszwDeviceName
))
155 CoTaskMemFree(pName
);
164 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
)
167 IEnumNetCfgComponent
* pENetCfg
;
168 INetCfgComponent
*pNCfgComp
, *pAdapterCfgComp
;
169 INetCfgComponentBindings
* pCompBind
;
171 DWORD dwCharacteristics
;
172 LPOLESTR pDisplayName
, pHelpText
;
176 hr
= pNCfg
->EnumComponents(CompGuid
, &pENetCfg
);
182 while (pENetCfg
->Next(1, &pNCfgComp
, &Num
) == S_OK
)
184 hr
= pNCfgComp
->GetCharacteristics(&dwCharacteristics
);
185 if (SUCCEEDED(hr
) && (dwCharacteristics
& NCF_HIDDEN
))
187 pNCfgComp
->Release();
192 hr
= pNCfgComp
->GetDisplayName(&pDisplayName
);
193 hr
= pNCfgComp
->GetHelpText(&pHelpText
);
194 bChecked
= TRUE
; //ReactOS hack
195 hr
= pNCfgComp
->QueryInterface(IID_INetCfgComponentBindings
, (LPVOID
*)&pCompBind
);
198 if (GetINetCfgComponent(pNCfg
, &pAdapterCfgComp
))
200 hr
= pCompBind
->IsBoundTo(pAdapterCfgComp
);
205 pAdapterCfgComp
->Release();
206 pCompBind
->Release();
210 pItem
= static_cast<NET_ITEM
*>(CoTaskMemAlloc(sizeof(NET_ITEM
)));
214 pItem
->dwCharacteristics
= dwCharacteristics
;
215 pItem
->szHelp
= pHelpText
;
216 pItem
->Type
= (NET_TYPE
)Type
;
217 pItem
->pNCfgComp
= pNCfgComp
;
218 pItem
->NumPropDialogOpen
= 0;
220 AddItemToListView(hDlgCtrl
, pItem
, pDisplayName
, bChecked
);
221 CoTaskMemFree(pDisplayName
);
227 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg
)
231 INetCfgLock
*pNCfgLock
;
232 HWND hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
239 SendDlgItemMessageW(hwndDlg
, IDC_NETCARDNAME
, WM_SETTEXT
, 0, (LPARAM
)m_pProperties
->pszwDeviceName
);
240 if (m_pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
242 /* check show item on taskbar*/
243 SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_SETCHECK
, BST_CHECKED
, 0);
245 if (m_pProperties
->dwCharacter
& NCCF_NOTIFY_DISCONNECTED
)
247 /* check notify item */
248 SendDlgItemMessageW(hwndDlg
, IDC_NOTIFYNOCONNECTION
, BM_SETCHECK
, BST_CHECKED
, 0);
251 memset(&lc
, 0, sizeof(LV_COLUMN
));
252 lc
.mask
= LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
253 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
254 if (GetClientRect(hDlgCtrl
, &rc
))
256 lc
.mask
|= LVCF_WIDTH
;
257 lc
.cx
= rc
.right
- rc
.left
;
259 lc
.pszText
= (LPWSTR
)L
"";
260 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
)&lc
);
261 dwStyle
= (DWORD
) SendMessage(hDlgCtrl
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0);
262 dwStyle
= dwStyle
| LVS_EX_FULLROWSELECT
| LVS_EX_CHECKBOXES
;
263 SendMessage(hDlgCtrl
, LVM_SETEXTENDEDLISTVIEWSTYLE
, 0, dwStyle
);
265 hr
= CoCreateInstance(CLSID_CNetCfg
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetCfg
, (LPVOID
*)&pNCfg
);
269 hr
= pNCfg
->QueryInterface(IID_INetCfgLock
, (LPVOID
*)&pNCfgLock
);
270 hr
= pNCfgLock
->AcquireWriteLock(100, L
"", &pDisplayName
);
273 CoTaskMemFree(pDisplayName
);
277 m_NCfgLock
= pNCfgLock
;
278 hr
= pNCfg
->Initialize(NULL
);
285 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETCLIENT
, NET_TYPE_CLIENT
);
286 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETSERVICE
, NET_TYPE_SERVICE
);
287 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETTRANS
, NET_TYPE_PROTOCOL
);
290 ZeroMemory(&li
, sizeof(li
));
291 li
.mask
= LVIF_STATE
;
292 li
.stateMask
= (UINT
)-1;
293 li
.state
= LVIS_FOCUSED
|LVIS_SELECTED
;
294 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
298 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg
)
304 INetCfgComponent
*pNCfgComp
;
307 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
308 Count
= ListView_GetItemCount(hDlgCtrl
);
312 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
313 lvItem
.mask
= LVIF_PARAM
| LVIF_STATE
;
314 lvItem
.stateMask
= (UINT
)-1;
315 for (Index
= 0; Index
< Count
; Index
++)
317 lvItem
.iItem
= Index
;
318 if (SendMessageW(hDlgCtrl
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
))
320 if (lvItem
.state
& LVIS_SELECTED
)
325 if (!(lvItem
.state
& LVIS_SELECTED
))
330 pItem
= (PNET_ITEM
)lvItem
.lParam
;
331 pNCfgComp
= (INetCfgComponent
*)pItem
->pNCfgComp
;
332 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_QUERY_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
335 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_SHOW_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
341 CNetConnectionPropertyUi::LANPropertiesUIDlg(
351 CNetConnectionPropertyUi
* This
;
362 page
= (PROPSHEETPAGE
*)lParam
;
363 This
= (CNetConnectionPropertyUi
*)page
->lParam
;
364 This
->InitializeLANPropertiesUIDlg(hwndDlg
);
365 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
368 lppl
= (LPNMLISTVIEW
) lParam
;
369 lppsn
= (LPPSHNOTIFY
) lParam
;
370 if (lppsn
->hdr
.code
== PSN_APPLY
)
372 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
375 hr
= This
->m_pNCfg
->Apply();
377 return PSNRET_INVALID
;
380 if (SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
386 if (StringFromCLSID((CLSID
)This
->m_pProperties
->guidId
, &pStr
) == ERROR_SUCCESS
)
388 swprintf(szKey
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
390 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKey
, 0, KEY_WRITE
, &hKey
) == ERROR_SUCCESS
)
392 RegSetValueExW(hKey
, L
"ShowIcon", 0, REG_DWORD
, (LPBYTE
)&dwShowIcon
, sizeof(DWORD
));
397 return PSNRET_NOERROR
;
400 else if (lppsn
->hdr
.code
== PSN_CANCEL
)
402 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
405 hr
= This
->m_pNCfg
->Cancel();
407 return PSNRET_NOERROR
;
409 return PSNRET_INVALID
;
411 return PSNRET_NOERROR
;
414 if (lppl
->hdr
.code
== LVN_ITEMCHANGING
)
416 ZeroMemory(&li
, sizeof(li
));
417 li
.mask
= LVIF_PARAM
;
418 li
.iItem
= lppl
->iItem
;
419 if (!SendMessageW(lppl
->hdr
.hwndFrom
, LVM_GETITEMW
, 0, (LPARAM
)&li
))
422 pItem
= (PNET_ITEM
)li
.lParam
;
426 if (!(lppl
->uOldState
& LVIS_FOCUSED
) && (lppl
->uNewState
& LVIS_FOCUSED
))
428 /* new focused item */
429 if (pItem
->dwCharacteristics
& NCF_NOT_USER_REMOVABLE
)
430 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), FALSE
);
432 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), TRUE
);
434 if (pItem
->dwCharacteristics
& NCF_HAS_UI
)
435 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), TRUE
);
437 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), FALSE
);
439 SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_SETTEXT
, 0, (LPARAM
)pItem
->szHelp
);
444 if (LOWORD(wParam
) == IDC_PROPERTIES
)
446 This
= (CNetConnectionPropertyUi
*) GetWindowLongPtr(hwndDlg
, DWLP_USER
);
447 This
->ShowNetworkComponentProperties(hwndDlg
);
450 else if (LOWORD(wParam
) == IDC_CONFIGURE
)
452 LPOLESTR DeviceInstanceID
;
453 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
455 if (This
->GetDeviceInstanceID(&DeviceInstanceID
))
457 WCHAR wszCmd
[2*MAX_PATH
];
458 StringCbPrintfW(wszCmd
, sizeof(wszCmd
), L
"rundll32.exe devmgr.dll,DeviceProperties_RunDLL /DeviceID %s", DeviceInstanceID
);
459 CoTaskMemFree(DeviceInstanceID
);
462 PROCESS_INFORMATION pi
;
463 ZeroMemory(&si
, sizeof(si
));
465 if (!CreateProcessW(NULL
, wszCmd
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
468 CloseHandle(pi
.hProcess
);
469 CloseHandle(pi
.hThread
);
478 CNetConnectionPropertyUi::GetDeviceInstanceID(
479 OUT LPOLESTR
*DeviceInstanceID
)
481 LPOLESTR pStr
, pResult
;
484 WCHAR szKeyName
[2*MAX_PATH
];
485 WCHAR szInstanceID
[2*MAX_PATH
];
487 if (StringFromCLSID(m_pProperties
->guidId
, &pStr
) != ERROR_SUCCESS
)
489 // failed to convert guid to string
493 StringCbPrintfW(szKeyName
, sizeof(szKeyName
), L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
496 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKeyName
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
498 // failed to open key
502 dwInstanceID
= sizeof(szInstanceID
);
503 if (RegGetValueW(hKey
, NULL
, L
"PnpInstanceId", RRF_RT_REG_SZ
, NULL
, (PVOID
)szInstanceID
, &dwInstanceID
) == ERROR_SUCCESS
)
505 szInstanceID
[MAX_PATH
-1] = L
'\0';
506 pResult
= static_cast<LPOLESTR
>(CoTaskMemAlloc((wcslen(szInstanceID
) + 1) * sizeof(WCHAR
)));
509 wcscpy(pResult
, szInstanceID
);
510 *DeviceInstanceID
= pResult
;
521 CNetConnectionPropertyUi::QueryInterface(
527 if (IsEqualIID (iid
, IID_IUnknown
) ||
528 IsEqualIID (iid
, IID_INetConnectionPropertyUi
) ||
529 IsEqualIID (iid
, IID_INetConnectionPropertyUi2
))
531 *ppvObj
= (INetConnectionPropertyUi2
*)this;
535 else if (IsEqualIID(iid
, IID_INetLanConnectionUiInfo
))
537 *ppvObj
= (INetLanConnectionUiInfo
*)this;
541 else if (IsEqualIID(iid
, IID_INetConnectionConnectUi
))
543 *ppvObj
= (INetConnectionConnectUi
*)this;
548 return E_NOINTERFACE
;
553 CNetConnectionPropertyUi::AddRef()
555 ULONG refCount
= InterlockedIncrement(&m_ref
);
562 CNetConnectionPropertyUi::Release()
564 ULONG refCount
= InterlockedDecrement(&m_ref
);
574 CNetConnectionPropertyUi::AddPages(
576 LPFNADDPROPSHEETPAGE pfnAddPage
,
579 HPROPSHEETPAGE hProp
;
582 INITCOMMONCONTROLSEX initEx
;
584 initEx
.dwSize
= sizeof(initEx
);
585 initEx
.dwICC
= ICC_LISTVIEW_CLASSES
;
586 if (!InitCommonControlsEx(&initEx
))
589 hr
= m_pCon
->GetProperties(&m_pProperties
);
593 hProp
= InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES
), LANPropertiesUIDlg
, reinterpret_cast<LPARAM
>(this), NULL
);
596 ret
= (*pfnAddPage
)(hProp
, lParam
);
603 DestroyPropertySheetPage(hProp
);
611 CNetConnectionPropertyUi::GetIcon(
620 CNetConnectionPropertyUi::GetDeviceGuid(GUID
*pGuid
)
622 CopyMemory(pGuid
, &m_pProperties
->guidId
, sizeof(GUID
));
628 CNetConnectionPropertyUi::SetConnection(INetConnection
* pCon
)
644 CNetConnectionPropertyUi::Connect(
649 return E_POINTER
; //FIXME
652 if (dwFlags
& NCUC_NO_UI
)
653 return m_pCon
->Connect();
660 CNetConnectionPropertyUi::Disconnect(
665 swprintf(szBuffer
, L
"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags
);
666 MessageBoxW(NULL
, szBuffer
, NULL
, MB_OK
);
671 HRESULT WINAPI
LanConnectUI_Constructor(IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
673 TRACE("LanConnectUI_Constructor\n");
679 return CLASS_E_NOAGGREGATION
;
681 CNetConnectionPropertyUi
*pConPropUi
= new CNetConnectionPropertyUi
;
683 return E_OUTOFMEMORY
;
685 pConPropUi
->AddRef();
686 HRESULT hr
= pConPropUi
->QueryInterface(riid
, ppv
);
687 pConPropUi
->Release();