netprofm: Support NLM_ENUM_NETWORK flags.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56271
This commit is contained in:
Hans Leidekker 2024-02-26 13:07:34 +01:00 committed by Alexandre Julliard
parent fbd6b2583d
commit 635e0566a3
2 changed files with 60 additions and 16 deletions

View file

@ -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(

View file

@ -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 );