* Sync up to trunk HEAD (r62286).
[reactos.git] / dll / win32 / netshell / lanconnectui.cpp
1 #include "precomp.h"
2
3 #include <netcfgx.h>
4 #include <netcfgn.h>
5 #include <strsafe.h>
6
7 /// CLASSID
8 /// {7007ACC5-3202-11D1-AAD2-00805FC1270E}
9 /// open network properties and wlan properties
10
11 typedef enum
12 {
13 NET_TYPE_CLIENT = 1,
14 NET_TYPE_SERVICE = 2,
15 NET_TYPE_PROTOCOL = 3
16 } NET_TYPE;
17
18 typedef struct
19 {
20 NET_TYPE Type;
21 DWORD dwCharacteristics;
22 LPWSTR szHelp;
23 INetCfgComponent *pNCfgComp;
24 UINT NumPropDialogOpen;
25 } NET_ITEM, *PNET_ITEM;
26
27 class CNetConnectionPropertyUi final :
28 public INetConnectionPropertyUi2,
29 public INetLanConnectionUiInfo,
30 public INetConnectionConnectUi
31 {
32 public:
33 CNetConnectionPropertyUi();
34
35 // IUnknown
36 virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut);
37 virtual ULONG WINAPI AddRef();
38 virtual ULONG WINAPI Release();
39
40 // INetConnectionPropertyUi2
41 virtual HRESULT WINAPI AddPages(HWND hwndParent, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
42 virtual HRESULT WINAPI GetIcon(DWORD dwSize, HICON *phIcon);
43
44 // INetLanConnectionUiInfo
45 virtual HRESULT WINAPI GetDeviceGuid(GUID *pGuid);
46
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);
51
52 private:
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);
59
60 INetConnection * pCon;
61 INetCfgLock *NCfgLock;
62 INetCfg * pNCfg;
63 NETCON_PROPERTIES * pProperties;
64 LONG ref;
65 };
66
67 CNetConnectionPropertyUi::CNetConnectionPropertyUi()
68 {
69 ref = 0;
70 pCon = NULL;
71 pNCfg = NULL;
72 NCfgLock = NULL;
73 pProperties = NULL;
74 }
75
76 HPROPSHEETPAGE
77 InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
78 {
79 PROPSHEETPAGEW ppage;
80
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;
88 if (szTitle)
89 {
90 ppage.dwFlags |= PSP_USETITLE;
91 ppage.pszTitle = szTitle;
92 }
93 return CreatePropertySheetPageW(&ppage);
94 }
95
96 VOID
97 AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked)
98 {
99 LVITEMW lvItem;
100
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);
108 }
109
110 BOOL
111 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut)
112 {
113 LPWSTR pName;
114 HRESULT hr;
115 INetCfgComponent * pNCg;
116 ULONG Fetched;
117 IEnumNetCfgComponent * pEnumCfg;
118
119 hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg);
120 if (FAILED(hr))
121 {
122 return FALSE;
123 }
124
125 while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK)
126 {
127 hr = pNCg->GetDisplayName(&pName);
128 if (SUCCEEDED(hr))
129 {
130 if (!_wcsicmp(pName, pProperties->pszwDeviceName))
131 {
132 *pOut = pNCg;
133 pEnumCfg->Release();
134 return TRUE;
135 }
136 CoTaskMemFree(pName);
137 }
138 pNCg->Release();
139 }
140 pEnumCfg->Release();
141 return FALSE;
142 }
143
144 VOID
145 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type)
146 {
147 HRESULT hr;
148 IEnumNetCfgComponent * pENetCfg;
149 INetCfgComponent *pNCfgComp, *pAdapterCfgComp;
150 INetCfgComponentBindings * pCompBind;
151 ULONG Num;
152 DWORD dwCharacteristics;
153 LPOLESTR pDisplayName, pHelpText;
154 PNET_ITEM pItem;
155 BOOL bChecked;
156
157 hr = pNCfg->EnumComponents(CompGuid, &pENetCfg);
158 if (FAILED(hr))
159 {
160 pNCfg->Release();
161 return;
162 }
163 while(pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK)
164 {
165 hr = pNCfgComp->GetCharacteristics(&dwCharacteristics);
166 if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN))
167 {
168 pNCfgComp->Release();
169 continue;
170 }
171 pDisplayName = NULL;
172 pHelpText = NULL;
173 hr = pNCfgComp->GetDisplayName(&pDisplayName);
174 hr = pNCfgComp->GetHelpText(&pHelpText);
175 bChecked = TRUE; //ReactOS hack
176 hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind);
177 if (SUCCEEDED(hr))
178 {
179 if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp))
180 {
181 hr = pCompBind->IsBoundTo(pAdapterCfgComp);
182 if (hr == S_OK)
183 bChecked = TRUE;
184 else
185 bChecked = FALSE;
186 pAdapterCfgComp->Release();
187 pCompBind->Release();
188 }
189 }
190
191 pItem = (NET_ITEM*)CoTaskMemAlloc(sizeof(NET_ITEM));
192 if (!pItem)
193 continue;
194
195 pItem->dwCharacteristics = dwCharacteristics;
196 pItem->szHelp = pHelpText;
197 pItem->Type = (NET_TYPE)Type;
198 pItem->pNCfgComp = pNCfgComp;
199 pItem->NumPropDialogOpen = 0;
200
201 AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked);
202 CoTaskMemFree(pDisplayName);
203 }
204 pENetCfg->Release();
205 }
206
207 VOID
208 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg)
209 {
210 HRESULT hr;
211 INetCfg *pNCfg;
212 INetCfgLock *pNCfgLock;
213 HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST);
214 LVCOLUMNW lc;
215 RECT rc;
216 DWORD dwStyle;
217 LPWSTR pDisplayName;
218 LVITEMW li;
219
220 SendDlgItemMessageW(hwndDlg, IDC_NETCARDNAME, WM_SETTEXT, 0, (LPARAM)pProperties->pszwDeviceName);
221 if (pProperties->dwCharacter & NCCF_SHOW_ICON)
222 {
223 /* check show item on taskbar*/
224 SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_SETCHECK, BST_CHECKED, 0);
225 }
226 if (pProperties->dwCharacter & NCCF_NOTIFY_DISCONNECTED)
227 {
228 /* check notify item */
229 SendDlgItemMessageW(hwndDlg, IDC_NOTIFYNOCONNECTION, BM_SETCHECK, BST_CHECKED, 0);
230 }
231
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))
236 {
237 lc.mask |= LVCF_WIDTH;
238 lc.cx = rc.right - rc.left;
239 }
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);
245
246 hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (LPVOID*)&pNCfg);
247 if (FAILED(hr))
248 return;
249
250 hr = pNCfg->QueryInterface(IID_INetCfgLock, (LPVOID*)&pNCfgLock);
251 hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName);
252 if (hr == S_FALSE)
253 {
254 CoTaskMemFree(pDisplayName);
255 return;
256 }
257
258 NCfgLock = pNCfgLock;
259 hr = pNCfg->Initialize(NULL);
260 if (FAILED(hr))
261 {
262 pNCfg->Release();
263 return;
264 }
265
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);
269 this->pNCfg = pNCfg;
270
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);
276 }
277
278 VOID
279 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg)
280 {
281 LVITEMW lvItem;
282 HWND hDlgCtrl;
283 UINT Index, Count;
284 HRESULT hr;
285 INetCfgComponent *pNCfgComp;
286 PNET_ITEM pItem;
287
288 hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST);
289 Count = ListView_GetItemCount(hDlgCtrl);
290 if (!Count)
291 return;
292
293 ZeroMemory(&lvItem, sizeof(LVITEMW));
294 lvItem.mask = LVIF_PARAM | LVIF_STATE;
295 lvItem.stateMask = (UINT)-1;
296 for (Index = 0; Index < Count; Index++)
297 {
298 lvItem.iItem = Index;
299 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&lvItem))
300 {
301 if (lvItem.state & LVIS_SELECTED)
302 break;
303 }
304 }
305
306 if (!(lvItem.state & LVIS_SELECTED))
307 {
308 return;
309 }
310
311 pItem = (PNET_ITEM)lvItem.lParam;
312 pNCfgComp = (INetCfgComponent*)pItem->pNCfgComp;
313 hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_QUERY_PROPERTY_UI, (INetConnectionConnectUi*)this);
314 if (SUCCEEDED(hr))
315 {
316 hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_SHOW_PROPERTY_UI, (INetConnectionConnectUi*)this);
317 }
318 }
319
320 INT_PTR
321 CALLBACK
322 CNetConnectionPropertyUi::LANPropertiesUIDlg(
323 HWND hwndDlg,
324 UINT uMsg,
325 WPARAM wParam,
326 LPARAM lParam)
327 {
328 PROPSHEETPAGE *page;
329 LPNMLISTVIEW lppl;
330 LVITEMW li;
331 PNET_ITEM pItem;
332 CNetConnectionPropertyUi * This;
333 LPPSHNOTIFY lppsn;
334 DWORD dwShowIcon;
335 HRESULT hr;
336 WCHAR szKey[200];
337 LPOLESTR pStr;
338 HKEY hKey;
339
340 switch(uMsg)
341 {
342 case WM_INITDIALOG:
343 page = (PROPSHEETPAGE*)lParam;
344 This = (CNetConnectionPropertyUi*)page->lParam;
345 This->InitializeLANPropertiesUIDlg(hwndDlg);
346 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This);
347 return TRUE;
348 case WM_NOTIFY:
349 lppl = (LPNMLISTVIEW) lParam;
350 lppsn = (LPPSHNOTIFY) lParam;
351 if (lppsn->hdr.code == PSN_APPLY)
352 {
353 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
354 if (This->pNCfg)
355 {
356 hr = This->pNCfg->Apply();
357 if (FAILED(hr))
358 return PSNRET_INVALID;
359 }
360
361 if (SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_GETCHECK, 0, 0) == BST_CHECKED)
362 dwShowIcon = 1;
363 else
364 dwShowIcon = 0;
365
366
367 if (StringFromCLSID((CLSID)This->pProperties->guidId, &pStr) == ERROR_SUCCESS)
368 {
369 swprintf(szKey, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr);
370 CoTaskMemFree(pStr);
371 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
372 {
373 RegSetValueExW(hKey, L"ShowIcon", 0, REG_DWORD, (LPBYTE)&dwShowIcon, sizeof(DWORD));
374 RegCloseKey(hKey);
375 }
376 }
377
378 return PSNRET_NOERROR;
379 }
380 #if 0
381 else if (lppsn->hdr.code == PSN_CANCEL)
382 {
383 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
384 if (This->pNCfg)
385 {
386 hr = This->pNCfg->Cancel();
387 if (SUCCEEDED(hr))
388 return PSNRET_NOERROR;
389 else
390 return PSNRET_INVALID;
391 }
392 return PSNRET_NOERROR;
393 }
394 #endif
395 if (lppl->hdr.code == LVN_ITEMCHANGING)
396 {
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))
401 return TRUE;
402
403 pItem = (PNET_ITEM)li.lParam;
404 if (!pItem)
405 return TRUE;
406
407 if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED))
408 {
409 /* new focused item */
410 if (pItem->dwCharacteristics & NCF_NOT_USER_REMOVABLE)
411 EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), FALSE);
412 else
413 EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), TRUE);
414
415 if (pItem->dwCharacteristics & NCF_HAS_UI)
416 EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), TRUE);
417 else
418 EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), FALSE);
419
420 SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)pItem->szHelp);
421 }
422 }
423 break;
424 case WM_COMMAND:
425 if (LOWORD(wParam) == IDC_PROPERTIES)
426 {
427 This = (CNetConnectionPropertyUi*) GetWindowLongPtr(hwndDlg, DWLP_USER);
428 This->ShowNetworkComponentProperties(hwndDlg);
429 return FALSE;
430 }
431 else if (LOWORD(wParam) == IDC_CONFIGURE)
432 {
433 LPOLESTR DeviceInstanceID;
434 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
435
436 if (This->GetDeviceInstanceID(&DeviceInstanceID))
437 {
438 WCHAR wszCmd[2*MAX_PATH];
439 StringCbPrintfW(wszCmd, sizeof(wszCmd), L"rundll32.exe devmgr.dll,DeviceProperties_RunDLL /DeviceID %s", DeviceInstanceID);
440 CoTaskMemFree(DeviceInstanceID);
441
442 STARTUPINFOW si;
443 PROCESS_INFORMATION pi;
444 ZeroMemory(&si, sizeof(si));
445 si.cb = sizeof(si);
446 if (!CreateProcessW(NULL, wszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
447 break;
448
449 CloseHandle(pi.hProcess);
450 CloseHandle(pi.hThread);
451 }
452 }
453 break;
454 }
455 return FALSE;
456 }
457
458 BOOL
459 CNetConnectionPropertyUi::GetDeviceInstanceID(
460 OUT LPOLESTR *DeviceInstanceID)
461 {
462 LPOLESTR pStr, pResult;
463 HKEY hKey;
464 DWORD dwInstanceID;
465 WCHAR szKeyName[2*MAX_PATH];
466 WCHAR szInstanceID[2*MAX_PATH];
467
468 if (StringFromCLSID(pProperties->guidId, &pStr) != ERROR_SUCCESS)
469 {
470 // failed to convert guid to string
471 return FALSE;
472 }
473
474 StringCbPrintfW(szKeyName, sizeof(szKeyName), L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr);
475 CoTaskMemFree(pStr);
476
477 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
478 {
479 // failed to open key
480 return FALSE;
481 }
482
483 dwInstanceID = sizeof(szInstanceID);
484 if (RegGetValueW(hKey, NULL, L"PnpInstanceId", RRF_RT_REG_SZ, NULL, (PVOID)szInstanceID, &dwInstanceID) == ERROR_SUCCESS)
485 {
486 szInstanceID[MAX_PATH-1] = L'\0';
487 pResult = (LPOLESTR)CoTaskMemAlloc((wcslen(szInstanceID) + 1) * sizeof(WCHAR));
488 if (pResult != 0)
489 {
490 wcscpy(pResult, szInstanceID);
491 *DeviceInstanceID = pResult;
492 RegCloseKey(hKey);
493 return TRUE;
494 }
495 }
496 RegCloseKey(hKey);
497 return FALSE;
498 }
499
500 HRESULT
501 WINAPI
502 CNetConnectionPropertyUi::QueryInterface(
503 REFIID iid,
504 LPVOID *ppvObj)
505 {
506 LPOLESTR pStr;
507 *ppvObj = NULL;
508
509 if (IsEqualIID (iid, IID_IUnknown) ||
510 IsEqualIID (iid, IID_INetConnectionPropertyUi) ||
511 IsEqualIID (iid, IID_INetConnectionPropertyUi2))
512 {
513 *ppvObj = (INetConnectionPropertyUi2*)this;
514 AddRef();
515 return S_OK;
516 }
517 else if (IsEqualIID(iid, IID_INetLanConnectionUiInfo))
518 {
519 *ppvObj = (INetLanConnectionUiInfo*)this;
520 AddRef();
521 return S_OK;
522 }
523 else if (IsEqualIID(iid, IID_INetConnectionConnectUi))
524 {
525 *ppvObj = (INetConnectionConnectUi*)this;
526 AddRef();
527 return S_OK;
528 }
529
530 StringFromCLSID((CLSID)iid, &pStr);
531 MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK);
532 CoTaskMemFree(pStr);
533 return E_NOINTERFACE;
534 }
535
536 ULONG
537 WINAPI
538 CNetConnectionPropertyUi::AddRef()
539 {
540 ULONG refCount = InterlockedIncrement(&ref);
541
542 return refCount;
543 }
544
545 ULONG
546 WINAPI
547 CNetConnectionPropertyUi::Release()
548 {
549 ULONG refCount = InterlockedDecrement(&ref);
550
551 if (!refCount)
552 {
553 if (pNCfg)
554 {
555 pNCfg->Uninitialize();
556 pNCfg->Release();
557 }
558 if (NCfgLock)
559 {
560 NCfgLock->Release();
561 }
562 if (pProperties)
563 {
564 NcFreeNetconProperties(pProperties);
565 }
566 delete this;
567 }
568
569 return refCount;
570 }
571
572 HRESULT
573 WINAPI
574 CNetConnectionPropertyUi::AddPages(
575 HWND hwndParent,
576 LPFNADDPROPSHEETPAGE pfnAddPage,
577 LPARAM lParam)
578 {
579 HPROPSHEETPAGE hProp;
580 BOOL ret;
581 HRESULT hr = E_FAIL;
582 INITCOMMONCONTROLSEX initEx;
583
584 initEx.dwSize = sizeof(initEx);
585 initEx.dwICC = ICC_LISTVIEW_CLASSES;
586 if(!InitCommonControlsEx(&initEx))
587 return E_FAIL;
588
589 hr = pCon->GetProperties(&pProperties);
590 if (FAILED(hr))
591 return hr;
592
593 hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, (LPARAM)this, pProperties->pszwName);
594 if (hProp)
595 {
596 ret = (*pfnAddPage)(hProp, lParam);
597 if (ret)
598 {
599 hr = NOERROR;
600 }
601 else
602 {
603 DestroyPropertySheetPage(hProp);
604 }
605 }
606 return hr;
607 }
608
609 HRESULT
610 WINAPI
611 CNetConnectionPropertyUi::GetIcon(
612 DWORD dwSize,
613 HICON *phIcon)
614 {
615 return E_NOTIMPL;
616 }
617
618 HRESULT
619 WINAPI
620 CNetConnectionPropertyUi::GetDeviceGuid(GUID *pGuid)
621 {
622 CopyMemory(pGuid, &pProperties->guidId, sizeof(GUID));
623 return S_OK;
624 }
625
626 HRESULT
627 WINAPI
628 CNetConnectionPropertyUi::SetConnection(INetConnection* pCon)
629 {
630 if (this->pCon)
631 this->pCon->Release();
632
633 if (!pCon)
634 return E_POINTER;
635
636 this->pCon = pCon;
637
638 pCon->AddRef();
639 return S_OK;
640 }
641
642 HRESULT
643 WINAPI
644 CNetConnectionPropertyUi::Connect(
645 HWND hwndParent,
646 DWORD dwFlags)
647 {
648 if (!pCon)
649 return E_POINTER; //FIXME
650
651
652 if (dwFlags & NCUC_NO_UI)
653 return pCon->Connect();
654
655 return E_FAIL;
656 }
657
658 HRESULT
659 WINAPI
660 CNetConnectionPropertyUi::Disconnect(
661 HWND hwndParent,
662 DWORD dwFlags)
663 {
664 WCHAR szBuffer[100];
665 swprintf(szBuffer, L"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags);
666 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
667
668 return S_OK;
669 }
670
671 HRESULT WINAPI LanConnectUI_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
672 {
673 TRACE("LanConnectUI_Constructor\n");
674
675 if (!ppv)
676 return E_POINTER;
677
678 if (pUnkOuter)
679 return CLASS_E_NOAGGREGATION;
680
681 CNetConnectionPropertyUi *pConPropUi = new CNetConnectionPropertyUi;
682 if (!pConPropUi)
683 return E_OUTOFMEMORY;
684
685 pConPropUi->AddRef();
686 HRESULT hr = pConPropUi->QueryInterface(riid, ppv);
687 pConPropUi->Release();
688
689 return hr;
690 }