xref: /reactos/dll/directx/wine/dplayx/dplay_global.h (revision 8a978a17)
1 /*
2  * Copyright 2000 Peter Hunnisett
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #ifndef __WINE_DPLAY_GLOBAL_INCLUDED
20 #define __WINE_DPLAY_GLOBAL_INCLUDED
21 
22 #include <stdarg.h>
23 
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wine/dplaysp.h"
27 #include "lobbysp.h"
28 #include "dplayx_queue.h"
29 
30 extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback,
31                                 LPCVOID lpAddress, DWORD dwAddressSize,
32                                 LPVOID lpContext ) DECLSPEC_HIDDEN;
33 
34 typedef struct tagEnumSessionAsyncCallbackData
35 {
36   LPSPINITDATA lpSpData;
37   GUID         requestGuid;
38   DWORD        dwEnumSessionFlags;
39   DWORD        dwTimeout;
40   HANDLE       hSuicideRequest;
41 } EnumSessionAsyncCallbackData;
42 
43 typedef struct tagDP_MSG_REPLY_STRUCT
44 {
45   HANDLE hReceipt;
46   WORD   wExpectedReply;
47   LPVOID lpReplyMsg;
48   DWORD  dwMsgBodySize;
49   /* FIXME: Is the message header required as well? */
50 } DP_MSG_REPLY_STRUCT, *LPDP_MSG_REPLY_STRUCT;
51 
52 typedef struct tagDP_MSG_REPLY_STRUCT_LIST
53 {
54   DPQ_ENTRY(tagDP_MSG_REPLY_STRUCT_LIST) repliesExpected;
55   DP_MSG_REPLY_STRUCT replyExpected;
56 } DP_MSG_REPLY_STRUCT_LIST, *LPDP_MSG_REPLY_STRUCT_LIST;
57 
58 struct PlayerData
59 {
60   /* Individual player information */
61   DPID dpid;
62 
63   DPNAME name;
64   HANDLE hEvent;
65 
66   ULONG  uRef;  /* What is the reference count on this data? */
67 
68   /* View of local data */
69   LPVOID lpLocalData;
70   DWORD  dwLocalDataSize;
71 
72   /* View of remote data */
73   LPVOID lpRemoteData;
74   DWORD  dwRemoteDataSize;
75 
76   /* SP data on a per player basis */
77   LPVOID lpSPPlayerData;
78 
79   DWORD  dwFlags; /* Special remarks about the type of player */
80 };
81 typedef struct PlayerData* lpPlayerData;
82 
83 struct PlayerList
84 {
85   DPQ_ENTRY(PlayerList) players;
86 
87   lpPlayerData lpPData;
88 };
89 typedef struct PlayerList* lpPlayerList;
90 
91 struct GroupData
92 {
93   /* Internal information */
94   DPID parent; /* If parent == 0 it's a top level group */
95 
96   ULONG uRef; /* Reference count */
97 
98   DPQ_HEAD(GroupList)  groups;  /* A group has [0..n] groups */
99   DPQ_HEAD(PlayerList) players; /* A group has [0..n] players */
100 
101   DPID idGroupOwner; /* ID of player who owns the group */
102 
103   DWORD dwFlags; /* Flags describing anything special about the group */
104 
105   DPID   dpid;
106   DPNAME name;
107 
108   /* View of local data */
109   LPVOID lpLocalData;
110   DWORD  dwLocalDataSize;
111 
112   /* View of remote data */
113   LPVOID lpRemoteData;
114   DWORD  dwRemoteDataSize;
115 };
116 typedef struct GroupData  GroupData;
117 typedef struct GroupData* lpGroupData;
118 
119 struct GroupList
120 {
121   DPQ_ENTRY(GroupList) groups;
122 
123   lpGroupData lpGData;
124 };
125 typedef struct GroupList* lpGroupList;
126 
127 struct DPMSG
128 {
129   DPQ_ENTRY( DPMSG ) msgs;
130   DPMSG_GENERIC* msg;
131 };
132 typedef struct DPMSG* LPDPMSG;
133 
134 enum SPSTATE
135 {
136   NO_PROVIDER = 0,
137   DP_SERVICE_PROVIDER = 1,
138   DP_LOBBY_PROVIDER = 2
139 };
140 
141 /* Contains all data members. FIXME: Rename me */
142 typedef struct tagDirectPlay2Data
143 {
144   BOOL   bConnectionOpen;
145 
146   /* For async EnumSessions requests */
147   HANDLE hEnumSessionThread;
148   HANDLE hKillEnumSessionThreadEvent;
149   DWORD  dwEnumSessionLock;
150 
151   LPVOID lpNameServerData; /* DPlay interface doesn't know contents */
152 
153   BOOL bHostInterface; /* Did this interface create the session */
154 
155   lpGroupData lpSysGroup; /* System group with _everything_ in it */
156 
157   LPDPSESSIONDESC2 lpSessionDesc;
158 
159   /* I/O Msg queues */
160   DPQ_HEAD( DPMSG ) receiveMsgs; /* Msg receive queue */
161   DPQ_HEAD( DPMSG ) sendMsgs;    /* Msg send pending queue */
162 
163   /* Information about the service provider active on this connection */
164   SPINITDATA spData;
165   BOOL       bSPInitialized;
166 
167   /* Information about the lobby server that's attached to this DP object */
168   SPDATA_INIT dplspData;
169   BOOL        bDPLSPInitialized;
170 
171   /* Our service provider */
172   HMODULE hServiceProvider;
173 
174   /* Our DP lobby provider */
175   HMODULE hDPLobbyProvider;
176 
177   enum SPSTATE connectionInitialized;
178 
179   /* Expected messages queue */
180   DPQ_HEAD( tagDP_MSG_REPLY_STRUCT_LIST ) repliesExpected;
181 } DirectPlay2Data;
182 
183 typedef struct IDirectPlayImpl
184 {
185   IDirectPlay IDirectPlay_iface;
186   IDirectPlay2A IDirectPlay2A_iface;
187   IDirectPlay2 IDirectPlay2_iface;
188   IDirectPlay3A IDirectPlay3A_iface;
189   IDirectPlay3 IDirectPlay3_iface;
190   IDirectPlay4A IDirectPlay4A_iface;
191   IDirectPlay4  IDirectPlay4_iface;
192   LONG numIfaces; /* "in use interfaces" refcount */
193   LONG ref, ref2A, ref2, ref3A, ref3, ref4A, ref4;
194   CRITICAL_SECTION lock;
195   DirectPlay2Data *dp2;
196 } IDirectPlayImpl;
197 
198 HRESULT DP_HandleMessage( IDirectPlayImpl *This, const void *lpMessageBody,
199         DWORD  dwMessageBodySize, const void *lpMessageHeader, WORD wCommandId, WORD wVersion,
200         void **lplpReply, DWORD *lpdwMsgSize ) DECLSPEC_HIDDEN;
201 
202 /* DP SP external interfaces into DirectPlay */
203 extern HRESULT DP_GetSPPlayerData( IDirectPlayImpl *lpDP, DPID idPlayer, void **lplpData ) DECLSPEC_HIDDEN;
204 extern HRESULT DP_SetSPPlayerData( IDirectPlayImpl *lpDP, DPID idPlayer, void *lpData ) DECLSPEC_HIDDEN;
205 
206 /* DP external interfaces to call into DPSP interface */
207 extern LPVOID DPSP_CreateSPPlayerData(void) DECLSPEC_HIDDEN;
208 
209 extern HRESULT dplay_create( REFIID riid, void **ppv ) DECLSPEC_HIDDEN;
210 extern HRESULT dplobby_create( REFIID riid, void **ppv ) DECLSPEC_HIDDEN;
211 extern HRESULT dplaysp_create( REFIID riid, void **ppv, IDirectPlayImpl *dp ) DECLSPEC_HIDDEN;
212 extern HRESULT dplobbysp_create( REFIID riid, void **ppv, IDirectPlayImpl *dp ) DECLSPEC_HIDDEN;
213 
214 #endif /* __WINE_DPLAY_GLOBAL_INCLUDED */
215