/* FIXME: Need to add interface locking inside procedures */
-/* Prototypes */
-static BOOL DPSP_CreateIUnknown( LPVOID lpSP );
-static BOOL DPSP_DestroyIUnknown( LPVOID lpSP );
-static BOOL DPSP_CreateDirectPlaySP( void *lpSP, IDirectPlayImpl *dp );
-static BOOL DPSP_DestroyDirectPlaySP( LPVOID lpSP );
-
-/* Predefine the interface */
-typedef struct IDirectPlaySPImpl IDirectPlaySPImpl;
-
-typedef struct tagDirectPlaySPIUnknownData
-{
- LONG ulObjRef;
- CRITICAL_SECTION DPSP_lock;
-} DirectPlaySPIUnknownData;
-
-typedef struct tagDirectPlaySPData
+typedef struct IDirectPlaySPImpl
{
- LPVOID lpSpRemoteData;
- DWORD dwSpRemoteDataSize; /* Size of data pointed to by lpSpRemoteData */
-
- LPVOID lpSpLocalData;
- DWORD dwSpLocalDataSize; /* Size of data pointed to by lpSpLocalData */
-
+ IDirectPlaySP IDirectPlaySP_iface;
+ LONG ref;
+ void *remote_data;
+ DWORD remote_data_size;
+ void *local_data;
+ DWORD local_data_size;
IDirectPlayImpl *dplay; /* FIXME: This should perhaps be iface not impl */
-
-} DirectPlaySPData;
-
-#define DPSP_IMPL_FIELDS \
- LONG ulInterfaceRef; \
- DirectPlaySPIUnknownData* unk; \
- DirectPlaySPData* sp;
-
-struct IDirectPlaySPImpl
-{
- const IDirectPlaySPVtbl *lpVtbl;
- DPSP_IMPL_FIELDS
-};
-
-/* Forward declaration of virtual tables */
-static const IDirectPlaySPVtbl directPlaySPVT;
+} IDirectPlaySPImpl;
/* This structure is passed to the DP object for safe keeping */
typedef struct tagDP_SPPLAYERDATA
DWORD dwPlayerRemoteDataSize;
} DP_SPPLAYERDATA, *LPDP_SPPLAYERDATA;
-/* Create the SP interface */
-HRESULT DPSP_CreateInterface( REFIID riid, void **ppvObj, IDirectPlayImpl *dp )
-{
- TRACE( " for %s\n", debugstr_guid( riid ) );
-
- *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof( IDirectPlaySPImpl ) );
-
- if( *ppvObj == NULL )
- {
- return DPERR_OUTOFMEMORY;
- }
-
- if( IsEqualGUID( &IID_IDirectPlaySP, riid ) )
- {
- IDirectPlaySPImpl *This = *ppvObj;
- This->lpVtbl = &directPlaySPVT;
- }
- else
- {
- /* Unsupported interface */
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return E_NOINTERFACE;
- }
-
- /* Initialize it */
- if( DPSP_CreateIUnknown( *ppvObj ) &&
- DPSP_CreateDirectPlaySP( *ppvObj, dp )
- )
- {
- IDirectPlaySP_AddRef( (LPDIRECTPLAYSP)*ppvObj );
- return S_OK;
- }
-
- /* Initialize failed, destroy it */
- DPSP_DestroyDirectPlaySP( *ppvObj );
- DPSP_DestroyIUnknown( *ppvObj );
-
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return DPERR_NOMEMORY;
-}
-
-static BOOL DPSP_CreateIUnknown( LPVOID lpSP )
-{
- IDirectPlaySPImpl *This = lpSP;
-
- This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) );
-
- if ( This->unk == NULL )
- {
- return FALSE;
- }
-
- InitializeCriticalSection( &This->unk->DPSP_lock );
- This->unk->DPSP_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlaySPImpl*->DirectPlaySPIUnknownData*->DPSP_lock");
- return TRUE;
-}
-
-static BOOL DPSP_DestroyIUnknown( LPVOID lpSP )
+static inline IDirectPlaySPImpl *impl_from_IDirectPlaySP( IDirectPlaySP *iface )
{
- IDirectPlaySPImpl *This = lpSP;
-
- This->unk->DPSP_lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection( &This->unk->DPSP_lock );
- HeapFree( GetProcessHeap(), 0, This->unk );
-
- return TRUE;
+ return CONTAINING_RECORD( iface, IDirectPlaySPImpl, IDirectPlaySP_iface );
}
-
-static BOOL DPSP_CreateDirectPlaySP( void *lpSP, IDirectPlayImpl *dp )
+static HRESULT WINAPI IDirectPlaySPImpl_QueryInterface( IDirectPlaySP *iface, REFIID riid,
+ void **ppv )
{
- IDirectPlaySPImpl *This = lpSP;
-
- This->sp = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->sp) ) );
+ TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid( riid ), ppv );
- if ( This->sp == NULL )
+ if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDirectPlaySP, riid ) )
{
- return FALSE;
- }
-
- This->sp->dplay = dp;
-
- return TRUE;
-}
-
-static BOOL DPSP_DestroyDirectPlaySP( LPVOID lpSP )
-{
- IDirectPlaySPImpl *This = lpSP;
-
- HeapFree( GetProcessHeap(), 0, This->sp->lpSpRemoteData );
- HeapFree( GetProcessHeap(), 0, This->sp->lpSpLocalData );
-
- /* FIXME: Need to delete player queue */
-
- HeapFree( GetProcessHeap(), 0, This->sp );
- return TRUE;
-}
-
-/* Interface implementation */
-
-static HRESULT WINAPI DPSP_QueryInterface
-( LPDIRECTPLAYSP iface,
- REFIID riid,
- LPVOID* ppvObj )
-{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
- 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 ) );
- (*(IDirectPlaySPImpl**)ppvObj)->ulInterfaceRef = 0;
-
- if( IsEqualGUID( &IID_IDirectPlaySP, riid ) )
- {
- IDirectPlaySPImpl *This = *ppvObj;
- This->lpVtbl = &directPlaySPVT;
- }
- else
- {
- /* Unsupported interface */
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return E_NOINTERFACE;
+ *ppv = iface;
+ IDirectPlaySP_AddRef( iface );
+ return S_OK;
}
- IDirectPlaySP_AddRef( (LPDIRECTPLAYSP)*ppvObj );
-
- return S_OK;
+ FIXME( "Unsupported interface %s\n", debugstr_guid( riid ) );
+ *ppv = NULL;
+ return E_NOINTERFACE;
}
-static ULONG WINAPI DPSP_AddRef
-( LPDIRECTPLAYSP iface )
+static ULONG WINAPI IDirectPlaySPImpl_AddRef( IDirectPlaySP *iface )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
-
- ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
+ ULONG ref = InterlockedIncrement( &This->ref );
- TRACE( "ref count incremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
+ TRACE( "(%p) ref=%d\n", This, ref );
- return ulObjRefCount;
+ return ref;
}
-static ULONG WINAPI DPSP_Release
-( LPDIRECTPLAYSP iface )
+static ULONG WINAPI IDirectPlaySPImpl_Release( IDirectPlaySP *iface )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
+ ULONG ref = InterlockedDecrement( &This->ref );
- ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
+ TRACE( "(%p) ref=%d\n", This, ref );
- TRACE( "ref count decremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
-
- /* Deallocate if this is the last reference to the object */
- if( ulObjRefCount == 0 )
- {
- DPSP_DestroyDirectPlaySP( This );
- DPSP_DestroyIUnknown( This );
- }
-
- if( ulInterfaceRefCount == 0 )
+ if( !ref )
{
+ HeapFree( GetProcessHeap(), 0, This->remote_data );
+ HeapFree( GetProcessHeap(), 0, This->local_data );
HeapFree( GetProcessHeap(), 0, This );
}
- return ulInterfaceRefCount;
+ return ref;
}
-static HRESULT WINAPI IDirectPlaySPImpl_AddMRUEntry
-( LPDIRECTPLAYSP iface,
- LPCWSTR lpSection,
- LPCWSTR lpKey,
- LPCVOID lpData,
- DWORD dwDataSize,
- DWORD dwMaxEntries
-)
+static HRESULT WINAPI IDirectPlaySPImpl_AddMRUEntry( IDirectPlaySP *iface, LPCWSTR lpSection,
+ LPCWSTR lpKey, const void *lpData, DWORD dwDataSize, DWORD dwMaxEntries )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
/* Should be able to call the comctl32 undocumented MRU routines.
I suspect that the interface works appropriately */
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_CreateAddress
-( LPDIRECTPLAYSP iface,
- REFGUID guidSP,
- REFGUID guidDataType,
- LPCVOID lpData,
- DWORD dwDataSize,
- LPVOID lpAddress,
- LPDWORD lpdwAddressSize
-)
+static HRESULT WINAPI IDirectPlaySPImpl_CreateAddress( IDirectPlaySP *iface, REFGUID guidSP,
+ REFGUID guidDataType, const void *lpData, DWORD dwDataSize, void *lpAddress,
+ DWORD *lpdwAddressSize )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
FIXME( "(%p)->(%s,%s,%p,0x%08x,%p,%p): stub\n",
This, debugstr_guid(guidSP), debugstr_guid(guidDataType),
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_EnumAddress
-( LPDIRECTPLAYSP iface,
- LPDPENUMADDRESSCALLBACK lpEnumAddressCallback,
- LPCVOID lpAddress,
- DWORD dwAddressSize,
- LPVOID lpContext
-)
+static HRESULT WINAPI IDirectPlaySPImpl_EnumAddress( IDirectPlaySP *iface,
+ LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, const void *lpAddress, DWORD dwAddressSize,
+ void *lpContext )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
TRACE( "(%p)->(%p,%p,0x%08x,%p)\n",
This, lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext );
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_EnumMRUEntries
-( LPDIRECTPLAYSP iface,
- LPCWSTR lpSection,
- LPCWSTR lpKey,
- LPENUMMRUCALLBACK lpEnumMRUCallback,
- LPVOID lpContext
-)
+static HRESULT WINAPI IDirectPlaySPImpl_EnumMRUEntries( IDirectPlaySP *iface, LPCWSTR lpSection,
+ LPCWSTR lpKey, LPENUMMRUCALLBACK lpEnumMRUCallback, void *lpContext )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
/* Should be able to call the comctl32 undocumented MRU routines.
I suspect that the interface works appropriately */
- FIXME( "(%p)->(%p,%p,%p,%p,): stub\n",
+ FIXME( "(%p)->(%p,%p,%p,%p): stub\n",
This, lpSection, lpKey, lpEnumMRUCallback, lpContext );
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_GetPlayerFlags
-( LPDIRECTPLAYSP iface,
- DPID idPlayer,
- LPDWORD lpdwPlayerFlags
-)
+static HRESULT WINAPI IDirectPlaySPImpl_GetPlayerFlags( IDirectPlaySP *iface, DPID idPlayer,
+ DWORD *lpdwPlayerFlags )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
FIXME( "(%p)->(0x%08x,%p): stub\n",
This, idPlayer, lpdwPlayerFlags );
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_GetSPPlayerData
-( LPDIRECTPLAYSP iface,
- DPID idPlayer,
- LPVOID* lplpData,
- LPDWORD lpdwDataSize,
- DWORD dwFlags
-)
+static HRESULT WINAPI IDirectPlaySPImpl_GetSPPlayerData( IDirectPlaySP *iface, DPID idPlayer,
+ void **lplpData, DWORD *lpdwDataSize, DWORD dwFlags )
{
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
HRESULT hr;
LPDP_SPPLAYERDATA lpPlayerData;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
TRACE( "(%p)->(0x%08x,%p,%p,0x%08x)\n",
This, idPlayer, lplpData, lpdwDataSize, dwFlags );
- hr = DP_GetSPPlayerData( This->sp->dplay, idPlayer, (LPVOID*)&lpPlayerData );
+ hr = DP_GetSPPlayerData( This->dplay, idPlayer, (void**)&lpPlayerData );
if( FAILED(hr) )
{
return hr;
}
-static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage
-( LPDIRECTPLAYSP iface,
- LPVOID lpMessageBody,
- DWORD dwMessageBodySize,
- LPVOID lpMessageHeader
-)
+static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage( IDirectPlaySP *iface, void *lpMessageBody,
+ DWORD dwMessageBodySize, void *lpMessageHeader )
{
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
LPDPMSG_SENDENVELOPE lpMsg = lpMessageBody;
HRESULT hr = DPERR_GENERIC;
WORD wCommandId;
WORD wVersion;
DPSP_REPLYDATA data;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
-
FIXME( "(%p)->(%p,0x%08x,%p): mostly stub\n",
This, lpMessageBody, dwMessageBodySize, lpMessageHeader );
data.dwMessageSize = 0;
/* Pass this message to the dplay interface to handle */
- hr = DP_HandleMessage( This->sp->dplay, lpMessageBody, dwMessageBodySize,
- lpMessageHeader, wCommandId, wVersion,
- &data.lpMessage, &data.dwMessageSize );
+ hr = DP_HandleMessage( This->dplay, lpMessageBody, dwMessageBodySize, lpMessageHeader,
+ wCommandId, wVersion, &data.lpMessage, &data.dwMessageSize );
if( FAILED(hr) )
{
data.idNameServer = 0;
data.lpISP = iface;
- hr = (This->sp->dplay->dp2->spData.lpCB->Reply)( &data );
+ hr = This->dplay->dp2->spData.lpCB->Reply( &data );
if( FAILED(hr) )
{
#endif
}
-static HRESULT WINAPI IDirectPlaySPImpl_SetSPPlayerData
-( LPDIRECTPLAYSP iface,
- DPID idPlayer,
- LPVOID lpData,
- DWORD dwDataSize,
- DWORD dwFlags
-)
+static HRESULT WINAPI IDirectPlaySPImpl_SetSPPlayerData( IDirectPlaySP *iface, DPID idPlayer,
+ void *lpData, DWORD dwDataSize, DWORD dwFlags )
{
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
HRESULT hr;
LPDP_SPPLAYERDATA lpPlayerEntry;
LPVOID lpPlayerData;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
-
-/* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */
- TRACE( "(%p)->(0x%08x,%p,0x%08x,0x%08x)\n",
- This, idPlayer, lpData, dwDataSize, dwFlags );
+ TRACE( "(%p)->(0x%08x,%p,0x%08x,0x%08x)\n", This, idPlayer, lpData, dwDataSize, dwFlags );
- hr = DP_GetSPPlayerData( This->sp->dplay, idPlayer, (LPVOID*)&lpPlayerEntry );
+ hr = DP_GetSPPlayerData( This->dplay, idPlayer, (void**)&lpPlayerEntry );
if( FAILED(hr) )
{
/* Player must not exist */
lpPlayerEntry->dwPlayerRemoteDataSize = dwDataSize;
}
- hr = DP_SetSPPlayerData( This->sp->dplay, idPlayer, lpPlayerEntry );
+ hr = DP_SetSPPlayerData( This->dplay, idPlayer, lpPlayerEntry );
return hr;
}
-static HRESULT WINAPI IDirectPlaySPImpl_CreateCompoundAddress
-( LPDIRECTPLAYSP iface,
- LPCDPCOMPOUNDADDRESSELEMENT lpElements,
- DWORD dwElementCount,
- LPVOID lpAddress,
- LPDWORD lpdwAddressSize
-)
+static HRESULT WINAPI IDirectPlaySPImpl_CreateCompoundAddress( IDirectPlaySP *iface,
+ const DPCOMPOUNDADDRESSELEMENT *lpElements, DWORD dwElementCount, void *lpAddress,
+ DWORD *lpdwAddressSize )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
FIXME( "(%p)->(%p,0x%08x,%p,%p): stub\n",
This, lpElements, dwElementCount, lpAddress, lpdwAddressSize );
return DP_OK;
}
-static HRESULT WINAPI IDirectPlaySPImpl_GetSPData
-( LPDIRECTPLAYSP iface,
- LPVOID* lplpData,
- LPDWORD lpdwDataSize,
- DWORD dwFlags
-)
+static HRESULT WINAPI IDirectPlaySPImpl_GetSPData( IDirectPlaySP *iface, void **lplpData,
+ DWORD *lpdwDataSize, DWORD dwFlags )
{
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
HRESULT hr = DP_OK;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
-/* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */
- TRACE( "(%p)->(%p,%p,0x%08x)\n",
- This, lplpData, lpdwDataSize, dwFlags );
+ TRACE( "(%p)->(%p,%p,0x%08x)\n", This, lplpData, lpdwDataSize, dwFlags );
#if 0
/* This is what the documentation says... */
/* Yes, we're supposed to return a pointer to the memory we have stored! */
if( dwFlags == DPSET_REMOTE )
{
- *lpdwDataSize = This->sp->dwSpRemoteDataSize;
- *lplpData = This->sp->lpSpRemoteData;
+ *lpdwDataSize = This->remote_data_size;
+ *lplpData = This->remote_data;
- if( This->sp->lpSpRemoteData == NULL )
- {
+ if( !This->remote_data )
hr = DPERR_GENERIC;
- }
}
else if( dwFlags == DPSET_LOCAL )
{
- *lpdwDataSize = This->sp->dwSpLocalDataSize;
- *lplpData = This->sp->lpSpLocalData;
+ *lpdwDataSize = This->local_data_size;
+ *lplpData = This->local_data;
- if( This->sp->lpSpLocalData == NULL )
- {
+ if( !This->local_data )
hr = DPERR_GENERIC;
- }
}
return hr;
}
-static HRESULT WINAPI IDirectPlaySPImpl_SetSPData
-( LPDIRECTPLAYSP iface,
- LPVOID lpData,
- DWORD dwDataSize,
- DWORD dwFlags
-)
+static HRESULT WINAPI IDirectPlaySPImpl_SetSPData( IDirectPlaySP *iface, void *lpData,
+ DWORD dwDataSize, DWORD dwFlags )
{
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
LPVOID lpSpData;
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
-
-/* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */
- TRACE( "(%p)->(%p,0x%08x,0x%08x)\n",
- This, lpData, dwDataSize, dwFlags );
+ TRACE( "(%p)->(%p,0x%08x,0x%08x)\n", This, lpData, dwDataSize, dwFlags );
#if 0
/* This is what the documentation says... */
/* If we have data already allocated, free it and replace it */
if( dwFlags == DPSET_REMOTE )
{
- HeapFree( GetProcessHeap(), 0, This->sp->lpSpRemoteData );
- This->sp->dwSpRemoteDataSize = dwDataSize;
- This->sp->lpSpRemoteData = lpSpData;
+ HeapFree( GetProcessHeap(), 0, This->remote_data );
+ This->remote_data_size = dwDataSize;
+ This->remote_data = lpSpData;
}
else if ( dwFlags == DPSET_LOCAL )
{
- HeapFree( GetProcessHeap(), 0, This->sp->lpSpLocalData );
- This->sp->lpSpLocalData = lpSpData;
- This->sp->dwSpLocalDataSize = dwDataSize;
+ HeapFree( GetProcessHeap(), 0, This->local_data );
+ This->local_data = lpSpData;
+ This->local_data_size = dwDataSize;
}
return DP_OK;
}
-static VOID WINAPI IDirectPlaySPImpl_SendComplete
-( LPDIRECTPLAYSP iface,
- LPVOID unknownA,
- DWORD unknownB
-)
+static void WINAPI IDirectPlaySPImpl_SendComplete( IDirectPlaySP *iface, void *unknownA,
+ DWORD unknownB )
{
- IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
+ IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface );
FIXME( "(%p)->(%p,0x%08x): stub\n",
This, unknownA, unknownB );
static const IDirectPlaySPVtbl directPlaySPVT =
{
-
- DPSP_QueryInterface,
- DPSP_AddRef,
- DPSP_Release,
-
+ IDirectPlaySPImpl_QueryInterface,
+ IDirectPlaySPImpl_AddRef,
+ IDirectPlaySPImpl_Release,
IDirectPlaySPImpl_AddMRUEntry,
IDirectPlaySPImpl_CreateAddress,
IDirectPlaySPImpl_EnumAddress,
IDirectPlaySPImpl_SendComplete
};
+HRESULT dplaysp_create( REFIID riid, void **ppv, IDirectPlayImpl *dp )
+{
+ IDirectPlaySPImpl *obj;
+ HRESULT hr;
+
+ TRACE( "(%s, %p)\n", debugstr_guid( riid ), ppv );
+
+ *ppv = NULL;
+ obj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *obj ) );
+ if ( !obj )
+ return DPERR_OUTOFMEMORY;
+
+ obj->IDirectPlaySP_iface.lpVtbl = &directPlaySPVT;
+ obj->ref = 1;
+ obj->dplay = dp;
+
+ hr = IDirectPlaySP_QueryInterface( &obj->IDirectPlaySP_iface, riid, ppv );
+ IDirectPlaySP_Release( &obj->IDirectPlaySP_iface );
+
+ return hr;
+}
/* DP external interfaces to call into DPSP interface */
#include "dplayx_global.h"
-/* Prototypes */
-static BOOL DPLSP_CreateIUnknown( LPVOID lpSP );
-static BOOL DPLSP_DestroyIUnknown( LPVOID lpSP );
-static BOOL DPLSP_CreateDPLobbySP( void *lpSP, IDirectPlayImpl *dp );
-static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP );
-
-/* Predefine the interface */
-typedef struct IDPLobbySPImpl IDPLobbySPImpl;
-
-typedef struct tagDPLobbySPIUnknownData
-{
- LONG ulObjRef;
- CRITICAL_SECTION DPLSP_lock;
-} DPLobbySPIUnknownData;
-
-typedef struct tagDPLobbySPData
+typedef struct IDPLobbySPImpl
{
+ IDPLobbySP IDPLobbySP_iface;
+ LONG ref;
IDirectPlayImpl *dplay;
-} DPLobbySPData;
-
-#define DPLSP_IMPL_FIELDS \
- LONG ulInterfaceRef; \
- DPLobbySPIUnknownData* unk; \
- DPLobbySPData* sp;
+} IDPLobbySPImpl;
-struct IDPLobbySPImpl
+static inline IDPLobbySPImpl *impl_from_IDPLobbySP(IDPLobbySP *iface)
{
- const IDPLobbySPVtbl *lpVtbl;
- DPLSP_IMPL_FIELDS
-};
-
-/* Forward declaration of virtual tables */
-static const IDPLobbySPVtbl dpLobbySPVT;
-
-HRESULT DPLSP_CreateInterface( REFIID riid, void **ppvObj, IDirectPlayImpl *dp )
-{
- TRACE( " for %s\n", debugstr_guid( riid ) );
-
- *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof( IDPLobbySPImpl ) );
-
- if( *ppvObj == NULL )
- {
- return DPERR_OUTOFMEMORY;
- }
-
- if( IsEqualGUID( &IID_IDPLobbySP, riid ) )
- {
- IDPLobbySPImpl *This = *ppvObj;
- This->lpVtbl = &dpLobbySPVT;
- }
- else
- {
- /* Unsupported interface */
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return E_NOINTERFACE;
- }
-
- /* Initialize it */
- if( DPLSP_CreateIUnknown( *ppvObj ) &&
- DPLSP_CreateDPLobbySP( *ppvObj, dp )
- )
- {
- IDPLobbySP_AddRef( (LPDPLOBBYSP)*ppvObj );
- return S_OK;
- }
-
- /* Initialize failed, destroy it */
- DPLSP_DestroyDPLobbySP( *ppvObj );
- DPLSP_DestroyIUnknown( *ppvObj );
-
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return DPERR_NOMEMORY;
+ return CONTAINING_RECORD(iface, IDPLobbySPImpl, IDPLobbySP_iface);
}
-static BOOL DPLSP_CreateIUnknown( LPVOID lpSP )
+static HRESULT WINAPI IDPLobbySPImpl_QueryInterface( IDPLobbySP *iface, REFIID riid,
+ void **ppv )
{
- IDPLobbySPImpl *This = lpSP;
-
- This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) );
+ TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid( riid ), ppv );
- if ( This->unk == NULL )
+ if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDPLobbySP, riid ) )
{
- return FALSE;
- }
-
- InitializeCriticalSection( &This->unk->DPLSP_lock );
- This->unk->DPLSP_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDPLobbySPImpl*->DPLobbySPIUnknownData*->DPLSP_lock");
-
- return TRUE;
-}
-
-static BOOL DPLSP_DestroyIUnknown( LPVOID lpSP )
-{
- IDPLobbySPImpl *This = lpSP;
-
- This->unk->DPLSP_lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection( &This->unk->DPLSP_lock );
- HeapFree( GetProcessHeap(), 0, This->unk );
-
- return TRUE;
-}
-
-static BOOL DPLSP_CreateDPLobbySP( void *lpSP, IDirectPlayImpl *dp )
-{
- IDPLobbySPImpl *This = lpSP;
-
- This->sp = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->sp) ) );
-
- if ( This->sp == NULL )
- {
- return FALSE;
- }
-
- This->sp->dplay = dp;
-
- return TRUE;
-}
-
-static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP )
-{
- IDPLobbySPImpl *This = lpSP;
-
- HeapFree( GetProcessHeap(), 0, This->sp );
-
- return TRUE;
-}
-
-static
-HRESULT WINAPI DPLSP_QueryInterface
-( LPDPLOBBYSP iface,
- REFIID riid,
- LPVOID* ppvObj
-)
-{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
- 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 ) );
- (*(IDPLobbySPImpl**)ppvObj)->ulInterfaceRef = 0;
-
- if( IsEqualGUID( &IID_IDPLobbySP, riid ) )
- {
- IDPLobbySPImpl *This = *ppvObj;
- This->lpVtbl = &dpLobbySPVT;
- }
- else
- {
- /* Unsupported interface */
- HeapFree( GetProcessHeap(), 0, *ppvObj );
- *ppvObj = NULL;
-
- return E_NOINTERFACE;
+ *ppv = iface;
+ IDPLobbySP_AddRef(iface);
+ return S_OK;
}
- IDPLobbySP_AddRef( (LPDPLOBBYSP)*ppvObj );
-
- return S_OK;
+ FIXME("Unsupported interface %s\n", debugstr_guid(riid));
+ *ppv = NULL;
+ return E_NOINTERFACE;
}
-static
-ULONG WINAPI DPLSP_AddRef
-( LPDPLOBBYSP iface )
+static ULONG WINAPI IDPLobbySPImpl_AddRef( IDPLobbySP *iface )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
-
- ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
+ ULONG ref = InterlockedIncrement( &This->ref );
- TRACE( "ref count incremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
+ TRACE( "(%p) ref=%d\n", This, ref );
- return ulObjRefCount;
+ return ref;
}
-static
-ULONG WINAPI DPLSP_Release
-( LPDPLOBBYSP iface )
+static ULONG WINAPI IDPLobbySPImpl_Release( IDPLobbySP *iface )
{
- ULONG ulInterfaceRefCount, ulObjRefCount;
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
+ ULONG ref = InterlockedDecrement( &This->ref );
- ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef );
- ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
+ TRACE( "(%p) ref=%d\n", This, ref );
- TRACE( "ref count decremented to %u:%u for %p\n",
- ulInterfaceRefCount, ulObjRefCount, This );
-
- /* Deallocate if this is the last reference to the object */
- if( ulObjRefCount == 0 )
- {
- DPLSP_DestroyDPLobbySP( This );
- DPLSP_DestroyIUnknown( This );
- }
-
- if( ulInterfaceRefCount == 0 )
- {
+ if( !ref )
HeapFree( GetProcessHeap(), 0, This );
- }
- return ulInterfaceRefCount;
+ return ref;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_AddGroupToGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_ADDREMOTEGROUPTOGROUP argtg
-)
+static HRESULT WINAPI IDPLobbySPImpl_AddGroupToGroup( IDPLobbySP *iface,
+ SPDATA_ADDREMOTEGROUPTOGROUP *argtg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, argtg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_AddPlayerToGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_ADDREMOTEPLAYERTOGROUP arptg
-)
+static HRESULT WINAPI IDPLobbySPImpl_AddPlayerToGroup( IDPLobbySP *iface,
+ SPDATA_ADDREMOTEPLAYERTOGROUP *arptg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, arptg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_CreateGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_CREATEREMOTEGROUP crg
-)
+static HRESULT WINAPI IDPLobbySPImpl_CreateGroup( IDPLobbySP *iface,
+ SPDATA_CREATEREMOTEGROUP *crg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, crg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_CreateGroupInGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_CREATEREMOTEGROUPINGROUP crgig
-)
+static HRESULT WINAPI IDPLobbySPImpl_CreateGroupInGroup( IDPLobbySP *iface,
+ SPDATA_CREATEREMOTEGROUPINGROUP *crgig )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, crgig );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_DeleteGroupFromGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_DELETEREMOTEGROUPFROMGROUP drgfg
-)
+static HRESULT WINAPI IDPLobbySPImpl_DeleteGroupFromGroup( IDPLobbySP *iface,
+ SPDATA_DELETEREMOTEGROUPFROMGROUP *drgfg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, drgfg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_DeletePlayerFromGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_DELETEREMOTEPLAYERFROMGROUP drpfg
-)
+static HRESULT WINAPI IDPLobbySPImpl_DeletePlayerFromGroup( IDPLobbySP *iface,
+ SPDATA_DELETEREMOTEPLAYERFROMGROUP *drpfg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, drpfg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_DestroyGroup
-( LPDPLOBBYSP iface,
- LPSPDATA_DESTROYREMOTEGROUP drg
-)
+static HRESULT WINAPI IDPLobbySPImpl_DestroyGroup( IDPLobbySP *iface,
+ SPDATA_DESTROYREMOTEGROUP *drg )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, drg );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_EnumSessionsResponse
-( LPDPLOBBYSP iface,
- LPSPDATA_ENUMSESSIONSRESPONSE er
-)
+static HRESULT WINAPI IDPLobbySPImpl_EnumSessionsResponse( IDPLobbySP *iface,
+ SPDATA_ENUMSESSIONSRESPONSE *er )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, er );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_GetSPDataPointer
-( LPDPLOBBYSP iface,
- LPVOID* lplpData
-)
+static HRESULT WINAPI IDPLobbySPImpl_GetSPDataPointer( IDPLobbySP *iface, LPVOID* lplpData )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, lplpData );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_HandleMessage
-( LPDPLOBBYSP iface,
- LPSPDATA_HANDLEMESSAGE hm
-)
+static HRESULT WINAPI IDPLobbySPImpl_HandleMessage( IDPLobbySP *iface, SPDATA_HANDLEMESSAGE *hm )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, hm );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_SendChatMessage
-( LPDPLOBBYSP iface,
- LPSPDATA_CHATMESSAGE cm
-)
+static HRESULT WINAPI IDPLobbySPImpl_SendChatMessage( IDPLobbySP *iface,
+ SPDATA_CHATMESSAGE *cm )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, cm );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_SetGroupName
-( LPDPLOBBYSP iface,
- LPSPDATA_SETREMOTEGROUPNAME srgn
-)
+static HRESULT WINAPI IDPLobbySPImpl_SetGroupName( IDPLobbySP *iface,
+ SPDATA_SETREMOTEGROUPNAME *srgn )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, srgn );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_SetPlayerName
-( LPDPLOBBYSP iface,
- LPSPDATA_SETREMOTEPLAYERNAME srpn
-)
+static HRESULT WINAPI IDPLobbySPImpl_SetPlayerName( IDPLobbySP *iface,
+ SPDATA_SETREMOTEPLAYERNAME *srpn )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, srpn );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_SetSessionDesc
-( LPDPLOBBYSP iface,
- LPSPDATA_SETSESSIONDESC ssd
-)
+static HRESULT WINAPI IDPLobbySPImpl_SetSessionDesc( IDPLobbySP *iface,
+ SPDATA_SETSESSIONDESC *ssd )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, ssd );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_SetSPDataPointer
-( LPDPLOBBYSP iface,
- LPVOID lpData
-)
+static HRESULT WINAPI IDPLobbySPImpl_SetSPDataPointer( IDPLobbySP *iface, void *lpData )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, lpData );
return DP_OK;
}
-static
-HRESULT WINAPI IDPLobbySPImpl_StartSession
-( LPDPLOBBYSP iface,
- LPSPDATA_STARTSESSIONCOMMAND ssc
-)
+static HRESULT WINAPI IDPLobbySPImpl_StartSession( IDPLobbySP *iface,
+ SPDATA_STARTSESSIONCOMMAND *ssc )
{
- IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
+ IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
FIXME( "(%p)->(%p):stub\n", This, ssc );
return DP_OK;
}
static const IDPLobbySPVtbl dpLobbySPVT =
{
-
- DPLSP_QueryInterface,
- DPLSP_AddRef,
- DPLSP_Release,
-
+ IDPLobbySPImpl_QueryInterface,
+ IDPLobbySPImpl_AddRef,
+ IDPLobbySPImpl_Release,
IDPLobbySPImpl_AddGroupToGroup,
IDPLobbySPImpl_AddPlayerToGroup,
IDPLobbySPImpl_CreateGroup,
IDPLobbySPImpl_SetSessionDesc,
IDPLobbySPImpl_SetSPDataPointer,
IDPLobbySPImpl_StartSession
-
};
+
+HRESULT dplobbysp_create( REFIID riid, void **ppv, IDirectPlayImpl *dp )
+{
+ IDPLobbySPImpl *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->IDPLobbySP_iface.lpVtbl = &dpLobbySPVT;
+ obj->ref = 1;
+ obj->dplay = dp;
+
+ hr = IDPLobbySP_QueryInterface( &obj->IDPLobbySP_iface, riid, ppv );
+ IDPLobbySP_Release( &obj->IDPLobbySP_iface );
+
+ return hr;
+}