Added some stubs for quartz dll.
[wine/multimedia.git] / dlls / quartz / main.c
blobd0f88d6dbdc593bf11c9e8efbdc4a00bfd10ea25
1 #include "config.h"
3 #include "windef.h"
4 #include "winerror.h"
5 #include "winbase.h"
6 #include "wingdi.h"
7 #include "ole2.h"
8 #include "strmif.h"
9 #include "uuids.h"
11 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(quartz);
14 #include "quartz_private.h"
15 #include "fgraph.h"
16 #include "sysclock.h"
17 #include "memalloc.h"
20 typedef struct QUARTZ_CLASSENTRY
22 const CLSID* pclsid;
23 QUARTZ_pCreateIUnknown pCreateIUnk;
24 } QUARTZ_CLASSENTRY;
27 static HRESULT WINAPI
28 IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj);
29 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface);
30 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface);
31 static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj);
32 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock);
34 static ICOM_VTABLE(IClassFactory) iclassfact =
36 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
37 IClassFactory_fnQueryInterface,
38 IClassFactory_fnAddRef,
39 IClassFactory_fnRelease,
40 IClassFactory_fnCreateInstance,
41 IClassFactory_fnLockServer
44 typedef struct
46 /* IUnknown fields */
47 ICOM_VFIELD(IClassFactory);
48 DWORD ref;
49 /* IClassFactory fields */
50 const QUARTZ_CLASSENTRY* pEntry;
51 } IClassFactoryImpl;
53 static const QUARTZ_CLASSENTRY QUARTZ_ClassList[] =
55 { &CLSID_FilterGraph, &QUARTZ_CreateFilterGraph },
56 { &CLSID_SystemClock, &QUARTZ_CreateSystemClock },
57 { &CLSID_MemoryAllocator, &QUARTZ_CreateMemoryAllocator },
58 { NULL, NULL },
61 /* per-process variables */
62 static CRITICAL_SECTION csHeap;
63 static DWORD dwClassObjRef;
64 static HANDLE hDLLHeap;
66 void* QUARTZ_AllocObj( DWORD dwSize )
68 void* pv;
70 EnterCriticalSection( &csHeap );
71 dwClassObjRef ++;
72 pv = HeapAlloc( hDLLHeap, 0, dwSize );
73 if ( pv == NULL )
74 dwClassObjRef --;
75 LeaveCriticalSection( &csHeap );
77 return pv;
80 void QUARTZ_FreeObj( void* pobj )
82 EnterCriticalSection( &csHeap );
83 HeapFree( hDLLHeap, 0, pobj );
84 dwClassObjRef --;
85 LeaveCriticalSection( &csHeap );
88 void* QUARTZ_AllocMem( DWORD dwSize )
90 return HeapAlloc( hDLLHeap, 0, dwSize );
93 void QUARTZ_FreeMem( void* pMem )
95 HeapFree( hDLLHeap, 0, pMem );
98 /************************************************************************/
100 static HRESULT WINAPI
101 IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
103 ICOM_THIS(IClassFactoryImpl,iface);
105 TRACE("(%p)->(%p,%p)\n",This,riid,ppobj);
106 if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) ||
107 ( IsEqualGUID( &IID_IClassFactory, riid ) ) )
109 *ppobj = iface;
110 IClassFactory_AddRef(iface);
111 return S_OK;
114 return E_NOINTERFACE;
117 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
119 ICOM_THIS(IClassFactoryImpl,iface);
121 TRACE("(%p)->()\n",This);
123 return ++(This->ref);
126 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
128 ICOM_THIS(IClassFactoryImpl,iface);
130 TRACE("(%p)->()\n",This);
131 if ( (--(This->ref)) > 0 )
132 return This->ref;
134 QUARTZ_FreeObj(This);
135 return 0;
138 static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj)
140 ICOM_THIS(IClassFactoryImpl,iface);
141 HRESULT hr;
142 IUnknown* punk;
144 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
146 if ( ppobj == NULL )
147 return E_POINTER;
149 *ppobj = NULL;
151 hr = (*This->pEntry->pCreateIUnk)(pOuter,(void**)&punk);
152 if ( hr != S_OK )
153 return hr;
155 hr = IUnknown_QueryInterface(punk,riid,ppobj);
156 IUnknown_Release(punk);
158 return hr;
161 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock)
163 ICOM_THIS(IClassFactoryImpl,iface);
164 HRESULT hr;
166 FIXME("(%p)->(%d),stub!\n",This,dolock);
167 if (dolock)
168 hr = IClassFactory_AddRef(iface);
169 else
170 hr = IClassFactory_Release(iface);
172 return hr;
177 static HRESULT IClassFactory_Alloc( const CLSID* pclsid, void** ppobj )
179 const QUARTZ_CLASSENTRY* pEntry;
180 IClassFactoryImpl* pImpl;
182 TRACE( "(%s,%p)\n", debugstr_guid(pclsid), ppobj );
184 pEntry = QUARTZ_ClassList;
185 while ( pEntry->pclsid != NULL )
187 if ( IsEqualGUID( pclsid, pEntry->pclsid ) )
188 goto found;
191 return CLASS_E_CLASSNOTAVAILABLE;
192 found:
193 pImpl = (IClassFactoryImpl*)QUARTZ_AllocObj( sizeof(IClassFactoryImpl) );
194 if ( pImpl == NULL )
195 return E_OUTOFMEMORY;
197 ICOM_VTBL(pImpl) = &iclassfact;
198 pImpl->ref = 1;
199 pImpl->pEntry = pEntry;
201 *ppobj = (void*)pImpl;
202 return S_OK;
206 /***********************************************************************
207 * QUARTZ_InitProcess (internal)
209 static BOOL QUARTZ_InitProcess( void )
211 TRACE("()\n");
213 dwClassObjRef = 0;
214 hDLLHeap = (HANDLE)NULL;
215 InitializeCriticalSection( &csHeap );
217 hDLLHeap = HeapCreate( 0, 0x10000, 0 );
218 if ( hDLLHeap == (HANDLE)NULL )
219 return FALSE;
221 return TRUE;
224 /***********************************************************************
225 * QUARTZ_UninitProcess (internal)
227 static void QUARTZ_UninitProcess( void )
229 TRACE("()\n");
231 if ( dwClassObjRef != 0 )
232 ERR( "you must release some objects allocated from quartz.\n" );
233 if ( hDLLHeap != (HANDLE)NULL )
235 HeapDestroy( hDLLHeap );
236 hDLLHeap = (HANDLE)NULL;
238 DeleteCriticalSection( &csHeap );
241 /***********************************************************************
242 * QUARTZ_DllMain
244 BOOL WINAPI QUARTZ_DllMain(
245 HINSTANCE hInstDLL,
246 DWORD fdwReason,
247 LPVOID lpvReserved )
249 switch ( fdwReason )
251 case DLL_PROCESS_ATTACH:
252 if ( !QUARTZ_InitProcess() )
253 return FALSE;
254 break;
255 case DLL_PROCESS_DETACH:
256 QUARTZ_UninitProcess();
257 break;
258 case DLL_THREAD_ATTACH:
259 break;
260 case DLL_THREAD_DETACH:
261 break;
264 return TRUE;
268 /***********************************************************************
269 * DllCanUnloadNow (QUARTZ.@)
271 * RETURNS
272 * Success: S_OK
273 * Failure: S_FALSE
275 HRESULT WINAPI QUARTZ_DllCanUnloadNow(void)
277 HRESULT hr;
279 EnterCriticalSection( &csHeap );
280 hr = ( dwClassObjRef == 0 ) ? S_OK : S_FALSE;
281 LeaveCriticalSection( &csHeap );
283 return hr;
286 /***********************************************************************
287 * DllGetClassObject (QUARTZ.@)
289 HRESULT WINAPI QUARTZ_DllGetClassObject(
290 const CLSID* pclsid,const IID* piid,void** ppv)
292 *ppv = NULL;
293 if ( IsEqualCLSID( &IID_IUnknown, piid ) ||
294 IsEqualCLSID( &IID_IClassFactory, piid ) )
296 return IClassFactory_Alloc( pclsid, ppv );
299 return CLASS_E_CLASSNOTAVAILABLE;
302 /***********************************************************************
303 * DllRegisterServer (QUARTZ.@)
306 HRESULT WINAPI QUARTZ_DllRegisterServer( void )
308 FIXME( "(): stub\n" );
309 return E_FAIL;
312 /***********************************************************************
313 * DllUnregisterServer (QUARTZ.@)
316 HRESULT WINAPI QUARTZ_DllUnregisterServer( void )
318 FIXME( "(): stub\n" );
319 return E_FAIL;