* Sync up to trunk HEAD (r62286).
[reactos.git] / dll / win32 / sti / sti_main.c
1 /*
2 * Copyright (C) 2002 Aric Stewart for CodeWeavers
3 * Copyright (C) 2009 Damjan Jovanovic
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20 #include "precomp.h"
21
22 extern HRESULT WINAPI STI_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN;
23 extern BOOL WINAPI STI_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN;
24 extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN;
25 extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN;
26
27 typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj);
28
29 typedef struct
30 {
31 IClassFactory IClassFactory_iface;
32 fnCreateInstance pfnCreateInstance;
33 } sti_cf;
34
35 static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface )
36 {
37 return CONTAINING_RECORD(iface, sti_cf, IClassFactory_iface);
38 }
39
40 static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj )
41 {
42 if (pUnkOuter != NULL && !IsEqualIID(riid, &IID_IUnknown))
43 return CLASS_E_NOAGGREGATION;
44
45 if (IsEqualGUID(riid, &IID_IUnknown))
46 return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, pUnkOuter);
47 else if (IsEqualGUID(riid, &IID_IStillImageW))
48 return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, NULL);
49 else if (IsEqualGUID(riid, &IID_IStillImageA))
50 return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION_REAL, (PSTIA*) ppObj, NULL);
51 else
52 {
53 FIXME("no interface %s\n", debugstr_guid(riid));
54 return E_NOINTERFACE;
55 }
56 }
57
58 static HRESULT WINAPI sti_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
59 {
60 if (IsEqualGUID(riid, &IID_IUnknown) ||
61 IsEqualGUID(riid, &IID_IClassFactory))
62 {
63 IClassFactory_AddRef( iface );
64 *ppobj = iface;
65 return S_OK;
66 }
67 FIXME("interface %s not implemented\n", debugstr_guid(riid));
68 return E_NOINTERFACE;
69 }
70
71 static ULONG WINAPI sti_cf_AddRef( IClassFactory *iface )
72 {
73 return 2;
74 }
75
76 static ULONG WINAPI sti_cf_Release( IClassFactory *iface )
77 {
78 return 1;
79 }
80
81 static HRESULT WINAPI sti_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
82 REFIID riid, LPVOID *ppobj )
83 {
84 sti_cf *This = impl_from_IClassFactory( iface );
85 HRESULT r;
86 IUnknown *punk;
87
88 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj);
89
90 *ppobj = NULL;
91
92 r = This->pfnCreateInstance( riid, pOuter, (LPVOID *)&punk );
93 if (FAILED(r))
94 return r;
95
96 r = IUnknown_QueryInterface( punk, riid, ppobj );
97 if (FAILED(r))
98 return r;
99
100 IUnknown_Release( punk );
101 return r;
102 }
103
104 static HRESULT WINAPI sti_cf_LockServer( IClassFactory *iface, BOOL dolock )
105 {
106 FIXME("(%p)->(%d)\n", iface, dolock);
107 return S_OK;
108 }
109
110 static const struct IClassFactoryVtbl sti_cf_vtbl =
111 {
112 sti_cf_QueryInterface,
113 sti_cf_AddRef,
114 sti_cf_Release,
115 sti_cf_CreateInstance,
116 sti_cf_LockServer
117 };
118
119 static sti_cf the_sti_cf = { { &sti_cf_vtbl }, sti_create };
120
121 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
122 {
123 TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved);
124
125 if (fdwReason == DLL_WINE_PREATTACH)
126 return FALSE;
127 return STI_DllMain(hInstDLL, fdwReason, lpvReserved);
128 }
129
130 /******************************************************************************
131 * DllGetClassObject (STI.@)
132 */
133 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
134 {
135 IClassFactory *cf = NULL;
136
137 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
138
139 if (IsEqualGUID( rclsid, &CLSID_Sti ))
140 {
141 cf = &the_sti_cf.IClassFactory_iface;
142 }
143
144 if (cf)
145 return IClassFactory_QueryInterface( cf, iid, ppv );
146 return STI_DllGetClassObject( rclsid, iid, ppv );
147 }
148
149 /******************************************************************************
150 * DllCanUnloadNow (STI.@)
151 */
152 HRESULT WINAPI DllCanUnloadNow( void )
153 {
154 return S_FALSE;
155 }
156
157 /***********************************************************************
158 * DllRegisterServer (STI.@)
159 */
160 HRESULT WINAPI DllRegisterServer(void)
161 {
162 return STI_DllRegisterServer();
163 }
164
165 /***********************************************************************
166 * DllUnRegisterServer (STI.@)
167 */
168 HRESULT WINAPI DllUnregisterServer(void)
169 {
170 return STI_DllUnregisterServer();
171 }