Module: wine Branch: master Commit: 1e22d293039ed284475ffe454c165d04997a319d URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e22d293039ed284475ffe454c...
Author: Michael Stefaniuc mstefani@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);