dplayx: Merge the IDirectPlay4_AddPlayerToGroup helper.

This commit is contained in:
Michael Stefaniuc 2013-03-29 17:03:51 +01:00 committed by Alexandre Julliard
parent 06edee2da7
commit 5dc2b8f69c
1 changed files with 73 additions and 93 deletions

View File

@ -106,9 +106,6 @@ static HRESULT DP_IF_CreateGroupInGroup
( IDirectPlay3Impl* This, LPVOID lpMsgHdr, DPID idParentGroup,
LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData,
DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi );
static HRESULT DP_IF_AddPlayerToGroup
( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup,
DPID idPlayer, BOOL bAnsi );
static HRESULT DP_SetSessionDesc
( IDirectPlay2Impl* This, LPCDPSESSIONDESC2 lpSessDesc,
DWORD dwFlags, BOOL bInitial, BOOL bAnsi );
@ -428,86 +425,6 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody,
}
static HRESULT DP_IF_AddPlayerToGroup
( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup,
DPID idPlayer, BOOL bAnsi )
{
lpGroupData lpGData;
lpPlayerList lpPList;
lpPlayerList lpNewPList;
TRACE( "(%p)->(%p,0x%08x,0x%08x,%u)\n",
This, lpMsgHdr, idGroup, idPlayer, bAnsi );
if( This->dp2->connectionInitialized == NO_PROVIDER )
{
return DPERR_UNINITIALIZED;
}
/* Find the group */
if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL )
{
return DPERR_INVALIDGROUP;
}
/* Find the player */
if( ( lpPList = DP_FindPlayer( This, idPlayer ) ) == NULL )
{
return DPERR_INVALIDPLAYER;
}
/* Create a player list (ie "shortcut" ) */
lpNewPList = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *lpNewPList ) );
if( lpNewPList == NULL )
{
return DPERR_CANTADDPLAYER;
}
/* Add the shortcut */
lpPList->lpPData->uRef++;
lpNewPList->lpPData = lpPList->lpPData;
/* Add the player to the list of players for this group */
DPQ_INSERT(lpGData->players,lpNewPList,players);
/* Let the SP know that we've added a player to the group */
if( This->dp2->spData.lpCB->AddPlayerToGroup )
{
DPSP_ADDPLAYERTOGROUPDATA data;
TRACE( "Calling SP AddPlayerToGroup\n" );
data.idPlayer = idPlayer;
data.idGroup = idGroup;
data.lpISP = This->dp2->spData.lpISP;
(*This->dp2->spData.lpCB->AddPlayerToGroup)( &data );
}
/* Inform all other peers of the addition of player to the group. If there are
* no peers keep this event quiet.
* Also, if this event was the result of another machine sending it to us,
* don't bother rebroadcasting it.
*/
if( ( lpMsgHdr == NULL ) &&
This->dp2->lpSessionDesc &&
( This->dp2->lpSessionDesc->dwFlags & DPSESSION_MULTICASTSERVER ) )
{
DPMSG_ADDPLAYERTOGROUP msg;
msg.dwType = DPSYS_ADDPLAYERTOGROUP;
msg.dpIdGroup = idGroup;
msg.dpIdPlayer = idPlayer;
/* FIXME: Correct to just use send effectively? */
/* FIXME: Should size include data w/ message or just message "header" */
/* FIXME: Check return code */
DP_SendEx( This, DPID_SERVERPLAYER, DPID_ALLPLAYERS, 0, &msg, sizeof( msg ), 0, 0, NULL, NULL, bAnsi );
}
return DP_OK;
}
static HRESULT WINAPI IDirectPlay4AImpl_QueryInterface( IDirectPlay4A *iface, REFIID riid,
void **ppv )
{
@ -618,18 +535,82 @@ static ULONG WINAPI IDirectPlay4Impl_Release(IDirectPlay4 *iface)
return ref;
}
static HRESULT WINAPI IDirectPlay4AImpl_AddPlayerToGroup( IDirectPlay4A *iface, DPID idGroup,
DPID idPlayer )
static HRESULT WINAPI IDirectPlay4AImpl_AddPlayerToGroup( IDirectPlay4A *iface, DPID group,
DPID player )
{
IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface );
return DP_IF_AddPlayerToGroup( This, NULL, idGroup, idPlayer, TRUE );
IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface );
return IDirectPlayX_AddPlayerToGroup( &This->IDirectPlay4_iface, group, player );
}
static HRESULT WINAPI DirectPlay2WImpl_AddPlayerToGroup
( LPDIRECTPLAY2 iface, DPID idGroup, DPID idPlayer )
static HRESULT WINAPI IDirectPlay4Impl_AddPlayerToGroup( IDirectPlay4 *iface, DPID group,
DPID player )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_AddPlayerToGroup( This, NULL, idGroup, idPlayer, FALSE );
IDirectPlayImpl *This = impl_from_IDirectPlay4( iface );
lpGroupData gdata;
lpPlayerList plist;
lpPlayerList newplist;
TRACE( "(%p)->(0x%08x,0x%08x)\n", This, group, player );
if ( This->dp2->connectionInitialized == NO_PROVIDER )
return DPERR_UNINITIALIZED;
/* Find the group */
if ( ( gdata = DP_FindAnyGroup( This, group ) ) == NULL )
return DPERR_INVALIDGROUP;
/* Find the player */
if ( ( plist = DP_FindPlayer( This, player ) ) == NULL )
return DPERR_INVALIDPLAYER;
/* Create a player list (ie "shortcut" ) */
newplist = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *newplist ) );
if ( !newplist )
return DPERR_CANTADDPLAYER;
/* Add the shortcut */
plist->lpPData->uRef++;
newplist->lpPData = plist->lpPData;
/* Add the player to the list of players for this group */
DPQ_INSERT(gdata->players, newplist, players);
/* Let the SP know that we've added a player to the group */
if ( This->dp2->spData.lpCB->AddPlayerToGroup )
{
DPSP_ADDPLAYERTOGROUPDATA data;
TRACE( "Calling SP AddPlayerToGroup\n" );
data.idPlayer = player;
data.idGroup = group;
data.lpISP = This->dp2->spData.lpISP;
(*This->dp2->spData.lpCB->AddPlayerToGroup)( &data );
}
/* Inform all other peers of the addition of player to the group. If there are
* no peers keep this event quiet.
* Also, if this event was the result of another machine sending it to us,
* don't bother rebroadcasting it.
*/
if ( This->dp2->lpSessionDesc &&
( This->dp2->lpSessionDesc->dwFlags & DPSESSION_MULTICASTSERVER ) )
{
DPMSG_ADDPLAYERTOGROUP msg;
msg.dwType = DPSYS_ADDPLAYERTOGROUP;
msg.dpIdGroup = group;
msg.dpIdPlayer = player;
/* FIXME: Correct to just use send effectively? */
/* FIXME: Should size include data w/ message or just message "header" */
/* FIXME: Check return code */
IDirectPlayX_SendEx( iface, DPID_SERVERPLAYER, DPID_ALLPLAYERS, 0, &msg, sizeof( msg ),
0, 0, NULL, NULL );
}
return DP_OK;
}
static HRESULT WINAPI IDirectPlay4AImpl_Close( IDirectPlay4A *iface )
@ -4284,8 +4265,7 @@ static const IDirectPlay4Vtbl dp4_vt =
IDirectPlay4Impl_QueryInterface,
IDirectPlay4Impl_AddRef,
IDirectPlay4Impl_Release,
XCAST(AddPlayerToGroup)DirectPlay2WImpl_AddPlayerToGroup,
IDirectPlay4Impl_AddPlayerToGroup,
IDirectPlay4Impl_Close,
XCAST(CreateGroup)DirectPlay2WImpl_CreateGroup,
XCAST(CreatePlayer)DirectPlay2WImpl_CreatePlayer,