source: trunk/src/quartz/main.c@ 6649

Last change on this file since 6649 was 6649, checked in by bird, 24 years ago

Added $Id:$ keyword.

File size: 7.3 KB
Line 
1/* $Id: main.c,v 1.3 2001-09-05 13:36:37 bird Exp $ */
2
3#include "config.h"
4
5#include "windef.h"
6#include "winerror.h"
7#include "winbase.h"
8#include "wingdi.h"
9#include "ole2.h"
10#include "wine/obj_oleaut.h"
11#include "strmif.h"
12#include "control.h"
13#include "uuids.h"
14
15#include "debugtools.h"
16DEFAULT_DEBUG_CHANNEL(quartz);
17
18#include "quartz_private.h"
19#include "fgraph.h"
20#include "sysclock.h"
21#include "memalloc.h"
22
23
24typedef struct QUARTZ_CLASSENTRY
25{
26 const CLSID* pclsid;
27 QUARTZ_pCreateIUnknown pCreateIUnk;
28} QUARTZ_CLASSENTRY;
29
30
31static HRESULT WINAPI
32IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj);
33static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface);
34static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface);
35static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj);
36static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock);
37
38static ICOM_VTABLE(IClassFactory) iclassfact =
39{
40 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
41 IClassFactory_fnQueryInterface,
42 IClassFactory_fnAddRef,
43 IClassFactory_fnRelease,
44 IClassFactory_fnCreateInstance,
45 IClassFactory_fnLockServer
46};
47
48typedef struct
49{
50 /* IUnknown fields */
51 ICOM_VFIELD(IClassFactory);
52 DWORD ref;
53 /* IClassFactory fields */
54 const QUARTZ_CLASSENTRY* pEntry;
55} IClassFactoryImpl;
56
57static const QUARTZ_CLASSENTRY QUARTZ_ClassList[] =
58{
59 { &CLSID_FilterGraph, &QUARTZ_CreateFilterGraph },
60 { &CLSID_SystemClock, &QUARTZ_CreateSystemClock },
61 { &CLSID_MemoryAllocator, &QUARTZ_CreateMemoryAllocator },
62 { NULL, NULL },
63};
64
65/* per-process variables */
66static CRITICAL_SECTION csHeap;
67static DWORD dwClassObjRef;
68static HANDLE hDLLHeap;
69
70void* QUARTZ_AllocObj( DWORD dwSize )
71{
72 void* pv;
73
74 EnterCriticalSection( &csHeap );
75 dwClassObjRef ++;
76 pv = HeapAlloc( hDLLHeap, 0, dwSize );
77 if ( pv == NULL )
78 dwClassObjRef --;
79 LeaveCriticalSection( &csHeap );
80
81 return pv;
82}
83
84void QUARTZ_FreeObj( void* pobj )
85{
86 EnterCriticalSection( &csHeap );
87 HeapFree( hDLLHeap, 0, pobj );
88 dwClassObjRef --;
89 LeaveCriticalSection( &csHeap );
90}
91
92void* QUARTZ_AllocMem( DWORD dwSize )
93{
94 return HeapAlloc( hDLLHeap, 0, dwSize );
95}
96
97void QUARTZ_FreeMem( void* pMem )
98{
99 HeapFree( hDLLHeap, 0, pMem );
100}
101
102/************************************************************************/
103
104static HRESULT WINAPI
105IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
106{
107 ICOM_THIS(IClassFactoryImpl,iface);
108
109 TRACE("(%p)->(%p,%p)\n",This,riid,ppobj);
110 if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) ||
111 ( IsEqualGUID( &IID_IClassFactory, riid ) ) )
112 {
113 *ppobj = iface;
114 IClassFactory_AddRef(iface);
115 return S_OK;
116 }
117
118 return E_NOINTERFACE;
119}
120
121static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
122{
123 ICOM_THIS(IClassFactoryImpl,iface);
124
125 TRACE("(%p)->()\n",This);
126
127 return ++(This->ref);
128}
129
130static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
131{
132 ICOM_THIS(IClassFactoryImpl,iface);
133
134 TRACE("(%p)->()\n",This);
135 if ( (--(This->ref)) > 0 )
136 return This->ref;
137
138 QUARTZ_FreeObj(This);
139 return 0;
140}
141
142static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj)
143{
144 ICOM_THIS(IClassFactoryImpl,iface);
145 HRESULT hr;
146 IUnknown* punk;
147
148 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
149
150 if ( ppobj == NULL )
151 return E_POINTER;
152 if ( pOuter != NULL && !IsEqualGUID( riid, &IID_IUnknown ) )
153 return CLASS_E_NOAGGREGATION;
154
155 *ppobj = NULL;
156
157 hr = (*This->pEntry->pCreateIUnk)(pOuter,(void**)&punk);
158 if ( hr != S_OK )
159 return hr;
160
161 hr = IUnknown_QueryInterface(punk,riid,ppobj);
162 IUnknown_Release(punk);
163
164 return hr;
165}
166
167static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock)
168{
169 ICOM_THIS(IClassFactoryImpl,iface);
170 HRESULT hr;
171
172 FIXME("(%p)->(%d),stub!\n",This,dolock);
173 if (dolock)
174 hr = IClassFactory_AddRef(iface);
175 else
176 hr = IClassFactory_Release(iface);
177
178 return hr;
179}
180
181
182
183static HRESULT IClassFactory_Alloc( const CLSID* pclsid, void** ppobj )
184{
185 const QUARTZ_CLASSENTRY* pEntry;
186 IClassFactoryImpl* pImpl;
187
188 TRACE( "(%s,%p)\n", debugstr_guid(pclsid), ppobj );
189
190 pEntry = QUARTZ_ClassList;
191 while ( pEntry->pclsid != NULL )
192 {
193 if ( IsEqualGUID( pclsid, pEntry->pclsid ) )
194 goto found;
195 }
196
197 return CLASS_E_CLASSNOTAVAILABLE;
198found:
199 pImpl = (IClassFactoryImpl*)QUARTZ_AllocObj( sizeof(IClassFactoryImpl) );
200 if ( pImpl == NULL )
201 return E_OUTOFMEMORY;
202
203 ICOM_VTBL(pImpl) = &iclassfact;
204 pImpl->ref = 1;
205 pImpl->pEntry = pEntry;
206
207 *ppobj = (void*)pImpl;
208 return S_OK;
209}
210
211
212/***********************************************************************
213 * QUARTZ_InitProcess (internal)
214 */
215static BOOL QUARTZ_InitProcess( void )
216{
217 TRACE("()\n");
218
219 dwClassObjRef = 0;
220 hDLLHeap = (HANDLE)NULL;
221 InitializeCriticalSection( &csHeap );
222
223 hDLLHeap = HeapCreate( 0, 0x10000, 0 );
224 if ( hDLLHeap == (HANDLE)NULL )
225 return FALSE;
226
227 return TRUE;
228}
229
230/***********************************************************************
231 * QUARTZ_UninitProcess (internal)
232 */
233static void QUARTZ_UninitProcess( void )
234{
235 TRACE("()\n");
236
237 if ( dwClassObjRef != 0 )
238 ERR( "you must release some objects allocated from quartz.\n" );
239 if ( hDLLHeap != (HANDLE)NULL )
240 {
241 HeapDestroy( hDLLHeap );
242 hDLLHeap = (HANDLE)NULL;
243 }
244 DeleteCriticalSection( &csHeap );
245}
246
247/***********************************************************************
248 * QUARTZ_DllMain
249 */
250BOOL WINAPI QUARTZ_DllMain(
251 HINSTANCE hInstDLL,
252 DWORD fdwReason,
253 LPVOID lpvReserved )
254{
255 switch ( fdwReason )
256 {
257 case DLL_PROCESS_ATTACH:
258 if ( !QUARTZ_InitProcess() )
259 return FALSE;
260 break;
261 case DLL_PROCESS_DETACH:
262 QUARTZ_UninitProcess();
263 break;
264 case DLL_THREAD_ATTACH:
265 break;
266 case DLL_THREAD_DETACH:
267 break;
268 }
269
270 return TRUE;
271}
272
273
274/***********************************************************************
275 * DllCanUnloadNow (QUARTZ.@)
276 *
277 * RETURNS
278 * Success: S_OK
279 * Failure: S_FALSE
280 */
281HRESULT WINAPI QUARTZ_DllCanUnloadNow(void)
282{
283 HRESULT hr;
284
285 EnterCriticalSection( &csHeap );
286 hr = ( dwClassObjRef == 0 ) ? S_OK : S_FALSE;
287 LeaveCriticalSection( &csHeap );
288
289 return hr;
290}
291
292/***********************************************************************
293 * DllGetClassObject (QUARTZ.@)
294 */
295HRESULT WINAPI QUARTZ_DllGetClassObject(
296 const CLSID* pclsid,const IID* piid,void** ppv)
297{
298 *ppv = NULL;
299 if ( IsEqualCLSID( &IID_IUnknown, piid ) ||
300 IsEqualCLSID( &IID_IClassFactory, piid ) )
301 {
302 return IClassFactory_Alloc( pclsid, ppv );
303 }
304
305 return CLASS_E_CLASSNOTAVAILABLE;
306}
307
308/***********************************************************************
309 * DllRegisterServer (QUARTZ.@)
310 */
311
312HRESULT WINAPI QUARTZ_DllRegisterServer( void )
313{
314 FIXME( "(): stub\n" );
315 return E_FAIL;
316}
317
318/***********************************************************************
319 * DllUnregisterServer (QUARTZ.@)
320 */
321
322HRESULT WINAPI QUARTZ_DllUnregisterServer( void )
323{
324 FIXME( "(): stub\n" );
325 return E_FAIL;
326}
327
Note: See TracBrowser for help on using the repository browser.