/*==========================================================================; * * Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved. * * File: factory.c * Content: DirectDrawFactory implementation * History: * Date By Reason * ==== == ====== * 22-oct-97 jeffno initial implementation * ***************************************************************************/ #include "ddrawpr.h" HRESULT InternalCreateDDFactory2(void ** ppvObj, IUnknown * pUnkOuter) { LPDDFACTORY2 lpFac = NULL; DDASSERT(ppvObj); if (pUnkOuter) { return CLASS_E_NOAGGREGATION; } /* * If any allocations are added to this function, make sure to update the * cleanup code in classfac.c */ lpFac = MemAlloc(sizeof(DDFACTORY2)); if (!lpFac) { return DDERR_OUTOFMEMORY; } lpFac->lpVtbl = &ddFactory2Callbacks; lpFac->dwRefCnt = 0; *ppvObj = (IUnknown*) lpFac; return DD_OK; } /* * DDFac2_QueryInterface */ HRESULT DDAPI DDFac2_QueryInterface( LPDIRECTDRAWFACTORY2 lpDDFac, REFIID riid, LPVOID FAR * ppvObj ) { LPDDFACTORY2 this; ENTER_DDRAW(); DPF(2,A,"ENTERAPI: DDFac2_QueryInterface"); /* * validate parms */ TRY { this = (LPDDFACTORY2) lpDDFac; if( !VALID_DIRECTDRAWFACTORY2_PTR( this ) ) { LEAVE_DDRAW(); return DDERR_INVALIDOBJECT; } if( !VALID_PTR_PTR( ppvObj ) ) { DPF( 1, "Invalid clipper pointer" ); LEAVE_DDRAW(); return (DWORD) DDERR_INVALIDPARAMS; } if( !VALIDEX_IID_PTR( riid ) ) { DPF_ERR( "Invalid IID pointer" ); LEAVE_DDRAW(); return (DWORD) DDERR_INVALIDPARAMS; } *ppvObj = NULL; } EXCEPT( EXCEPTION_EXECUTE_HANDLER ) { DPF_ERR( "Exception encountered validating parameters" ); LEAVE_DDRAW(); return DDERR_INVALIDPARAMS; } /* * check guids */ if( IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectDrawFactory2) ) { ((IUnknown*)this)->lpVtbl->AddRef((IUnknown*)this); *ppvObj = (LPVOID) this; LEAVE_DDRAW(); return DD_OK; } LEAVE_DDRAW(); return E_NOINTERFACE; } /* DDFac2_QueryInterface */ #undef DPF_MODNAME #define DPF_MODNAME "DDFactory2::AddRef" /* * DDFac2_AddRef */ DWORD DDAPI DDFac2_AddRef( LPDIRECTDRAWFACTORY2 lpDDFac ) { LPDDFACTORY2 this; ENTER_DDRAW(); DPF(2,A,"ENTERAPI: DDFac2_AddRef"); /* * validate parms */ TRY { this = (LPDDFACTORY2) lpDDFac; if( !VALID_DIRECTDRAWFACTORY2_PTR( this ) ) { LEAVE_DDRAW(); return 0; } } EXCEPT( EXCEPTION_EXECUTE_HANDLER ) { DPF_ERR( "Exception encountered validating parameters" ); LEAVE_DDRAW(); return 0; } /* * update reference count */ this->dwRefCnt++; DPF( 5, "DDFactory %08lx addrefed, refcnt = %ld", this, this->dwRefCnt ); LEAVE_DDRAW(); return this->dwRefCnt; } /* DDFac2_AddRef */ #undef DPF_MODNAME #define DPF_MODNAME "DDFactory2::Release" ULONG DDAPI DDFac2_Release( LPDIRECTDRAWFACTORY2 lpDDFac ) { LPDDFACTORY2 this; ENTER_DDRAW(); DPF(2,A,"ENTERAPI: DDFac2_Release"); /* * validate parms */ TRY { this = (LPDDFACTORY2) lpDDFac; if( !VALID_DIRECTDRAWFACTORY2_PTR( this ) ) { LEAVE_DDRAW(); return 0; } } EXCEPT( EXCEPTION_EXECUTE_HANDLER ) { DPF_ERR( "Exception encountered validating parameters" ); LEAVE_DDRAW(); return 0; } /* * update reference count */ this->dwRefCnt--; DPF( 5, "DDFactory %08lx releaseed, refcnt = %ld", this, this->dwRefCnt ); if (this->dwRefCnt == 0) { this->lpVtbl = 0; MemFree(this); LEAVE_DDRAW(); return 0; } LEAVE_DDRAW(); return this->dwRefCnt; } /* DDFac2_Release */ HRESULT DDAPI DDFac2_CreateDirectDraw( LPDIRECTDRAWFACTORY2 lpDDFac, GUID FAR*rDeviceGuid, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwFlags, IUnknown FAR *pUnkOuter, IDirectDraw4 FAR **ppDDraw) { LPDIRECTDRAW lpDD; HRESULT hr = DirectDrawCreate( rDeviceGuid, &lpDD, pUnkOuter ); lpDDFac; DPF(2,A,"ENTERAPI: DDFac2_CreateDirectDraw"); if( SUCCEEDED(hr) ) { hr = lpDD->lpVtbl->QueryInterface(lpDD,&IID_IDirectDraw4,(void**) ppDDraw); lpDD->lpVtbl->Release(lpDD); if( SUCCEEDED(hr) ) { hr = (*ppDDraw)->lpVtbl->SetCooperativeLevel(*ppDDraw, hWnd, dwCoopLevelFlags); } } return hr; } /* DDFac2_CreateDirectDraw */ HRESULT DDAPI DDFac2_DirectDrawEnumerate(LPDIRECTDRAWFACTORY2 lpDDFac, LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext , DWORD dwFlags) { DPF(2,A,"ENTERAPI: DDFac2_DirectDrawEnumerate"); return DirectDrawEnumerateExA(lpCallback, lpContext, dwFlags); } /* DDFac2_DirectDrawEnumerate */