/* 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 */