From cc3fcf0a2d87d26a6373c458a439193090cc4d80 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 14 Nov 2007 16:39:02 +0000 Subject: [PATCH] inetcomm: Add a class factory for MimeBody. --- dlls/inetcomm/inetcomm_main.c | 97 ++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/dlls/inetcomm/inetcomm_main.c b/dlls/inetcomm/inetcomm_main.c index 952efcbb31e..81303b3aecf 100644 --- a/dlls/inetcomm/inetcomm_main.c +++ b/dlls/inetcomm/inetcomm_main.c @@ -25,6 +25,9 @@ #include "windef.h" #include "winbase.h" #include "winnt.h" +#include "winuser.h" +#include "ole2.h" +#include "mimeole.h" #include "inetcomm_private.h" @@ -54,14 +57,104 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } +/****************************************************************************** + * ClassFactory + */ +typedef struct +{ + const struct IClassFactoryVtbl *lpVtbl; + HRESULT (*create_object)(IUnknown *, void **); +} cf; + +static inline cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (cf *)((char*)iface - FIELD_OFFSET(cf, lpVtbl)); +} + +static HRESULT WINAPI 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 cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + cf *This = impl_from_IClassFactory( iface ); + HRESULT r; + IUnknown *punk; + + TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj ); + + *ppobj = NULL; + + r = This->create_object( pOuter, (LPVOID*) &punk ); + if (FAILED(r)) + return r; + + r = IUnknown_QueryInterface( punk, riid, ppobj ); + IUnknown_Release( punk ); + + return r; +} + +static HRESULT WINAPI cf_LockServer( IClassFactory *iface, BOOL dolock) +{ + FIXME("(%p)->(%d),stub!\n",iface,dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl cf_vtbl = +{ + cf_QueryInterface, + cf_AddRef, + cf_Release, + cf_CreateInstance, + cf_LockServer +}; + +static cf mime_body_cf = { &cf_vtbl, MimeBody_create }; + /*********************************************************************** * DllGetClassObject (INETCOMM.@) */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) { - FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); - return CLASS_E_CLASSNOTAVAILABLE; + IClassFactory *cf = NULL; + + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv ); + + if( IsEqualCLSID( rclsid, &CLSID_IMimeBody )) + { + cf = (IClassFactory*) &mime_body_cf.lpVtbl; + } + + if ( !cf ) + { + FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); + return CLASS_E_CLASSNOTAVAILABLE; + } + + return IClassFactory_QueryInterface( cf, iid, ppv ); } /***********************************************************************