From: Hans Leidekker hans@codeweavers.com
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 );
From: Hans Leidekker hans@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56271 --- dlls/netprofm/list.c | 2 ++ dlls/netprofm/tests/list.c | 7 +++++++ 2 files changed, 9 insertions(+)
diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index d6eb1265ac5..31534c7f4b9 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -812,6 +812,8 @@ static HRESULT WINAPI networks_enum_Next(
TRACE( "%p, %lu %p %p\n", iter, count, ret, fetched );
+ if (!ret) return E_POINTER; + *ret = NULL; if (fetched) *fetched = 0; if (!count) return S_OK;
diff --git a/dlls/netprofm/tests/list.c b/dlls/netprofm/tests/list.c index 05b6851a2d8..bb3d0f59be8 100644 --- a/dlls/netprofm/tests/list.c +++ b/dlls/netprofm/tests/list.c @@ -381,14 +381,21 @@ static void test_INetworkListManager( void ) hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_ALL, &network_iter ); ok( hr == S_OK, "got %08lx\n", hr ); ok(network_iter != NULL, "network_iter not set\n"); + hr = IEnumNetworks_Next( network_iter, 0, NULL, NULL ); + ok( hr == E_POINTER, "got %08lx\n", hr ); + network = (INetwork *)0xdeadbeef; while ((hr = IEnumNetworks_Next( network_iter, 1, &network, NULL )) == S_OK) { + ok( network != (INetwork *)0xdeadbeef, "network not set\n" ); 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 ); + network = (INetwork *)0xdeadbeef; } + ok( hr == S_FALSE, "got %08lx\n", hr ); + ok( network == NULL, "network not set\n" ); IEnumNetworks_Release( network_iter );
hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_CONNECTED, &network_iter );
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=143422
Your paranoid android.
=== w11pro64 (32 bit report) ===
netprofm: list.c:420: Test failed: got -1
=== w11pro64_amd (64 bit report) ===
netprofm: list.c:420: Test failed: got -1