[PATCH 22/54] dplayx: Cleanup the DirectPlay object creation.

Michael Stefaniuc mstefani at redhat.de
Fri Mar 29 10:48:57 CDT 2013


---
 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 ) );
-- 
1.7.11.7



More information about the wine-patches mailing list