diff --git a/dlls/dplayx/dpclassfactory.c b/dlls/dplayx/dpclassfactory.c index 2502e1ef0d2..438ad605f9d 100644 --- a/dlls/dplayx/dpclassfactory.c +++ b/dlls/dplayx/dpclassfactory.c @@ -101,7 +101,7 @@ static const IClassFactoryVtbl cf_vt = { IClassFactoryImpl_LockServer }; -static IClassFactoryImpl dplay_cf = {{&cf_vt}, DP_CreateInterface}; +static IClassFactoryImpl dplay_cf = {{&cf_vt}, dplay_create}; static IClassFactoryImpl dplaylobby_cf = {{&cf_vt}, DPL_CreateInterface}; diff --git a/dlls/dplayx/dpinit.h b/dlls/dplayx/dpinit.h index 361759b3974..090b67a8326 100644 --- a/dlls/dplayx/dpinit.h +++ b/dlls/dplayx/dpinit.h @@ -26,7 +26,7 @@ #include "wtypes.h" #include "dplay_global.h" -extern HRESULT DP_CreateInterface( REFIID riid, LPVOID* ppvObj ) DECLSPEC_HIDDEN; +extern HRESULT dplay_create( REFIID riid, void **ppv ) DECLSPEC_HIDDEN; extern HRESULT DPL_CreateInterface( REFIID riid, LPVOID* ppvObj ) DECLSPEC_HIDDEN; extern HRESULT DPSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp ) DECLSPEC_HIDDEN; diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 9f766deb195..93862a3772d 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -76,10 +76,6 @@ static BOOL CALLBACK cbRemoveGroupOrPlayer( DPID dpId, DWORD dwPlayerType, LPVOID lpContext ); static void DP_DeleteGroup( IDirectPlay2Impl* This, DPID dpid ); -/* Forward declarations of virtual tables */ -static const IDirectPlay4Vtbl directPlay4AVT; -static const IDirectPlay4Vtbl directPlay4WVT; - /* Helper methods for player/group interfaces */ static HRESULT DP_IF_DeletePlayerFromGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, @@ -360,55 +356,6 @@ static BOOL DP_DestroyDirectPlay2( LPVOID lpDP ) } -/* Create a new interface */ -HRESULT DP_CreateInterface - ( REFIID riid, LPVOID* ppvObj ) -{ - IDirectPlayImpl *This; - - TRACE( " for %s\n", debugstr_guid( riid ) ); - - This = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( IDirectPlayImpl ) ); - if( !This ) - return DPERR_OUTOFMEMORY; - - This->IDirectPlay4_iface.lpVtbl = &directPlay4WVT; - This->IDirectPlay4A_iface.lpVtbl = &directPlay4AVT; - - if( IsEqualGUID( &IID_IDirectPlay2, riid ) || IsEqualGUID( &IID_IDirectPlay3, riid ) || - IsEqualGUID( &IID_IDirectPlay4, riid ) ) - *ppvObj = &This->IDirectPlay4_iface; - else if( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDirectPlay2A, riid ) || - IsEqualGUID( &IID_IDirectPlay3A, riid ) || IsEqualGUID( &IID_IDirectPlay4A, riid ) ) - *ppvObj = &This->IDirectPlay4A_iface; - else - { - /* Unsupported interface */ - HeapFree( GetProcessHeap(), 0, *ppvObj ); - *ppvObj = NULL; - - return E_NOINTERFACE; - } - - /* Initialize it */ - if ( DP_CreateDirectPlay2( This ) ) - { - InitializeCriticalSection( &This->lock ); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlayImpl.lock"); - IDirectPlayX_AddRef( (LPDIRECTPLAY2A)*ppvObj ); - - return S_OK; - } - - /* Initialize failed, destroy it */ - DP_DestroyDirectPlay2( This ); - HeapFree( GetProcessHeap(), 0, This ); - - *ppvObj = NULL; - return DPERR_NOMEMORY; -} - - /* Direct Play methods */ /* Shared between all dplay types */ @@ -4619,12 +4566,8 @@ static HRESULT WINAPI DirectPlay4WImpl_CancelPriority } /* Note: Hack so we can reuse the old functions without compiler warnings */ -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(directPlay4WVT.fun)) -#else # define XCAST(fun) (void*) -#endif -static const IDirectPlay4Vtbl directPlay4WVT = +static const IDirectPlay4Vtbl dp4_vt = { IDirectPlay4Impl_QueryInterface, IDirectPlay4Impl_AddRef, @@ -4685,7 +4628,7 @@ static const IDirectPlay4Vtbl directPlay4WVT = }; #undef XCAST -static const IDirectPlay4Vtbl directPlay4AVT = +static const IDirectPlay4Vtbl dp4A_vt = { IDirectPlay4AImpl_QueryInterface, IDirectPlay4AImpl_AddRef, @@ -4743,6 +4686,35 @@ static const IDirectPlay4Vtbl directPlay4AVT = DirectPlay4AImpl_CancelPriority }; +HRESULT dplay_create( REFIID riid, void **ppv ) +{ + IDirectPlayImpl *obj; + HRESULT hr; + + TRACE( "(%s, %p)\n", debugstr_guid( riid ), ppv ); + + *ppv = NULL; + obj = HeapAlloc( GetProcessHeap(), 0, sizeof( *obj ) ); + if ( !obj ) + return DPERR_OUTOFMEMORY; + + obj->IDirectPlay4A_iface.lpVtbl = &dp4A_vt; + obj->IDirectPlay4_iface.lpVtbl = &dp4_vt; + obj->ulInterfaceRef = 1; + + InitializeCriticalSection( &obj->lock ); + obj->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlayImpl.lock"); + + if ( DP_CreateDirectPlay2( obj ) ) + hr = IDirectPlayX_QueryInterface( &obj->IDirectPlay4A_iface, riid, ppv ); + else + hr = DPERR_NOMEMORY; + IDirectPlayX_Release( &obj->IDirectPlay4A_iface ); + + return hr; +} + + HRESULT DP_GetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID* lplpData ) @@ -5016,13 +4988,10 @@ HRESULT WINAPI DirectPlayCreate return DPERR_INVALIDPARAMS; } - /* Create an IDirectPlay object. We don't support that so we'll cheat and give them an IDirectPlay2A object and hope that doesn't cause problems */ - if( DP_CreateInterface( &IID_IDirectPlay2A, (LPVOID*)lplpDP ) != DP_OK ) - { + if ( dplay_create( &IID_IDirectPlay2A, (void**)lplpDP ) != DP_OK ) return DPERR_UNAVAILABLE; - } if( IsEqualGUID( &GUID_NULL, lpGUID ) ) { diff --git a/dlls/dplayx/dplobby.c b/dlls/dplayx/dplobby.c index 9adc67ad073..204ff59916c 100644 --- a/dlls/dplayx/dplobby.c +++ b/dlls/dplayx/dplobby.c @@ -494,8 +494,7 @@ static HRESULT DPL_ConnectEx dwFlags = DPCONNECT_RETURNSTATUS; } - /* Create the DirectPlay interface */ - if( ( hr = DP_CreateInterface( riid, lplpDP ) ) != DP_OK ) + if ( ( hr = dplay_create( riid, lplpDP ) ) != DP_OK ) { ERR( "error creating interface for %s:%s.\n", debugstr_guid( riid ), DPLAYX_HresultToString( hr ) );