Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

818 lines
28 KiB

/*==========================================================================;
*
* Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dplaysp.h
* Content: DirectPlay Service Provider header
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 1/96 andyco created it
* 1/26/96 andyco list data structures
* 2/15/96 andyco packed structures (for net xport)
* 3/16/96 andyco added shutdown callback
* 3/25/96 andyco added sp nodes for sp enum
* 3/28/96 andyco added free receive buffer callback
* 4/9/96 andyco moved dplayi_dplay, packed player, spnode, etc. to dplaypr.h
* 4/10/96 andyco added getmessagesize,isvalidmessage fn's
* 4/11/96 andyco added spdata instead of reserving a bunch of dwords
* 4/12/96 andyco added dplay_xxx methods to get rid of dpmess.h macros
* 4/18/96 andyco added remote players to createplayer, getplayer + group
* list fn's
* 4/25/96 andyco got rid of dwreservedx. added dwSPHeaderSize. spblob
* follows message
* 5/2/96 andyco replaced idirectplay * with iunknown *
* 5/9/96 andyco idirectplay2
* 6/8/96 andyco moved dplayi_player/group to dplaypr.h. ported from
* (now defunct) dplayi.h.
* 6/19/96 andyco changed names, etc. for consistency
* 6/22/96 andyco tossed dwCookies. removed pUnk from callbacks. removed sessiondesc
* from callbacks. alphapathetical order.
* 6/22/96 andyco made DPlay_xxx functions a COM interface (IDirectPlaySP)
* 6/22/96 kipo added EnumConnectionData() method.
* 6/23/96 andyco updated comments. removed bLocal from Create fn's (look
* at flags).
* 6/23/96 kipo cleanup for service provider lab.
* 6/24/96 kipo added version number
* 6/24/96 andyco added getaddress
* 6/25/96 kipo added WINAPI prototypes and updated for DPADDRESS
* 6/28/96 kipo added support for CreateAddress() method.
* 7/10/96 andyco added dwflags to createaddress. changed guid * to
* refguid in createaddress call.
* 7/16/96 kipo changed address types to be GUIDs instead of 4CC
* 7/30/96 kipo added DPLAYI_PLAYER_CREATEDPLAYEREVENT
* 8/23/96 kipo incremented major version number
* 10/10/96 andyco added optimized groups
* 2/7/97 andyco added idpsp to each callback
* 3/04/97 kipo updated gdwDPlaySPRefCount definition
* 3/17/97 kipo added support for CreateCompoundAddress()
* 5/8/97 myronth added DPLAYI_GROUP_STAGINGAREA (internal)
* 5/18/97 kipo added DPLAYI_PLAYER_SPECTATOR
* 5/23/97 kipo Added support for return status codes
* 10/21/97 myronth Added DPLAYI_GROUP_HIDDEN
* 10/29/97 myronth Added DPLAYI_PLAYER_OWNER (internal)
* 10/31/97 andyco added voice call
* 1/20/98 myronth #ifdef'd out voice support
* 1/28/98 sohailm Added dwSessionFlags to DPSP_OPENDATA
* 4/1/98 aarono Added DPLAYI_PLAYER_DOESNT_HAVE_NAMETABLE
* 6/2/98 aarono Added DPLAYI_PLAYER_BEING_DESTROYED to avoid
* deleting more than once.
*@@END_MSINTERNAL
*
***************************************************************************/
#ifndef __DPLAYSP_INCLUDED__
#define __DPLAYSP_INCLUDED__
#include "dplay.h"
#include "dplobby.h"
#ifdef __cplusplus
extern "C" {
#endif
/*============================================================================
*
* DirectPlay Service Provider Structures
*
* Various structures used to invoke DirectPlay Service Providers.
*
*==========================================================================*/
/*
* Callback for EnumMRU()
*/
typedef BOOL (PASCAL *LPENUMMRUCALLBACK)(
LPCVOID lpData,
DWORD dwDataSize,
LPVOID lpContext);
/*
* Major version number for service provider.
*
* The most-significant 16 bits are reserved for the DirectPlay
* major version number. The least-significant 16 bits are for
* use by the service provider.
*/
#define DPSP_MAJORVERSION 0x00060000
/*
* This is the major version number that DirectX 3 (DX3) shipped with
*/
#define DPSP_DX3VERSION 0x00040000
/*
* This is the major version number that DirectX 5 (DX5) shipped with
*/
#define DPSP_DX5VERSION 0x00050000
/*
* Masks to help check the version info
*/
#define DPSP_MAJORVERSIONMASK 0xFFFF0000
#define DPSP_MINORVERSIONMASK 0x0000FFFF
//@@BEGIN_MSINTERNAL
#ifdef BIGMESSAGEDEFENSE
/*
* warning types that could be returned from the SP via HandleSPWarning
* see below for corresponding structures
*/
#define DPSPWARN_MESSAGETOOBIG 0xB0FF0001
#define DPSPWARN_PLAYERDEAD 0xB0FF0002
#endif
//@@END_MSINTERNAL
/*
* DPLAYI_PLAYER_FLAGS
*
* These flags may be used with players or groups, as appropriate.
* The service provider can get these by calling IDirectPlaySP->GetFlags()
* as defined below. The flags are also available in the dwFlags field
* for most of the callback data structures.
*
* These flags are set by DirectPlay - they are read only for the
* service provider
*
*/
/*
* Player is the system player (player only).
*/
#define DPLAYI_PLAYER_SYSPLAYER 0x00000001
/*
* Player is the name server (player only). Only valid when
* DPLAYI_PLAYER_SYSPLAYER is also set.
*/
#define DPLAYI_PLAYER_NAMESRVR 0x00000002
/*
* Player belongs to a group (player only).
*/
#define DPLAYI_PLAYER_PLAYERINGROUP 0x00000004
/*
* Player allocated on this IDirectPlay (player or group).
*/
#define DPLAYI_PLAYER_PLAYERLOCAL 0x00000008
//@@BEGIN_MSINTERNAL
/*
* Player event allocated by DirectPlay (player only).
* Used for compatability with the IDirectPlay1 API.
* INTERNAL USE ONLY
*/
#define DPLAYI_PLAYER_CREATEDPLAYEREVENT 0x00000010
//@@END_MSINTERNAL
/*
* This group is the system group. If the service provider returns
* DPCAPS_GROUPOPTIMIZED on a GetCaps call, then DirectPlay will create
* a system group containing all players in the game. Sends by the application
* to DPID_ALLPLAYERS will be sent to this group. (group only).
*
*/
#define DPLAYI_GROUP_SYSGROUP 0x00000020
/*
* DirectPlay "owns" this group. Sends to this group will be emulated by DirectPlay
* (sends go to each individual member). This flag is set on a group if the
* Service Provider returns failure to the CreateGroup or AddPlayerToGroup
* callback. (group only).
*
*/
#define DPLAYI_GROUP_DPLAYOWNS 0x00000040
/*
* This player is the app's server player
*/
#define DPLAYI_PLAYER_APPSERVER 0x00000080
//@@BEGIN_MSINTERNAL
/*
* This group is a staging area
*/
#define DPLAYI_GROUP_STAGINGAREA 0x00000100
//@@END_MSINTERNAL
/*
* This player is a spectator
*/
#define DPLAYI_PLAYER_SPECTATOR 0x00000200
/*
* This group is hidden
*/
#define DPLAYI_GROUP_HIDDEN 0x00000400
//@@BEGIN_MSINTERNAL
/*
* Player is the owner of a group. (Only used
* internally, and only used during EnumGroupPlayers).
* INTERNAL USE ONLY
*/
#define DPLAYI_PLAYER_OWNER 0x00000800
// a-josbor: Internal flag that gets set when the Keepalive has
// determined that this player should be killed
#define DPLAYI_PLAYER_ON_DEATH_ROW 0x00001000
// aarono: use this flag to mark players waiting for nametable.
// any sends to these players just return DPERR_UNAVAILABLE
// this bit is cleared when we transmit the nametable.
#define DPLAYI_PLAYER_DOESNT_HAVE_NAMETABLE 0x00002000
// a-josbor: set when we get an error back on a reliable
// send. We don't kill them right away because there might
// be messages pending from them
#define DPLAYI_PLAYER_CONNECTION_LOST 0x00004000
/*
* Used to stop re-entering destory player
*/
#define DPLAYI_PLAYER_BEING_DESTROYED 0x00010000
#define DPLAYI_PLAYER_NONPROP_FLAGS ( DPLAYI_PLAYER_DOESNT_HAVE_NAMETABLE | \
DPLAYI_PLAYER_BEING_DESTROYED | \
DPLAYI_PLAYER_ON_DEATH_ROW |\
DPLAYI_PLAYER_CONNECTION_LOST )
//@@END_MSINTERNAL
/*
* IDirectPlaySP
*
* Service providers are passed an IDirectPlaySP interface
* in the SPInit method. This interface is used to call DirectPlay.
*/
struct IDirectPlaySP;
typedef struct IDirectPlaySP FAR* LPDIRECTPLAYSP;
#undef INTERFACE
#define INTERFACE IDirectPlaySP
DECLARE_INTERFACE_( IDirectPlaySP, IUnknown )
{
/*** IUnknown methods ***/
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
/*** IDirectPlaySP methods ***/
STDMETHOD(AddMRUEntry) (THIS_ LPCWSTR, LPCWSTR, LPCVOID, DWORD, DWORD) PURE;
STDMETHOD(CreateAddress) (THIS_ REFGUID,REFGUID,LPCVOID,DWORD,LPVOID,LPDWORD) PURE;
STDMETHOD(EnumAddress) (THIS_ LPDPENUMADDRESSCALLBACK,LPCVOID,DWORD,LPVOID) PURE;
STDMETHOD(EnumMRUEntries) (THIS_ LPCWSTR, LPCWSTR, LPENUMMRUCALLBACK, LPVOID) PURE;
STDMETHOD(GetPlayerFlags) (THIS_ DPID,LPDWORD) PURE;
STDMETHOD(GetSPPlayerData) (THIS_ DPID,LPVOID *,LPDWORD,DWORD) PURE;
STDMETHOD(HandleMessage) (THIS_ LPVOID,DWORD,LPVOID) PURE;
STDMETHOD(SetSPPlayerData) (THIS_ DPID,LPVOID,DWORD,DWORD) PURE;
/*** IDirectPlaySP methods added for DX 5 ***/
STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT,DWORD,LPVOID,LPDWORD) PURE;
STDMETHOD(GetSPData) (THIS_ LPVOID *,LPDWORD,DWORD) PURE;
STDMETHOD(SetSPData) (THIS_ LPVOID,DWORD,DWORD) PURE;
/*** IDirectPlaySP methods added for DX 6 ***/
STDMETHOD_(VOID,SendComplete) (THIS_ LPVOID,DWORD) PURE;
//@@BEGIN_MSINTERNAL
#ifdef BIGMESSAGEDEFENSE
STDMETHOD(HandleSPWarning) (THIS_ LPVOID,DWORD,LPVOID) PURE;
#endif
//@@END_MSINTERNAL
};
/*
* GUID for IDirectPlaySP
*/
// {0C9F6360-CC61-11cf-ACEC-00AA006886E3}
DEFINE_GUID(IID_IDirectPlaySP, 0xc9f6360, 0xcc61, 0x11cf, 0xac, 0xec, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3);
/* CALLBACK DATA STRUCTURES
*
* These are passed by DirectPlay to the service provider when
* the callback is invoked.
*/
/*
* DPSP_ADDPLAYERTOGROUPDATA
*/
typedef struct _DPSP_ADDPLAYERTOGROUPDATA
{
DPID idPlayer;
DPID idGroup;
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_ADDPLAYERTOGROUPDATA;
typedef DPSP_ADDPLAYERTOGROUPDATA FAR* LPDPSP_ADDPLAYERTOGROUPDATA;
/*
* DPSP_CLOSEDATA - used with CloseEx
*/
typedef struct _DPSP_CLOSEDATA
{
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_CLOSEDATA;
typedef DPSP_CLOSEDATA FAR* LPDPSP_CLOSEDATA;
/*
* DPSP_CREATEGROUPDATA
*/
typedef struct _DPSP_CREATEGROUPDATA
{
DPID idGroup;
DWORD dwFlags; // DPLAYI_PLAYER_xxx flags
LPVOID lpSPMessageHeader; // For local groups, lpSPMessageHeader will be
// NULL. For remote groups, lpSPMessageHeader
// will be the header that was received with
// the AddPlayer message.
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_CREATEGROUPDATA;
typedef DPSP_CREATEGROUPDATA FAR* LPDPSP_CREATEGROUPDATA;
/*
* DPSP_CREATEPLAYERDATA
*/
typedef struct _DPSP_CREATEPLAYERDATA
{
DPID idPlayer;
DWORD dwFlags; // DPLAYI_PLAYER_xxx flags
LPVOID lpSPMessageHeader; // For local groups, lpSPMessageHeader will be
// NULL. For remote groups, lpSPMessageHeader
// will be the header that was received with
// the AddPlayer message.
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_CREATEPLAYERDATA;
typedef DPSP_CREATEPLAYERDATA FAR* LPDPSP_CREATEPLAYERDATA;
/*
* DPSP_DELETEGROUPDATA
*/
typedef struct _DPSP_DELETEGROUPDATA
{
DPID idGroup;
DWORD dwFlags; // DPLAYI_PLAYER_xxx flags
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_DELETEGROUPDATA;
typedef DPSP_DELETEGROUPDATA FAR* LPDPSP_DELETEGROUPDATA;
/*
* DPSP_DELETEPLAYERDATA
*/
typedef struct _DPSP_DELETEPLAYERDATA
{
DPID idPlayer; // player being deleted
DWORD dwFlags; // DPLAYI_PLAYER_xxx flags
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_DELETEPLAYERDATA;
typedef DPSP_DELETEPLAYERDATA FAR* LPDPSP_DELETEPLAYERDATA;
/*
* DPSP_ENUMSESSIONSDATA
*/
typedef struct _DPSP_ENUMSESSIONSDATA
{
LPVOID lpMessage; // enum message to send
DWORD dwMessageSize; // size of message to send (including sp header)
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
BOOL bReturnStatus; // TRUE to return status on progress of enum
} DPSP_ENUMSESSIONSDATA;
typedef DPSP_ENUMSESSIONSDATA FAR* LPDPSP_ENUMSESSIONSDATA;
/*
* DPSP_GETADDRESSDATA
*/
typedef struct _DPSP_GETADDRESSDATA
{
DPID idPlayer; // player (or group) to get ADDRESS for
DWORD dwFlags; // DPLAYI_PLAYER_xxx flags for idPlayer
LPDPADDRESS lpAddress; // return buffer for address of idPlayer
LPDWORD lpdwAddressSize; // pointer to size of address buffer. If
// this is less than the required size
// (or is 0) the service provider should
// set *lpdwAddressSize to the required
// size and return DPERR_BUFFERTOOSMALL
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_GETADDRESSDATA;
typedef DPSP_GETADDRESSDATA FAR* LPDPSP_GETADDRESSDATA;
/*
* DPSP_GETADDRESSCHOICESDATA
*/
typedef struct _DPSP_GETADDRESSCHOICESDATA
{
LPDPADDRESS lpAddress; // return buffer for address choices
LPDWORD lpdwAddressSize; // pointer to size of address buffer. If
// this is less than the required size
// (or is 0) the service provider should
// set *lpdwAddressSize to the required
// size and return DPERR_BUFFERTOOSMALL
IDirectPlaySP * lpISP;
} DPSP_GETADDRESSCHOICESDATA;
typedef DPSP_GETADDRESSCHOICESDATA FAR* LPDPSP_GETADDRESSCHOICESDATA;
/*
* DPSP_GETCAPSDATA
*/
typedef struct _DPSP_GETCAPSDATA
{
DPID idPlayer; // player to get caps for
LPDPCAPS lpCaps;
DWORD dwFlags; // DPGETCAPS_xxx
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_GETCAPSDATA;
typedef DPSP_GETCAPSDATA FAR* LPDPSP_GETCAPSDATA;
/*
* DPSP_OPENDATA
*/
typedef struct _DPSP_OPENDATA
{
BOOL bCreate; // TRUE if creating, FALSE if joining
LPVOID lpSPMessageHeader; // If we are joining a session, lpSPMessageData
// is the message data received with the
// EnumSessionsReply message. If we are creating
// a session, it will be set to NULL.
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
BOOL bReturnStatus; // TRUE to return status on progress of open
/*** fields added for DX 6 ***/
DWORD dwOpenFlags; // flags passed by app to IDirectPlayX->Open(...)
DWORD dwSessionFlags; // flags passed by app in the session desc
} DPSP_OPENDATA;
typedef DPSP_OPENDATA FAR* LPDPSP_OPENDATA;
/*
* DPSP_REMOVEPLAYERFROMGROUPDATA
*/
typedef struct _DPSP_REMOVEPLAYERFROMGROUPDATA
{
DPID idPlayer;
DPID idGroup;
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_REMOVEPLAYERFROMGROUPDATA;
typedef DPSP_REMOVEPLAYERFROMGROUPDATA FAR* LPDPSP_REMOVEPLAYERFROMGROUPDATA;
/*
* DPSP_REPLYDATA
*/
typedef struct _DPSP_REPLYDATA
{
LPVOID lpSPMessageHeader; // header that was received by dplay
// (with the message we're replying to)
LPVOID lpMessage; // message to send
DWORD dwMessageSize; // size of message to send (including sp header)
DPID idNameServer; // player id of nameserver
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_REPLYDATA;
typedef DPSP_REPLYDATA FAR* LPDPSP_REPLYDATA;
/*
* DPSP_SENDDATA
*/
typedef struct _DPSP_SENDDATA
{
DWORD dwFlags; // e.g. DPSEND_GUARANTEE
DPID idPlayerTo; // player we're sending to
DPID idPlayerFrom; // player we're sending from
LPVOID lpMessage; // message to send
DWORD dwMessageSize; // size of message to send (including sp header)
BOOL bSystemMessage; // TRUE if this is a system message
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_SENDDATA;
typedef DPSP_SENDDATA FAR* LPDPSP_SENDDATA;
/*
* DPSP_SENDTOGROUPDATA
*/
typedef struct _DPSP_SENDTOGROUPDATA
{
DWORD dwFlags; // e.g. DPSEND_GUARANTEE
DPID idGroupTo; // group we're sending to
DPID idPlayerFrom; // player we're sending from
LPVOID lpMessage; // message to send
DWORD dwMessageSize; // size of message to send (including sp header)
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_SENDTOGROUPDATA;
typedef DPSP_SENDTOGROUPDATA FAR* LPDPSP_SENDTOGROUPDATA;
/*
* DPSP_SENDEXDATA
*/
typedef struct _DPSP_SENDEXDATA
{
IDirectPlaySP * lpISP; // indication interface
DWORD dwFlags; // e.g. DPSEND_GUARANTEE
DPID idPlayerTo; // player we're sending to
DPID idPlayerFrom; // player we're sending from
LPSGBUFFER lpSendBuffers; // scatter gather array of send data
DWORD cBuffers; // count of buffers
DWORD dwMessageSize; // total size of message
DWORD dwPriority; // message priority
DWORD dwTimeout; // timeout for message in ms (don't send after t/o)
LPVOID lpDPContext; // async only: context value to use when notifying completion
LPDWORD lpdwSPMsgID; // async only: message id to be assigned by SP for use in other apis.
BOOL bSystemMessage; // TRUE if this is a system message
} DPSP_SENDEXDATA;
typedef DPSP_SENDEXDATA FAR* LPDPSP_SENDEXDATA;
/*
* DPSP_SENDTOGROUPEXDATA
*/
typedef struct _DPSP_SENDTOGROUPEXDATA
{
IDirectPlaySP * lpISP; // indication interface
DWORD dwFlags; // e.g. DPSEND_GUARANTEE
DPID idGroupTo; // group we're sending to
DPID idPlayerFrom; // player we're sending from
LPSGBUFFER lpSendBuffers; // scatter gather array of send data
DWORD cBuffers; // count of buffers
DWORD dwMessageSize; // total size of message
DWORD dwPriority; // message priority
DWORD dwTimeout; // timeout for message in ms (don't send after t/o)
LPVOID lpDPContext; // async only: context value to use when notifying completion
LPDWORD lpdwSPMsgID; // async only: message id to be assigned by SP for use in other apis.
} DPSP_SENDTOGROUPEXDATA;
typedef DPSP_SENDTOGROUPEXDATA FAR* LPDPSP_SENDTOGROUPEXDATA;
/*
* DPSP_GETMESSAGEQUEUE
*/
typedef struct _DPSP_GETMESSAGEQUEUEDATA
{
IDirectPlaySP * lpISP; // indication interface
DWORD dwFlags;
DPID idFrom;
DPID idTo;
LPDWORD lpdwNumMsgs;
LPDWORD lpdwNumBytes;
} DPSP_GETMESSAGEQUEUEDATA;
typedef DPSP_GETMESSAGEQUEUEDATA FAR* LPDPSP_GETMESSAGEQUEUEDATA;
/*
* DPSP_CANCELSEND
*/
#define DPCANCELSEND_PRIORITY 0x00000001
#define DPCANCELSEND_ALL 0x00000002
typedef struct _DPSP_CANCELDATA
{
IDirectPlaySP * lpISP; // indication interface
DWORD dwFlags; // 0,DPCANCELSEND_PRIORITY,DPCANCELSEND_ALL,etc.
LPRGLPVOID lprglpvSPMsgID; // cancel just these messages (dwFlags == 0)
DWORD cSPMsgID; // number of message id's in array (dwFlags == 0)
DWORD dwMinPriority; // cancel all sends at this priority (dwFlags==DPCANCELSEND_PRIORITY)
DWORD dwMaxPriority; // cancel all sends between Min and Max.
} DPSP_CANCELDATA;
typedef DPSP_CANCELDATA FAR* LPDPSP_CANCELDATA;
/*
* DPSP_SHUTDOWNDATA - used with ShutdownEx
*/
typedef struct _DPSP_SHUTDOWNDATA
{
/*** fields added for DX 5 ***/
IDirectPlaySP * lpISP;
} DPSP_SHUTDOWNDATA;
typedef DPSP_SHUTDOWNDATA FAR* LPDPSP_SHUTDOWNDATA;
//@@BEGIN_MSINTERNAL
#ifdef BIGMESSAGEDEFENSE
/*
* DPSP_MSGTOOBIG - used with HandleSPNotification (DPSPWARN_MESSAGETOOBIG)
*/
typedef struct _DPSP_MSGTOOBIG
{
DWORD dwType;
LPBYTE pReceiveBuffer; // --> pointer to the message data
DWORD dwBytesReceived;// --> the number of bytes of the message actually received
DWORD dwMessageSize; // --> the size of the message as understood by the SP
} DPSP_MSGTOOBIG;
typedef DPSP_MSGTOOBIG FAR* LPDPSP_MSGTOOBIG;
/*
* DPSP_PLAYERDEAD - used with HandleSPNotification (DPSPWARN_PLAYERDEAD)
*/
typedef struct _DPSP_PLAYERDISCONNECT
{
DWORD dwType;
DPID dwID; // ID of the Sys player that has been disconnected
} DPSP_PLAYERDEAD;
typedef DPSP_PLAYERDEAD FAR* LPDPSP_PLAYERDEAD;
#endif
//@@END_MSINTERNAL
/*
* Prototypes for callbacks returned by SPInit.
*/
typedef HRESULT (WINAPI *LPDPSP_CREATEPLAYER)(LPDPSP_CREATEPLAYERDATA);
typedef HRESULT (WINAPI *LPDPSP_DELETEPLAYER)(LPDPSP_DELETEPLAYERDATA);
typedef HRESULT (WINAPI *LPDPSP_SEND)(LPDPSP_SENDDATA);
typedef HRESULT (WINAPI *LPDPSP_ENUMSESSIONS)(LPDPSP_ENUMSESSIONSDATA);
typedef HRESULT (WINAPI *LPDPSP_REPLY)(LPDPSP_REPLYDATA);
typedef HRESULT (WINAPI *LPDPSP_SHUTDOWN)(void);
typedef HRESULT (WINAPI *LPDPSP_CREATEGROUP)(LPDPSP_CREATEGROUPDATA);
typedef HRESULT (WINAPI *LPDPSP_DELETEGROUP)(LPDPSP_DELETEGROUPDATA);
typedef HRESULT (WINAPI *LPDPSP_ADDPLAYERTOGROUP)(LPDPSP_ADDPLAYERTOGROUPDATA);
typedef HRESULT (WINAPI *LPDPSP_REMOVEPLAYERFROMGROUP)(LPDPSP_REMOVEPLAYERFROMGROUPDATA);
typedef HRESULT (WINAPI *LPDPSP_GETCAPS)(LPDPSP_GETCAPSDATA);
typedef HRESULT (WINAPI *LPDPSP_GETADDRESS)(LPDPSP_GETADDRESSDATA);
typedef HRESULT (WINAPI *LPDPSP_GETADDRESSCHOICES)(LPDPSP_GETADDRESSCHOICESDATA);
typedef HRESULT (WINAPI *LPDPSP_OPEN)(LPDPSP_OPENDATA);
typedef HRESULT (WINAPI *LPDPSP_CLOSE)(void);
typedef HRESULT (WINAPI *LPDPSP_SENDTOGROUP)(LPDPSP_SENDTOGROUPDATA);
typedef HRESULT (WINAPI *LPDPSP_SHUTDOWNEX)(LPDPSP_SHUTDOWNDATA);
typedef HRESULT (WINAPI *LPDPSP_CLOSEEX)(LPDPSP_CLOSEDATA);
typedef HRESULT (WINAPI *LPDPSP_SENDEX)(LPDPSP_SENDEXDATA);
typedef HRESULT (WINAPI *LPDPSP_SENDTOGROUPEX)(LPDPSP_SENDTOGROUPEXDATA);
typedef HRESULT (WINAPI *LPDPSP_CANCEL)(LPDPSP_CANCELDATA);
typedef HRESULT (WINAPI *LPDPSP_GETMESSAGEQUEUE)(LPDPSP_GETMESSAGEQUEUEDATA);
/*
* DPSP_SPCALLBACKS
*
* Table of callback pointers passed to SPInit. The service provider should fill
* in the functions it implements. If the service provider does not implement
* a callback, it should not set the table value for the unimplemented callback.
*/
typedef struct _DPSP_SPCALLBACKS
{
DWORD dwSize; // size of table
DWORD dwVersion; // the DPSP_MAJORVERSION of this DPLAY object
// for DX3, this was 0.
LPDPSP_ENUMSESSIONS EnumSessions; // required
LPDPSP_REPLY Reply; // required
LPDPSP_SEND Send; // required
LPDPSP_ADDPLAYERTOGROUP AddPlayerToGroup; // optional
LPDPSP_CLOSE Close; // optional - for DX3 compat only
LPDPSP_CREATEGROUP CreateGroup; // optional
LPDPSP_CREATEPLAYER CreatePlayer; // optional
LPDPSP_DELETEGROUP DeleteGroup; // optional
LPDPSP_DELETEPLAYER DeletePlayer; // optional
LPDPSP_GETADDRESS GetAddress; // optional
LPDPSP_GETCAPS GetCaps; // required
LPDPSP_OPEN Open; // optional
LPDPSP_REMOVEPLAYERFROMGROUP RemovePlayerFromGroup; // optional
LPDPSP_SENDTOGROUP SendToGroup; // optional
LPDPSP_SHUTDOWN Shutdown; // optional - for DX3 compat only
/*** fields added for DX 5 ***/
LPDPSP_CLOSEEX CloseEx; // optional
LPDPSP_SHUTDOWNEX ShutdownEx; // optional
LPDPSP_GETADDRESSCHOICES GetAddressChoices; // optional
/*** fields added for DX 6 ***/
/*** for async ***/
LPDPSP_SENDEX SendEx; // optional - required for async
LPDPSP_SENDTOGROUPEX SendToGroupEx; // optional - optional for async
LPDPSP_CANCEL Cancel; // optional - optional for async, highly recommended
LPDPSP_GETMESSAGEQUEUE GetMessageQueue; // optional - optional for async, highly recommended
} DPSP_SPCALLBACKS;
typedef DPSP_SPCALLBACKS FAR *LPDPSP_SPCALLBACKS;
/*
* SPINITDATA
*
* Data structure passed to the service provider at SPInit.
*/
typedef struct _SPINITDATA
{
LPDPSP_SPCALLBACKS lpCB; // service provider fills in entry points
IDirectPlaySP * lpISP; // used to call back into DirectPlay
// (e.g. when message is received)
LPWSTR lpszName; // service provider name from registry
LPGUID lpGuid; // service provider GUID from registry
DWORD dwReserved1; // service provider-specific data from registry
DWORD dwReserved2; // service provider-specific data from registry
DWORD dwSPHeaderSize; // dwSPHeaderSize is the size of the
// data the sp wants stored with each message.
// DirectPlay will allocate dwSPHeaderSize
// bytes at the beginning of each message.
// The service provider can then do what
// they want with these.
LPDPADDRESS lpAddress; // address to use for connection
DWORD dwAddressSize; // size of address data
DWORD dwSPVersion; // version number 16 | 16 , major | minor version
} SPINITDATA;
typedef SPINITDATA FAR* LPSPINITDATA;
/*
* SPInit
*
* DirectPlay calls this function to initialize the service provider.
* All service providers must export this entry point from their DLL.
*/
typedef HRESULT (WINAPI *LPDPSP_SPINIT)(LPSPINITDATA);
HRESULT WINAPI SPInit(LPSPINITDATA);
/*
* gdwDPlaySPRefCount
*
* To ensure that the DPLAYX.DLL will not be unloaded before the service
* provider, the server provider should statically link to DPLAYX.LIB and
* increment this global during the SPINIT call and decrement this global
* during Shutdown.
*/
extern __declspec(dllimport) DWORD gdwDPlaySPRefCount;
/*@@BEGIN_MSINTERNAL */
/*
* All of the following entries are part of the voice support that was
* removed from dplay before DX6. It is currently still part of the
* code base and is just #ifdef'd out.
*/
#ifdef DPLAY_VOICE_SUPPORT
/*
* Player was created on a system that has voice capability
*
* INTERNAL USE ONLY
* THIS ENTRY SHOULD BE SURROUNDED BY MSINTERNALS!!!!!
*/
#define DPLAYI_PLAYER_HASVOICE 0x00001000
/*
* DPSP_CLOSEVOICEDATA - used with CloseVoice
*/
typedef struct _DPSP_CLOSEVOICEDATA
{
IDirectPlaySP * lpISP;
DWORD dwFlags;
} DPSP_CLOSEVOICEDATA;
typedef DPSP_CLOSEVOICEDATA FAR* LPDPSP_CLOSEVOICEDATA;
/*
* DPSP_OPENVOICEDATA - used with OpenVoice
*/
typedef struct _DPSP_OPENVOICEDATA
{
IDirectPlaySP * lpISP;
DWORD dwFlags;
DPID idTo;
DPID idFrom;
BOOL bToPlayer; // TRUE if idTo is a Player
} DPSP_OPENVOICEDATA;
typedef DPSP_OPENVOICEDATA FAR* LPDPSP_OPENVOICEDATA;
typedef HRESULT (WINAPI *LPDPSP_CLOSEVOICE)(LPDPSP_CLOSEVOICEDATA);
typedef HRESULT (WINAPI *LPDPSP_OPENVOICE)(LPDPSP_OPENVOICEDATA);
// From interface declaration
LPDPSP_CLOSEVOICE CloseVoice; // optional
LPDPSP_OPENVOICE OpenVoice; // optional
#endif // DPLAY_VOICE_SUPPORT
/*@@END_MSINTERNAL */
#ifdef __cplusplus
};
#endif
#endif