From 7fab074623b002f47758d2e45d43d76fd0237404 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 7 Sep 2008 18:28:37 +0000 Subject: [PATCH] - Acquire INetCfgLock before enumerating the items - Check if a network component is enabled for a specific network adapter - Get INetCfgComponent from the INetComponent - Use ReportView for component dialog svn path=/trunk/; revision=36041 --- reactos/dll/win32/netshell/lanconnectui.c | 119 +++++++++++++++++----- reactos/dll/win32/netshell/lang/de-DE.rc | 2 +- reactos/dll/win32/netshell/lang/en-US.rc | 2 +- reactos/dll/win32/netshell/lang/ru-RU.rc | 2 +- 4 files changed, 94 insertions(+), 31 deletions(-) diff --git a/reactos/dll/win32/netshell/lanconnectui.c b/reactos/dll/win32/netshell/lanconnectui.c index 2c211a12e9a..f90a76bf10b 100644 --- a/reactos/dll/win32/netshell/lanconnectui.c +++ b/reactos/dll/win32/netshell/lanconnectui.c @@ -24,6 +24,7 @@ typedef struct { INetConnectionPropertyUi *lpVtbl; INetConnection * pCon; + INetCfgLock *NCfgLock; INetCfg * pNCfg; LONG ref; }INetConnectionPropertyUiImpl, *LPINetConnectionPropertyUiImpl; @@ -49,7 +50,7 @@ InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWS } VOID -AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName) +AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked) { LVITEMW lvItem; @@ -59,20 +60,63 @@ AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName) lvItem.lParam = (LPARAM)pItem; lvItem.iItem = ListView_GetItemCount(hDlgCtrl); lvItem.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - ListView_SetCheckState(hDlgCtrl, lvItem.iItem, TRUE); + ListView_SetCheckState(hDlgCtrl, lvItem.iItem, bChecked); +} + +BOOL +GetINetCfgComponent(INetCfg * pNCfg, INetConnection * pNetCon, INetCfgComponent ** pOut) +{ + LPWSTR pName; + HRESULT hr; + NETCON_PROPERTIES* pProps; + INetCfgComponent * pNCg; + ULONG Fetched; + IEnumNetCfgComponent * pEnumCfg; + + hr = INetConnection_GetProperties(pNetCon, &pProps); + if (FAILED(hr)) + return FALSE; + + hr = INetCfg_EnumComponents(pNCfg, &GUID_DEVCLASS_NET, &pEnumCfg); + if (FAILED(hr)) + { + NcFreeNetconProperties(pProps); + return FALSE; + } + + while(IEnumNetCfgComponent_Next(pEnumCfg, 1, &pNCg, &Fetched) == S_OK) + { + hr = INetCfgComponent_GetDisplayName(pNCg, &pName); + if (SUCCEEDED(hr)) + { + if (!wcsicmp(pName, pProps->pszwDeviceName)) + { + *pOut = pNCg; + IEnumNetCfgComponent_Release(pEnumCfg); + NcFreeNetconProperties(pProps); + return TRUE; + } + CoTaskMemFree(pName); + } + INetCfgComponent_Release(pNCg); + } + IEnumNetCfgComponent_Release(pEnumCfg); + NcFreeNetconProperties(pProps); + return FALSE; } VOID -EnumComponents(HWND hDlgCtrl, INetCfg * pNCfg, const GUID * CompGuid, UINT Type) +EnumComponents(HWND hDlgCtrl, INetConnectionPropertyUiImpl * This, INetCfg * pNCfg, const GUID * CompGuid, UINT Type) { HRESULT hr; IEnumNetCfgComponent * pENetCfg; - INetCfgComponent *pNCfgComp; + INetCfgComponent *pNCfgComp, *pAdapterCfgComp; + INetCfgComponentBindings * pCompBind; ULONG Num; DWORD dwCharacteristics; LPOLESTR pDisplayName, pHelpText; PNET_ITEM pItem; - + BOOL bChecked; hr = INetCfg_EnumComponents(pNCfg, CompGuid, &pENetCfg); if (FAILED(hr)) @@ -92,16 +136,29 @@ EnumComponents(HWND hDlgCtrl, INetCfg * pNCfg, const GUID * CompGuid, UINT Type) pHelpText = NULL; hr = INetCfgComponent_GetDisplayName(pNCfgComp, &pDisplayName); hr = INetCfgComponent_GetHelpText(pNCfgComp, &pHelpText); + hr = INetCfgComponent_QueryInterface(pNCfgComp, &IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); - pItem = CoTaskMemAlloc(sizeof(NET_ITEM)); - if (!pItem) - continue; + bChecked = FALSE; + if (GetINetCfgComponent(pNCfg, This->pCon, &pAdapterCfgComp)) + { + hr = INetCfgComponentBindings_IsBoundTo(pCompBind, pAdapterCfgComp); + if (hr == S_OK) + bChecked = TRUE; + else + bChecked = FALSE; + INetCfgComponent_Release(pAdapterCfgComp); + } + pItem = CoTaskMemAlloc(sizeof(NET_ITEM)); + if (!pItem) + continue; pItem->dwCharacteristics = dwCharacteristics; pItem->szHelp = pHelpText; pItem->Type = Type; pItem->pNCfgComp = pNCfgComp; pItem->NumPropDialogOpen = 0; - AddItemToListView(hDlgCtrl, pItem, pDisplayName); + + + AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); CoTaskMemFree(pDisplayName); } IEnumNetCfgComponent_Release(pENetCfg); @@ -113,11 +170,14 @@ InitializeLANPropertiesUIDlg(HWND hwndDlg, INetConnectionPropertyUiImpl * This) { HRESULT hr; INetCfg * pNCfg; + INetCfgLock * pNCfgLock; HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); LVCOLUMNW lc; RECT rc; DWORD dwStyle; NETCON_PROPERTIES * pProperties; + LPWSTR pDisplayName; + LVITEMW li; hr = INetConnection_GetProperties(This->pCon, &pProperties); if (FAILED(hr)) @@ -155,6 +215,15 @@ InitializeLANPropertiesUIDlg(HWND hwndDlg, INetConnectionPropertyUiImpl * This) if (FAILED(hr)) return; + hr = INetCfgLock_QueryInterface(pNCfg, &IID_INetCfgLock, (LPVOID*)&pNCfgLock); + hr = INetCfgLock_AcquireWriteLock(pNCfgLock, 100, L"", &pDisplayName); + if (hr == S_FALSE) + { + CoTaskMemFree(pDisplayName); + return; + } + + This->NCfgLock = pNCfgLock; hr = INetCfg_Initialize(pNCfg, NULL); if (FAILED(hr)) { @@ -162,10 +231,16 @@ InitializeLANPropertiesUIDlg(HWND hwndDlg, INetConnectionPropertyUiImpl * This) return; } - EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); - EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); - EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); + EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); + EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); + EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); This->pNCfg = pNCfg; + + ZeroMemory(&li, sizeof(li)); + li.mask = LVIF_STATE; + li.stateMask = (UINT)-1; + li.state = LVIS_FOCUSED|LVIS_SELECTED; + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } VOID @@ -180,8 +255,7 @@ ShowNetworkComponentProperties( INetConnectionPropertyUi * pConUI = NULL; INetCfgComponent * pNCfgComp; PNET_ITEM pItem; - INetCfgLock * pLock; - LPWSTR pLockApp; + WCHAR szBuffer[200]; hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); Count = ListView_GetItemCount(hDlgCtrl); @@ -228,26 +302,15 @@ ShowNetworkComponentProperties( pItem = (PNET_ITEM)lvItem.lParam; pNCfgComp = (INetCfgComponent*) pItem->pNCfgComp; - hr = INetCfg_QueryInterface(This->pNCfg, &IID_INetCfgLock, (LPVOID*)&pLock); - if (FAILED(hr)) - return; - - hr = INetCfgLock_AcquireWriteLock(pLock, 10000, L"", &pLockApp); - if (FAILED(hr)) - { - CoTaskMemFree(pLockApp); - INetConnectionPropertyUi_Release(pConUI); - return; - } - - hr = INetCfgComponent_RaisePropertyUi(pNCfgComp, GetParent(hwndDlg), NCRP_QUERY_PROPERTY_UI, (IUnknown*)pConUI); if (SUCCEEDED(hr)) { hr = INetCfgComponent_RaisePropertyUi(pNCfgComp, GetParent(hwndDlg), NCRP_SHOW_PROPERTY_UI, (IUnknown*)pConUI); } - INetCfgLock_ReleaseWriteLock(pLock); + swprintf(szBuffer, L"result %08x", hr); + MessageBoxW(NULL, szBuffer, NULL, MB_OK); + INetConnectionPropertyUi_Release(pConUI); } diff --git a/reactos/dll/win32/netshell/lang/de-DE.rc b/reactos/dll/win32/netshell/lang/de-DE.rc index b497886071d..a142113e0ae 100644 --- a/reactos/dll/win32/netshell/lang/de-DE.rc +++ b/reactos/dll/win32/netshell/lang/de-DE.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Allgemein" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "List3", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP | LVS_EX_FULLROWSELECT, 9, 71, 230, 55 + CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 LTEXT "Verbindung herstellen ьber:", -1, 9,9,217,8 EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY PUSHBUTTON "&Konfigurieren", IDC_CONFIGURE, 189, 38, 50, 14 diff --git a/reactos/dll/win32/netshell/lang/en-US.rc b/reactos/dll/win32/netshell/lang/en-US.rc index a4cf3995dc1..3b8fe2346e7 100644 --- a/reactos/dll/win32/netshell/lang/en-US.rc +++ b/reactos/dll/win32/netshell/lang/en-US.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "General" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_LIST | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 + CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 LTEXT "Connect Using:", -1, 9,9,217,8 EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_DISABLED | WS_TABSTOP PUSHBUTTON "&Configure", IDC_CONFIGURE, 189, 38, 50, 14 diff --git a/reactos/dll/win32/netshell/lang/ru-RU.rc b/reactos/dll/win32/netshell/lang/ru-RU.rc index 91c8fff75dd..2f438e8f941 100644 --- a/reactos/dll/win32/netshell/lang/ru-RU.rc +++ b/reactos/dll/win32/netshell/lang/ru-RU.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Общие" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_LIST | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 + CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 LTEXT "Подключение через:", -1, 9, 9, 217, 8 EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_DISABLED | WS_TABSTOP PUSHBUTTON "&Настроить...", IDC_CONFIGURE, 174, 38, 65, 14