11 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(quartz
);
14 #include "quartz_private.h"
20 typedef struct QUARTZ_CLASSENTRY
23 QUARTZ_pCreateIUnknown pCreateIUnk
;
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
47 ICOM_VFIELD(IClassFactory
);
49 /* IClassFactory fields */
50 const QUARTZ_CLASSENTRY
* pEntry
;
53 static const QUARTZ_CLASSENTRY QUARTZ_ClassList
[] =
55 { &CLSID_FilterGraph
, &QUARTZ_CreateFilterGraph
},
56 { &CLSID_SystemClock
, &QUARTZ_CreateSystemClock
},
57 { &CLSID_MemoryAllocator
, &QUARTZ_CreateMemoryAllocator
},
61 /* per-process variables */
62 static CRITICAL_SECTION csHeap
;
63 static DWORD dwClassObjRef
;
64 static HANDLE hDLLHeap
;
66 void* QUARTZ_AllocObj( DWORD dwSize
)
70 EnterCriticalSection( &csHeap
);
72 pv
= HeapAlloc( hDLLHeap
, 0, dwSize
);
75 LeaveCriticalSection( &csHeap
);
80 void QUARTZ_FreeObj( void* pobj
)
82 EnterCriticalSection( &csHeap
);
83 HeapFree( hDLLHeap
, 0, pobj
);
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
) ) )
110 IClassFactory_AddRef(iface
);
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 )
134 QUARTZ_FreeObj(This
);
138 static HRESULT WINAPI
IClassFactory_fnCreateInstance(LPCLASSFACTORY iface
,LPUNKNOWN pOuter
,REFIID riid
,LPVOID
*ppobj
)
140 ICOM_THIS(IClassFactoryImpl
,iface
);
144 TRACE("(%p)->(%p,%s,%p)\n",This
,pOuter
,debugstr_guid(riid
),ppobj
);
151 hr
= (*This
->pEntry
->pCreateIUnk
)(pOuter
,(void**)&punk
);
155 hr
= IUnknown_QueryInterface(punk
,riid
,ppobj
);
156 IUnknown_Release(punk
);
161 static HRESULT WINAPI
IClassFactory_fnLockServer(LPCLASSFACTORY iface
,BOOL dolock
)
163 ICOM_THIS(IClassFactoryImpl
,iface
);
166 FIXME("(%p)->(%d),stub!\n",This
,dolock
);
168 hr
= IClassFactory_AddRef(iface
);
170 hr
= IClassFactory_Release(iface
);
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
) )
191 return CLASS_E_CLASSNOTAVAILABLE
;
193 pImpl
= (IClassFactoryImpl
*)QUARTZ_AllocObj( sizeof(IClassFactoryImpl
) );
195 return E_OUTOFMEMORY
;
197 ICOM_VTBL(pImpl
) = &iclassfact
;
199 pImpl
->pEntry
= pEntry
;
201 *ppobj
= (void*)pImpl
;
206 /***********************************************************************
207 * QUARTZ_InitProcess (internal)
209 static BOOL
QUARTZ_InitProcess( void )
214 hDLLHeap
= (HANDLE
)NULL
;
215 InitializeCriticalSection( &csHeap
);
217 hDLLHeap
= HeapCreate( 0, 0x10000, 0 );
218 if ( hDLLHeap
== (HANDLE
)NULL
)
224 /***********************************************************************
225 * QUARTZ_UninitProcess (internal)
227 static void QUARTZ_UninitProcess( void )
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 /***********************************************************************
244 BOOL WINAPI
QUARTZ_DllMain(
251 case DLL_PROCESS_ATTACH
:
252 if ( !QUARTZ_InitProcess() )
255 case DLL_PROCESS_DETACH
:
256 QUARTZ_UninitProcess();
258 case DLL_THREAD_ATTACH
:
260 case DLL_THREAD_DETACH
:
268 /***********************************************************************
269 * DllCanUnloadNow (QUARTZ.@)
275 HRESULT WINAPI
QUARTZ_DllCanUnloadNow(void)
279 EnterCriticalSection( &csHeap
);
280 hr
= ( dwClassObjRef
== 0 ) ? S_OK
: S_FALSE
;
281 LeaveCriticalSection( &csHeap
);
286 /***********************************************************************
287 * DllGetClassObject (QUARTZ.@)
289 HRESULT WINAPI
QUARTZ_DllGetClassObject(
290 const CLSID
* pclsid
,const IID
* piid
,void** ppv
)
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" );
312 /***********************************************************************
313 * DllUnregisterServer (QUARTZ.@)
316 HRESULT WINAPI
QUARTZ_DllUnregisterServer( void )
318 FIXME( "(): stub\n" );