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