25#define NONAMELESSUNION
77#define DPID_NOPARENT_GROUP 0
78#define DPID_SYSTEM_GROUP DPID_NOPARENT_GROUP
80#define DPID_NAME_SERVER 0x19a9d65b
83#define DPMSG_CREATEGROUP_DWFLAGS(x) ( (x) & DPGROUP_HIDDEN )
86#define DPMSG_CREATEPLAYER_DWFLAGS(x) 0
139 This->dp2->dwEnumSessionLock = 0;
156 sizeof( *
This->dp2->lpSessionDesc ) );
157 if(
This->dp2->lpSessionDesc ==
NULL )
162 This->dp2->lpSessionDesc->dwSize =
sizeof( *
This->dp2->lpSessionDesc );
168 sizeof( *
This->dp2->spData.lpCB ) );
169 This->dp2->spData.lpCB->dwSize =
sizeof( *
This->dp2->spData.lpCB );
182 sizeof( *
This->dp2->dplspData.lpCB ) );
183 This->dp2->dplspData.lpCB->dwSize =
sizeof( *
This->dp2->dplspData.lpCB );
213 if(
This->dp2->spData.lpCB->ShutdownEx )
217 TRACE(
"Calling SP ShutdownEx\n" );
219 data.lpISP =
This->dp2->spData.lpISP;
221 (*
This->dp2->spData.lpCB->ShutdownEx)( &
data );
223 else if (
This->dp2->spData.lpCB->Shutdown )
225 TRACE(
"Calling obsolete SP Shutdown\n" );
226 (*
This->dp2->spData.lpCB->Shutdown)();
230 if(
This->dp2->hServiceProvider != 0 )
236 if(
This->dp2->hDPLobbyProvider != 0 )
259 obj->lock.DebugInfo->Spare[0] = 0;
271 DWORD dwMessageBodySize,
const void *lpcMessageHeader,
WORD wCommandId,
WORD wVersion,
272 void **lplpReply,
DWORD *lpdwMsgSize )
274 TRACE(
"(%p)->(%p,0x%08x,%p,%u,%u)\n",
275 This, lpcMessageBody, dwMessageBodySize, lpcMessageHeader, wCommandId,
290 This->dp2->spData.dwSPHeaderSize,
292 This->dp2->lpNameServerData );
301 *lpdwMsgSize =
This->dp2->spData.dwSPHeaderSize +
sizeof( *lpReply );
305 FIXME(
"Ignoring dwFlags 0x%08x in request msg\n",
310 This->dp2->spData.dwSPHeaderSize );
318 TRACE(
"Allocating new playerid 0x%08x from remote request\n",
329 TRACE(
"GOT THE SELF MESSAGE: %p -> 0x%08x\n", lpcMessageHeader, ((
const DWORD *)lpcMessageHeader)[1] );
334 TRACE(
"Sending message to self to get my addr\n" );
343 FIXME(
"Unknown wCommandId %u. Ignoring message\n", wCommandId );
429 FIXME(
"(%p)->(0x%08x): stub\n",
This, player );
475 FIXME(
"(%p)->(%p,%u,%p,%p,0x%08x): stub\n",
This, sdesc,
timeout, enumsessioncb,
context,
483 FIXME(
"(%p)->(%p): stub\n",
This, caps );
498 FIXME(
"(%p)->(0x%08x,%p): stub\n",
This, player, caps );
506 FIXME(
"(%p)->(0x%08x,%p,%p,%p,%p): stub\n",
This, player,
name, size_name,
fullname,
521 FIXME(
"(%p)->(%p): stub\n",
This, sdesc );
529 FIXME(
"(%p)->(%p,%p,0x%08x,%p,%p): stub\n",
This,
from, to,
flags,
data,
size );
544 FIXME(
"(%p)->(0x%08x,0x%08x,0x%08x,%p,%u): stub\n",
This,
from, to,
flags,
data,
size );
557static const IDirectPlayVtbl
dp_vt =
630 *
ppv = &
This->IDirectPlay_iface;
635 *
ppv = &
This->IDirectPlay_iface;
640 *
ppv = &
This->IDirectPlay2A_iface;
645 *
ppv = &
This->IDirectPlay2_iface;
650 *
ppv = &
This->IDirectPlay3A_iface;
655 *
ppv = &
This->IDirectPlay3_iface;
660 *
ppv = &
This->IDirectPlay4A_iface;
665 *
ppv = &
This->IDirectPlay4_iface;
896 plist->lpPData->uRef++;
900 DPQ_INSERT(gdata->players, newplist, players);
903 if (
This->dp2->spData.lpCB->AddPlayerToGroup )
907 TRACE(
"Calling SP AddPlayerToGroup\n" );
909 data.idPlayer = player;
911 data.lpISP =
This->dp2->spData.lpISP;
913 (*
This->dp2->spData.lpCB->AddPlayerToGroup)( &
data );
921 if (
This->dp2->lpSessionDesc &&
928 msg.dpIdPlayer = player;
982 if(
This->dp2->spData.lpCB->CloseEx )
986 TRACE(
"Calling SP CloseEx\n" );
987 data.lpISP =
This->dp2->spData.lpISP;
988 hr = (*
This->dp2->spData.lpCB->CloseEx)( &
data );
990 else if (
This->dp2->spData.lpCB->Close )
992 TRACE(
"Calling SP Close (obsolete interface)\n" );
993 hr = (*
This->dp2->spData.lpCB->Close)();
1007 if( lpGData ==
NULL )
1016 lpGData->
dpid = *lpid;
1021 lpGData->
parent = idParent;
1026 TRACE(
"Created group id 0x%08x\n", *lpid );
1036 TRACE(
"(%p)->(0x%08x)\n",
This, dpid );
1040 if( lpGList ==
NULL )
1042 ERR(
"DPID 0x%08x not found\n", dpid );
1048 FIXME(
"Why is this not the last reference to group?\n" );
1065 TRACE(
"(%p)->(0x%08x)\n",
This, dpid );
1069 return This->dp2->lpSysGroup;
1076 if( lpGroups ==
NULL )
1089 TRACE(
"(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n",
1090 This, lpMsgHdr, lpidGroup, lpGroupName, lpData, dwDataSize,
1104 if(
This->dp2->bHostInterface )
1117 if( lpGData ==
NULL )
1124 This->dp2->lpSysGroup = lpGData;
1125 TRACE(
"Inserting system group\n" );
1147 if(
This->dp2->spData.lpCB->CreateGroup )
1150 DWORD dwCreateFlags = 0;
1152 TRACE(
"Calling SP CreateGroup\n" );
1157 if( lpMsgHdr ==
NULL )
1163 data.idGroup = *lpidGroup;
1164 data.dwFlags = dwCreateFlags;
1165 data.lpSPMessageHeader = lpMsgHdr;
1166 data.lpISP =
This->dp2->spData.lpISP;
1168 (*
This->dp2->spData.lpCB->CreateGroup)( &
data );
1175 if( ( lpMsgHdr ==
NULL ) &&
1176 This->dp2->lpSessionDesc &&
1183 msg.dpId = *lpidGroup;
1184 msg.dwCurrentPlayers = 0;
1185 msg.lpData = lpData;
1186 msg.dwDataSize = dwDataSize;
1187 msg.dpnName = *lpGroupName;
1281 if( lpData !=
NULL )
1308 if( lpPData ==
NULL )
1314 lpPData->
dpid = *lpid;
1329 ERR(
"Can't duplicate player msg handle %p\n",
hEvent );
1336 TRACE(
"Created player id 0x%08x\n", *lpid );
1339 This->dp2->lpSessionDesc->dwCurrentPlayers++;
1357 TRACE(
"(%p)->(0x%08x)\n",
This, dpid );
1361 if( lpPList ==
NULL )
1363 ERR(
"DPID 0x%08x not found\n", dpid );
1370 FIXME(
"Why is this not the last reference to player?\n" );
1388 TRACE(
"(%p)->(0x%08x)\n",
This, dpid );
1393 DPQ_FIND_ENTRY(
This->dp2->lpSysGroup->players, players, lpPData->dpid, ==, dpid, lpPlayers );
1404 lpDst->
dwSize =
sizeof( *lpDst );
1408 if( lpSrc->
dwSize !=
sizeof( *lpSrc) )
1479 if( lpData !=
NULL )
1505 DWORD dwCreateFlags = 0;
1507 TRACE(
"(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n",
1508 This, lpidPlayer, lpPlayerName,
hEvent, lpData,
1520 if( lpidPlayer ==
NULL )
1550 if( lpMsgHdr ==
NULL )
1561 ERR(
"unknown dwFlags = 0x%08x\n",
dwFlags );
1568 if(
This->dp2->bHostInterface )
1596 if( !lpPData || !lpPList )
1613 if(
This->dp2->spData.lpCB->CreatePlayer )
1617 data.idPlayer = *lpidPlayer;
1618 data.dwFlags = dwCreateFlags;
1619 data.lpSPMessageHeader = lpMsgHdr;
1620 data.lpISP =
This->dp2->spData.lpISP;
1622 TRACE(
"Calling SP CreatePlayer 0x%08x: dwFlags: 0x%08x lpMsgHdr: %p\n",
1623 *lpidPlayer,
data.dwFlags,
data.lpSPMessageHeader );
1625 hr = (*
This->dp2->spData.lpCB->CreatePlayer)( &
data );
1635 if(
This->dp2->spData.lpCB->AddPlayerToGroup )
1639 data.idPlayer = *lpidPlayer;
1641 data.lpISP =
This->dp2->spData.lpISP;
1643 TRACE(
"Calling SP AddPlayerToGroup (sys group)\n" );
1645 hr = (*
This->dp2->spData.lpCB->AddPlayerToGroup)( &
data );
1650 ERR(
"Failed to add player to sys group with sp: %s\n",
1656 if( !
This->dp2->bHostInterface )
1664 TRACE(
"Sending message to self to get my addr\n" );
1675 if( ( lpMsgHdr ==
NULL ) &&
1676 This->dp2->lpSessionDesc &&
1683 msg.dpId = *lpidPlayer;
1684 msg.dwCurrentPlayers = 0;
1685 msg.lpData = lpData;
1686 msg.dwDataSize = dwDataSize;
1687 msg.dpnName = *lpPlayerName;
1739 if( lpidPlayer ==
NULL )
1762 if( lpidPlayer ==
NULL )
1849 plist->lpPData->uRef--;
1855 if (
This->dp2->spData.lpCB->RemovePlayerFromGroup )
1859 TRACE(
"Calling SP RemovePlayerFromGroup\n" );
1860 data.idPlayer = player;
1862 data.lpISP =
This->dp2->spData.lpISP;
1863 hr = (*
This->dp2->spData.lpCB->RemovePlayerFromGroup)( &
data );
1867 FIXME(
"Need to send a message\n" );
1889 TRACE(
"Removing element:0x%08x (type:0x%08x) from element:0x%08x\n",
1890 dpId, dwPlayerType, lpCtxt->
idGroup );
1896 ERR(
"Unable to delete group 0x%08x from group 0x%08x\n", dpId, lpCtxt->
idGroup );
1900 ERR(
"Unable to delete player 0x%08x from grp 0x%08x\n", dpId, lpCtxt->
idGroup );
1910 FIXME(
"(%p)->(%p,0x%08x,%u): semi stub\n",
1911 This, lpMsgHdr, idGroup, bAnsi );
1939 if(
This->dp2->spData.lpCB->DeleteGroup )
1943 FIXME(
"data.dwFlags is incorrect\n" );
1945 data.idGroup = idGroup;
1947 data.lpISP =
This->dp2->spData.lpISP;
1949 (*
This->dp2->spData.lpCB->DeleteGroup)( &
data );
1952 FIXME(
"Send out a DESTORYPLAYERORGROUP message\n" );
2005 FIXME(
"(%p)->(%p,0x%08x,%u): semi stub\n",
2006 This, lpMsgHdr, idPlayer, bAnsi );
2022 cbContext.
bAnsi = bAnsi;
2033 if(
This->dp2->spData.lpCB->DeletePlayer )
2037 FIXME(
"data.dwFlags is incorrect\n" );
2039 data.idPlayer = idPlayer;
2041 data.lpISP =
This->dp2->spData.lpISP;
2043 (*
This->dp2->spData.lpCB->DeletePlayer)( &
data );
2046 FIXME(
"Send a DELETEPLAYERORGROUP msg\n" );
2074 ERR(
"Group callback has dwPlayerType = 0x%08x\n", dwPlayerType );
2302 FIXME(
": not checking for conditions\n" );
2313 TRACE(
"EnumSessionsCallback2 invoked\n" );
2314 if( !lpEnumSessionsCallback2( lpSessionDesc, &
dwTimeout, 0, lpContext ) )
2327 HANDLE hSuicideRequest =
data->hSuicideRequest;
2339 TRACE(
"Thread terminating on terminate request\n" );
2345 data->dwEnumSessionFlags,
2356 TRACE(
"Thread terminating\n" );
2377 TRACE(
"Killing EnumSession thread %p\n",
2378 This->dp2->hEnumSessionThread );
2439 TRACE(
"(%p)->(%p,0x%08x,%p,%p,0x%08x)\n",
This, sdesc,
timeout, enumsessioncb,
2446 if (
This->dp2->bConnectionOpen )
2460 if (
This->dp2->bDPLSPInitialized && !
This->dp2->bSPInitialized )
2462 WARN(
"Hack providing TCP/IP SP for lobby provider activated\n" );
2466 ERR(
"Can't build compound addr\n" );
2483 caps.
dwSize =
sizeof( caps );
2503 if (
This->dp2->dwEnumSessionLock )
2510 This->dp2->dwEnumSessionLock++;
2516 &
This->dp2->spData );
2523 data->lpSpData = &
This->dp2->spData;
2532 ERR(
"Can't duplicate thread killing handle\n" );
2534 TRACE(
": creating EnumSessionsRequest thread\n" );
2538 This->dp2->dwEnumSessionLock--;
2666 DWORD dwRequiredDataSize;
2668 FIXME(
"(%p)->(0x%08x,%p,%p,%u) ANSI ignored\n",
2669 This, idGroup, lpData, lpdwDataSize, bAnsi );
2688 if( ( lpData ==
NULL ) ||
2689 ( *lpdwDataSize < dwRequiredDataSize )
2692 *lpdwDataSize = dwRequiredDataSize;
2751 void *lpData,
DWORD *lpdwDataSize )
2758 void *lpData,
DWORD *lpdwDataSize )
2901 data.idPlayer = player;
2904 data.lpISP =
This->dp2->spData.lpISP;
2906 return (*
This->dp2->spData.lpCB->GetCaps)( &
data );
2968 src =
plist->lpPData->lpRemoteData;
2988 DWORD dwRequiredDataSize;
2990 FIXME(
"(%p)->(0x%08x,%p,%p,%u): ANSI\n",
2991 This, idPlayer, lpData, lpdwDataSize, bAnsi );
3015 if( ( lpData ==
NULL ) ||
3016 ( *lpdwDataSize < dwRequiredDataSize )
3019 *lpdwDataSize = dwRequiredDataSize;
3078 void *lpData,
DWORD *lpdwDataSize )
3085 void *lpData,
DWORD *lpdwDataSize )
3094 DWORD dwRequiredSize;
3096 TRACE(
"(%p)->(%p,%p,%u)\n",
This, lpData, lpdwDataSize, bAnsi );
3103 if( ( lpData ==
NULL ) && ( lpdwDataSize ==
NULL ) )
3111 if ( ( lpData ==
NULL ) ||
3112 ( *lpdwDataSize < dwRequiredSize )
3115 *lpdwDataSize = dwRequiredSize;
3153 DWORD *lpdwDataSize )
3160 DWORD *lpdwDataSize )
3211 FIXME(
"(%p)->(%p,0x%08x,%p,%p): partial stub\n",
3221 TRACE(
": rejecting invalid dpsd size (%d).\n", lpsd->
dwSize );
3225 if(
This->dp2->bConnectionOpen )
3227 TRACE(
": rejecting already open connection.\n" );
3251 if(
This->dp2->spData.lpCB->Open )
3255 FIXME(
"Not all data fields are correct. Need new parameter\n" );
3260 data.lpISP =
This->dp2->spData.lpISP;
3263 data.dwSessionFlags =
This->dp2->lpSessionDesc->dwFlags;
3309 ERR(
"Couldn't create name server/system player: %s\n",
3357 void *lpData,
DWORD *lpdwDataSize,
BOOL bAnsi )
3361 FIXME(
"(%p)->(%p,%p,0x%08x,%p,%p,%u): stub\n",
3362 This, lpidFrom, lpidTo,
dwFlags, lpData, lpdwDataSize, bAnsi );
3375 if( ( lpData ==
NULL ) &&
3384 lpMsg =
This->dp2->receiveMsgs.lpQHFirst;
3388 FIXME(
"Remove from queue\n" );
3408 if (lpData)
CopyMemory( lpData, lpMsg->
msg, *lpdwDataSize );
3548 FIXME(
"Was this group created by this interface?\n" );
3560 FIXME(
"Send msg?\n" );
3570 TRACE(
"(%p)->(0x%08x,%p,0x%08x,%u)\n",
This, idGroup,
3571 lpGroupName,
dwFlags, bAnsi );
3581 FIXME(
"Message not sent and dwFlags ignored\n" );
3684 FIXME(
"Was this group created by this interface?\n" );
3693 FIXME(
"Send msg?\n" );
3703 TRACE(
"(%p)->(0x%08x,%p,0x%08x,%u)\n",
3719 FIXME(
"Message not sent and dwFlags ignored\n" );
3769 DWORD dwRequiredSize;
3772 TRACE(
"(%p)->(%p,0x%08x,%u,%u)\n",
3786 if( !
This->dp2->bHostInterface )
3795 if( lpTempSessDesc ==
NULL )