/* * Copyright 2014 Hans Leidekker for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #define COBJMACROS #include "config.h" #include #include "windef.h" #include "winbase.h" #include "initguid.h" #include "objbase.h" #include "ocidl.h" #include "netlistmgr.h" #include "wine/debug.h" #include "netprofm_private.h" WINE_DEFAULT_DEBUG_CHANNEL(netprofm); struct list_manager { INetworkListManager INetworkListManager_iface; INetworkCostManager INetworkCostManager_iface; IConnectionPointContainer IConnectionPointContainer_iface; LONG refs; }; static inline struct list_manager *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface) { return CONTAINING_RECORD(iface, struct list_manager, IConnectionPointContainer_iface); } static inline struct list_manager *impl_from_INetworkCostManager( INetworkCostManager *iface ) { return CONTAINING_RECORD( iface, struct list_manager, INetworkCostManager_iface ); } static HRESULT WINAPI cost_manager_QueryInterface( INetworkCostManager *iface, REFIID riid, void **obj ) { struct list_manager *mgr = impl_from_INetworkCostManager( iface ); return INetworkListManager_QueryInterface( &mgr->INetworkListManager_iface, riid, obj ); } static ULONG WINAPI cost_manager_AddRef( INetworkCostManager *iface ) { struct list_manager *mgr = impl_from_INetworkCostManager( iface ); return INetworkListManager_AddRef( &mgr->INetworkListManager_iface ); } static ULONG WINAPI cost_manager_Release( INetworkCostManager *iface ) { struct list_manager *mgr = impl_from_INetworkCostManager( iface ); return INetworkListManager_Release( &mgr->INetworkListManager_iface ); } static HRESULT WINAPI cost_manager_GetCost( INetworkCostManager *iface, DWORD *pCost, NLM_SOCKADDR *pDestIPAddr) { FIXME( "%p, %p, %p\n", iface, pCost, pDestIPAddr ); if (!pCost) return E_POINTER; *pCost = NLM_CONNECTION_COST_UNRESTRICTED; return S_OK; } static HRESULT WINAPI cost_manager_GetDataPlanStatus( INetworkCostManager *iface, NLM_DATAPLAN_STATUS *pDataPlanStatus, NLM_SOCKADDR *pDestIPAddr) { FIXME( "%p, %p, %p\n", iface, pDataPlanStatus, pDestIPAddr ); return E_NOTIMPL; } static HRESULT WINAPI cost_manager_SetDestinationAddresses( INetworkCostManager *iface, UINT32 length, NLM_SOCKADDR *pDestIPAddrList, VARIANT_BOOL bAppend) { FIXME( "%p, %u, %p, %x\n", iface, length, pDestIPAddrList, bAppend ); return E_NOTIMPL; } static const INetworkCostManagerVtbl cost_manager_vtbl = { cost_manager_QueryInterface, cost_manager_AddRef, cost_manager_Release, cost_manager_GetCost, cost_manager_GetDataPlanStatus, cost_manager_SetDestinationAddresses }; static inline struct list_manager *impl_from_INetworkListManager( INetworkListManager *iface ) { return CONTAINING_RECORD( iface, struct list_manager, INetworkListManager_iface ); } static ULONG WINAPI list_manager_AddRef( INetworkListManager *iface ) { struct list_manager *mgr = impl_from_INetworkListManager( iface ); return InterlockedIncrement( &mgr->refs ); } static ULONG WINAPI list_manager_Release( INetworkListManager *iface ) { struct list_manager *mgr = impl_from_INetworkListManager( iface ); LONG refs = InterlockedDecrement( &mgr->refs ); if (!refs) { TRACE( "destroying %p\n", mgr ); HeapFree( GetProcessHeap(), 0, mgr ); } return refs; } static HRESULT WINAPI list_manager_QueryInterface( INetworkListManager *iface, REFIID riid, void **obj ) { struct list_manager *mgr = impl_from_INetworkListManager( iface ); TRACE( "%p, %s, %p\n", mgr, debugstr_guid(riid), obj ); if (IsEqualGUID( riid, &IID_INetworkListManager ) || IsEqualGUID( riid, &IID_IUnknown )) { *obj = iface; } else if (IsEqualGUID( riid, &IID_INetworkCostManager )) { *obj = &mgr->INetworkCostManager_iface; } else if (IsEqualGUID( riid, &IID_IConnectionPointContainer )) { *obj = &mgr->IConnectionPointContainer_iface; } else { FIXME( "interface %s not implemented\n", debugstr_guid(riid) ); return E_NOINTERFACE; } INetworkListManager_AddRef( iface ); return S_OK; } static HRESULT WINAPI list_manager_GetTypeInfoCount( INetworkListManager *iface, UINT *count ) { FIXME("\n"); return E_NOTIMPL; } static HRESULT WINAPI list_manager_GetTypeInfo( INetworkListManager *iface, UINT index, LCID lcid, ITypeInfo **info ) { FIXME("\n"); return E_NOTIMPL; } static HRESULT WINAPI list_manager_GetIDsOfNames( INetworkListManager *iface, REFIID riid, LPOLESTR *names, UINT count, LCID lcid, DISPID *dispid ) { FIXME("\n"); return E_NOTIMPL; } static HRESULT WINAPI list_manager_Invoke( INetworkListManager *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 list_manager_GetNetworks( INetworkListManager *iface, NLM_ENUM_NETWORK Flags, IEnumNetworks **ppEnumNetwork ) { FIXME( "%p, %x, %p\n", iface, Flags, ppEnumNetwork ); return E_NOTIMPL; } static HRESULT WINAPI list_manager_GetNetwork( INetworkListManager *iface, GUID gdNetworkId, INetwork **ppNetwork ) { FIXME( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkId), ppNetwork ); return E_NOTIMPL; } static HRESULT WINAPI list_manager_GetNetworkConnections( INetworkListManager *iface, IEnumNetworkConnections **ppEnum ) { FIXME( "%p, %p\n", iface, ppEnum ); return E_NOTIMPL; } static HRESULT WINAPI list_manager_GetNetworkConnection( INetworkListManager *iface, GUID gdNetworkConnectionId, INetworkConnection **ppNetworkConnection ) { FIXME( "%p, %s, %p\n", iface, debugstr_guid(&gdNetworkConnectionId), ppNetworkConnection ); return E_NOTIMPL; } static HRESULT WINAPI list_manager_IsConnectedToInternet( INetworkListManager *iface, VARIANT_BOOL *pbIsConnected ) { FIXME( "%p, %p\n", iface, pbIsConnected ); *pbIsConnected = VARIANT_TRUE; return S_OK; } static HRESULT WINAPI list_manager_IsConnected( INetworkListManager *iface, VARIANT_BOOL *pbIsConnected ) { FIXME( "%p, %p\n", iface, pbIsConnected ); *pbIsConnected = VARIANT_TRUE; return S_OK; } static HRESULT WINAPI list_manager_GetConnectivity( INetworkListManager *iface, NLM_CONNECTIVITY *pConnectivity ) { FIXME( "%p, %p\n", iface, pConnectivity ); *pConnectivity = NLM_CONNECTIVITY_IPV4_INTERNET; return S_OK; } static const INetworkListManagerVtbl list_manager_vtbl = { list_manager_QueryInterface, list_manager_AddRef, list_manager_Release, list_manager_GetTypeInfoCount, list_manager_GetTypeInfo, list_manager_GetIDsOfNames, list_manager_Invoke, list_manager_GetNetworks, list_manager_GetNetwork, list_manager_GetNetworkConnections, list_manager_GetNetworkConnection, list_manager_IsConnectedToInternet, list_manager_IsConnected, list_manager_GetConnectivity }; static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID riid, void **ppv) { struct list_manager *This = impl_from_IConnectionPointContainer( iface ); return INetworkListManager_QueryInterface(&This->INetworkListManager_iface, riid, ppv); } static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) { struct list_manager *This = impl_from_IConnectionPointContainer( iface ); return INetworkListManager_AddRef(&This->INetworkListManager_iface); } static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) { struct list_manager *This = impl_from_IConnectionPointContainer( iface ); return INetworkListManager_Release(&This->INetworkListManager_iface); } static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, IEnumConnectionPoints **ppEnum) { struct list_manager *This = impl_from_IConnectionPointContainer( iface ); FIXME("(%p)->(%p): stub\n", This, ppEnum); return E_NOTIMPL; } static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, IConnectionPoint **cp) { struct list_manager *This = impl_from_IConnectionPointContainer( iface ); FIXME("(%p)->(%s %p): stub\n", This, debugstr_guid(riid), cp); return E_NOTIMPL; } static const struct IConnectionPointContainerVtbl cpc_vtbl = { ConnectionPointContainer_QueryInterface, ConnectionPointContainer_AddRef, ConnectionPointContainer_Release, ConnectionPointContainer_EnumConnectionPoints, ConnectionPointContainer_FindConnectionPoint }; HRESULT list_manager_create( void **obj ) { struct list_manager *mgr; TRACE( "%p\n", obj ); if (!(mgr = HeapAlloc( GetProcessHeap(), 0, sizeof(*mgr) ))) return E_OUTOFMEMORY; mgr->INetworkListManager_iface.lpVtbl = &list_manager_vtbl; mgr->INetworkCostManager_iface.lpVtbl = &cost_manager_vtbl; mgr->IConnectionPointContainer_iface.lpVtbl = &cpc_vtbl; mgr->refs = 1; *obj = &mgr->INetworkListManager_iface; TRACE( "returning iface %p\n", *obj ); return S_OK; }