Module: wine Branch: master Commit: 635e0566a331e0ccb0b9445e0252fed0c5840eaf URL: https://gitlab.winehq.org/wine/wine/-/commit/635e0566a331e0ccb0b9445e0252fed...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Feb 26 13:07:34 2024 +0100
netprofm: Support NLM_ENUM_NETWORK flags.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56271
---
dlls/netprofm/list.c | 37 ++++++++++++++++++++++++++++--------- dlls/netprofm/tests/list.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 16 deletions(-)
diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index cb65484485b..d6eb1265ac5 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -684,6 +684,7 @@ struct networks_enum LONG refs; struct list_manager *mgr; struct list *cursor; + NLM_ENUM_NETWORK flags; };
static inline struct networks_enum *impl_from_IEnumNetworks( @@ -792,6 +793,17 @@ static HRESULT WINAPI networks_enum_get__NewEnum( return E_NOTIMPL; }
+static BOOL match_enum_network_flags( NLM_ENUM_NETWORK flags, struct network *network ) +{ + if (flags == NLM_ENUM_NETWORK_ALL) return TRUE; + if (network->connected) + { + if (flags & NLM_ENUM_NETWORK_CONNECTED) return TRUE; + } + else if (flags & NLM_ENUM_NETWORK_DISCONNECTED) return TRUE; + return FALSE; +} + static HRESULT WINAPI networks_enum_Next( IEnumNetworks *iface, ULONG count, INetwork **ret, ULONG *fetched ) { @@ -806,10 +818,13 @@ static HRESULT WINAPI networks_enum_Next( while (iter->cursor && i < count) { struct network *network = LIST_ENTRY( iter->cursor, struct network, entry ); - ret[i] = &network->INetwork_iface; - INetwork_AddRef( ret[i] ); + if (match_enum_network_flags( iter->flags, network )) + { + ret[i] = &network->INetwork_iface; + INetwork_AddRef( ret[i] ); + i++; + } iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); - i++; } if (fetched) *fetched = i;
@@ -826,10 +841,14 @@ static HRESULT WINAPI networks_enum_Skip( if (!count) return S_OK; if (!iter->cursor) return S_FALSE;
- while (count--) + for (;;) { + struct network *network; iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); if (!iter->cursor) break; + network = LIST_ENTRY( iter->cursor, struct network, entry ); + if (match_enum_network_flags( iter->flags, network )) count--; + if (!count) break; }
return count ? S_FALSE : S_OK; @@ -847,7 +866,7 @@ static HRESULT WINAPI networks_enum_Reset( }
static HRESULT create_networks_enum( - struct list_manager *, IEnumNetworks** ); + struct list_manager *, NLM_ENUM_NETWORK, IEnumNetworks ** );
static HRESULT WINAPI networks_enum_Clone( IEnumNetworks *iface, IEnumNetworks **ret ) @@ -855,7 +874,7 @@ static HRESULT WINAPI networks_enum_Clone( struct networks_enum *iter = impl_from_IEnumNetworks( iface );
TRACE( "%p, %p\n", iter, ret ); - return create_networks_enum( iter->mgr, ret ); + return create_networks_enum( iter->mgr, iter->flags, ret ); }
static const IEnumNetworksVtbl networks_enum_vtbl = @@ -875,7 +894,7 @@ static const IEnumNetworksVtbl networks_enum_vtbl = };
static HRESULT create_networks_enum( - struct list_manager *mgr, IEnumNetworks **ret ) + struct list_manager *mgr, NLM_ENUM_NETWORK flags, IEnumNetworks **ret ) { struct networks_enum *iter;
@@ -886,6 +905,7 @@ static HRESULT create_networks_enum( iter->cursor = list_head( &mgr->networks ); iter->mgr = mgr; INetworkListManager_AddRef( &mgr->INetworkListManager_iface ); + iter->flags = flags; iter->refs = 1;
*ret = &iter->IEnumNetworks_iface; @@ -1227,9 +1247,8 @@ static HRESULT WINAPI list_manager_GetNetworks( struct list_manager *mgr = impl_from_INetworkListManager( iface );
TRACE( "%p, %x, %p\n", iface, Flags, ppEnumNetwork ); - if (Flags) FIXME( "flags %08x not supported\n", Flags );
- return create_networks_enum( mgr, ppEnumNetwork ); + return create_networks_enum( mgr, Flags, ppEnumNetwork ); }
static HRESULT WINAPI list_manager_GetNetwork( diff --git a/dlls/netprofm/tests/list.c b/dlls/netprofm/tests/list.c index b58aef9bdec..05b6851a2d8 100644 --- a/dlls/netprofm/tests/list.c +++ b/dlls/netprofm/tests/list.c @@ -380,15 +380,40 @@ static void test_INetworkListManager( void ) network_iter = NULL; hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_ALL, &network_iter ); ok( hr == S_OK, "got %08lx\n", hr ); - if (network_iter) + ok(network_iter != NULL, "network_iter not set\n"); + while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) { - while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) - { - test_INetwork( network, NULL ); - INetwork_Release( network ); - } - IEnumNetworks_Release( network_iter ); + connected = 1; + hr = INetwork_get_IsConnected( network, &connected ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( connected == -1 || connected == 0, "got %d\n", connected ); + INetwork_Release( network ); + } + IEnumNetworks_Release( network_iter ); + + hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_CONNECTED, &network_iter ); + ok( hr == S_OK, "got %08lx\n", hr ); + while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) + { + connected = 0; + hr = INetwork_get_IsConnected( network, &connected ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( connected == -1, "got %d\n", connected ); + INetwork_Release( network ); + } + IEnumNetworks_Release( network_iter ); + + hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_DISCONNECTED, &network_iter ); + ok( hr == S_OK, "got %08lx\n", hr ); + while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) + { + connected = -1; + hr = INetwork_get_IsConnected( network, &connected ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( connected == 0, "got %d\n", connected ); + INetwork_Release( network ); } + IEnumNetworks_Release( network_iter );
conn_iter = NULL; hr = INetworkListManager_GetNetworkConnections( mgr, &conn_iter );