📄 dplay.c
字号:
hr = (*This->dp2->spData.lpCB->RemovePlayerFromGroup)( &data );
}
/* Need to send a DELETEPLAYERFROMGROUP message */
FIXME( "Need to send a message\n" );
return hr;
}
static HRESULT WINAPI DirectPlay2AImpl_DeletePlayerFromGroup
( LPDIRECTPLAY2A iface, DPID idGroup, DPID idPlayer )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DeletePlayerFromGroup( This, NULL, idGroup, idPlayer, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_DeletePlayerFromGroup
( LPDIRECTPLAY2 iface, DPID idGroup, DPID idPlayer )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DeletePlayerFromGroup( This, NULL, idGroup, idPlayer, FALSE );
}
typedef struct _DPRGOPContext
{
IDirectPlay3Impl* This;
BOOL bAnsi;
DPID idGroup;
} DPRGOPContext, *lpDPRGOPContext;
static BOOL CALLBACK
cbRemoveGroupOrPlayer(
DPID dpId,
DWORD dwPlayerType,
LPCDPNAME lpName,
DWORD dwFlags,
LPVOID lpContext )
{
lpDPRGOPContext lpCtxt = (lpDPRGOPContext)lpContext;
TRACE( "Removing element:0x%08lx (type:0x%08lx) from element:0x%08lx\n",
dpId, dwPlayerType, lpCtxt->idGroup );
if( dwPlayerType == DPPLAYERTYPE_GROUP )
{
if( FAILED( DP_IF_DeleteGroupFromGroup( lpCtxt->This, lpCtxt->idGroup,
dpId )
)
)
{
ERR( "Unable to delete group 0x%08lx from group 0x%08lx\n",
dpId, lpCtxt->idGroup );
}
}
else
{
if( FAILED( DP_IF_DeletePlayerFromGroup( (IDirectPlay2Impl*)lpCtxt->This,
NULL, lpCtxt->idGroup,
dpId, lpCtxt->bAnsi )
)
)
{
ERR( "Unable to delete player 0x%08lx from grp 0x%08lx\n",
dpId, lpCtxt->idGroup );
}
}
return TRUE; /* Continue enumeration */
}
static HRESULT WINAPI DP_IF_DestroyGroup
( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, BOOL bAnsi )
{
lpGroupData lpGData;
DPRGOPContext context;
FIXME( "(%p)->(%p,0x%08lx,%u): semi stub\n",
This, lpMsgHdr, idGroup, bAnsi );
/* Find the group */
if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL )
{
return DPERR_INVALIDPLAYER; /* yes player */
}
context.This = (IDirectPlay3Impl*)This;
context.bAnsi = bAnsi;
context.idGroup = idGroup;
/* Remove all players that this group has */
DP_IF_EnumGroupPlayers( This, idGroup, NULL,
cbRemoveGroupOrPlayer, (LPVOID)&context, 0, bAnsi );
/* Remove all links to groups that this group has since this is dp3 */
DP_IF_EnumGroupsInGroup( (IDirectPlay3Impl*)This, idGroup, NULL,
cbRemoveGroupOrPlayer, (LPVOID)&context, 0, bAnsi );
/* Remove this group from the parent group - if it has one */
if( ( idGroup != DPID_SYSTEM_GROUP ) &&
( lpGData->parent != DPID_SYSTEM_GROUP )
)
{
DP_IF_DeleteGroupFromGroup( (IDirectPlay3Impl*)This, lpGData->parent,
idGroup );
}
/* Now delete this group data and list from the system group */
DP_DeleteGroup( This, idGroup );
/* Let the SP know that we've destroyed this group */
if( This->dp2->spData.lpCB->DeleteGroup )
{
DPSP_DELETEGROUPDATA data;
FIXME( "data.dwFlags is incorrect\n" );
data.idGroup = idGroup;
data.dwFlags = 0;
data.lpISP = This->dp2->spData.lpISP;
(*This->dp2->spData.lpCB->DeleteGroup)( &data );
}
FIXME( "Send out a DESTORYPLAYERORGROUP message\n" );
return DP_OK;
}
static HRESULT WINAPI DirectPlay2AImpl_DestroyGroup
( LPDIRECTPLAY2A iface, DPID idGroup )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DestroyGroup( This, NULL, idGroup, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_DestroyGroup
( LPDIRECTPLAY2 iface, DPID idGroup )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DestroyGroup( This, NULL, idGroup, FALSE );
}
typedef struct _DPFAGContext
{
IDirectPlay2Impl* This;
DPID idPlayer;
BOOL bAnsi;
} DPFAGContext, *lpDPFAGContext;
static HRESULT WINAPI DP_IF_DestroyPlayer
( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idPlayer, BOOL bAnsi )
{
DPFAGContext cbContext;
FIXME( "(%p)->(%p,0x%08lx,%u): semi stub\n",
This, lpMsgHdr, idPlayer, bAnsi );
if( This->dp2->connectionInitialized == NO_PROVIDER )
{
return DPERR_UNINITIALIZED;
}
if( DP_FindPlayer( This, idPlayer ) == NULL )
{
return DPERR_INVALIDPLAYER;
}
/* FIXME: If the player is remote, we must be the host to delete this */
cbContext.This = This;
cbContext.idPlayer = idPlayer;
cbContext.bAnsi = bAnsi;
/* Find each group and call DeletePlayerFromGroup if the player is a
member of the group */
DP_IF_EnumGroups( This, NULL, cbDeletePlayerFromAllGroups,
(LPVOID)&cbContext, DPENUMGROUPS_ALL, bAnsi );
/* Now delete player and player list from the sys group */
DP_DeletePlayer( This, idPlayer );
/* Let the SP know that we've destroyed this group */
if( This->dp2->spData.lpCB->DeletePlayer )
{
DPSP_DELETEPLAYERDATA data;
FIXME( "data.dwFlags is incorrect\n" );
data.idPlayer = idPlayer;
data.dwFlags = 0;
data.lpISP = This->dp2->spData.lpISP;
(*This->dp2->spData.lpCB->DeletePlayer)( &data );
}
FIXME( "Send a DELETEPLAYERORGROUP msg\n" );
return DP_OK;
}
static BOOL CALLBACK
cbDeletePlayerFromAllGroups(
DPID dpId,
DWORD dwPlayerType,
LPCDPNAME lpName,
DWORD dwFlags,
LPVOID lpContext )
{
lpDPFAGContext lpCtxt = (lpDPFAGContext)lpContext;
if( dwPlayerType == DPPLAYERTYPE_GROUP )
{
DP_IF_DeletePlayerFromGroup( lpCtxt->This, NULL, dpId, lpCtxt->idPlayer,
lpCtxt->bAnsi );
/* Enumerate all groups in this group since this will normally only
* be called for top level groups
*/
DP_IF_EnumGroupsInGroup( (IDirectPlay3Impl*)lpCtxt->This,
dpId, NULL,
cbDeletePlayerFromAllGroups,
(LPVOID)lpContext, DPENUMGROUPS_ALL,
lpCtxt->bAnsi );
}
else
{
ERR( "Group callback has dwPlayerType = 0x%08lx\n", dwPlayerType );
}
return TRUE;
}
static HRESULT WINAPI DirectPlay2AImpl_DestroyPlayer
( LPDIRECTPLAY2A iface, DPID idPlayer )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DestroyPlayer( This, NULL, idPlayer, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_DestroyPlayer
( LPDIRECTPLAY2 iface, DPID idPlayer )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_DestroyPlayer( This, NULL, idPlayer, FALSE );
}
static HRESULT WINAPI DP_IF_EnumGroupPlayers
( IDirectPlay2Impl* This, DPID idGroup, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags, BOOL bAnsi )
{
lpGroupData lpGData;
lpPlayerList lpPList;
FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx,%u): semi stub\n",
This, idGroup, lpguidInstance, lpEnumPlayersCallback2,
lpContext, dwFlags, bAnsi );
if( This->dp2->connectionInitialized == NO_PROVIDER )
{
return DPERR_UNINITIALIZED;
}
/* Find the group */
if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL )
{
return DPERR_INVALIDGROUP;
}
if( DPQ_IS_EMPTY( lpGData->players ) )
{
return DP_OK;
}
lpPList = DPQ_FIRST( lpGData->players );
/* Walk the players in this group */
for( ;; )
{
/* We do not enum the name server or app server as they are of no
* concequence to the end user.
*/
if( ( lpPList->lpPData->dpid != DPID_NAME_SERVER ) &&
( lpPList->lpPData->dpid != DPID_SERVERPLAYER )
)
{
/* FIXME: Need to add stuff for dwFlags checking */
if( !lpEnumPlayersCallback2( lpPList->lpPData->dpid, DPPLAYERTYPE_PLAYER,
&lpPList->lpPData->name,
lpPList->lpPData->dwFlags,
lpContext )
)
{
/* User requested break */
return DP_OK;
}
}
if( DPQ_IS_ENDOFLIST( lpPList->players ) )
{
break;
}
lpPList = DPQ_NEXT( lpPList->players );
}
return DP_OK;
}
static HRESULT WINAPI DirectPlay2AImpl_EnumGroupPlayers
( LPDIRECTPLAY2A iface, DPID idGroup, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumGroupPlayers( This, idGroup, lpguidInstance,
lpEnumPlayersCallback2, lpContext,
dwFlags, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_EnumGroupPlayers
( LPDIRECTPLAY2 iface, DPID idGroup, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumGroupPlayers( This, idGroup, lpguidInstance,
lpEnumPlayersCallback2, lpContext,
dwFlags, FALSE );
}
/* NOTE: This only enumerates top level groups (created with CreateGroup) */
static HRESULT WINAPI DP_IF_EnumGroups
( IDirectPlay2Impl* This, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags, BOOL bAnsi )
{
return DP_IF_EnumGroupsInGroup( (IDirectPlay3Impl*)This,
DPID_SYSTEM_GROUP, lpguidInstance,
lpEnumPlayersCallback2, lpContext,
dwFlags, bAnsi );
}
static HRESULT WINAPI DirectPlay2AImpl_EnumGroups
( LPDIRECTPLAY2A iface, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumGroups( This, lpguidInstance, lpEnumPlayersCallback2,
lpContext, dwFlags, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_EnumGroups
( LPDIRECTPLAY2 iface, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumGroups( This, lpguidInstance, lpEnumPlayersCallback2,
lpContext, dwFlags, FALSE );
}
static HRESULT WINAPI DP_IF_EnumPlayers
( IDirectPlay2Impl* This, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags, BOOL bAnsi )
{
return DP_IF_EnumGroupPlayers( This, DPID_SYSTEM_GROUP, lpguidInstance,
lpEnumPlayersCallback2, lpContext,
dwFlags, bAnsi );
}
static HRESULT WINAPI DirectPlay2AImpl_EnumPlayers
( LPDIRECTPLAY2A iface, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumPlayers( This, lpguidInstance, lpEnumPlayersCallback2,
lpContext, dwFlags, TRUE );
}
static HRESULT WINAPI DirectPlay2WImpl_EnumPlayers
( LPDIRECTPLAY2 iface, LPGUID lpguidInstance,
LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
LPVOID lpContext, DWORD dwFlags )
{
IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
return DP_IF_EnumPlayers( This, lpguidInstance, lpEnumPlayersCallback2,
lpContext, dwFlags, FALSE );
}
/* This function should call the registered callback function that the user
passed into EnumSessions for each entry available.
*/
static void DP_InvokeEnumSessionCallbacks
( LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
LPVOID lpNSInfo,
DWORD dwTimeout,
LPVOID lpContext )
{
LPDPSESSIONDESC2 lpSessionDesc;
FIXME( ": not checking for conditions\n" );
/* Not sure if this should be pruning but it's convenient */
NS_PruneSessionCache( lpNSInfo );
NS_ResetSessionEnumeration( lpNSInfo );
/* Enumerate all sessions */
/* FIXME: Need to indicate ANSI */
while( (lpSessionDesc = NS_Wal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -