[STOBJECT] Change Turkish translation.
[reactos.git] / dll / shellext / 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 INetConnectionConnectUi,
29 public INetConnectionPropertyUi2,
30 public INetLanConnectionUiInfo
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 ~CNetConnectionPropertyUi();
54
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);
61
62 INetConnection * m_pCon;
63 INetCfgLock *m_NCfgLock;
64 INetCfg * m_pNCfg;
65 NETCON_PROPERTIES * m_pProperties;
66 LONG m_ref;
67 };
68
69 CNetConnectionPropertyUi::CNetConnectionPropertyUi() :
70 m_pCon(NULL),
71 m_NCfgLock(NULL),
72 m_pNCfg(NULL),
73 m_pProperties(NULL),
74 m_ref(0)
75 {
76 }
77
78 CNetConnectionPropertyUi::~CNetConnectionPropertyUi()
79 {
80 if (m_pNCfg)
81 {
82 m_pNCfg->Uninitialize();
83 m_pNCfg->Release();
84 }
85 if (m_NCfgLock)
86 {
87 m_NCfgLock->Release();
88 }
89 if (m_pProperties)
90 {
91 NcFreeNetconProperties(m_pProperties);
92 }
93 }
94
95 HPROPSHEETPAGE
96 InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
97 {
98 PROPSHEETPAGEW ppage;
99
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;
107 if (szTitle)
108 {
109 ppage.dwFlags |= PSP_USETITLE;
110 ppage.pszTitle = szTitle;
111 }
112 return CreatePropertySheetPageW(&ppage);
113 }
114
115 VOID
116 AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked)
117 {
118 LVITEMW lvItem;
119
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);
127 }
128
129 BOOL
130 CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut)
131 {
132 LPWSTR pName;
133 HRESULT hr;
134 INetCfgComponent * pNCg;
135 ULONG Fetched;
136 IEnumNetCfgComponent * pEnumCfg;
137
138 hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg);
139 if (FAILED(hr))
140 {
141 return FALSE;
142 }
143
144 while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK)
145 {
146 hr = pNCg->GetDisplayName(&pName);
147 if (SUCCEEDED(hr))
148 {
149 if (!_wcsicmp(pName, m_pProperties->pszwDeviceName))
150 {
151 *pOut = pNCg;
152 pEnumCfg->Release();
153 return TRUE;
154 }
155 CoTaskMemFree(pName);
156 }
157 pNCg->Release();
158 }
159 pEnumCfg->Release();
160 return FALSE;
161 }
162
163 VOID
164 CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type)
165 {
166 HRESULT hr;
167 IEnumNetCfgComponent * pENetCfg;
168 INetCfgComponent *pNCfgComp, *pAdapterCfgComp;
169 INetCfgComponentBindings * pCompBind;
170 ULONG Num;
171 DWORD dwCharacteristics;
172 LPOLESTR pDisplayName, pHelpText;
173 PNET_ITEM pItem;
174 BOOL bChecked;
175
176 hr = pNCfg->EnumComponents(CompGuid, &pENetCfg);
177 if (FAILED(hr))
178 {
179 pNCfg->Release();
180 return;
181 }
182 while (pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK)
183 {
184 hr = pNCfgComp->GetCharacteristics(&dwCharacteristics);
185 if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN))
186 {
187 pNCfgComp->Release();
188 continue;
189 }
190 pDisplayName = NULL;
191 pHelpText = NULL;
192 hr = pNCfgComp->GetDisplayName(&pDisplayName);
193 hr = pNCfgComp->GetHelpText(&pHelpText);
194 bChecked = TRUE; //ReactOS hack
195 hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind);
196 if (SUCCEEDED(hr))
197 {
198 if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp))
199 {
200 hr = pCompBind->IsBoundTo(pAdapterCfgComp);
201 if (hr == S_OK)
202 bChecked = TRUE;
203 else
204 bChecked = FALSE;
205 pAdapterCfgComp->Release();
206 pCompBind->Release();
207 }
208 }
209
210 pItem = static_cast<NET_ITEM*>(CoTaskMemAlloc(sizeof(NET_ITEM)));
211 if (!pItem)
212 continue;
213
214 pItem->dwCharacteristics = dwCharacteristics;
215 pItem->szHelp = pHelpText;
216 pItem->Type = (NET_TYPE)Type;
217 pItem->pNCfgComp = pNCfgComp;
218 pItem->NumPropDialogOpen = 0;
219
220 AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked);
221 CoTaskMemFree(pDisplayName);
222 }
223 pENetCfg->Release();
224 }
225
226 VOID
227 CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg)
228 {
229 HRESULT hr;
230 INetCfg *pNCfg;
231 INetCfgLock *pNCfgLock;
232 HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST);
233 LVCOLUMNW lc;
234 RECT rc;
235 DWORD dwStyle;
236 LPWSTR pDisplayName;
237 LVITEMW li;
238
239 SendDlgItemMessageW(hwndDlg, IDC_NETCARDNAME, WM_SETTEXT, 0, (LPARAM)m_pProperties->pszwDeviceName);
240 if (m_pProperties->dwCharacter & NCCF_SHOW_ICON)
241 {
242 /* check show item on taskbar*/
243 SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_SETCHECK, BST_CHECKED, 0);
244 }
245 if (m_pProperties->dwCharacter & NCCF_NOTIFY_DISCONNECTED)
246 {
247 /* check notify item */
248 SendDlgItemMessageW(hwndDlg, IDC_NOTIFYNOCONNECTION, BM_SETCHECK, BST_CHECKED, 0);
249 }
250
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))
255 {
256 lc.mask |= LVCF_WIDTH;
257 lc.cx = rc.right - rc.left;
258 }
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);
264
265 hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (LPVOID*)&pNCfg);
266 if (FAILED(hr))
267 return;
268
269 hr = pNCfg->QueryInterface(IID_INetCfgLock, (LPVOID*)&pNCfgLock);
270 hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName);
271 if (hr == S_FALSE)
272 {
273 CoTaskMemFree(pDisplayName);
274 return;
275 }
276
277 m_NCfgLock = pNCfgLock;
278 hr = pNCfg->Initialize(NULL);
279 if (FAILED(hr))
280 {
281 pNCfg->Release();
282 return;
283 }
284
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);
288 m_pNCfg = pNCfg;
289
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);
295 }
296
297 VOID
298 CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg)
299 {
300 LVITEMW lvItem;
301 HWND hDlgCtrl;
302 UINT Index, Count;
303 HRESULT hr;
304 INetCfgComponent *pNCfgComp;
305 PNET_ITEM pItem;
306
307 hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST);
308 Count = ListView_GetItemCount(hDlgCtrl);
309 if (!Count)
310 return;
311
312 ZeroMemory(&lvItem, sizeof(LVITEMW));
313 lvItem.mask = LVIF_PARAM | LVIF_STATE;
314 lvItem.stateMask = (UINT)-1;
315 for (Index = 0; Index < Count; Index++)
316 {
317 lvItem.iItem = Index;
318 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&lvItem))
319 {
320 if (lvItem.state & LVIS_SELECTED)
321 break;
322 }
323 }
324
325 if (!(lvItem.state & LVIS_SELECTED))
326 {
327 return;
328 }
329
330 pItem = (PNET_ITEM)lvItem.lParam;
331 pNCfgComp = (INetCfgComponent*)pItem->pNCfgComp;
332 hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_QUERY_PROPERTY_UI, (INetConnectionConnectUi*)this);
333 if (SUCCEEDED(hr))
334 {
335 hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_SHOW_PROPERTY_UI, (INetConnectionConnectUi*)this);
336 }
337 }
338
339 INT_PTR
340 CALLBACK
341 CNetConnectionPropertyUi::LANPropertiesUIDlg(
342 HWND hwndDlg,
343 UINT uMsg,
344 WPARAM wParam,
345 LPARAM lParam)
346 {
347 PROPSHEETPAGE *page;
348 LPNMLISTVIEW lppl;
349 LVITEMW li;
350 PNET_ITEM pItem;
351 CNetConnectionPropertyUi * This;
352 LPPSHNOTIFY lppsn;
353 DWORD dwShowIcon;
354 HRESULT hr;
355 WCHAR szKey[200];
356 LPOLESTR pStr;
357 HKEY hKey;
358
359 switch (uMsg)
360 {
361 case WM_INITDIALOG:
362 page = (PROPSHEETPAGE*)lParam;
363 This = (CNetConnectionPropertyUi*)page->lParam;
364 This->InitializeLANPropertiesUIDlg(hwndDlg);
365 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This);
366 return TRUE;
367 case WM_NOTIFY:
368 lppl = (LPNMLISTVIEW) lParam;
369 lppsn = (LPPSHNOTIFY) lParam;
370 if (lppsn->hdr.code == PSN_APPLY)
371 {
372 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
373 if (This->m_pNCfg)
374 {
375 hr = This->m_pNCfg->Apply();
376 if (FAILED(hr))
377 return PSNRET_INVALID;
378 }
379
380 if (SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_GETCHECK, 0, 0) == BST_CHECKED)
381 dwShowIcon = 1;
382 else
383 dwShowIcon = 0;
384
385
386 if (StringFromCLSID((CLSID)This->m_pProperties->guidId, &pStr) == ERROR_SUCCESS)
387 {
388 swprintf(szKey, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr);
389 CoTaskMemFree(pStr);
390 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
391 {
392 RegSetValueExW(hKey, L"ShowIcon", 0, REG_DWORD, (LPBYTE)&dwShowIcon, sizeof(DWORD));
393 RegCloseKey(hKey);
394 }
395 }
396
397 return PSNRET_NOERROR;
398 }
399 #if 0
400 else if (lppsn->hdr.code == PSN_CANCEL)
401 {
402 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
403 if (This->m_pNCfg)
404 {
405 hr = This->m_pNCfg->Cancel();
406 if (SUCCEEDED(hr))
407 return PSNRET_NOERROR;
408 else
409 return PSNRET_INVALID;
410 }
411 return PSNRET_NOERROR;
412 }
413 #endif
414 if (lppl->hdr.code == LVN_ITEMCHANGING)
415 {
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))
420 return TRUE;
421
422 pItem = (PNET_ITEM)li.lParam;
423 if (!pItem)
424 return TRUE;
425
426 if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED))
427 {
428 /* new focused item */
429 if (pItem->dwCharacteristics & NCF_NOT_USER_REMOVABLE)
430 EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), FALSE);
431 else
432 EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), TRUE);
433
434 if (pItem->dwCharacteristics & NCF_HAS_UI)
435 EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), TRUE);
436 else
437 EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), FALSE);
438
439 SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)pItem->szHelp);
440 }
441 }
442 break;
443 case WM_COMMAND:
444 if (LOWORD(wParam) == IDC_PROPERTIES)
445 {
446 This = (CNetConnectionPropertyUi*) GetWindowLongPtr(hwndDlg, DWLP_USER);
447 This->ShowNetworkComponentProperties(hwndDlg);
448 return FALSE;
449 }
450 else if (LOWORD(wParam) == IDC_CONFIGURE)
451 {
452 LPOLESTR DeviceInstanceID;
453 This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER);
454
455 if (This->GetDeviceInstanceID(&DeviceInstanceID))
456 {
457 WCHAR wszCmd[2*MAX_PATH];
458 StringCbPrintfW(wszCmd, sizeof(wszCmd), L"rundll32.exe devmgr.dll,DeviceProperties_RunDLL /DeviceID %s", DeviceInstanceID);
459 CoTaskMemFree(DeviceInstanceID);
460
461 STARTUPINFOW si;
462 PROCESS_INFORMATION pi;
463 ZeroMemory(&si, sizeof(si));
464 si.cb = sizeof(si);
465 if (!CreateProcessW(NULL, wszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
466 break;
467
468 CloseHandle(pi.hProcess);
469 CloseHandle(pi.hThread);
470 }
471 }
472 break;
473 }
474 return FALSE;
475 }
476
477 BOOL
478 CNetConnectionPropertyUi::GetDeviceInstanceID(
479 OUT LPOLESTR *DeviceInstanceID)
480 {
481 LPOLESTR pStr, pResult;
482 HKEY hKey;
483 DWORD dwInstanceID;
484 WCHAR szKeyName[2*MAX_PATH];
485 WCHAR szInstanceID[2*MAX_PATH];
486
487 if (StringFromCLSID(m_pProperties->guidId, &pStr) != ERROR_SUCCESS)
488 {
489 // failed to convert guid to string
490 return FALSE;
491 }
492
493 StringCbPrintfW(szKeyName, sizeof(szKeyName), L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr);
494 CoTaskMemFree(pStr);
495
496 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
497 {
498 // failed to open key
499 return FALSE;
500 }
501
502 dwInstanceID = sizeof(szInstanceID);
503 if (RegGetValueW(hKey, NULL, L"PnpInstanceId", RRF_RT_REG_SZ, NULL, (PVOID)szInstanceID, &dwInstanceID) == ERROR_SUCCESS)
504 {
505 szInstanceID[MAX_PATH-1] = L'\0';
506 pResult = static_cast<LPOLESTR>(CoTaskMemAlloc((wcslen(szInstanceID) + 1) * sizeof(WCHAR)));
507 if (pResult != 0)
508 {
509 wcscpy(pResult, szInstanceID);
510 *DeviceInstanceID = pResult;
511 RegCloseKey(hKey);
512 return TRUE;
513 }
514 }
515 RegCloseKey(hKey);
516 return FALSE;
517 }
518
519 HRESULT
520 WINAPI
521 CNetConnectionPropertyUi::QueryInterface(
522 REFIID iid,
523 LPVOID *ppvObj)
524 {
525 *ppvObj = NULL;
526
527 if (IsEqualIID (iid, IID_IUnknown) ||
528 IsEqualIID (iid, IID_INetConnectionPropertyUi) ||
529 IsEqualIID (iid, IID_INetConnectionPropertyUi2))
530 {
531 *ppvObj = (INetConnectionPropertyUi2*)this;
532 AddRef();
533 return S_OK;
534 }
535 else if (IsEqualIID(iid, IID_INetLanConnectionUiInfo))
536 {
537 *ppvObj = (INetLanConnectionUiInfo*)this;
538 AddRef();
539 return S_OK;
540 }
541 else if (IsEqualIID(iid, IID_INetConnectionConnectUi))
542 {
543 *ppvObj = (INetConnectionConnectUi*)this;
544 AddRef();
545 return S_OK;
546 }
547
548 return E_NOINTERFACE;
549 }
550
551 ULONG
552 WINAPI
553 CNetConnectionPropertyUi::AddRef()
554 {
555 ULONG refCount = InterlockedIncrement(&m_ref);
556
557 return refCount;
558 }
559
560 ULONG
561 WINAPI
562 CNetConnectionPropertyUi::Release()
563 {
564 ULONG refCount = InterlockedDecrement(&m_ref);
565
566 if (!refCount)
567 delete this;
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 = m_pCon->GetProperties(&m_pProperties);
590 if (FAILED(hr))
591 return hr;
592
593 hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, reinterpret_cast<LPARAM>(this), NULL);
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, &m_pProperties->guidId, sizeof(GUID));
623 return S_OK;
624 }
625
626 HRESULT
627 WINAPI
628 CNetConnectionPropertyUi::SetConnection(INetConnection* pCon)
629 {
630 if (m_pCon)
631 m_pCon->Release();
632
633 if (!pCon)
634 return E_POINTER;
635
636 m_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 (!m_pCon)
649 return E_POINTER; //FIXME
650
651
652 if (dwFlags & NCUC_NO_UI)
653 return m_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 }