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