Michael Stefaniuc : dplayx: Cleanup the DirectPlay object creation.
Alexandre Julliard
julliard at winehq.org
Tue Apr 2 13:38:35 CDT 2013
Module: wine
Branch: master
Commit: 4a9cd6307282a26f6a603074a8cc48ac206a159b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a9cd6307282a26f6a603074a8cc48ac206a159b
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Fri Mar 29 16:48:57 2013 +0100
dplayx: Cleanup the DirectPlay object creation.
---
dlls/dplayx/dpclassfactory.c | 2 +-
dlls/dplayx/dpinit.h | 2 +-
dlls/dplayx/dplay.c | 95 ++++++++++++++----------------------------
dlls/dplayx/dplobby.c | 3 +-
4 files changed, 35 insertions(+), 67 deletions(-)
diff --git a/dlls/dplayx/dpclassfactory.c b/dlls/dplayx/dpclassfactory.c
index 2502e1e..438ad60 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 361759b..090b67a 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 9f766de..93862a3 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 9adc67a..204ff59 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 ) );
More information about the wine-cvs
mailing list