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 INetConnectionPropertyUi2
,
29 public INetLanConnectionUiInfo
,
30 public INetConnectionConnectUi
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 BOOL
GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
);
54 VOID
EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
);
55 VOID
InitializeLANPropertiesUIDlg(HWND hwndDlg
);
56 VOID
ShowNetworkComponentProperties(HWND hwndDlg
);
57 BOOL
GetDeviceInstanceID(OUT LPOLESTR
*DeviceInstanceID
);
58 static INT_PTR CALLBACK
LANPropertiesUIDlg(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
60 INetConnection
* pCon
;
61 INetCfgLock
*NCfgLock
;
63 NETCON_PROPERTIES
* pProperties
;
67 CNetConnectionPropertyUi::CNetConnectionPropertyUi()
77 InitializePropertySheetPage(LPWSTR resname
, DLGPROC dlgproc
, LPARAM lParam
, LPWSTR szTitle
)
81 memset(&ppage
, 0x0, sizeof(PROPSHEETPAGEW
));
82 ppage
.dwSize
= sizeof(PROPSHEETPAGEW
);
83 ppage
.dwFlags
= PSP_DEFAULT
;
84 ppage
.pszTemplate
= resname
;
85 ppage
.pfnDlgProc
= dlgproc
;
86 ppage
.lParam
= lParam
;
87 ppage
.hInstance
= netshell_hInstance
;
90 ppage
.dwFlags
|= PSP_USETITLE
;
91 ppage
.pszTitle
= szTitle
;
93 return CreatePropertySheetPageW(&ppage
);
97 AddItemToListView(HWND hDlgCtrl
, PNET_ITEM pItem
, LPWSTR szName
, BOOL bChecked
)
101 ZeroMemory(&lvItem
, sizeof(lvItem
));
102 lvItem
.mask
= LVIF_TEXT
| LVIF_PARAM
;
103 lvItem
.pszText
= szName
;
104 lvItem
.lParam
= (LPARAM
)pItem
;
105 lvItem
.iItem
= ListView_GetItemCount(hDlgCtrl
);
106 lvItem
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
);
107 ListView_SetCheckState(hDlgCtrl
, lvItem
.iItem
, bChecked
);
111 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
)
115 INetCfgComponent
* pNCg
;
117 IEnumNetCfgComponent
* pEnumCfg
;
119 hr
= pNCfg
->EnumComponents(&GUID_DEVCLASS_NET
, &pEnumCfg
);
125 while (pEnumCfg
->Next(1, &pNCg
, &Fetched
) == S_OK
)
127 hr
= pNCg
->GetDisplayName(&pName
);
130 if (!_wcsicmp(pName
, pProperties
->pszwDeviceName
))
136 CoTaskMemFree(pName
);
145 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
)
148 IEnumNetCfgComponent
* pENetCfg
;
149 INetCfgComponent
*pNCfgComp
, *pAdapterCfgComp
;
150 INetCfgComponentBindings
* pCompBind
;
152 DWORD dwCharacteristics
;
153 LPOLESTR pDisplayName
, pHelpText
;
157 hr
= pNCfg
->EnumComponents(CompGuid
, &pENetCfg
);
163 while(pENetCfg
->Next(1, &pNCfgComp
, &Num
) == S_OK
)
165 hr
= pNCfgComp
->GetCharacteristics(&dwCharacteristics
);
166 if (SUCCEEDED(hr
) && (dwCharacteristics
& NCF_HIDDEN
))
168 pNCfgComp
->Release();
173 hr
= pNCfgComp
->GetDisplayName(&pDisplayName
);
174 hr
= pNCfgComp
->GetHelpText(&pHelpText
);
175 bChecked
= TRUE
; //ReactOS hack
176 hr
= pNCfgComp
->QueryInterface(IID_INetCfgComponentBindings
, (LPVOID
*)&pCompBind
);
179 if (GetINetCfgComponent(pNCfg
, &pAdapterCfgComp
))
181 hr
= pCompBind
->IsBoundTo(pAdapterCfgComp
);
186 pAdapterCfgComp
->Release();
187 pCompBind
->Release();
191 pItem
= (NET_ITEM
*)CoTaskMemAlloc(sizeof(NET_ITEM
));
195 pItem
->dwCharacteristics
= dwCharacteristics
;
196 pItem
->szHelp
= pHelpText
;
197 pItem
->Type
= (NET_TYPE
)Type
;
198 pItem
->pNCfgComp
= pNCfgComp
;
199 pItem
->NumPropDialogOpen
= 0;
201 AddItemToListView(hDlgCtrl
, pItem
, pDisplayName
, bChecked
);
202 CoTaskMemFree(pDisplayName
);
208 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg
)
212 INetCfgLock
*pNCfgLock
;
213 HWND hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
220 SendDlgItemMessageW(hwndDlg
, IDC_NETCARDNAME
, WM_SETTEXT
, 0, (LPARAM
)pProperties
->pszwDeviceName
);
221 if (pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
223 /* check show item on taskbar*/
224 SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_SETCHECK
, BST_CHECKED
, 0);
226 if (pProperties
->dwCharacter
& NCCF_NOTIFY_DISCONNECTED
)
228 /* check notify item */
229 SendDlgItemMessageW(hwndDlg
, IDC_NOTIFYNOCONNECTION
, BM_SETCHECK
, BST_CHECKED
, 0);
232 memset(&lc
, 0, sizeof(LV_COLUMN
));
233 lc
.mask
= LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
234 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
235 if (GetClientRect(hDlgCtrl
, &rc
))
237 lc
.mask
|= LVCF_WIDTH
;
238 lc
.cx
= rc
.right
- rc
.left
;
240 lc
.pszText
= (LPWSTR
)L
"";
241 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
)&lc
);
242 dwStyle
= (DWORD
) SendMessage(hDlgCtrl
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0);
243 dwStyle
= dwStyle
| LVS_EX_FULLROWSELECT
| LVS_EX_CHECKBOXES
;
244 SendMessage(hDlgCtrl
, LVM_SETEXTENDEDLISTVIEWSTYLE
, 0, dwStyle
);
246 hr
= CoCreateInstance(CLSID_CNetCfg
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetCfg
, (LPVOID
*)&pNCfg
);
250 hr
= pNCfg
->QueryInterface(IID_INetCfgLock
, (LPVOID
*)&pNCfgLock
);
251 hr
= pNCfgLock
->AcquireWriteLock(100, L
"", &pDisplayName
);
254 CoTaskMemFree(pDisplayName
);
258 NCfgLock
= pNCfgLock
;
259 hr
= pNCfg
->Initialize(NULL
);
266 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETCLIENT
, NET_TYPE_CLIENT
);
267 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETSERVICE
, NET_TYPE_SERVICE
);
268 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETTRANS
, NET_TYPE_PROTOCOL
);
271 ZeroMemory(&li
, sizeof(li
));
272 li
.mask
= LVIF_STATE
;
273 li
.stateMask
= (UINT
)-1;
274 li
.state
= LVIS_FOCUSED
|LVIS_SELECTED
;
275 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
279 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg
)
285 INetCfgComponent
*pNCfgComp
;
288 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
289 Count
= ListView_GetItemCount(hDlgCtrl
);
293 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
294 lvItem
.mask
= LVIF_PARAM
| LVIF_STATE
;
295 lvItem
.stateMask
= (UINT
)-1;
296 for (Index
= 0; Index
< Count
; Index
++)
298 lvItem
.iItem
= Index
;
299 if (SendMessageW(hDlgCtrl
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
))
301 if (lvItem
.state
& LVIS_SELECTED
)
306 if (!(lvItem
.state
& LVIS_SELECTED
))
311 pItem
= (PNET_ITEM
)lvItem
.lParam
;
312 pNCfgComp
= (INetCfgComponent
*)pItem
->pNCfgComp
;
313 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_QUERY_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
316 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_SHOW_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
322 CNetConnectionPropertyUi::LANPropertiesUIDlg(
332 CNetConnectionPropertyUi
* This
;
343 page
= (PROPSHEETPAGE
*)lParam
;
344 This
= (CNetConnectionPropertyUi
*)page
->lParam
;
345 This
->InitializeLANPropertiesUIDlg(hwndDlg
);
346 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
349 lppl
= (LPNMLISTVIEW
) lParam
;
350 lppsn
= (LPPSHNOTIFY
) lParam
;
351 if (lppsn
->hdr
.code
== PSN_APPLY
)
353 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
356 hr
= This
->pNCfg
->Apply();
358 return PSNRET_INVALID
;
361 if (SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
367 if (StringFromCLSID((CLSID
)This
->pProperties
->guidId
, &pStr
) == ERROR_SUCCESS
)
369 swprintf(szKey
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
371 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKey
, 0, KEY_WRITE
, &hKey
) == ERROR_SUCCESS
)
373 RegSetValueExW(hKey
, L
"ShowIcon", 0, REG_DWORD
, (LPBYTE
)&dwShowIcon
, sizeof(DWORD
));
378 return PSNRET_NOERROR
;
381 else if (lppsn
->hdr
.code
== PSN_CANCEL
)
383 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
386 hr
= This
->pNCfg
->Cancel();
388 return PSNRET_NOERROR
;
390 return PSNRET_INVALID
;
392 return PSNRET_NOERROR
;
395 if (lppl
->hdr
.code
== LVN_ITEMCHANGING
)
397 ZeroMemory(&li
, sizeof(li
));
398 li
.mask
= LVIF_PARAM
;
399 li
.iItem
= lppl
->iItem
;
400 if (!SendMessageW(lppl
->hdr
.hwndFrom
, LVM_GETITEMW
, 0, (LPARAM
)&li
))
403 pItem
= (PNET_ITEM
)li
.lParam
;
407 if (!(lppl
->uOldState
& LVIS_FOCUSED
) && (lppl
->uNewState
& LVIS_FOCUSED
))
409 /* new focused item */
410 if (pItem
->dwCharacteristics
& NCF_NOT_USER_REMOVABLE
)
411 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), FALSE
);
413 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), TRUE
);
415 if (pItem
->dwCharacteristics
& NCF_HAS_UI
)
416 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), TRUE
);
418 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), FALSE
);
420 SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_SETTEXT
, 0, (LPARAM
)pItem
->szHelp
);
425 if (LOWORD(wParam
) == IDC_PROPERTIES
)
427 This
= (CNetConnectionPropertyUi
*) GetWindowLongPtr(hwndDlg
, DWLP_USER
);
428 This
->ShowNetworkComponentProperties(hwndDlg
);
431 else if (LOWORD(wParam
) == IDC_CONFIGURE
)
433 LPOLESTR DeviceInstanceID
;
434 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
436 if (This
->GetDeviceInstanceID(&DeviceInstanceID
))
438 WCHAR wszCmd
[2*MAX_PATH
];
439 StringCbPrintfW(wszCmd
, sizeof(wszCmd
), L
"rundll32.exe devmgr.dll,DeviceProperties_RunDLL /DeviceID %s", DeviceInstanceID
);
440 CoTaskMemFree(DeviceInstanceID
);
443 PROCESS_INFORMATION pi
;
444 ZeroMemory(&si
, sizeof(si
));
446 if (!CreateProcessW(NULL
, wszCmd
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
449 CloseHandle(pi
.hProcess
);
450 CloseHandle(pi
.hThread
);
459 CNetConnectionPropertyUi::GetDeviceInstanceID(
460 OUT LPOLESTR
*DeviceInstanceID
)
462 LPOLESTR pStr
, pResult
;
465 WCHAR szKeyName
[2*MAX_PATH
];
466 WCHAR szInstanceID
[2*MAX_PATH
];
468 if (StringFromCLSID(pProperties
->guidId
, &pStr
) != ERROR_SUCCESS
)
470 // failed to convert guid to string
474 StringCbPrintfW(szKeyName
, sizeof(szKeyName
), L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
477 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKeyName
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
479 // failed to open key
483 dwInstanceID
= sizeof(szInstanceID
);
484 if (RegGetValueW(hKey
, NULL
, L
"PnpInstanceId", RRF_RT_REG_SZ
, NULL
, (PVOID
)szInstanceID
, &dwInstanceID
) == ERROR_SUCCESS
)
486 szInstanceID
[MAX_PATH
-1] = L
'\0';
487 pResult
= (LPOLESTR
)CoTaskMemAlloc((wcslen(szInstanceID
) + 1) * sizeof(WCHAR
));
490 wcscpy(pResult
, szInstanceID
);
491 *DeviceInstanceID
= pResult
;
502 CNetConnectionPropertyUi::QueryInterface(
509 if (IsEqualIID (iid
, IID_IUnknown
) ||
510 IsEqualIID (iid
, IID_INetConnectionPropertyUi
) ||
511 IsEqualIID (iid
, IID_INetConnectionPropertyUi2
))
513 *ppvObj
= (INetConnectionPropertyUi2
*)this;
517 else if (IsEqualIID(iid
, IID_INetLanConnectionUiInfo
))
519 *ppvObj
= (INetLanConnectionUiInfo
*)this;
523 else if (IsEqualIID(iid
, IID_INetConnectionConnectUi
))
525 *ppvObj
= (INetConnectionConnectUi
*)this;
530 StringFromCLSID((CLSID
)iid
, &pStr
);
531 MessageBoxW(NULL
, pStr
, L
"INetConnectionPropertyUi_fnQueryInterface", MB_OK
);
533 return E_NOINTERFACE
;
538 CNetConnectionPropertyUi::AddRef()
540 ULONG refCount
= InterlockedIncrement(&ref
);
547 CNetConnectionPropertyUi::Release()
549 ULONG refCount
= InterlockedDecrement(&ref
);
555 pNCfg
->Uninitialize();
564 NcFreeNetconProperties(pProperties
);
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
= pCon
->GetProperties(&pProperties
);
593 hProp
= InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES
), LANPropertiesUIDlg
, (LPARAM
)this, pProperties
->pszwName
);
596 ret
= (*pfnAddPage
)(hProp
, lParam
);
603 DestroyPropertySheetPage(hProp
);
611 CNetConnectionPropertyUi::GetIcon(
620 CNetConnectionPropertyUi::GetDeviceGuid(GUID
*pGuid
)
622 CopyMemory(pGuid
, &pProperties
->guidId
, sizeof(GUID
));
628 CNetConnectionPropertyUi::SetConnection(INetConnection
* pCon
)
631 this->pCon
->Release();
644 CNetConnectionPropertyUi::Connect(
649 return E_POINTER
; //FIXME
652 if (dwFlags
& NCUC_NO_UI
)
653 return 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();