Module: wine Branch: master Commit: 2a28839ed8213ce3c3d4307372e3c98ff1c8d118 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a28839ed8213ce3c3d4307372...
Author: Damjan Jovanovic damjan.jov@gmail.com Date: Wed Sep 23 18:54:50 2009 +0200
sti: Add sti class factory.
---
dlls/sti/Makefile.in | 2 +- dlls/sti/sti.spec | 4 +- dlls/sti/sti_main.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 155 insertions(+), 6 deletions(-)
diff --git a/dlls/sti/Makefile.in b/dlls/sti/Makefile.in index 3167261..8405693 100644 --- a/dlls/sti/Makefile.in +++ b/dlls/sti/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = sti.dll IMPORTLIB = sti -IMPORTS = ole32 advapi32 kernel32 +IMPORTS = uuid ole32 advapi32 kernel32
C_SRCS = \ regsvr.c \ diff --git a/dlls/sti/sti.spec b/dlls/sti/sti.spec index 186f382..189af52 100644 --- a/dlls/sti/sti.spec +++ b/dlls/sti/sti.spec @@ -1,5 +1,5 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() @ stdcall StiCreateInstance(ptr long ptr ptr) diff --git a/dlls/sti/sti_main.c b/dlls/sti/sti_main.c index 1d4e6ad..c53d6bb 100644 --- a/dlls/sti/sti_main.c +++ b/dlls/sti/sti_main.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2002 Aric Stewart for CodeWeavers + * Copyright (C) 2009 Damjan Jovanovic * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,15 +19,163 @@
#include <stdarg.h>
+#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "winreg.h" #include "winerror.h" +#include "objbase.h" +#include "sti.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sti); + +typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); + +typedef struct +{ + const struct IClassFactoryVtbl *vtbl; + fnCreateInstance pfnCreateInstance; +} sti_cf; + +static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (sti_cf *)((char *)iface - FIELD_OFFSET( sti_cf, vtbl )); +} + +static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj ) +{ + if (pUnkOuter != NULL && !IsEqualIID(riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + if (IsEqualGUID(riid, &IID_IUnknown)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, pUnkOuter); + else if (IsEqualGUID(riid, &IID_IStillImageW)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, NULL); + else if (IsEqualGUID(riid, &IID_IStillImageA)) + return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION_REAL, (PSTIA*) ppObj, NULL); + else + { + FIXME("no interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } +} + +static HRESULT WINAPI sti_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 sti_cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI sti_cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI sti_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + sti_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( riid, 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 sti_cf_LockServer( IClassFactory *iface, BOOL dolock ) +{ + FIXME("(%p)->(%d)\n", iface, dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl sti_cf_vtbl = +{ + sti_cf_QueryInterface, + sti_cf_AddRef, + sti_cf_Release, + sti_cf_CreateInstance, + sti_cf_LockServer +}; + +static sti_cf the_sti_cf = { &sti_cf_vtbl, sti_create }; + +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); + + switch(fdwReason) { + case DLL_WINE_PREATTACH: + return FALSE; + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +/****************************************************************************** + * DllGetClassObject (STI.@) + */ +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) +{ + IClassFactory *cf = NULL; + + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); + + if (IsEqualGUID( rclsid, &CLSID_Sti )) + { + cf = (IClassFactory *)&the_sti_cf.vtbl; + } + + if (!cf) return CLASS_E_CLASSNOTAVAILABLE; + return IClassFactory_QueryInterface( cf, iid, ppv ); +} + +/****************************************************************************** + * DllCanUnloadNow (STI.@) + */ +HRESULT WINAPI DllCanUnloadNow( void ) +{ + FIXME("\n"); + return S_FALSE; +}
/****************************************************************************** * StiCreateInstance (STI.@) */ -HRESULT WINAPI StiCreateInstance( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI StiCreateInstance( HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter ) { return STG_E_UNIMPLEMENTEDFUNCTION; } @@ -34,7 +183,7 @@ HRESULT WINAPI StiCreateInstance( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) /****************************************************************************** * StiCreateInstanceA (STI.@) */ -HRESULT WINAPI StiCreateInstanceA( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI StiCreateInstanceA( HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter ) { return STG_E_UNIMPLEMENTEDFUNCTION; } @@ -42,7 +191,7 @@ HRESULT WINAPI StiCreateInstanceA( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) /****************************************************************************** * StiCreateInstanceW (STI.@) */ -HRESULT WINAPI StiCreateInstanceW( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI StiCreateInstanceW( HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter ) { return STG_E_UNIMPLEMENTEDFUNCTION; }