1/*==========================================================================;
2 *
3 *  Copyright (C) 1994-1995 Microsoft Corporation.  All Rights Reserved.
4 *
5 *  File:       dplay.h
6 *  Content:    DirectPlay include file
7 *
8 ***************************************************************************/
9
10#ifndef __DPLAY_INCLUDED__
11#define __DPLAY_INCLUDED__
12#ifdef _WIN32
13/* for DECLARE_INTERFACE and HRESULT. */
14#include <ole2.h>
15#endif
16
17#define _FACDP  0x877
18#define MAKE_DPHRESULT( code )    MAKE_HRESULT( 1, _FACDP, code )
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#pragma pack(push, 1)
25
26
27/*============================================================================
28 *
29 * DirectPlay Structures
30 *
31 * Various structures used to invoke DirectPlay.
32 *
33 *==========================================================================*/
34
35#ifdef __cplusplus
36/* 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined */
37struct IDirectPlay;
38typedef struct IDirectPlay        FAR *LPDIRECTPLAY;
39#else
40typedef struct IDirectPlay        FAR *LPDIRECTPLAY;
41#endif
42
43typedef DWORD DPID, FAR *LPDPID;
44
45typedef struct _DPCAPS
46{
47    DWORD   dwSize;
48    DWORD   dwFlags;
49    DWORD   dwMaxBufferSize;
50    DWORD   dwMaxQueueSize;             // Function of DPlay, not SP.
51    DWORD   dwMaxPlayers;
52    DWORD   dwHundredBaud;              // 24 is 2400, 96 is 9600, etc.
53    DWORD   dwLatency;
54} DPCAPS;
55
56typedef DPCAPS        FAR *LPDPCAPS;
57
58#define DPLONGNAMELEN           52
59#define DPSHORTNAMELEN          20
60#define DPSESSIONNAMELEN        32
61#define DPPASSWORDLEN           16
62#define DPUSERRESERVED          16
63
64typedef struct
65{
66    DWORD   dwSize;
67    GUID    guidSession;                  // Id for Game.  Null is all games.
68    DWORD   dwSession;                    // session identifier
69    DWORD   dwMaxPlayers;                 // Maximum players allowed in game.
70    DWORD   dwCurrentPlayers;             // Current  players in Game.
71    DWORD   dwFlags;                      // DPOPEN_* flags
72    char    szSessionName[DPSESSIONNAMELEN];// Human readable name for Game
73    char    szUserField[DPUSERRESERVED];
74    DWORD   dwReserved1;                  // Reserved for future MS use.
75    char    szPassword[DPPASSWORDLEN];    // Password to be allowed into game.
76    DWORD   dwReserved2;                  // Reserved for future MS use.
77    DWORD   dwUser1;
78    DWORD   dwUser2;
79    DWORD   dwUser3;
80    DWORD   dwUser4;
81} DPSESSIONDESC;
82typedef DPSESSIONDESC FAR *LPDPSESSIONDESC;
83
84
85/*
86 * Create API
87 */
88typedef BOOL (FAR PASCAL * LPDPENUMDPCALLBACK)(
89    LPGUID              lpSPGuid,
90    LPSTR               lpFriendlyName,
91    DWORD               dwMajorVersion,
92    DWORD               dwMinorVersion,
93    LPVOID              lpContext);
94
95typedef BOOL (FAR PASCAL * LPDPENUMSESSIONSCALLBACK)(
96    LPDPSESSIONDESC     lpDPSGameDesc,
97    LPVOID              lpContext,
98    LPDWORD             lpdwTimeOut,
99    DWORD               dwFlags);
100
101
102
103extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY FAR *lplpDP, IUnknown FAR *pUnk);
104extern HRESULT WINAPI DirectPlayEnumerate( LPDPENUMDPCALLBACK, LPVOID );
105
106
107/* Player enumeration callback prototype */
108typedef BOOL (FAR PASCAL *LPDPENUMPLAYERSCALLBACK)(
109    DPID    dpId,
110    LPSTR   lpFriendlyName,
111    LPSTR   lpFormalName,
112    DWORD   dwFlags,
113    LPVOID  lpContext );
114
115/*
116 * IDirectPlay
117 */
118#undef INTERFACE
119#define INTERFACE IDirectPlay
120#ifdef _WIN32
121DECLARE_INTERFACE_( IDirectPlay, IUnknown )
122{
123    /*** IUnknown methods ***/
124    STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
125    STDMETHOD_(ULONG,AddRef)        (THIS)  PURE;
126    STDMETHOD_(ULONG,Release)       (THIS) PURE;
127    /*** IDirectPlay methods ***/
128    STDMETHOD(AddPlayerToGroup)     (THIS_ DPID, DPID) PURE;
129    STDMETHOD(Close)                (THIS) PURE;
130    STDMETHOD(CreatePlayer)         (THIS_ LPDPID,LPSTR,LPSTR,LPHANDLE) PURE;
131    STDMETHOD(CreateGroup)          (THIS_ LPDPID,LPSTR,LPSTR) PURE;
132    STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE;
133    STDMETHOD(DestroyPlayer)        (THIS_ DPID) PURE;
134    STDMETHOD(DestroyGroup)         (THIS_ DPID) PURE;
135    STDMETHOD(EnableNewPlayers)     (THIS_ BOOL) PURE;
136    STDMETHOD(EnumGroupPlayers)     (THIS_ DPID, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
137    STDMETHOD(EnumGroups)           (THIS_ DWORD, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
138    STDMETHOD(EnumPlayers)          (THIS_ DWORD, LPDPENUMPLAYERSCALLBACK,LPVOID,DWORD) PURE;
139    STDMETHOD(EnumSessions)         (THIS_ LPDPSESSIONDESC,DWORD,LPDPENUMSESSIONSCALLBACK,LPVOID,DWORD) PURE;
140    STDMETHOD(GetCaps)              (THIS_ LPDPCAPS) PURE;
141    STDMETHOD(GetMessageCount)      (THIS_ DPID, LPDWORD) PURE;
142    STDMETHOD(GetPlayerCaps)        (THIS_ DPID, LPDPCAPS) PURE;
143    STDMETHOD(GetPlayerName)        (THIS_ DPID,LPSTR,LPDWORD,LPSTR,LPDWORD) PURE;
144    STDMETHOD(Initialize)           (THIS_ LPGUID) PURE;
145    STDMETHOD(Open)                 (THIS_ LPDPSESSIONDESC) PURE;
146    STDMETHOD(Receive)              (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE;
147    STDMETHOD(SaveSession)          (THIS_ LPSTR) PURE;
148    STDMETHOD(Send)                 (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE;
149    STDMETHOD(SetPlayerName)        (THIS_ DPID,LPSTR,LPSTR) PURE;
150};
151#endif
152
153
154
155
156/****************************************************************************
157 *
158 * DIRECTPLAY ERRORS
159 *
160 * Errors are represented by negative values and cannot be combined.
161 *
162 ****************************************************************************/
163#define DP_OK                           0
164#define DPERR_ALREADYINITIALIZED        MAKE_DPHRESULT(   5 )
165#define DPERR_ACCESSDENIED              MAKE_DPHRESULT(  10 )
166#define DPERR_ACTIVEPLAYERS             MAKE_DPHRESULT(  20 )
167#define DPERR_BUFFERTOOSMALL            MAKE_DPHRESULT(  30 )
168#define DPERR_CANTADDPLAYER             MAKE_DPHRESULT(  40 )
169#define DPERR_CANTCREATEGROUP           MAKE_DPHRESULT(  50 )
170#define DPERR_CANTCREATEPLAYER          MAKE_DPHRESULT(  60 )
171#define DPERR_CANTCREATESESSION         MAKE_DPHRESULT(  70 )
172#define DPERR_CAPSNOTAVAILABLEYET       MAKE_DPHRESULT(  80 )
173#define DPERR_EXCEPTION                 MAKE_DPHRESULT(  90 )
174#define DPERR_GENERIC                   E_FAIL
175
176#define DPERR_INVALIDFLAGS              MAKE_DPHRESULT( 120 )
177#define DPERR_INVALIDOBJECT             MAKE_DPHRESULT( 130 )
178#define DPERR_INVALIDPARAM              E_INVALIDARG
179#define DPERR_INVALIDPARAMS             DPERR_INVALIDPARAM
180#define DPERR_INVALIDPLAYER             MAKE_DPHRESULT( 150 )
181#define DPERR_NOCAPS                    MAKE_DPHRESULT( 160 )
182#define DPERR_NOCONNECTION              MAKE_DPHRESULT( 170 )
183#define DPERR_NOMEMORY                  E_OUTOFMEMORY
184#define DPERR_OUTOFMEMORY               DPERR_NOMEMORY
185#define DPERR_NOMESSAGES                MAKE_DPHRESULT( 190 )
186#define DPERR_NONAMESERVERFOUND         MAKE_DPHRESULT( 200 )
187#define DPERR_NOPLAYERS                 MAKE_DPHRESULT( 210 )
188#define DPERR_NOSESSIONS                MAKE_DPHRESULT( 220 )
189#define DPERR_SENDTOOBIG                MAKE_DPHRESULT( 230 )
190#define DPERR_TIMEOUT                   MAKE_DPHRESULT( 240 )
191#define DPERR_UNAVAILABLE               MAKE_DPHRESULT( 250 )
192#define DPERR_UNSUPPORTED               E_NOTIMPL
193#define DPERR_BUSY                      MAKE_DPHRESULT( 270 )
194#define DPERR_USERCANCEL                MAKE_DPHRESULT( 280 )
195
196
197#define DPOPEN_OPENSESSION          0x00000001
198#define DPOPEN_CREATESESSION        0x00000002
199
200#define DPSEND_GUARANTEE            0x00000001
201#define DPSEND_HIGHPRIORITY         0x00000002
202#define DPSEND_TRYONCE              0x00000004
203
204#define DPRECEIVE_ALL               0x00000001
205#define DPRECEIVE_TOPLAYER          0x00000002
206#define DPRECEIVE_FROMPLAYER        0x00000004
207#define DPRECEIVE_PEEK              0x00000008
208
209#define DPCAPS_NAMESERVICE          0x00000001 // A name server is supported.
210#define DPCAPS_NAMESERVER           0x00000002 // You are the name server.
211#define DPCAPS_GUARANTEED           0x00000004 // SP's don't have to implement guarantees.
212
213#define DPENUMSESSIONS_AVAILABLE    0x00000001 // All games that match password (if given)
214                                               // and have openings.
215#define DPENUMSESSIONS_ALL          0x00000002
216#define DPENUMSESSIONS_PREVIOUS     0x00000004
217
218#define DPENUMPLAYERS_ALL           0x00000000
219#define DPENUMPLAYERS_PREVIOUS      0x00000004
220#define DPENUMPLAYERS_LOCAL         0x00000008
221#define DPENUMPLAYERS_REMOTE        0x00000010
222#define DPENUMPLAYERS_GROUP         0x00000020
223#define DPENUMPLAYERS_SESSION       0x00000080
224
225//
226// This flag is set on the enumsessions callback when the time out has occured.
227// This means that there is no session data for this callback.
228// If lpdwTimeOut is set to a non-zero value and the EnumSessionsCallback returns
229// TRUE then EnumSessions will continue until the next timeout occurs.
230// Timeouts are in milliseconds.
231
232#define DPESC_TIMEDOUT              0x00000001
233
234
235//
236// System message structures and types.
237//
238// System messages have a leading 4 byte type code to identify the message.
239// an app knows it is a system message because it is addressed 'To' player 0.
240//
241
242
243#define DPSYS_ADDPLAYER               0x0003  // DPMSG_ADDPLAYER
244#define DPSYS_DELETEPLAYER            0x0005  // DPMSG_DELETEPLAYER
245
246#define DPSYS_ADDPLAYERTOGROUP        0x0007  // DPMSG_GROUPADD
247
248#define DPSYS_INVITE                  0x000e  // DPMSG_INVITE, Net only.
249
250#define DPSYS_DELETEGROUP             0x0020  // DPMSG_DELETEPLAYER
251#define DPSYS_DELETEPLAYERFROMGRP     0x0021  // DPMSG_GROUPDELETE
252#define DPSYS_SESSIONLOST             0x0031
253
254#define DPSYS_CONNECT                 0x484b  // DPMSG_GENERIC
255
256
257
258typedef struct
259{
260    DWORD       dwType;
261    DWORD       dwPlayerType;
262    DPID        dpId;
263    char        szLongName[DPLONGNAMELEN];
264    char        szShortName[DPSHORTNAMELEN];
265    DWORD       dwCurrentPlayers;
266}   DPMSG_ADDPLAYER;
267
268typedef DPMSG_ADDPLAYER DPMSG_ADDGROUP;
269
270typedef struct
271{
272    DWORD       dwType;
273    DPID        dpIdGroup;
274    DPID        dpIdPlayer;
275} DPMSG_GROUPADD;
276
277typedef DPMSG_GROUPADD DPMSG_GROUPDELETE;
278typedef struct
279{
280    DWORD       dwType;
281    DPID        dpId;
282} DPMSG_DELETEPLAYER;
283
284typedef struct
285{
286    DWORD           dwType;
287    DPSESSIONDESC   dpsDesc;
288} DPMSG_INVITE;
289
290
291
292typedef struct
293{
294    DWORD           dwType;
295} DPMSG_GENERIC;
296
297#pragma pack(pop)
298
299
300DEFINE_GUID( IID_IDirectPlay, 0x5454e9a0, 0xdb65, 0x11ce, 0x92, 0x1c, 0x00, 0xaa, 0x00, 0x6c, 0x49, 0x72);
301
302
303
304#ifdef __cplusplus
305};
306#endif
307
308#endif
309