Michael Stefaniuc : dplayx: Add both interfaces to the DirectPlayLobby object and stop cloning the object .
Alexandre Julliard
julliard at winehq.org
Fri Apr 12 10:40:36 CDT 2013
Module: wine
Branch: master
Commit: 1e22d293039ed284475ffe454c165d04997a319d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e22d293039ed284475ffe454c165d04997a319d
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Thu Apr 11 23:53:38 2013 +0200
dplayx: Add both interfaces to the DirectPlayLobby object and stop cloning the object.
---
dlls/dplayx/dplobby.c | 79 +++++++++++++------------------------------
dlls/dplayx/tests/dplayx.c | 1 +
2 files changed, 25 insertions(+), 55 deletions(-)
diff --git a/dlls/dplayx/dplobby.c b/dlls/dplayx/dplobby.c
index 54d55d3..1335a6d 100644
--- a/dlls/dplayx/dplobby.c
+++ b/dlls/dplayx/dplobby.c
@@ -74,7 +74,6 @@ typedef struct DPLMSG* LPDPLMSG;
typedef struct tagDirectPlayLobbyIUnknownData
{
- LONG ulObjRef;
CRITICAL_SECTION DPL_lock;
} DirectPlayLobbyIUnknownData;
@@ -87,7 +86,8 @@ typedef struct tagDirectPlayLobbyData
typedef struct IDirectPlayLobbyImpl
{
- const void *lpVtbl;
+ IDirectPlayLobby3 IDirectPlayLobby3_iface;
+ IDirectPlayLobby3A IDirectPlayLobby3A_iface;
LONG ulInterfaceRef;
DirectPlayLobbyIUnknownData* unk;
DirectPlayLobbyData* dpl;
@@ -95,12 +95,12 @@ typedef struct IDirectPlayLobbyImpl
static inline IDirectPlayLobbyImpl *impl_from_IDirectPlayLobby3( IDirectPlayLobby3 *iface )
{
- return (IDirectPlayLobbyImpl*)iface; /* What you gonna do? */
+ return CONTAINING_RECORD( iface, IDirectPlayLobbyImpl, IDirectPlayLobby3_iface );
}
static inline IDirectPlayLobbyImpl *impl_from_IDirectPlayLobby3A( IDirectPlayLobby3A *iface )
{
- return (IDirectPlayLobbyImpl*)iface; /* What you gonna do? */
+ return CONTAINING_RECORD( iface, IDirectPlayLobbyImpl, IDirectPlayLobby3A_iface );
}
/* Forward declarations of virtual tables */
@@ -201,12 +201,15 @@ HRESULT DPL_CreateInterface
if ( !This )
return DPERR_OUTOFMEMORY;
+ This->IDirectPlayLobby3_iface.lpVtbl = &directPlayLobby3WVT;
+ This->IDirectPlayLobby3A_iface.lpVtbl = &directPlayLobby3AVT;
+
if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDirectPlayLobby, riid ) ||
IsEqualGUID( &IID_IDirectPlayLobby2, riid ) || IsEqualGUID( &IID_IDirectPlayLobby3, riid ) )
- This->lpVtbl = &directPlayLobby3WVT;
+ *ppvObj = &This->IDirectPlayLobby3_iface;
else if ( IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) ||
IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) || IsEqualGUID( &IID_IDirectPlayLobby3A, riid ) )
- This->lpVtbl = &directPlayLobby3AVT;
+ *ppvObj = &This->IDirectPlayLobby3A_iface;
else
{
/* Unsupported interface */
@@ -217,19 +220,16 @@ HRESULT DPL_CreateInterface
}
/* Initialize it */
- *ppvObj = This;
- if ( DPL_CreateIUnknown( *ppvObj ) &&
- DPL_CreateLobby1( *ppvObj )
- )
+ if ( DPL_CreateIUnknown( This ) && DPL_CreateLobby1( This ) )
{
IDirectPlayLobby_AddRef( (LPDIRECTPLAYLOBBY)*ppvObj );
return S_OK;
}
/* Initialize failed, destroy it */
- DPL_DestroyLobby1( *ppvObj );
- DPL_DestroyIUnknown( *ppvObj );
- HeapFree( GetProcessHeap(), 0, *ppvObj );
+ DPL_DestroyLobby1( This );
+ DPL_DestroyIUnknown( This );
+ HeapFree( GetProcessHeap(), 0, This );
*ppvObj = NULL;
return DPERR_NOMEMORY;
@@ -239,35 +239,16 @@ static HRESULT WINAPI DPL_QueryInterface( IDirectPlayLobbyImpl *This, REFIID rii
{
TRACE("(%p)->(%s,%p)\n", This, debugstr_guid( riid ), ppvObj );
- *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof( *This ) );
-
- if( *ppvObj == NULL )
- {
- return DPERR_OUTOFMEMORY;
- }
-
- CopyMemory( *ppvObj, This, sizeof( *This ) );
- (*(IDirectPlayLobbyAImpl**)ppvObj)->ulInterfaceRef = 0;
-
if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDirectPlayLobby, riid ) ||
IsEqualGUID( &IID_IDirectPlayLobby2, riid ) || IsEqualGUID( &IID_IDirectPlayLobby3, riid ) )
- {
- IDirectPlayLobby3WImpl *This = *ppvObj;
- This->lpVtbl = &directPlayLobby3WVT;
- }
+ *ppvObj = &This->IDirectPlayLobby3_iface;
else if ( IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) ||
IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) || IsEqualGUID( &IID_IDirectPlayLobby3A, riid ) )
- {
- IDirectPlayLobby3AImpl *This = *ppvObj;
- This->lpVtbl = &directPlayLobby3AVT;
- }
+ *ppvObj = &This->IDirectPlayLobby3A_iface;
else
{
/* Unsupported interface */
- HeapFree( GetProcessHeap(), 0, *ppvObj );
*ppvObj = NULL;
-
return E_NOINTERFACE;
}
@@ -282,15 +263,11 @@ static HRESULT WINAPI DPL_QueryInterface( IDirectPlayLobbyImpl *This, REFIID rii
*/
static ULONG WINAPI DPL_AddRef( IDirectPlayLobbyImpl *This )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
-
- ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
+ ULONG ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
- TRACE( "ref count incremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
+ TRACE( "ref count incremented to %u for %p\n", ulInterfaceRefCount, This );
- return ulObjRefCount;
+ return ulInterfaceRefCount;
}
/*
@@ -300,24 +277,16 @@ static ULONG WINAPI DPL_AddRef( IDirectPlayLobbyImpl *This )
*/
static ULONG WINAPI DPL_Release( IDirectPlayLobbyImpl *This )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
-
- ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
+ ULONG ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
- TRACE( "ref count decremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
+ TRACE( "ref count decremented to %u for %p\n", ulInterfaceRefCount, This );
/* Deallocate if this is the last reference to the object */
- if( ulObjRefCount == 0 )
+ if( ulInterfaceRefCount == 0 )
{
DPL_DestroyLobby1( This );
DPL_DestroyIUnknown( This );
- }
-
- if( ulInterfaceRefCount == 0 )
- {
- HeapFree( GetProcessHeap(), 0, This );
+ HeapFree( GetProcessHeap(), 0, This );
}
return ulInterfaceRefCount;
@@ -403,7 +372,7 @@ static HRESULT DPL_ConnectEx
}
/* FIXME: Is it safe/correct to use appID of 0? */
- hr = IDirectPlayLobby_GetConnectionSettings( (LPDIRECTPLAYLOBBY)This,
+ hr = IDirectPlayLobby_GetConnectionSettings( &This->IDirectPlayLobby3_iface,
0, NULL, &dwConnSize );
if( hr != DPERR_BUFFERTOOSMALL )
{
@@ -418,7 +387,7 @@ static HRESULT DPL_ConnectEx
}
/* FIXME: Is it safe/correct to use appID of 0? */
- hr = IDirectPlayLobby_GetConnectionSettings( (LPDIRECTPLAYLOBBY)This,
+ hr = IDirectPlayLobby_GetConnectionSettings( &This->IDirectPlayLobby3_iface,
0, lpConn, &dwConnSize );
if( FAILED( hr ) )
{
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c
index 1b871d0..6ed864c 100644
--- a/dlls/dplayx/tests/dplayx.c
+++ b/dlls/dplayx/tests/dplayx.c
@@ -6526,6 +6526,7 @@ static void test_COM_dplobby(void)
IDirectPlayLobby_Release(dpl3A);
IDirectPlayLobby_Release(dpl2);
IDirectPlayLobby_Release(dpl2A);
+ IDirectPlayLobby_Release(dplA);
IDirectPlayLobby_Release(dpl);
refcount = IDirectPlayLobby_Release(dpl);
ok(refcount == 0, "refcount == %u, expected 0\n", refcount);
More information about the wine-cvs
mailing list