3 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
6 /// {7007ACC5-3202-11D1-AAD2-00805FC1270E}
7 /// open network properties and wlan properties
19 DWORD dwCharacteristics
;
21 INetCfgComponent
*pNCfgComp
;
22 UINT NumPropDialogOpen
;
23 } NET_ITEM
, *PNET_ITEM
;
25 class CNetConnectionPropertyUi final
:
26 public INetConnectionPropertyUi2
,
27 public INetLanConnectionUiInfo
,
28 public INetConnectionConnectUi
31 CNetConnectionPropertyUi();
34 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
35 virtual ULONG WINAPI
AddRef();
36 virtual ULONG WINAPI
Release();
38 // INetConnectionPropertyUi2
39 virtual HRESULT WINAPI
AddPages(HWND hwndParent
, LPFNADDPROPSHEETPAGE pfnAddPage
, LPARAM lParam
);
40 virtual HRESULT WINAPI
GetIcon(DWORD dwSize
, HICON
*phIcon
);
42 // INetLanConnectionUiInfo
43 virtual HRESULT WINAPI
GetDeviceGuid(GUID
*pGuid
);
45 // INetConnectionConnectUi
46 virtual HRESULT WINAPI
SetConnection(INetConnection
* pCon
);
47 virtual HRESULT WINAPI
Connect(HWND hwndParent
, DWORD dwFlags
);
48 virtual HRESULT WINAPI
Disconnect(HWND hwndParent
, DWORD dwFlags
);
51 BOOL
GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
);
52 VOID
EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
);
53 VOID
InitializeLANPropertiesUIDlg(HWND hwndDlg
);
54 VOID
ShowNetworkComponentProperties(HWND hwndDlg
);
55 static INT_PTR CALLBACK
LANPropertiesUIDlg(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
57 INetConnection
* pCon
;
58 INetCfgLock
*NCfgLock
;
60 NETCON_PROPERTIES
* pProperties
;
64 CNetConnectionPropertyUi::CNetConnectionPropertyUi()
74 InitializePropertySheetPage(LPWSTR resname
, DLGPROC dlgproc
, LPARAM lParam
, LPWSTR szTitle
)
78 memset(&ppage
, 0x0, sizeof(PROPSHEETPAGEW
));
79 ppage
.dwSize
= sizeof(PROPSHEETPAGEW
);
80 ppage
.dwFlags
= PSP_DEFAULT
;
81 ppage
.pszTemplate
= resname
;
82 ppage
.pfnDlgProc
= dlgproc
;
83 ppage
.lParam
= lParam
;
84 ppage
.hInstance
= netshell_hInstance
;
87 ppage
.dwFlags
|= PSP_USETITLE
;
88 ppage
.pszTitle
= szTitle
;
90 return CreatePropertySheetPageW(&ppage
);
94 AddItemToListView(HWND hDlgCtrl
, PNET_ITEM pItem
, LPWSTR szName
, BOOL bChecked
)
98 ZeroMemory(&lvItem
, sizeof(lvItem
));
99 lvItem
.mask
= LVIF_TEXT
| LVIF_PARAM
;
100 lvItem
.pszText
= szName
;
101 lvItem
.lParam
= (LPARAM
)pItem
;
102 lvItem
.iItem
= ListView_GetItemCount(hDlgCtrl
);
103 lvItem
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
);
104 ListView_SetCheckState(hDlgCtrl
, lvItem
.iItem
, bChecked
);
108 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg
*pNCfg
, INetCfgComponent
** pOut
)
112 INetCfgComponent
* pNCg
;
114 IEnumNetCfgComponent
* pEnumCfg
;
116 hr
= pNCfg
->EnumComponents(&GUID_DEVCLASS_NET
, &pEnumCfg
);
122 while (pEnumCfg
->Next(1, &pNCg
, &Fetched
) == S_OK
)
124 hr
= pNCg
->GetDisplayName(&pName
);
127 if (!_wcsicmp(pName
, pProperties
->pszwDeviceName
))
133 CoTaskMemFree(pName
);
142 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl
, INetCfg
*pNCfg
, const GUID
*CompGuid
, UINT Type
)
145 IEnumNetCfgComponent
* pENetCfg
;
146 INetCfgComponent
*pNCfgComp
, *pAdapterCfgComp
;
147 INetCfgComponentBindings
* pCompBind
;
149 DWORD dwCharacteristics
;
150 LPOLESTR pDisplayName
, pHelpText
;
154 hr
= pNCfg
->EnumComponents(CompGuid
, &pENetCfg
);
160 while(pENetCfg
->Next(1, &pNCfgComp
, &Num
) == S_OK
)
162 hr
= pNCfgComp
->GetCharacteristics(&dwCharacteristics
);
163 if (SUCCEEDED(hr
) && (dwCharacteristics
& NCF_HIDDEN
))
165 pNCfgComp
->Release();
170 hr
= pNCfgComp
->GetDisplayName(&pDisplayName
);
171 hr
= pNCfgComp
->GetHelpText(&pHelpText
);
172 bChecked
= TRUE
; //ReactOS hack
173 hr
= pNCfgComp
->QueryInterface(IID_INetCfgComponentBindings
, (LPVOID
*)&pCompBind
);
176 if (GetINetCfgComponent(pNCfg
, &pAdapterCfgComp
))
178 hr
= pCompBind
->IsBoundTo(pAdapterCfgComp
);
183 pAdapterCfgComp
->Release();
184 pCompBind
->Release();
188 pItem
= (NET_ITEM
*)CoTaskMemAlloc(sizeof(NET_ITEM
));
192 pItem
->dwCharacteristics
= dwCharacteristics
;
193 pItem
->szHelp
= pHelpText
;
194 pItem
->Type
= (NET_TYPE
)Type
;
195 pItem
->pNCfgComp
= pNCfgComp
;
196 pItem
->NumPropDialogOpen
= 0;
198 AddItemToListView(hDlgCtrl
, pItem
, pDisplayName
, bChecked
);
199 CoTaskMemFree(pDisplayName
);
205 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg
)
209 INetCfgLock
*pNCfgLock
;
210 HWND hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
217 SendDlgItemMessageW(hwndDlg
, IDC_NETCARDNAME
, WM_SETTEXT
, 0, (LPARAM
)pProperties
->pszwDeviceName
);
218 if (pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
220 /* check show item on taskbar*/
221 SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_SETCHECK
, BST_CHECKED
, 0);
223 if (pProperties
->dwCharacter
& NCCF_NOTIFY_DISCONNECTED
)
225 /* check notify item */
226 SendDlgItemMessageW(hwndDlg
, IDC_NOTIFYNOCONNECTION
, BM_SETCHECK
, BST_CHECKED
, 0);
229 memset(&lc
, 0, sizeof(LV_COLUMN
));
230 lc
.mask
= LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
231 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
232 if (GetClientRect(hDlgCtrl
, &rc
))
234 lc
.mask
|= LVCF_WIDTH
;
235 lc
.cx
= rc
.right
- rc
.left
;
237 lc
.pszText
= (LPWSTR
)L
"";
238 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
)&lc
);
239 dwStyle
= (DWORD
) SendMessage(hDlgCtrl
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0);
240 dwStyle
= dwStyle
| LVS_EX_FULLROWSELECT
| LVS_EX_CHECKBOXES
;
241 SendMessage(hDlgCtrl
, LVM_SETEXTENDEDLISTVIEWSTYLE
, 0, dwStyle
);
243 hr
= CoCreateInstance(CLSID_CNetCfg
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetCfg
, (LPVOID
*)&pNCfg
);
247 hr
= pNCfg
->QueryInterface(IID_INetCfgLock
, (LPVOID
*)&pNCfgLock
);
248 hr
= pNCfgLock
->AcquireWriteLock(100, L
"", &pDisplayName
);
251 CoTaskMemFree(pDisplayName
);
255 NCfgLock
= pNCfgLock
;
256 hr
= pNCfg
->Initialize(NULL
);
263 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETCLIENT
, NET_TYPE_CLIENT
);
264 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETSERVICE
, NET_TYPE_SERVICE
);
265 EnumComponents(hDlgCtrl
, pNCfg
, &GUID_DEVCLASS_NETTRANS
, NET_TYPE_PROTOCOL
);
268 ZeroMemory(&li
, sizeof(li
));
269 li
.mask
= LVIF_STATE
;
270 li
.stateMask
= (UINT
)-1;
271 li
.state
= LVIS_FOCUSED
|LVIS_SELECTED
;
272 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
276 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg
)
282 INetCfgComponent
*pNCfgComp
;
285 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMPONENTSLIST
);
286 Count
= ListView_GetItemCount(hDlgCtrl
);
290 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
291 lvItem
.mask
= LVIF_PARAM
| LVIF_STATE
;
292 lvItem
.stateMask
= (UINT
)-1;
293 for (Index
= 0; Index
< Count
; Index
++)
295 lvItem
.iItem
= Index
;
296 if (SendMessageW(hDlgCtrl
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
))
298 if (lvItem
.state
& LVIS_SELECTED
)
303 if (!(lvItem
.state
& LVIS_SELECTED
))
308 pItem
= (PNET_ITEM
)lvItem
.lParam
;
309 pNCfgComp
= (INetCfgComponent
*)pItem
->pNCfgComp
;
310 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_QUERY_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
313 hr
= pNCfgComp
->RaisePropertyUi(GetParent(hwndDlg
), NCRP_SHOW_PROPERTY_UI
, (INetConnectionConnectUi
*)this);
319 CNetConnectionPropertyUi::LANPropertiesUIDlg(
329 CNetConnectionPropertyUi
* This
;
340 page
= (PROPSHEETPAGE
*)lParam
;
341 This
= (CNetConnectionPropertyUi
*)page
->lParam
;
342 This
->InitializeLANPropertiesUIDlg(hwndDlg
);
343 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
346 lppl
= (LPNMLISTVIEW
) lParam
;
347 lppsn
= (LPPSHNOTIFY
) lParam
;
348 if (lppsn
->hdr
.code
== PSN_APPLY
)
350 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
353 hr
= This
->pNCfg
->Apply();
355 return PSNRET_INVALID
;
358 if (SendDlgItemMessageW(hwndDlg
, IDC_SHOWTASKBAR
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
364 if (StringFromCLSID((CLSID
)This
->pProperties
->guidId
, &pStr
) == ERROR_SUCCESS
)
366 swprintf(szKey
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr
);
368 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szKey
, 0, KEY_WRITE
, &hKey
) == ERROR_SUCCESS
)
370 RegSetValueExW(hKey
, L
"ShowIcon", 0, REG_DWORD
, (LPBYTE
)&dwShowIcon
, sizeof(DWORD
));
375 return PSNRET_NOERROR
;
378 else if (lppsn
->hdr
.code
== PSN_CANCEL
)
380 This
= (CNetConnectionPropertyUi
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
383 hr
= This
->pNCfg
->Cancel();
385 return PSNRET_NOERROR
;
387 return PSNRET_INVALID
;
389 return PSNRET_NOERROR
;
392 if (lppl
->hdr
.code
== LVN_ITEMCHANGING
)
394 ZeroMemory(&li
, sizeof(li
));
395 li
.mask
= LVIF_PARAM
;
396 li
.iItem
= lppl
->iItem
;
397 if (!SendMessageW(lppl
->hdr
.hwndFrom
, LVM_GETITEMW
, 0, (LPARAM
)&li
))
400 pItem
= (PNET_ITEM
)li
.lParam
;
404 if (!(lppl
->uOldState
& LVIS_FOCUSED
) && (lppl
->uNewState
& LVIS_FOCUSED
))
406 /* new focused item */
407 if (pItem
->dwCharacteristics
& NCF_NOT_USER_REMOVABLE
)
408 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), FALSE
);
410 EnableWindow(GetDlgItem(hwndDlg
, IDC_UNINSTALL
), TRUE
);
412 if (pItem
->dwCharacteristics
& NCF_HAS_UI
)
413 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), TRUE
);
415 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROPERTIES
), FALSE
);
417 SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_SETTEXT
, 0, (LPARAM
)pItem
->szHelp
);
422 if (LOWORD(wParam
) == IDC_PROPERTIES
)
424 This
= (CNetConnectionPropertyUi
*) GetWindowLongPtr(hwndDlg
, DWLP_USER
);
425 This
->ShowNetworkComponentProperties(hwndDlg
);
435 CNetConnectionPropertyUi::QueryInterface(
442 if (IsEqualIID (iid
, IID_IUnknown
) ||
443 IsEqualIID (iid
, IID_INetConnectionPropertyUi
) ||
444 IsEqualIID (iid
, IID_INetConnectionPropertyUi2
))
446 *ppvObj
= (INetConnectionPropertyUi2
*)this;
450 else if (IsEqualIID(iid
, IID_INetLanConnectionUiInfo
))
452 *ppvObj
= (INetLanConnectionUiInfo
*)this;
456 else if (IsEqualIID(iid
, IID_INetConnectionConnectUi
))
458 *ppvObj
= (INetConnectionConnectUi
*)this;
463 StringFromCLSID((CLSID
)iid
, &pStr
);
464 MessageBoxW(NULL
, pStr
, L
"INetConnectionPropertyUi_fnQueryInterface", MB_OK
);
466 return E_NOINTERFACE
;
471 CNetConnectionPropertyUi::AddRef()
473 ULONG refCount
= InterlockedIncrement(&ref
);
480 CNetConnectionPropertyUi::Release()
482 ULONG refCount
= InterlockedDecrement(&ref
);
488 pNCfg
->Uninitialize();
497 NcFreeNetconProperties(pProperties
);
507 CNetConnectionPropertyUi::AddPages(
509 LPFNADDPROPSHEETPAGE pfnAddPage
,
512 HPROPSHEETPAGE hProp
;
515 INITCOMMONCONTROLSEX initEx
;
517 initEx
.dwSize
= sizeof(initEx
);
518 initEx
.dwICC
= ICC_LISTVIEW_CLASSES
;
519 if(!InitCommonControlsEx(&initEx
))
522 hr
= pCon
->GetProperties(&pProperties
);
526 hProp
= InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES
), LANPropertiesUIDlg
, (LPARAM
)this, pProperties
->pszwName
);
529 ret
= (*pfnAddPage
)(hProp
, lParam
);
536 DestroyPropertySheetPage(hProp
);
544 CNetConnectionPropertyUi::GetIcon(
553 CNetConnectionPropertyUi::GetDeviceGuid(GUID
*pGuid
)
555 CopyMemory(pGuid
, &pProperties
->guidId
, sizeof(GUID
));
561 CNetConnectionPropertyUi::SetConnection(INetConnection
* pCon
)
564 this->pCon
->Release();
576 CNetConnectionPropertyUi::Connect(
581 return E_POINTER
; //FIXME
584 if (dwFlags
& NCUC_NO_UI
)
585 return pCon
->Connect();
592 CNetConnectionPropertyUi::Disconnect(
597 swprintf(szBuffer
, L
"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags
);
598 MessageBoxW(NULL
, szBuffer
, NULL
, MB_OK
);
603 HRESULT WINAPI
LanConnectUI_Constructor(IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
605 TRACE("LanConnectUI_Constructor\n");
611 return CLASS_E_NOAGGREGATION
;
613 CNetConnectionPropertyUi
*pConPropUi
= new CNetConnectionPropertyUi
;
615 return E_OUTOFMEMORY
;
617 pConPropUi
->AddRef();
618 HRESULT hr
= pConPropUi
->QueryInterface(riid
, ppv
);
619 pConPropUi
->Release();