Module: wine Branch: master Commit: 5fd74fb4a02336c50146cca04c88b30debca7940 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5fd74fb4a02336c50146cca04c...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Jul 30 11:15:38 2009 +0200
hnetcfg: Add class factory.
---
dlls/hnetcfg/hnetcfg.c | 121 ++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 103 insertions(+), 18 deletions(-)
diff --git a/dlls/hnetcfg/hnetcfg.c b/dlls/hnetcfg/hnetcfg.c index 3487bc3..59fa2d5 100644 --- a/dlls/hnetcfg/hnetcfg.c +++ b/dlls/hnetcfg/hnetcfg.c @@ -18,13 +18,98 @@
#include <stdarg.h>
+#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "objbase.h" +#include "netfw.h" + #include "wine/debug.h" +#include "hnetcfg_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj ); + +typedef struct +{ + const struct IClassFactoryVtbl *vtbl; + fnCreateInstance pfnCreateInstance; +} hnetcfg_cf; + +static inline hnetcfg_cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (hnetcfg_cf *)((char *)iface - FIELD_OFFSET( hnetcfg_cf, vtbl )); +} + +static HRESULT WINAPI hnetcfg_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) +{ + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + IClassFactory_AddRef( iface ); + *ppobj = iface; + return S_OK; + } + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI hnetcfg_cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI hnetcfg_cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI hnetcfg_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + hnetcfg_cf *This = impl_from_IClassFactory( iface ); + HRESULT r; + IUnknown *punk; + + TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if (pOuter) + return CLASS_E_NOAGGREGATION; + + r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk ); + if (FAILED(r)) + return r; + + r = IUnknown_QueryInterface( punk, riid, ppobj ); + if (FAILED(r)) + return r; + + IUnknown_Release( punk ); + return r; +} + +static HRESULT WINAPI hnetcfg_cf_LockServer( IClassFactory *iface, BOOL dolock ) +{ + FIXME("(%p)->(%d)\n", iface, dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl hnetcfg_cf_vtbl = +{ + hnetcfg_cf_QueryInterface, + hnetcfg_cf_AddRef, + hnetcfg_cf_Release, + hnetcfg_cf_CreateInstance, + hnetcfg_cf_LockServer +}; + +static hnetcfg_cf fw_manager_cf = { &hnetcfg_cf_vtbl, NetFwMgr_create }; +static hnetcfg_cf fw_app_cf = { &hnetcfg_cf_vtbl, NetFwAuthorizedApplication_create }; + BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); @@ -41,29 +126,29 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; }
-/****************************************************************** - * DllCanUnloadNow (HNETCFG.@) - * - * - */ -HRESULT WINAPI DllCanUnloadNow(void) +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) { - FIXME(":stub\n"); - return S_OK; -} + IClassFactory *cf = NULL;
+ TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
-/****************************************************************** - * DllGetClassObject (HNETCFG.@) - * - * - */ -HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) -{ + if (IsEqualGUID( rclsid, &CLSID_NetFwMgr )) + { + cf = (IClassFactory *)&fw_manager_cf.vtbl; + } + else if (IsEqualGUID( rclsid, &CLSID_NetFwAuthorizedApplication )) + { + cf = (IClassFactory *)&fw_app_cf.vtbl; + }
- FIXME("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + if (!cf) return CLASS_E_CLASSNOTAVAILABLE; + return IClassFactory_QueryInterface( cf, iid, ppv ); +}
- return E_NOINTERFACE; +HRESULT WINAPI DllCanUnloadNow( void ) +{ + FIXME("\n"); + return S_FALSE; }
/******************************************************************