netprofm: Support NLM_ENUM_NETWORK flags.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56271
This commit is contained in:
parent
fbd6b2583d
commit
635e0566a3
2 changed files with 60 additions and 16 deletions
|
@ -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(
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Add table
Reference in a new issue