sti: add the sti class factory
Damjan Jovanovic
damjan.jov at gmail.com
Sat Sep 5 13:49:53 CDT 2009
Changelog:
* add the sti class factory
Damjan Jovanovic
-------------- next part --------------
diff --git a/dlls/sti/Makefile.in b/dlls/sti/Makefile.in
index 3167261..b0915ea 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 = ole32 advapi32 kernel32 uuid
C_SRCS = \
regsvr.c \
diff --git a/dlls/sti/regsvr.c b/dlls/sti/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..0fd2724 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, (PSTIW*) ppObj, pUnkOuter);
+ else if (IsEqualGUID(riid, &IID_IStillImageW))
+ return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION, (PSTIW*) ppObj, NULL);
+ else if (IsEqualGUID(riid, &IID_IStillImageA))
+ return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION, (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;
}
diff --git a/include/sti.h b/include/sti.h
index 56650f5..ce0a29e 100644
--- a/include/sti.h
+++ b/include/sti.h
@@ -31,6 +31,25 @@ extern "C" {
DEFINE_GUID(CLSID_Sti, 0xB323F8E0L, 0x2E68, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C);
+DEFINE_GUID(IID_IStillImageW, 0x641BD880, 0x2DC8, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C);
+
+DEFINE_GUID(IID_IStillImageA, 0xA7B1F740, 0x1D7F, 0x11D1, 0xAC, 0xA9, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48);
+
+#define STI_VERSION_REAL 0x00000002
+#define STI_VERSION_FLAG_UNICODE 0x01000000
+
+#ifdef UNICODE
+# define STI_VERSION (STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE)
+#else
+# define STI_VERSION (STI_VERSION_REAL)
+#endif
+
+typedef struct IStillImageA STIIMAGEA, *PSTIIMAGEA, STIA, *PSTIA;
+typedef struct IStillImageW STIIMAGEW, *PSTIIMAGEW, STIW, *PSTIW;
+
+HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter);
+HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter);
+
#ifdef __cplusplus
};
#endif
More information about the wine-patches
mailing list