Ignore:
Timestamp:
Sep 5, 2001, 3:39:12 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/quartz/main.c

    r6578 r6649  
     1/* $Id: main.c,v 1.3 2001-09-05 13:36:37 bird Exp $ */
     2
    13#include "config.h"
    24
     
    2224typedef struct QUARTZ_CLASSENTRY
    2325{
    24         const CLSID*    pclsid;
    25         QUARTZ_pCreateIUnknown  pCreateIUnk;
     26    const CLSID*    pclsid;
     27    QUARTZ_pCreateIUnknown  pCreateIUnk;
    2628} QUARTZ_CLASSENTRY;
    2729
     
    3638static ICOM_VTABLE(IClassFactory) iclassfact =
    3739{
    38         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    39         IClassFactory_fnQueryInterface,
    40         IClassFactory_fnAddRef,
    41         IClassFactory_fnRelease,
    42         IClassFactory_fnCreateInstance,
    43         IClassFactory_fnLockServer
     40    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     41    IClassFactory_fnQueryInterface,
     42    IClassFactory_fnAddRef,
     43    IClassFactory_fnRelease,
     44    IClassFactory_fnCreateInstance,
     45    IClassFactory_fnLockServer
    4446};
    4547
    4648typedef struct
    4749{
    48         /* IUnknown fields */
    49         ICOM_VFIELD(IClassFactory);
    50         DWORD   ref;
    51         /* IClassFactory fields */
    52         const QUARTZ_CLASSENTRY* pEntry;
     50    /* IUnknown fields */
     51    ICOM_VFIELD(IClassFactory);
     52    DWORD   ref;
     53    /* IClassFactory fields */
     54    const QUARTZ_CLASSENTRY* pEntry;
    5355} IClassFactoryImpl;
    5456
    5557static const QUARTZ_CLASSENTRY QUARTZ_ClassList[] =
    5658{
    57         { &CLSID_FilterGraph, &QUARTZ_CreateFilterGraph },
    58         { &CLSID_SystemClock, &QUARTZ_CreateSystemClock },
    59         { &CLSID_MemoryAllocator, &QUARTZ_CreateMemoryAllocator },
    60         { NULL, NULL },
     59    { &CLSID_FilterGraph, &QUARTZ_CreateFilterGraph },
     60    { &CLSID_SystemClock, &QUARTZ_CreateSystemClock },
     61    { &CLSID_MemoryAllocator, &QUARTZ_CreateMemoryAllocator },
     62    { NULL, NULL },
    6163};
    6264
     
    6870void* QUARTZ_AllocObj( DWORD dwSize )
    6971{
    70         void*   pv;
    71 
    72         EnterCriticalSection( &csHeap );
    73         dwClassObjRef ++;
    74         pv = HeapAlloc( hDLLHeap, 0, dwSize );
    75         if ( pv == NULL )
    76                 dwClassObjRef --;
    77         LeaveCriticalSection( &csHeap );
    78 
    79         return pv;
     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;
    8082}
    8183
    8284void QUARTZ_FreeObj( void* pobj )
    8385{
    84         EnterCriticalSection( &csHeap );
    85         HeapFree( hDLLHeap, 0, pobj );
    86         dwClassObjRef --;
    87         LeaveCriticalSection( &csHeap );
     86    EnterCriticalSection( &csHeap );
     87    HeapFree( hDLLHeap, 0, pobj );
     88    dwClassObjRef --;
     89    LeaveCriticalSection( &csHeap );
    8890}
    8991
    9092void* QUARTZ_AllocMem( DWORD dwSize )
    9193{
    92         return HeapAlloc( hDLLHeap, 0, dwSize );
     94    return HeapAlloc( hDLLHeap, 0, dwSize );
    9395}
    9496
    9597void QUARTZ_FreeMem( void* pMem )
    9698{
    97         HeapFree( hDLLHeap, 0, pMem );
     99    HeapFree( hDLLHeap, 0, pMem );
    98100}
    99101
     
    103105IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
    104106{
    105         ICOM_THIS(IClassFactoryImpl,iface);
    106 
    107         TRACE("(%p)->(%p,%p)\n",This,riid,ppobj);
    108         if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) ||
    109              ( IsEqualGUID( &IID_IClassFactory, riid ) ) )
    110         {
    111                 *ppobj = iface;
    112                 IClassFactory_AddRef(iface);
    113                 return S_OK;
    114         }
    115 
    116         return E_NOINTERFACE;
     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;
    117119}
    118120
    119121static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
    120122{
    121         ICOM_THIS(IClassFactoryImpl,iface);
    122 
    123         TRACE("(%p)->()\n",This);
    124 
    125         return ++(This->ref);
     123    ICOM_THIS(IClassFactoryImpl,iface);
     124
     125    TRACE("(%p)->()\n",This);
     126
     127    return ++(This->ref);
    126128}
    127129
    128130static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
    129131{
    130         ICOM_THIS(IClassFactoryImpl,iface);
    131 
    132         TRACE("(%p)->()\n",This);
    133         if ( (--(This->ref)) > 0 )
    134                 return This->ref;
    135 
    136         QUARTZ_FreeObj(This);
    137         return 0;
     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;
    138140}
    139141
    140142static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj)
    141143{
    142         ICOM_THIS(IClassFactoryImpl,iface);
    143         HRESULT hr;
    144         IUnknown*       punk;
    145 
    146         TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
    147 
    148         if ( ppobj == NULL )
    149                 return E_POINTER;
    150         if ( pOuter != NULL && !IsEqualGUID( riid, &IID_IUnknown ) )
    151                 return CLASS_E_NOAGGREGATION;
    152 
    153         *ppobj = NULL;
    154 
    155         hr = (*This->pEntry->pCreateIUnk)(pOuter,(void**)&punk);
    156         if ( hr != S_OK )
    157                 return hr;
    158 
    159         hr = IUnknown_QueryInterface(punk,riid,ppobj);
    160         IUnknown_Release(punk);
    161 
    162         return hr;
     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;
    163165}
    164166
    165167static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock)
    166168{
    167         ICOM_THIS(IClassFactoryImpl,iface);
    168         HRESULT hr;
    169 
    170         FIXME("(%p)->(%d),stub!\n",This,dolock);
    171         if (dolock)
    172                 hr = IClassFactory_AddRef(iface);
    173         else
    174                 hr = IClassFactory_Release(iface);
    175 
    176         return hr;
     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;
    177179}
    178180
     
    181183static HRESULT IClassFactory_Alloc( const CLSID* pclsid, void** ppobj )
    182184{
    183         const QUARTZ_CLASSENTRY*        pEntry;
    184         IClassFactoryImpl*      pImpl;
    185 
    186         TRACE( "(%s,%p)\n", debugstr_guid(pclsid), ppobj );
    187 
    188         pEntry = QUARTZ_ClassList;
    189         while ( pEntry->pclsid != NULL )
    190         {
    191                 if ( IsEqualGUID( pclsid, pEntry->pclsid ) )
    192                         goto found;
    193         }
    194 
    195         return CLASS_E_CLASSNOTAVAILABLE;
     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;
    196198found:
    197         pImpl = (IClassFactoryImpl*)QUARTZ_AllocObj( sizeof(IClassFactoryImpl) );
    198         if ( pImpl == NULL )
    199                 return E_OUTOFMEMORY;
    200 
    201         ICOM_VTBL(pImpl) = &iclassfact;
    202         pImpl->ref = 1;
    203         pImpl->pEntry = pEntry;
    204 
    205         *ppobj = (void*)pImpl;
    206         return S_OK;
    207 }
    208 
    209 
    210 /***********************************************************************
    211  *              QUARTZ_InitProcess (internal)
     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)
    212214 */
    213215static BOOL QUARTZ_InitProcess( void )
    214216{
    215         TRACE("()\n");
    216 
    217         dwClassObjRef = 0;
    218         hDLLHeap = (HANDLE)NULL;
    219         InitializeCriticalSection( &csHeap );
    220 
    221         hDLLHeap = HeapCreate( 0, 0x10000, 0 );
    222         if ( hDLLHeap == (HANDLE)NULL )
    223                 return FALSE;
    224 
    225         return TRUE;
    226 }
    227 
    228 /***********************************************************************
    229  *              QUARTZ_UninitProcess (internal)
     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)
    230232 */
    231233static void QUARTZ_UninitProcess( void )
    232234{
    233         TRACE("()\n");
    234 
    235         if ( dwClassObjRef != 0 )
    236                 ERR( "you must release some objects allocated from quartz.\n" );
    237         if ( hDLLHeap != (HANDLE)NULL )
    238         {
    239                 HeapDestroy( hDLLHeap );
    240                 hDLLHeap = (HANDLE)NULL;
    241         }
    242         DeleteCriticalSection( &csHeap );
    243 }
    244 
    245 /***********************************************************************
    246  *              QUARTZ_DllMain
     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
    247249 */
    248250BOOL WINAPI QUARTZ_DllMain(
    249         HINSTANCE hInstDLL,
    250         DWORD fdwReason,
    251         LPVOID lpvReserved )
    252 {
    253         switch ( fdwReason )
    254         {
    255         case DLL_PROCESS_ATTACH:
    256                 if ( !QUARTZ_InitProcess() )
    257                         return FALSE;
    258                 break;
    259         case DLL_PROCESS_DETACH:
    260                 QUARTZ_UninitProcess();
    261                 break;
    262         case DLL_THREAD_ATTACH:
    263                 break;
    264         case DLL_THREAD_DETACH:
    265                 break;
    266         }
    267 
    268         return TRUE;
    269 }
    270 
    271 
    272 /***********************************************************************
    273  *              DllCanUnloadNow (QUARTZ.@)
     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.@)
    274276 *
    275277 * RETURNS
     
    279281HRESULT WINAPI QUARTZ_DllCanUnloadNow(void)
    280282{
    281         HRESULT hr;
    282 
    283         EnterCriticalSection( &csHeap );
    284         hr = ( dwClassObjRef == 0 ) ? S_OK : S_FALSE;
    285         LeaveCriticalSection( &csHeap );
    286 
    287         return hr;
    288 }
    289 
    290 /***********************************************************************
    291  *              DllGetClassObject (QUARTZ.@)
     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.@)
    292294 */
    293295HRESULT WINAPI QUARTZ_DllGetClassObject(
    294                 const CLSID* pclsid,const IID* piid,void** ppv)
    295 {
    296         *ppv = NULL;
    297         if ( IsEqualCLSID( &IID_IUnknown, piid ) ||
    298              IsEqualCLSID( &IID_IClassFactory, piid ) )
    299         {
    300                 return IClassFactory_Alloc( pclsid, ppv );
    301         }
    302 
    303         return CLASS_E_CLASSNOTAVAILABLE;
    304 }
    305 
    306 /***********************************************************************
    307  *              DllRegisterServer (QUARTZ.@)
     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.@)
    308310 */
    309311
    310312HRESULT WINAPI QUARTZ_DllRegisterServer( void )
    311313{
    312         FIXME( "(): stub\n" );
    313         return E_FAIL;
    314 }
    315 
    316 /***********************************************************************
    317  *              DllUnregisterServer (QUARTZ.@)
     314    FIXME( "(): stub\n" );
     315    return E_FAIL;
     316}
     317
     318/***********************************************************************
     319 *      DllUnregisterServer (QUARTZ.@)
    318320 */
    319321
    320322HRESULT WINAPI QUARTZ_DllUnregisterServer( void )
    321323{
    322         FIXME( "(): stub\n" );
    323         return E_FAIL;
    324 }
    325 
     324    FIXME( "(): stub\n" );
     325    return E_FAIL;
     326}
     327
Note: See TracChangeset for help on using the changeset viewer.