1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

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; LONG refs;
struct list_manager *mgr; struct list_manager *mgr;
struct list *cursor; struct list *cursor;
NLM_ENUM_NETWORK flags;
}; };
static inline struct networks_enum *impl_from_IEnumNetworks( static inline struct networks_enum *impl_from_IEnumNetworks(
@ -792,6 +793,17 @@ static HRESULT WINAPI networks_enum_get__NewEnum(
return E_NOTIMPL; 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( static HRESULT WINAPI networks_enum_Next(
IEnumNetworks *iface, ULONG count, INetwork **ret, ULONG *fetched ) IEnumNetworks *iface, ULONG count, INetwork **ret, ULONG *fetched )
{ {
@ -806,10 +818,13 @@ static HRESULT WINAPI networks_enum_Next(
while (iter->cursor && i < count) while (iter->cursor && i < count)
{ {
struct network *network = LIST_ENTRY( iter->cursor, struct network, entry ); struct network *network = LIST_ENTRY( iter->cursor, struct network, entry );
ret[i] = &network->INetwork_iface; if (match_enum_network_flags( iter->flags, network ))
INetwork_AddRef( ret[i] ); {
ret[i] = &network->INetwork_iface;
INetwork_AddRef( ret[i] );
i++;
}
iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); iter->cursor = list_next( &iter->mgr->networks, iter->cursor );
i++;
} }
if (fetched) *fetched = i; if (fetched) *fetched = i;
@ -826,10 +841,14 @@ static HRESULT WINAPI networks_enum_Skip(
if (!count) return S_OK; if (!count) return S_OK;
if (!iter->cursor) return S_FALSE; if (!iter->cursor) return S_FALSE;
while (count--) for (;;)
{ {
struct network *network;
iter->cursor = list_next( &iter->mgr->networks, iter->cursor ); iter->cursor = list_next( &iter->mgr->networks, iter->cursor );
if (!iter->cursor) break; 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; return count ? S_FALSE : S_OK;
@ -847,7 +866,7 @@ static HRESULT WINAPI networks_enum_Reset(
} }
static HRESULT create_networks_enum( static HRESULT create_networks_enum(
struct list_manager *, IEnumNetworks** ); struct list_manager *, NLM_ENUM_NETWORK, IEnumNetworks ** );
static HRESULT WINAPI networks_enum_Clone( static HRESULT WINAPI networks_enum_Clone(
IEnumNetworks *iface, IEnumNetworks **ret ) IEnumNetworks *iface, IEnumNetworks **ret )
@ -855,7 +874,7 @@ static HRESULT WINAPI networks_enum_Clone(
struct networks_enum *iter = impl_from_IEnumNetworks( iface ); struct networks_enum *iter = impl_from_IEnumNetworks( iface );
TRACE( "%p, %p\n", iter, ret ); 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 = static const IEnumNetworksVtbl networks_enum_vtbl =
@ -875,7 +894,7 @@ static const IEnumNetworksVtbl networks_enum_vtbl =
}; };
static HRESULT create_networks_enum( 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; struct networks_enum *iter;
@ -886,6 +905,7 @@ static HRESULT create_networks_enum(
iter->cursor = list_head( &mgr->networks ); iter->cursor = list_head( &mgr->networks );
iter->mgr = mgr; iter->mgr = mgr;
INetworkListManager_AddRef( &mgr->INetworkListManager_iface ); INetworkListManager_AddRef( &mgr->INetworkListManager_iface );
iter->flags = flags;
iter->refs = 1; iter->refs = 1;
*ret = &iter->IEnumNetworks_iface; *ret = &iter->IEnumNetworks_iface;
@ -1227,9 +1247,8 @@ static HRESULT WINAPI list_manager_GetNetworks(
struct list_manager *mgr = impl_from_INetworkListManager( iface ); struct list_manager *mgr = impl_from_INetworkListManager( iface );
TRACE( "%p, %x, %p\n", iface, Flags, ppEnumNetwork ); 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( static HRESULT WINAPI list_manager_GetNetwork(

View file

@ -380,15 +380,40 @@ static void test_INetworkListManager( void )
network_iter = NULL; network_iter = NULL;
hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_ALL, &network_iter ); hr = INetworkListManager_GetNetworks( mgr, NLM_ENUM_NETWORK_ALL, &network_iter );
ok( hr == S_OK, "got %08lx\n", hr ); 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) connected = 1;
{ hr = INetwork_get_IsConnected( network, &connected );
test_INetwork( network, NULL ); ok( hr == S_OK, "got %08lx\n", hr );
INetwork_Release( network ); ok( connected == -1 || connected == 0, "got %d\n", connected );
} INetwork_Release( network );
IEnumNetworks_Release( network_iter );
} }
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; conn_iter = NULL;
hr = INetworkListManager_GetNetworkConnections( mgr, &conn_iter ); hr = INetworkListManager_GetNetworkConnections( mgr, &conn_iter );