Hans Leidekker : netprofm: Add a stub implementation of INetworkConnection.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Aug 27 08:25:36 CDT 2015
Module: wine
Branch: master
Commit: 2d22baa6be75b05175c739e42807ab67fbb68bd4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2d22baa6be75b05175c739e42807ab67fbb68bd4
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Aug 27 15:04:51 2015 +0200
netprofm: Add a stub implementation of INetworkConnection.
---
dlls/netprofm/list.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 273 insertions(+)
diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c
index 6364515..b39856d 100644
--- a/dlls/netprofm/list.c
+++ b/dlls/netprofm/list.c
@@ -36,6 +36,7 @@
#include "olectl.h"
#include "wine/debug.h"
+#include "wine/list.h"
#include "netprofm_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(netprofm);
@@ -50,12 +51,23 @@ static inline BOOL heap_free( void *mem )
return HeapFree( GetProcessHeap(), 0, mem );
}
+struct connection
+{
+ INetworkConnection INetworkConnection_iface;
+ LONG refs;
+ struct list entry;
+ GUID id;
+ VARIANT_BOOL connected_to_internet;
+ VARIANT_BOOL connected;
+};
+
struct list_manager
{
INetworkListManager INetworkListManager_iface;
INetworkCostManager INetworkCostManager_iface;
IConnectionPointContainer IConnectionPointContainer_iface;
LONG refs;
+ struct list connections;
};
struct connection_point
@@ -358,7 +370,16 @@ static ULONG WINAPI list_manager_Release(
LONG refs = InterlockedDecrement( &mgr->refs );
if (!refs)
{
+ struct list *ptr;
+
TRACE( "destroying %p\n", mgr );
+
+ while ((ptr = list_head( &mgr->connections )))
+ {
+ struct connection *connection = LIST_ENTRY( ptr, struct connection, entry );
+ list_remove( &connection->entry );
+ INetworkConnection_Release( &connection->INetworkConnection_iface );
+ }
heap_free( mgr );
}
return refs;
@@ -583,6 +604,257 @@ static const struct IConnectionPointContainerVtbl cpc_vtbl =
ConnectionPointContainer_FindConnectionPoint
};
+static inline struct connection *impl_from_INetworkConnection(
+ INetworkConnection *iface )
+{
+ return CONTAINING_RECORD( iface, struct connection, INetworkConnection_iface );
+}
+
+static HRESULT WINAPI connection_QueryInterface(
+ INetworkConnection *iface, REFIID riid, void **obj )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ TRACE( "%p, %s, %p\n", connection, debugstr_guid(riid), obj );
+
+ if (IsEqualIID( riid, &IID_INetworkConnection ) ||
+ IsEqualIID( riid, &IID_IDispatch ) ||
+ IsEqualIID( riid, &IID_IUnknown ))
+ {
+ *obj = iface;
+ }
+ else
+ {
+ WARN( "interface not supported %s\n", debugstr_guid(riid) );
+ *obj = NULL;
+ return E_NOINTERFACE;
+ }
+ INetworkConnection_AddRef( iface );
+ return S_OK;
+}
+
+static ULONG WINAPI connection_AddRef(
+ INetworkConnection *iface )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ TRACE( "%p\n", connection );
+ return InterlockedIncrement( &connection->refs );
+}
+
+static ULONG WINAPI connection_Release(
+ INetworkConnection *iface )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+ LONG refs;
+
+ TRACE( "%p\n", connection );
+
+ if (!(refs = InterlockedDecrement( &connection->refs )))
+ {
+ list_remove( &connection->entry );
+ heap_free( connection );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI connection_GetTypeInfoCount(
+ INetworkConnection *iface,
+ UINT *count )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI connection_GetTypeInfo(
+ INetworkConnection *iface,
+ UINT index,
+ LCID lcid,
+ ITypeInfo **info )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI connection_GetIDsOfNames(
+ INetworkConnection *iface,
+ REFIID riid,
+ LPOLESTR *names,
+ UINT count,
+ LCID lcid,
+ DISPID *dispid )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI connection_Invoke(
+ INetworkConnection *iface,
+ DISPID member,
+ REFIID riid,
+ LCID lcid,
+ WORD flags,
+ DISPPARAMS *params,
+ VARIANT *result,
+ EXCEPINFO *excep_info,
+ UINT *arg_err )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI connection_GetNetwork(
+ INetworkConnection *iface,
+ INetwork **ppNetwork )
+{
+ FIXME( "%p, %p\n", iface, ppNetwork );
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI connection_get_IsConnectedToInternet(
+ INetworkConnection *iface,
+ VARIANT_BOOL *pbIsConnected )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ TRACE( "%p, %p\n", iface, pbIsConnected );
+
+ *pbIsConnected = connection->connected_to_internet;
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_get_IsConnected(
+ INetworkConnection *iface,
+ VARIANT_BOOL *pbIsConnected )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ TRACE( "%p, %p\n", iface, pbIsConnected );
+
+ *pbIsConnected = connection->connected;
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_GetConnectivity(
+ INetworkConnection *iface,
+ NLM_CONNECTIVITY *pConnectivity )
+{
+ FIXME( "%p, %p\n", iface, pConnectivity );
+
+ *pConnectivity = NLM_CONNECTIVITY_IPV4_INTERNET;
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_GetConnectionId(
+ INetworkConnection *iface,
+ GUID *pgdConnectionId )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ TRACE( "%p, %p\n", iface, pgdConnectionId );
+
+ *pgdConnectionId = connection->id;
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_GetAdapterId(
+ INetworkConnection *iface,
+ GUID *pgdAdapterId )
+{
+ struct connection *connection = impl_from_INetworkConnection( iface );
+
+ FIXME( "%p, %p\n", iface, pgdAdapterId );
+
+ *pgdAdapterId = connection->id;
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_GetDomainType(
+ INetworkConnection *iface,
+ NLM_DOMAIN_TYPE *pDomainType )
+{
+ FIXME( "%p, %p\n", iface, pDomainType );
+
+ *pDomainType = NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK;
+ return S_OK;
+}
+
+static const struct INetworkConnectionVtbl connection_vtbl =
+{
+ connection_QueryInterface,
+ connection_AddRef,
+ connection_Release,
+ connection_GetTypeInfoCount,
+ connection_GetTypeInfo,
+ connection_GetIDsOfNames,
+ connection_Invoke,
+ connection_GetNetwork,
+ connection_get_IsConnectedToInternet,
+ connection_get_IsConnected,
+ connection_GetConnectivity,
+ connection_GetConnectionId,
+ connection_GetAdapterId,
+ connection_GetDomainType
+};
+
+static struct connection *create_connection( const GUID *id )
+{
+ struct connection *ret;
+
+ if (!(ret = heap_alloc( sizeof(*ret) ))) return NULL;
+
+ ret->INetworkConnection_iface.lpVtbl = &connection_vtbl;
+ ret->refs = 1;
+ ret->id = *id;
+ ret->connected = VARIANT_FALSE;
+ ret->connected_to_internet = VARIANT_FALSE;
+ list_init( &ret->entry );
+
+ return ret;
+}
+
+static void init_networks( struct list_manager *mgr )
+{
+ DWORD size = 0;
+ IP_ADAPTER_ADDRESSES *buf, *aa;
+ GUID id;
+ ULONG ret, flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
+ GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_ALL_GATEWAYS;
+
+ list_init( &mgr->connections );
+
+ ret = GetAdaptersAddresses( WS_AF_UNSPEC, flags, NULL, NULL, &size );
+ if (ret != ERROR_BUFFER_OVERFLOW) return;
+
+ if (!(buf = heap_alloc( size ))) return;
+ if (GetAdaptersAddresses( WS_AF_UNSPEC, flags, NULL, buf, &size )) return;
+
+ memset( &id, 0, sizeof(id) );
+ for (aa = buf; aa; aa = aa->Next)
+ {
+ struct connection *connection;
+
+ id.Data1 = aa->IfIndex;
+
+ if (!(connection = create_connection( &id )))
+ goto done;
+
+ if (aa->FirstUnicastAddress)
+ {
+ connection->connected = VARIANT_TRUE;
+ }
+ if (aa->FirstGatewayAddress)
+ {
+ connection->connected_to_internet = VARIANT_TRUE;
+ }
+
+ list_add_tail( &mgr->connections, &connection->entry );
+ }
+
+done:
+ heap_free( buf );
+}
+
HRESULT list_manager_create( void **obj )
{
struct list_manager *mgr;
@@ -593,6 +865,7 @@ HRESULT list_manager_create( void **obj )
mgr->INetworkListManager_iface.lpVtbl = &list_manager_vtbl;
mgr->INetworkCostManager_iface.lpVtbl = &cost_manager_vtbl;
mgr->IConnectionPointContainer_iface.lpVtbl = &cpc_vtbl;
+ init_networks( mgr );
mgr->refs = 1;
*obj = &mgr->INetworkListManager_iface;
More information about the wine-cvs
mailing list