1 /* DirectPlay Conformance Tests
3 * Copyright 2007 - Alessandro Pignotti
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/test.h"
28 #define check(expected, result) \
29 ok( (expected) == (result), \
30 "expected=%d got=%d\n", \
31 (int)(expected), (int)(result) );
32 #define checkLP(expected, result) \
33 ok( (expected) == (result), \
34 "expected=%p got=%p\n", \
36 #define checkHR(expected, result) \
37 ok( (expected) == (result), \
38 "expected=%s got=%s\n", \
39 dpResult2str(expected), dpResult2str(result) );
40 #define checkStr(expected, result) \
41 ok( (result != NULL) && (!strcmp(expected, result)), \
42 "expected=%s got=%s\n", \
44 #define checkFlags(expected, result, flags) \
45 ok( (expected) == (result), \
46 "expected=0x%08x(%s) got=0x%08x(%s)\n", \
47 expected, dwFlags2str(expected, flags), \
48 result, dwFlags2str(result, flags) );
49 #define checkGuid(expected, result) \
50 ok( IsEqualGUID(expected, result), \
51 "expected=%s got=%s\n", \
52 Guid2str(expected), Guid2str(result) );
53 #define checkConv(expected, result, function) \
54 ok( (expected) == (result), \
55 "expected=0x%08x(%s) got=0x%08x(%s)\n", \
56 expected, function(expected), \
57 result, function(result) );
60 DEFINE_GUID(appGuid
, 0xbdcfe03e, 0xf0ec, 0x415b, 0x82, 0x11, 0x6f, 0x86, 0xd8, 0x19, 0x7f, 0xe1);
61 DEFINE_GUID(appGuid2
, 0x93417d3f, 0x7d26, 0x46ba, 0xb5, 0x76, 0xfe, 0x4b, 0x20, 0xbb, 0xad, 0x70);
62 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
65 typedef struct tagCallbackData
68 UINT dwCounter1
, dwCounter2
;
70 char szTrace1
[1024], szTrace2
[1024];
73 } CallbackData
, *lpCallbackData
;
76 static LPSTR
get_temp_buffer(void)
78 static UINT index
= 0;
79 static char buff
[10][256];
81 index
= (index
+ 1) % 10;
88 static LPCSTR
Guid2str(const GUID
*guid
)
90 LPSTR buffer
= get_temp_buffer();
92 if (!guid
) return "(null)";
94 /* Service providers */
95 if (IsEqualGUID(guid
, &DPSPGUID_IPX
))
96 return "DPSPGUID_IPX";
97 if (IsEqualGUID(guid
, &DPSPGUID_TCPIP
))
98 return "DPSPGUID_TCPIP";
99 if (IsEqualGUID(guid
, &DPSPGUID_SERIAL
))
100 return "DPSPGUID_SERIAL";
101 if (IsEqualGUID(guid
, &DPSPGUID_MODEM
))
102 return "DPSPGUID_MODEM";
103 /* DirectPlay Address IDs */
104 if (IsEqualGUID(guid
, &DPAID_TotalSize
))
105 return "DPAID_TotalSize";
106 if (IsEqualGUID(guid
, &DPAID_ServiceProvider
))
107 return "DPAID_ServiceProvider";
108 if (IsEqualGUID(guid
, &DPAID_LobbyProvider
))
109 return "DPAID_LobbyProvider";
110 if (IsEqualGUID(guid
, &DPAID_Phone
))
111 return "DPAID_Phone";
112 if (IsEqualGUID(guid
, &DPAID_PhoneW
))
113 return "DPAID_PhoneW";
114 if (IsEqualGUID(guid
, &DPAID_Modem
))
115 return "DPAID_Modem";
116 if (IsEqualGUID(guid
, &DPAID_ModemW
))
117 return "DPAID_ModemW";
118 if (IsEqualGUID(guid
, &DPAID_INet
))
120 if (IsEqualGUID(guid
, &DPAID_INetW
))
121 return "DPAID_INetW";
122 if (IsEqualGUID(guid
, &DPAID_INetPort
))
123 return "DPAID_INetPort";
124 if (IsEqualGUID(guid
, &DPAID_ComPort
))
125 return "DPAID_ComPort";
127 sprintf( buffer
, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
128 guid
->Data1
, guid
->Data2
, guid
->Data3
,
129 guid
->Data4
[0], guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3],
130 guid
->Data4
[4], guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7] );
136 static LPCSTR
dpResult2str(HRESULT hr
)
140 case DP_OK
: return "DP_OK";
141 case DPERR_ALREADYINITIALIZED
: return "DPERR_ALREADYINITIALIZED";
142 case DPERR_ACCESSDENIED
: return "DPERR_ACCESSDENIED";
143 case DPERR_ACTIVEPLAYERS
: return "DPERR_ACTIVEPLAYERS";
144 case DPERR_BUFFERTOOSMALL
: return "DPERR_BUFFERTOOSMALL";
145 case DPERR_CANTADDPLAYER
: return "DPERR_CANTADDPLAYER";
146 case DPERR_CANTCREATEGROUP
: return "DPERR_CANTCREATEGROUP";
147 case DPERR_CANTCREATEPLAYER
: return "DPERR_CANTCREATEPLAYER";
148 case DPERR_CANTCREATESESSION
: return "DPERR_CANTCREATESESSION";
149 case DPERR_CAPSNOTAVAILABLEYET
: return "DPERR_CAPSNOTAVAILABLEYET";
150 case DPERR_EXCEPTION
: return "DPERR_EXCEPTION";
151 case DPERR_GENERIC
: return "DPERR_GENERIC";
152 case DPERR_INVALIDFLAGS
: return "DPERR_INVALIDFLAGS";
153 case DPERR_INVALIDOBJECT
: return "DPERR_INVALIDOBJECT";
154 case DPERR_INVALIDPARAMS
: return "DPERR_INVALIDPARAMS";
155 /* symbol with the same value: DPERR_INVALIDPARAM */
156 case DPERR_INVALIDPLAYER
: return "DPERR_INVALIDPLAYER";
157 case DPERR_INVALIDGROUP
: return "DPERR_INVALIDGROUP";
158 case DPERR_NOCAPS
: return "DPERR_NOCAPS";
159 case DPERR_NOCONNECTION
: return "DPERR_NOCONNECTION";
160 case DPERR_NOMEMORY
: return "DPERR_NOMEMORY";
161 /* symbol with the same value: DPERR_OUTOFMEMORY */
162 case DPERR_NOMESSAGES
: return "DPERR_NOMESSAGES";
163 case DPERR_NONAMESERVERFOUND
: return "DPERR_NONAMESERVERFOUND";
164 case DPERR_NOPLAYERS
: return "DPERR_NOPLAYERS";
165 case DPERR_NOSESSIONS
: return "DPERR_NOSESSIONS";
166 case DPERR_PENDING
: return "DPERR_PENDING";
167 case DPERR_SENDTOOBIG
: return "DPERR_SENDTOOBIG";
168 case DPERR_TIMEOUT
: return "DPERR_TIMEOUT";
169 case DPERR_UNAVAILABLE
: return "DPERR_UNAVAILABLE";
170 case DPERR_UNSUPPORTED
: return "DPERR_UNSUPPORTED";
171 case DPERR_BUSY
: return "DPERR_BUSY";
172 case DPERR_USERCANCEL
: return "DPERR_USERCANCEL";
173 case DPERR_NOINTERFACE
: return "DPERR_NOINTERFACE";
174 case DPERR_CANNOTCREATESERVER
: return "DPERR_CANNOTCREATESERVER";
175 case DPERR_PLAYERLOST
: return "DPERR_PLAYERLOST";
176 case DPERR_SESSIONLOST
: return "DPERR_SESSIONLOST";
177 case DPERR_UNINITIALIZED
: return "DPERR_UNINITIALIZED";
178 case DPERR_NONEWPLAYERS
: return "DPERR_NONEWPLAYERS";
179 case DPERR_INVALIDPASSWORD
: return "DPERR_INVALIDPASSWORD";
180 case DPERR_CONNECTING
: return "DPERR_CONNECTING";
181 case DPERR_CONNECTIONLOST
: return "DPERR_CONNECTIONLOST";
182 case DPERR_UNKNOWNMESSAGE
: return "DPERR_UNKNOWNMESSAGE";
183 case DPERR_CANCELFAILED
: return "DPERR_CANCELFAILED";
184 case DPERR_INVALIDPRIORITY
: return "DPERR_INVALIDPRIORITY";
185 case DPERR_NOTHANDLED
: return "DPERR_NOTHANDLED";
186 case DPERR_CANCELLED
: return "DPERR_CANCELLED";
187 case DPERR_ABORTED
: return "DPERR_ABORTED";
188 case DPERR_BUFFERTOOLARGE
: return "DPERR_BUFFERTOOLARGE";
189 case DPERR_CANTCREATEPROCESS
: return "DPERR_CANTCREATEPROCESS";
190 case DPERR_APPNOTSTARTED
: return "DPERR_APPNOTSTARTED";
191 case DPERR_INVALIDINTERFACE
: return "DPERR_INVALIDINTERFACE";
192 case DPERR_NOSERVICEPROVIDER
: return "DPERR_NOSERVICEPROVIDER";
193 case DPERR_UNKNOWNAPPLICATION
: return "DPERR_UNKNOWNAPPLICATION";
194 case DPERR_NOTLOBBIED
: return "DPERR_NOTLOBBIED";
195 case DPERR_SERVICEPROVIDERLOADED
: return "DPERR_SERVICEPROVIDERLOADED";
196 case DPERR_ALREADYREGISTERED
: return "DPERR_ALREADYREGISTERED";
197 case DPERR_NOTREGISTERED
: return "DPERR_NOTREGISTERED";
198 case DPERR_AUTHENTICATIONFAILED
: return "DPERR_AUTHENTICATIONFAILED";
199 case DPERR_CANTLOADSSPI
: return "DPERR_CANTLOADSSPI";
200 case DPERR_ENCRYPTIONFAILED
: return "DPERR_ENCRYPTIONFAILED";
201 case DPERR_SIGNFAILED
: return "DPERR_SIGNFAILED";
202 case DPERR_CANTLOADSECURITYPACKAGE
: return "DPERR_CANTLOADSECURITYPACKAGE";
203 case DPERR_ENCRYPTIONNOTSUPPORTED
: return "DPERR_ENCRYPTIONNOTSUPPORTED";
204 case DPERR_CANTLOADCAPI
: return "DPERR_CANTLOADCAPI";
205 case DPERR_NOTLOGGEDIN
: return "DPERR_NOTLOGGEDIN";
206 case DPERR_LOGONDENIED
: return "DPERR_LOGONDENIED";
207 case CLASS_E_NOAGGREGATION
: return "CLASS_E_NOAGGREGATION";
211 LPSTR buffer
= get_temp_buffer();
212 sprintf( buffer
, "%d", HRESULT_CODE(hr
) );
218 static LPCSTR
dpMsgType2str(DWORD dwType
)
222 case DPSYS_CREATEPLAYERORGROUP
: return "DPSYS_CREATEPLAYERORGROUP";
223 case DPSYS_DESTROYPLAYERORGROUP
: return "DPSYS_DESTROYPLAYERORGROUP";
224 case DPSYS_ADDPLAYERTOGROUP
: return "DPSYS_ADDPLAYERTOGROUP";
225 case DPSYS_DELETEPLAYERFROMGROUP
: return "DPSYS_DELETEPLAYERFROMGROUP";
226 case DPSYS_SESSIONLOST
: return "DPSYS_SESSIONLOST";
227 case DPSYS_HOST
: return "DPSYS_HOST";
228 case DPSYS_SETPLAYERORGROUPDATA
: return "DPSYS_SETPLAYERORGROUPDATA";
229 case DPSYS_SETPLAYERORGROUPNAME
: return "DPSYS_SETPLAYERORGROUPNAME";
230 case DPSYS_SETSESSIONDESC
: return "DPSYS_SETSESSIONDESC";
231 case DPSYS_ADDGROUPTOGROUP
: return "DPSYS_ADDGROUPTOGROUP";
232 case DPSYS_DELETEGROUPFROMGROUP
: return "DPSYS_DELETEGROUPFROMGROUP";
233 case DPSYS_SECUREMESSAGE
: return "DPSYS_SECUREMESSAGE";
234 case DPSYS_STARTSESSION
: return "DPSYS_STARTSESSION";
235 case DPSYS_CHAT
: return "DPSYS_DPSYS_CHAT";
236 case DPSYS_SETGROUPOWNER
: return "DPSYS_SETGROUPOWNER";
237 case DPSYS_SENDCOMPLETE
: return "DPSYS_SENDCOMPLETE";
239 default: return "UNKNOWN";
243 static LPCSTR
dwFlags2str(DWORD dwFlags
, DWORD flagType
)
246 #define FLAGS_DPCONNECTION (1<<0)
247 #define FLAGS_DPENUMPLAYERS (1<<1)
248 #define FLAGS_DPENUMGROUPS (1<<2)
249 #define FLAGS_DPPLAYER (1<<3)
250 #define FLAGS_DPGROUP (1<<4)
251 #define FLAGS_DPENUMSESSIONS (1<<5)
252 #define FLAGS_DPGETCAPS (1<<6)
253 #define FLAGS_DPGET (1<<7)
254 #define FLAGS_DPRECEIVE (1<<8)
255 #define FLAGS_DPSEND (1<<9)
256 #define FLAGS_DPSET (1<<10)
257 #define FLAGS_DPMESSAGEQUEUE (1<<11)
258 #define FLAGS_DPCONNECT (1<<12)
259 #define FLAGS_DPOPEN (1<<13)
260 #define FLAGS_DPSESSION (1<<14)
261 #define FLAGS_DPLCONNECTION (1<<15)
262 #define FLAGS_DPESC (1<<16)
263 #define FLAGS_DPCAPS (1<<17)
265 LPSTR flags
= get_temp_buffer();
267 /* EnumConnections */
269 if (flagType
& FLAGS_DPCONNECTION
)
271 if (dwFlags
& DPCONNECTION_DIRECTPLAY
)
272 strcat(flags
, "DPCONNECTION_DIRECTPLAY,");
273 if (dwFlags
& DPCONNECTION_DIRECTPLAYLOBBY
)
274 strcat(flags
, "DPCONNECTION_DIRECTPLAYLOBBY,");
280 if (flagType
& FLAGS_DPENUMPLAYERS
)
282 if (dwFlags
== DPENUMPLAYERS_ALL
)
283 strcat(flags
, "DPENUMPLAYERS_ALL,");
284 if (dwFlags
& DPENUMPLAYERS_LOCAL
)
285 strcat(flags
, "DPENUMPLAYERS_LOCAL,");
286 if (dwFlags
& DPENUMPLAYERS_REMOTE
)
287 strcat(flags
, "DPENUMPLAYERS_REMOTE,");
288 if (dwFlags
& DPENUMPLAYERS_GROUP
)
289 strcat(flags
, "DPENUMPLAYERS_GROUP,");
290 if (dwFlags
& DPENUMPLAYERS_SESSION
)
291 strcat(flags
, "DPENUMPLAYERS_SESSION,");
292 if (dwFlags
& DPENUMPLAYERS_SERVERPLAYER
)
293 strcat(flags
, "DPENUMPLAYERS_SERVERPLAYER,");
294 if (dwFlags
& DPENUMPLAYERS_SPECTATOR
)
295 strcat(flags
, "DPENUMPLAYERS_SPECTATOR,");
296 if (dwFlags
& DPENUMPLAYERS_OWNER
)
297 strcat(flags
, "DPENUMPLAYERS_OWNER,");
299 if (flagType
& FLAGS_DPENUMGROUPS
)
301 if (dwFlags
== DPENUMGROUPS_ALL
)
302 strcat(flags
, "DPENUMGROUPS_ALL,");
303 if (dwFlags
& DPENUMPLAYERS_LOCAL
)
304 strcat(flags
, "DPENUMGROUPS_LOCAL,");
305 if (dwFlags
& DPENUMPLAYERS_REMOTE
)
306 strcat(flags
, "DPENUMGROUPS_REMOTE,");
307 if (dwFlags
& DPENUMPLAYERS_GROUP
)
308 strcat(flags
, "DPENUMGROUPS_GROUP,");
309 if (dwFlags
& DPENUMPLAYERS_SESSION
)
310 strcat(flags
, "DPENUMGROUPS_SESSION,");
311 if (dwFlags
& DPENUMGROUPS_SHORTCUT
)
312 strcat(flags
, "DPENUMGROUPS_SHORTCUT,");
313 if (dwFlags
& DPENUMGROUPS_STAGINGAREA
)
314 strcat(flags
, "DPENUMGROUPS_STAGINGAREA,");
315 if (dwFlags
& DPENUMGROUPS_HIDDEN
)
316 strcat(flags
, "DPENUMGROUPS_HIDDEN,");
321 if (flagType
& FLAGS_DPPLAYER
)
323 if (dwFlags
& DPPLAYER_SERVERPLAYER
)
324 strcat(flags
, "DPPLAYER_SERVERPLAYER,");
325 if (dwFlags
& DPPLAYER_SPECTATOR
)
326 strcat(flags
, "DPPLAYER_SPECTATOR,");
327 if (dwFlags
& DPPLAYER_LOCAL
)
328 strcat(flags
, "DPPLAYER_LOCAL,");
329 if (dwFlags
& DPPLAYER_OWNER
)
330 strcat(flags
, "DPPLAYER_OWNER,");
335 if (flagType
& FLAGS_DPGROUP
)
337 if (dwFlags
& DPGROUP_STAGINGAREA
)
338 strcat(flags
, "DPGROUP_STAGINGAREA,");
339 if (dwFlags
& DPGROUP_LOCAL
)
340 strcat(flags
, "DPGROUP_LOCAL,");
341 if (dwFlags
& DPGROUP_HIDDEN
)
342 strcat(flags
, "DPGROUP_HIDDEN,");
347 if (flagType
& FLAGS_DPENUMSESSIONS
)
349 if (dwFlags
& DPENUMSESSIONS_AVAILABLE
)
350 strcat(flags
, "DPENUMSESSIONS_AVAILABLE,");
351 if (dwFlags
& DPENUMSESSIONS_ALL
)
352 strcat(flags
, "DPENUMSESSIONS_ALL,");
353 if (dwFlags
& DPENUMSESSIONS_ASYNC
)
354 strcat(flags
, "DPENUMSESSIONS_ASYNC,");
355 if (dwFlags
& DPENUMSESSIONS_STOPASYNC
)
356 strcat(flags
, "DPENUMSESSIONS_STOPASYNC,");
357 if (dwFlags
& DPENUMSESSIONS_PASSWORDREQUIRED
)
358 strcat(flags
, "DPENUMSESSIONS_PASSWORDREQUIRED,");
359 if (dwFlags
& DPENUMSESSIONS_RETURNSTATUS
)
360 strcat(flags
, "DPENUMSESSIONS_RETURNSTATUS,");
366 if (flagType
& FLAGS_DPGETCAPS
)
368 if (dwFlags
& DPGETCAPS_GUARANTEED
)
369 strcat(flags
, "DPGETCAPS_GUARANTEED,");
375 if (flagType
& FLAGS_DPGET
)
377 if (dwFlags
== DPGET_REMOTE
)
378 strcat(flags
, "DPGET_REMOTE,");
379 if (dwFlags
& DPGET_LOCAL
)
380 strcat(flags
, "DPGET_LOCAL,");
385 if (flagType
& FLAGS_DPRECEIVE
)
387 if (dwFlags
& DPRECEIVE_ALL
)
388 strcat(flags
, "DPRECEIVE_ALL,");
389 if (dwFlags
& DPRECEIVE_TOPLAYER
)
390 strcat(flags
, "DPRECEIVE_TOPLAYER,");
391 if (dwFlags
& DPRECEIVE_FROMPLAYER
)
392 strcat(flags
, "DPRECEIVE_FROMPLAYER,");
393 if (dwFlags
& DPRECEIVE_PEEK
)
394 strcat(flags
, "DPRECEIVE_PEEK,");
399 if (flagType
& FLAGS_DPSEND
)
401 /*if (dwFlags == DPSEND_NONGUARANTEED)
402 strcat(flags, "DPSEND_NONGUARANTEED,");*/
403 if (dwFlags
== DPSEND_MAX_PRIORITY
) /* = DPSEND_MAX_PRI */
405 strcat(flags
, "DPSEND_MAX_PRIORITY,");
409 if (dwFlags
& DPSEND_GUARANTEED
)
410 strcat(flags
, "DPSEND_GUARANTEED,");
411 if (dwFlags
& DPSEND_HIGHPRIORITY
)
412 strcat(flags
, "DPSEND_HIGHPRIORITY,");
413 if (dwFlags
& DPSEND_OPENSTREAM
)
414 strcat(flags
, "DPSEND_OPENSTREAM,");
415 if (dwFlags
& DPSEND_CLOSESTREAM
)
416 strcat(flags
, "DPSEND_CLOSESTREAM,");
417 if (dwFlags
& DPSEND_SIGNED
)
418 strcat(flags
, "DPSEND_SIGNED,");
419 if (dwFlags
& DPSEND_ENCRYPTED
)
420 strcat(flags
, "DPSEND_ENCRYPTED,");
421 if (dwFlags
& DPSEND_LOBBYSYSTEMMESSAGE
)
422 strcat(flags
, "DPSEND_LOBBYSYSTEMMESSAGE,");
423 if (dwFlags
& DPSEND_ASYNC
)
424 strcat(flags
, "DPSEND_ASYNC,");
425 if (dwFlags
& DPSEND_NOSENDCOMPLETEMSG
)
426 strcat(flags
, "DPSEND_NOSENDCOMPLETEMSG,");
436 if (flagType
& FLAGS_DPSET
)
438 if (dwFlags
== DPSET_REMOTE
)
439 strcat(flags
, "DPSET_REMOTE,");
440 if (dwFlags
& DPSET_LOCAL
)
441 strcat(flags
, "DPSET_LOCAL,");
442 if (dwFlags
& DPSET_GUARANTEED
)
443 strcat(flags
, "DPSET_GUARANTEED,");
446 /* GetMessageQueue */
448 if (flagType
& FLAGS_DPMESSAGEQUEUE
)
450 if (dwFlags
& DPMESSAGEQUEUE_SEND
)
451 strcat(flags
, "DPMESSAGEQUEUE_SEND,");
452 if (dwFlags
& DPMESSAGEQUEUE_RECEIVE
)
453 strcat(flags
, "DPMESSAGEQUEUE_RECEIVE,");
458 if (flagType
& FLAGS_DPCONNECT
)
460 if (dwFlags
& DPCONNECT_RETURNSTATUS
)
461 strcat(flags
, "DPCONNECT_RETURNSTATUS,");
466 if (flagType
& FLAGS_DPOPEN
)
468 if (dwFlags
& DPOPEN_JOIN
)
469 strcat(flags
, "DPOPEN_JOIN,");
470 if (dwFlags
& DPOPEN_CREATE
)
471 strcat(flags
, "DPOPEN_CREATE,");
472 if (dwFlags
& DPOPEN_RETURNSTATUS
)
473 strcat(flags
, "DPOPEN_RETURNSTATUS,");
478 if (flagType
& FLAGS_DPSESSION
)
480 if (dwFlags
& DPSESSION_NEWPLAYERSDISABLED
)
481 strcat(flags
, "DPSESSION_NEWPLAYERSDISABLED,");
482 if (dwFlags
& DPSESSION_MIGRATEHOST
)
483 strcat(flags
, "DPSESSION_MIGRATEHOST,");
484 if (dwFlags
& DPSESSION_NOMESSAGEID
)
485 strcat(flags
, "DPSESSION_NOMESSAGEID,");
486 if (dwFlags
& DPSESSION_JOINDISABLED
)
487 strcat(flags
, "DPSESSION_JOINDISABLED,");
488 if (dwFlags
& DPSESSION_KEEPALIVE
)
489 strcat(flags
, "DPSESSION_KEEPALIVE,");
490 if (dwFlags
& DPSESSION_NODATAMESSAGES
)
491 strcat(flags
, "DPSESSION_NODATAMESSAGES,");
492 if (dwFlags
& DPSESSION_SECURESERVER
)
493 strcat(flags
, "DPSESSION_SECURESERVER,");
494 if (dwFlags
& DPSESSION_PRIVATE
)
495 strcat(flags
, "DPSESSION_PRIVATE,");
496 if (dwFlags
& DPSESSION_PASSWORDREQUIRED
)
497 strcat(flags
, "DPSESSION_PASSWORDREQUIRED,");
498 if (dwFlags
& DPSESSION_MULTICASTSERVER
)
499 strcat(flags
, "DPSESSION_MULTICASTSERVER,");
500 if (dwFlags
& DPSESSION_CLIENTSERVER
)
501 strcat(flags
, "DPSESSION_CLIENTSERVER,");
503 if (dwFlags
& DPSESSION_DIRECTPLAYPROTOCOL
)
504 strcat(flags
, "DPSESSION_DIRECTPLAYPROTOCOL,");
505 if (dwFlags
& DPSESSION_NOPRESERVEORDER
)
506 strcat(flags
, "DPSESSION_NOPRESERVEORDER,");
507 if (dwFlags
& DPSESSION_OPTIMIZELATENCY
)
508 strcat(flags
, "DPSESSION_OPTIMIZELATENCY,");
514 if (flagType
& FLAGS_DPLCONNECTION
)
516 if (dwFlags
& DPLCONNECTION_CREATESESSION
)
517 strcat(flags
, "DPLCONNECTION_CREATESESSION,");
518 if (dwFlags
& DPLCONNECTION_JOINSESSION
)
519 strcat(flags
, "DPLCONNECTION_JOINSESSION,");
522 /* EnumSessionsCallback2 */
524 if (flagType
& FLAGS_DPESC
)
526 if (dwFlags
& DPESC_TIMEDOUT
)
527 strcat(flags
, "DPESC_TIMEDOUT,");
533 if (flagType
& FLAGS_DPCAPS
)
535 if (dwFlags
& DPCAPS_ISHOST
)
536 strcat(flags
, "DPCAPS_ISHOST,");
537 if (dwFlags
& DPCAPS_GROUPOPTIMIZED
)
538 strcat(flags
, "DPCAPS_GROUPOPTIMIZED,");
539 if (dwFlags
& DPCAPS_KEEPALIVEOPTIMIZED
)
540 strcat(flags
, "DPCAPS_KEEPALIVEOPTIMIZED,");
541 if (dwFlags
& DPCAPS_GUARANTEEDOPTIMIZED
)
542 strcat(flags
, "DPCAPS_GUARANTEEDOPTIMIZED,");
543 if (dwFlags
& DPCAPS_GUARANTEEDSUPPORTED
)
544 strcat(flags
, "DPCAPS_GUARANTEEDSUPPORTED,");
545 if (dwFlags
& DPCAPS_SIGNINGSUPPORTED
)
546 strcat(flags
, "DPCAPS_SIGNINGSUPPORTED,");
547 if (dwFlags
& DPCAPS_ENCRYPTIONSUPPORTED
)
548 strcat(flags
, "DPCAPS_ENCRYPTIONSUPPORTED,");
549 if (dwFlags
& DPCAPS_ASYNCCANCELSUPPORTED
)
550 strcat(flags
, "DPCAPS_ASYNCCANCELSUPPORTED,");
551 if (dwFlags
& DPCAPS_ASYNCCANCELALLSUPPORTED
)
552 strcat(flags
, "DPCAPS_ASYNCCANCELALLSUPPORTED,");
553 if (dwFlags
& DPCAPS_SENDTIMEOUTSUPPORTED
)
554 strcat(flags
, "DPCAPS_SENDTIMEOUTSUPPORTED,");
555 if (dwFlags
& DPCAPS_SENDPRIORITYSUPPORTED
)
556 strcat(flags
, "DPCAPS_SENDPRIORITYSUPPORTED,");
557 if (dwFlags
& DPCAPS_ASYNCSUPPORTED
)
558 strcat(flags
, "DPCAPS_ASYNCSUPPORTED,");
560 if (dwFlags
& DPPLAYERCAPS_LOCAL
)
561 strcat(flags
, "DPPLAYERCAPS_LOCAL,");
564 if ((strlen(flags
) == 0) && (dwFlags
!= 0))
565 strcpy(flags
, "UNKNOWN");
567 flags
[strlen(flags
)-1] = '\0';
572 static char dpid2char(DPID
* dpid
, DWORD dpidSize
, DPID idPlayer
)
575 if ( idPlayer
== DPID_SYSMSG
)
577 for (i
=0; i
<dpidSize
; i
++)
579 if ( idPlayer
== dpid
[i
] )
585 static void check_messages( IDirectPlay4
*pDP
, DPID
*dpid
, DWORD dpidSize
,
586 lpCallbackData callbackData
)
588 /* Retrieves all messages from the queue of pDP, performing tests
589 * to check if we are receiving what we expect.
591 * Information about the messages is stores in callbackData:
593 * callbackData->dwCounter1: Number of messages received.
594 * callbackData->szTrace1: Traces for sender and receiver.
595 * We store the position a dpid holds in the dpid array.
598 * trace string: "01,02,03,14"
599 * expanded: [ '01', '02', '03', '14' ]
601 * \ \ \ ) message 3: from 1 to 4
602 * \ \ ) message 2: from 0 to 3
603 * \ ) message 1: from 0 to 2
604 * ) message 0: from 0 to 1
607 * sender of message i = character in place 3*i of the array
608 * receiver of message i = character in place 3*i+1 of the array
610 * A sender value of 'S' means DPID_SYSMSG, this is, a system message.
612 * callbackData->szTrace2: Traces for message sizes.
617 DWORD dwDataSize
= 1024;
618 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
622 callbackData
->szTrace2
[0] = '\0';
625 while ( DP_OK
== (hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
626 lpData
, &dwDataSize
)) )
629 callbackData
->szTrace1
[ 3*i
] = dpid2char( dpid
, dpidSize
, idFrom
);
630 callbackData
->szTrace1
[ 3*i
+1 ] = dpid2char( dpid
, dpidSize
, idTo
);
631 callbackData
->szTrace1
[ 3*i
+2 ] = ',';
633 sprintf( temp
, "%d,", dwDataSize
);
634 strcat( callbackData
->szTrace2
, temp
);
640 checkHR( DPERR_NOMESSAGES
, hr
);
642 callbackData
->szTrace1
[ 3*i
] = '\0';
643 callbackData
->dwCounter1
= i
;
646 HeapFree( GetProcessHeap(), 0, lpData
);
649 static void init_TCPIP_provider( IDirectPlay4
*pDP
, LPCSTR strIPAddressString
, WORD port
)
652 DPCOMPOUNDADDRESSELEMENT addressElements
[3];
653 LPVOID pAddress
= NULL
;
654 DWORD dwAddressSize
= 0;
655 IDirectPlayLobby3
*pDPL
;
658 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
659 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
660 ok (SUCCEEDED (hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n");
661 if (FAILED (hr
)) return;
663 /* Service provider */
664 addressElements
[0].guidDataType
= DPAID_ServiceProvider
;
665 addressElements
[0].dwDataSize
= sizeof(GUID
);
666 addressElements
[0].lpData
= (LPVOID
) &DPSPGUID_TCPIP
;
668 /* IP address string */
669 addressElements
[1].guidDataType
= DPAID_INet
;
670 addressElements
[1].dwDataSize
= lstrlen(strIPAddressString
) + 1;
671 addressElements
[1].lpData
= (LPVOID
) strIPAddressString
;
673 /* Optional Port number */
676 addressElements
[2].guidDataType
= DPAID_INetPort
;
677 addressElements
[2].dwDataSize
= sizeof(WORD
);
678 addressElements
[2].lpData
= &port
;
682 hr
= IDirectPlayLobby_CreateCompoundAddress( pDPL
, addressElements
, 2,
683 NULL
, &dwAddressSize
);
684 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
686 if( hr
== DPERR_BUFFERTOOSMALL
)
688 pAddress
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwAddressSize
);
689 hr
= IDirectPlayLobby_CreateCompoundAddress( pDPL
, addressElements
, 2,
690 pAddress
, &dwAddressSize
);
691 checkHR( DP_OK
, hr
);
694 hr
= IDirectPlayX_InitializeConnection( pDP
, pAddress
, 0 );
695 todo_wine
checkHR( DP_OK
, hr
);
697 HeapFree( GetProcessHeap(), 0, pAddress
);
701 static BOOL CALLBACK
EnumSessions_cb_join( LPCDPSESSIONDESC2 lpThisSD
,
706 IDirectPlay4
*pDP
= lpContext
;
710 if (dwFlags
& DPESC_TIMEDOUT
)
715 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
716 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
717 dpsd
.guidApplication
= appGuid
;
718 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
720 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
721 checkHR( DP_OK
, hr
);
727 /* DirectPlayCreate */
729 static void test_DirectPlayCreate(void)
735 /* TODO: Check how it behaves with pUnk!=NULL */
738 hr
= DirectPlayCreate( NULL
, NULL
, NULL
);
739 checkHR( DPERR_INVALIDPARAMS
, hr
);
740 hr
= DirectPlayCreate( (LPGUID
) &GUID_NULL
, NULL
, NULL
);
741 checkHR( DPERR_INVALIDPARAMS
, hr
);
742 hr
= DirectPlayCreate( (LPGUID
) &DPSPGUID_TCPIP
, NULL
, NULL
);
743 checkHR( DPERR_INVALIDPARAMS
, hr
);
745 /* pUnk==NULL, pDP!=NULL */
746 hr
= DirectPlayCreate( NULL
, &pDP
, NULL
);
747 checkHR( DPERR_INVALIDPARAMS
, hr
);
748 hr
= DirectPlayCreate( (LPGUID
) &GUID_NULL
, &pDP
, NULL
);
749 checkHR( DP_OK
, hr
);
751 IDirectPlayX_Release( pDP
);
752 hr
= DirectPlayCreate( (LPGUID
) &DPSPGUID_TCPIP
, &pDP
, NULL
);
753 todo_wine
checkHR( DP_OK
, hr
);
755 IDirectPlayX_Release( pDP
);
759 /* EnumConnections */
761 static BOOL CALLBACK
EnumAddress_cb2( REFGUID guidDataType
,
766 lpCallbackData callbackData
= lpContext
;
768 static REFGUID types
[] = { &DPAID_TotalSize
,
769 &DPAID_ServiceProvider
,
771 static DWORD sizes
[] = { 4, 16, 0 };
772 static REFGUID sps
[] = { &DPSPGUID_SERIAL
, &DPSPGUID_MODEM
,
773 &DPSPGUID_IPX
, &DPSPGUID_TCPIP
};
776 checkGuid( types
[ callbackData
->dwCounter2
], guidDataType
);
777 check( sizes
[ callbackData
->dwCounter2
], dwDataSize
);
779 if ( IsEqualGUID( types
[0], guidDataType
) )
781 todo_wine
check( 80, *((LPDWORD
) lpData
) );
783 else if ( IsEqualGUID( types
[1], guidDataType
) )
785 todo_wine
checkGuid( sps
[ callbackData
->dwCounter1
], lpData
);
788 callbackData
->dwCounter2
++;
793 static BOOL CALLBACK
EnumConnections_cb( LPCGUID lpguidSP
,
795 DWORD dwConnectionSize
,
801 lpCallbackData callbackData
= lpContext
;
802 IDirectPlayLobby
*pDPL
;
806 if (!callbackData
->dwFlags
)
808 callbackData
->dwFlags
= DPCONNECTION_DIRECTPLAY
;
811 checkFlags( callbackData
->dwFlags
, dwFlags
, FLAGS_DPCONNECTION
);
813 /* Get info from lpConnection */
814 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
815 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
816 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n");
820 callbackData
->dwCounter2
= 0;
821 IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb2
, lpConnection
,
822 dwConnectionSize
, callbackData
);
823 todo_wine
check( 3, callbackData
->dwCounter2
);
825 callbackData
->dwCounter1
++;
830 static void test_EnumConnections(void)
834 CallbackData callbackData
;
838 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
839 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
841 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
842 if (FAILED(hr
)) return;
844 callbackData
.dwCounter1
= 0;
845 callbackData
.dwFlags
= 0;
846 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
847 &callbackData
, callbackData
.dwFlags
);
848 checkHR( DP_OK
, hr
);
849 check( 4, callbackData
.dwCounter1
);
851 callbackData
.dwCounter1
= 0;
852 callbackData
.dwFlags
= 0;
853 hr
= IDirectPlayX_EnumConnections( pDP
, NULL
, EnumConnections_cb
,
854 &callbackData
, callbackData
.dwFlags
);
855 checkHR( DP_OK
, hr
);
856 check( 4, callbackData
.dwCounter1
);
858 callbackData
.dwCounter1
= 0;
859 callbackData
.dwFlags
= 0;
860 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, NULL
,
861 &callbackData
, callbackData
.dwFlags
);
862 checkHR( DPERR_INVALIDPARAMS
, hr
);
863 check( 0, callbackData
.dwCounter1
);
867 callbackData
.dwCounter1
= 0;
868 callbackData
.dwFlags
= DPCONNECTION_DIRECTPLAY
;
869 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
870 &callbackData
, callbackData
.dwFlags
);
871 checkHR( DP_OK
, hr
);
872 check( 4, callbackData
.dwCounter1
);
874 callbackData
.dwCounter1
= 0;
875 callbackData
.dwFlags
= DPCONNECTION_DIRECTPLAYLOBBY
;
876 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
877 &callbackData
, callbackData
.dwFlags
);
878 checkHR( DP_OK
, hr
);
879 check( 0, callbackData
.dwCounter1
);
881 callbackData
.dwCounter1
= 0;
882 callbackData
.dwFlags
= ( DPCONNECTION_DIRECTPLAY
|
883 DPCONNECTION_DIRECTPLAYLOBBY
);
884 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
885 &callbackData
, callbackData
.dwFlags
);
886 checkHR( DP_OK
, hr
);
887 check( 4, callbackData
.dwCounter1
);
889 callbackData
.dwCounter1
= 0;
890 callbackData
.dwFlags
= ~( DPCONNECTION_DIRECTPLAY
|
891 DPCONNECTION_DIRECTPLAYLOBBY
);
892 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
893 &callbackData
, callbackData
.dwFlags
);
894 checkHR( DPERR_INVALIDFLAGS
, hr
);
895 check( 0, callbackData
.dwCounter1
);
898 IDirectPlayX_Release( pDP
);
901 /* InitializeConnection */
903 static BOOL CALLBACK
EnumConnections_cb2( LPCGUID lpguidSP
,
905 DWORD dwConnectionSize
,
910 IDirectPlay4
*pDP
= lpContext
;
913 /* Incorrect parameters */
914 hr
= IDirectPlayX_InitializeConnection( pDP
, NULL
, 1 );
915 checkHR( DPERR_INVALIDPARAMS
, hr
);
916 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 1 );
917 checkHR( DPERR_INVALIDFLAGS
, hr
);
920 We're only interested in ensuring that the TCP/IP provider works */
922 if( IsEqualGUID(lpguidSP
, &DPSPGUID_TCPIP
) )
924 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 0 );
925 todo_wine
checkHR( DP_OK
, hr
);
926 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 0 );
927 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
933 static void test_InitializeConnection(void)
939 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
940 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
942 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
943 if (FAILED(hr
)) return;
945 IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb2
, pDP
, 0 );
947 IDirectPlayX_Release( pDP
);
952 static void test_GetCaps(void)
961 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
962 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
963 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
964 if (FAILED(hr
)) return;
966 ZeroMemory( &dpcaps
, sizeof(DPCAPS
) );
968 /* Service provider not ininitialized */
969 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, 0 );
970 checkHR( DPERR_UNINITIALIZED
, hr
);
972 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
974 /* dpcaps not ininitialized */
975 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, 0 );
976 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
978 dpcaps
.dwSize
= sizeof(DPCAPS
);
981 dwFlags
<=DPGETCAPS_GUARANTEED
;
982 dwFlags
+=DPGETCAPS_GUARANTEED
)
985 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, dwFlags
);
986 todo_wine
checkHR( DP_OK
, hr
);
991 check( sizeof(DPCAPS
), dpcaps
.dwSize
);
992 check( DPCAPS_ASYNCSUPPORTED
|
993 DPCAPS_GUARANTEEDOPTIMIZED
|
994 DPCAPS_GUARANTEEDSUPPORTED
,
996 check( 0, dpcaps
.dwMaxQueueSize
);
997 check( 0, dpcaps
.dwHundredBaud
);
998 check( 500, dpcaps
.dwLatency
);
999 check( 65536, dpcaps
.dwMaxLocalPlayers
);
1000 check( 20, dpcaps
.dwHeaderLength
);
1001 check( 5000, dpcaps
.dwTimeout
);
1006 check( 65479, dpcaps
.dwMaxBufferSize
);
1007 check( 65536, dpcaps
.dwMaxPlayers
);
1009 case DPGETCAPS_GUARANTEED
:
1010 check( 1048547, dpcaps
.dwMaxBufferSize
);
1011 check( 64, dpcaps
.dwMaxPlayers
);
1018 IDirectPlayX_Release( pDP
);
1023 static BOOL CALLBACK
EnumSessions_cb2( LPCDPSESSIONDESC2 lpThisSD
,
1024 LPDWORD lpdwTimeOut
,
1028 IDirectPlay4
*pDP
= lpContext
;
1029 DPSESSIONDESC2 dpsd
;
1032 if (dwFlags
& DPESC_TIMEDOUT
)
1036 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1037 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1038 dpsd
.guidApplication
= appGuid
;
1039 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
1041 if ( lpThisSD
->dwFlags
& DPSESSION_PASSWORDREQUIRED
)
1043 /* Incorrect password */
1044 U2(dpsd
).lpszPasswordA
= (LPSTR
) "sonic boom";
1045 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1046 checkHR( DPERR_INVALIDPASSWORD
, hr
);
1048 /* Correct password */
1049 U2(dpsd
).lpszPasswordA
= (LPSTR
) "hadouken";
1050 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1051 checkHR( DP_OK
, hr
);
1055 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1056 checkHR( DP_OK
, hr
);
1059 hr
= IDirectPlayX_Close( pDP
);
1060 checkHR( DP_OK
, hr
);
1065 static void test_Open(void)
1068 IDirectPlay4
*pDP
, *pDP_server
;
1069 DPSESSIONDESC2 dpsd
, dpsd_server
;
1073 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1074 &IID_IDirectPlay4A
, (LPVOID
*) &pDP_server
);
1075 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1076 if (FAILED(hr
)) return;
1078 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1079 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1080 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1081 if (FAILED(hr
)) return;
1083 ZeroMemory( &dpsd_server
, sizeof(DPSESSIONDESC2
) );
1084 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1086 /* Service provider not initialized */
1087 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1088 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1090 init_TCPIP_provider( pDP_server
, "127.0.0.1", 0 );
1091 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1093 /* Uninitialized dpsd */
1094 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1095 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1098 dpsd_server
.dwSize
= sizeof(DPSESSIONDESC2
);
1099 dpsd_server
.guidApplication
= appGuid
;
1100 dpsd_server
.dwMaxPlayers
= 10;
1103 /* Regular operation */
1104 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1105 todo_wine
checkHR( DP_OK
, hr
);
1108 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1109 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
1112 IDirectPlayX_Close( pDP_server
);
1114 dpsd_server
.dwFlags
= DPSESSION_CLIENTSERVER
| DPSESSION_MIGRATEHOST
;
1115 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1116 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1118 dpsd_server
.dwFlags
= DPSESSION_MULTICASTSERVER
| DPSESSION_MIGRATEHOST
;
1119 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1120 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1122 dpsd_server
.dwFlags
= DPSESSION_SECURESERVER
| DPSESSION_MIGRATEHOST
;
1123 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1124 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1127 /* Joining sessions */
1128 /* - Checking how strict dplay is with sizes */
1130 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1131 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1133 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
)-1;
1134 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1135 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1137 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
)+1;
1138 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1139 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1141 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1142 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1143 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
); /* Only checks for size, not guids */
1146 dpsd
.guidApplication
= appGuid
;
1147 dpsd
.guidInstance
= appGuid
;
1150 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1151 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
1152 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
| DPOPEN_CREATE
);
1153 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
); /* Second flag is ignored */
1155 dpsd_server
.dwFlags
= 0;
1158 /* Join to normal session */
1159 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1160 todo_wine
checkHR( DP_OK
, hr
);
1162 IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb2
, pDP
, 0 );
1165 /* Already initialized session */
1166 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1167 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
1170 /* Checking which is the error checking order */
1171 dpsd_server
.dwSize
= 0;
1173 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1174 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1176 dpsd_server
.dwSize
= sizeof(DPSESSIONDESC2
);
1179 /* Join to protected session */
1180 IDirectPlayX_Close( pDP_server
);
1181 U2(dpsd_server
).lpszPasswordA
= (LPSTR
) "hadouken";
1182 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1183 todo_wine
checkHR( DP_OK
, hr
);
1185 IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb2
,
1186 pDP
, DPENUMSESSIONS_PASSWORDREQUIRED
);
1189 IDirectPlayX_Release( pDP
);
1190 IDirectPlayX_Release( pDP_server
);
1196 static BOOL CALLBACK
EnumSessions_cb( LPCDPSESSIONDESC2 lpThisSD
,
1197 LPDWORD lpdwTimeOut
,
1201 lpCallbackData callbackData
= lpContext
;
1202 callbackData
->dwCounter1
++;
1204 if ( dwFlags
& DPESC_TIMEDOUT
)
1206 check( TRUE
, lpThisSD
== NULL
);
1209 check( FALSE
, lpThisSD
== NULL
);
1212 if ( U2(*lpThisSD
).lpszPasswordA
!= NULL
)
1214 check( TRUE
, (lpThisSD
->dwFlags
& DPSESSION_PASSWORDREQUIRED
) != 0 );
1217 if ( lpThisSD
->dwFlags
& DPSESSION_NEWPLAYERSDISABLED
)
1219 check( 0, lpThisSD
->dwCurrentPlayers
);
1222 check( sizeof(*lpThisSD
), lpThisSD
->dwSize
);
1223 checkLP( NULL
, U2(*lpThisSD
).lpszPasswordA
);
1228 static IDirectPlay4
*create_session(DPSESSIONDESC2
*lpdpsd
)
1236 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1237 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1238 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1239 if (FAILED(hr
)) return NULL
;
1241 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1243 hr
= IDirectPlayX_Open( pDP
, lpdpsd
, DPOPEN_CREATE
);
1244 todo_wine
checkHR( DP_OK
, hr
);
1246 if ( ! (lpdpsd
->dwFlags
& DPSESSION_NEWPLAYERSDISABLED
) )
1248 ZeroMemory( &name
, sizeof(DPNAME
) );
1249 name
.dwSize
= sizeof(DPNAME
);
1250 U1(name
).lpszShortNameA
= (LPSTR
) "bofh";
1252 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, &name
, NULL
, NULL
,
1253 0, DPPLAYER_SERVERPLAYER
);
1254 todo_wine
checkHR( DP_OK
, hr
);
1261 static void test_EnumSessions(void)
1264 #define N_SESSIONS 6
1266 IDirectPlay4
*pDP
, *pDPserver
[N_SESSIONS
];
1267 DPSESSIONDESC2 dpsd
, dpsd_server
[N_SESSIONS
];
1268 CallbackData callbackData
;
1273 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1274 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1275 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1276 if (FAILED(hr
)) return;
1278 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1279 callbackData
.dwCounter1
= -1; /* So that after a call to EnumSessions
1280 we get the exact number of sessions */
1281 callbackData
.dwFlags
= 0;
1284 /* Service provider not initialized */
1285 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1287 checkHR( DPERR_UNINITIALIZED
, hr
);
1290 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1293 /* Session with no size */
1294 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1296 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1298 if ( hr
== DPERR_UNINITIALIZED
)
1300 todo_wine
win_skip( "EnumSessions not implemented\n" );
1304 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1308 callbackData
.dwCounter1
= -1;
1309 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1311 checkHR( DP_OK
, hr
);
1312 check( 0, callbackData
.dwCounter1
);
1315 dpsd
.guidApplication
= appGuid
;
1317 /* Set up sessions */
1318 for (i
=0; i
<N_SESSIONS
; i
++)
1320 memcpy( &dpsd_server
[i
], &dpsd
, sizeof(DPSESSIONDESC2
) );
1323 U1(dpsd_server
[0]).lpszSessionNameA
= (LPSTR
) "normal";
1324 dpsd_server
[0].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1325 DPSESSION_DIRECTPLAYPROTOCOL
);
1326 dpsd_server
[0].dwMaxPlayers
= 10;
1328 U1(dpsd_server
[1]).lpszSessionNameA
= (LPSTR
) "full";
1329 dpsd_server
[1].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1330 DPSESSION_DIRECTPLAYPROTOCOL
);
1331 dpsd_server
[1].dwMaxPlayers
= 1;
1333 U1(dpsd_server
[2]).lpszSessionNameA
= (LPSTR
) "no new";
1334 dpsd_server
[2].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1335 DPSESSION_DIRECTPLAYPROTOCOL
|
1336 DPSESSION_NEWPLAYERSDISABLED
);
1337 dpsd_server
[2].dwMaxPlayers
= 10;
1339 U1(dpsd_server
[3]).lpszSessionNameA
= (LPSTR
) "no join";
1340 dpsd_server
[3].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1341 DPSESSION_DIRECTPLAYPROTOCOL
|
1342 DPSESSION_JOINDISABLED
);
1343 dpsd_server
[3].dwMaxPlayers
= 10;
1345 U1(dpsd_server
[4]).lpszSessionNameA
= (LPSTR
) "private";
1346 dpsd_server
[4].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1347 DPSESSION_DIRECTPLAYPROTOCOL
|
1348 DPSESSION_PRIVATE
);
1349 dpsd_server
[4].dwMaxPlayers
= 10;
1350 U2(dpsd_server
[4]).lpszPasswordA
= (LPSTR
) "password";
1352 U1(dpsd_server
[5]).lpszSessionNameA
= (LPSTR
) "protected";
1353 dpsd_server
[5].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1354 DPSESSION_DIRECTPLAYPROTOCOL
|
1355 DPSESSION_PASSWORDREQUIRED
);
1356 dpsd_server
[5].dwMaxPlayers
= 10;
1357 U2(dpsd_server
[5]).lpszPasswordA
= (LPSTR
) "password";
1360 for (i
=0; i
<N_SESSIONS
; i
++)
1362 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1363 if (!pDPserver
[i
]) return;
1367 /* Invalid params */
1368 callbackData
.dwCounter1
= -1;
1369 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1370 &callbackData
, -1 );
1371 checkHR( DPERR_INVALIDPARAMS
, hr
);
1373 hr
= IDirectPlayX_EnumSessions( pDP
, NULL
, 0, EnumSessions_cb
,
1375 checkHR( DPERR_INVALIDPARAMS
, hr
);
1377 check( -1, callbackData
.dwCounter1
);
1381 callbackData
.dwFlags
= DPENUMSESSIONS_ALL
; /* Doesn't list private,
1383 callbackData
.dwCounter1
= -1;
1384 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1385 &callbackData
, callbackData
.dwFlags
);
1386 checkHR( DP_OK
, hr
);
1387 check( N_SESSIONS
-2, callbackData
.dwCounter1
);
1389 /* Doesn't list private */
1390 callbackData
.dwFlags
= ( DPENUMSESSIONS_ALL
|
1391 DPENUMSESSIONS_PASSWORDREQUIRED
);
1392 callbackData
.dwCounter1
= -1;
1393 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1394 &callbackData
, callbackData
.dwFlags
);
1395 checkHR( DP_OK
, hr
);
1396 check( N_SESSIONS
-1, callbackData
.dwCounter1
);
1398 /* Doesn't list full, no new, no join, private, protected */
1399 callbackData
.dwFlags
= DPENUMSESSIONS_AVAILABLE
;
1400 callbackData
.dwCounter1
= -1;
1401 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1402 &callbackData
, callbackData
.dwFlags
);
1403 checkHR( DP_OK
, hr
);
1404 check( N_SESSIONS
-5, callbackData
.dwCounter1
);
1406 /* Like with DPENUMSESSIONS_AVAILABLE */
1407 callbackData
.dwFlags
= 0;
1408 callbackData
.dwCounter1
= -1;
1409 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1410 &callbackData
, callbackData
.dwFlags
);
1411 checkHR( DP_OK
, hr
);
1412 check( N_SESSIONS
-5, callbackData
.dwCounter1
);
1414 /* Doesn't list full, no new, no join, private */
1415 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1416 callbackData
.dwCounter1
= -1;
1417 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1418 &callbackData
, callbackData
.dwFlags
);
1419 checkHR( DP_OK
, hr
);
1420 check( N_SESSIONS
-4, callbackData
.dwCounter1
);
1423 /* Async enumeration */
1424 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1425 callbackData
.dwCounter1
= -1;
1426 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1427 &callbackData
, callbackData
.dwFlags
);
1428 checkHR( DP_OK
, hr
);
1429 check( N_SESSIONS
-4, callbackData
.dwCounter1
); /* Read cache of last
1432 callbackData
.dwFlags
= DPENUMSESSIONS_STOPASYNC
;
1433 callbackData
.dwCounter1
= -1;
1434 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1435 &callbackData
, callbackData
.dwFlags
);
1436 checkHR( DP_OK
, hr
);
1437 check( 0, callbackData
.dwCounter1
); /* Stop enumeration */
1439 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1440 callbackData
.dwCounter1
= -1;
1441 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1442 &callbackData
, callbackData
.dwFlags
);
1443 checkHR( DP_OK
, hr
);
1444 check( 0, callbackData
.dwCounter1
); /* Start enumeration */
1446 Sleep(500); /* Give time to fill the cache */
1448 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1449 callbackData
.dwCounter1
= -1;
1450 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1451 &callbackData
, callbackData
.dwFlags
);
1452 checkHR( DP_OK
, hr
);
1453 check( N_SESSIONS
-5, callbackData
.dwCounter1
); /* Retrieve results */
1455 callbackData
.dwFlags
= DPENUMSESSIONS_STOPASYNC
;
1456 callbackData
.dwCounter1
= -1;
1457 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1458 &callbackData
, callbackData
.dwFlags
);
1459 checkHR( DP_OK
, hr
);
1460 check( 0, callbackData
.dwCounter1
); /* Stop enumeration */
1463 /* Specific tests for passworded sessions */
1465 for (i
=0; i
<N_SESSIONS
; i
++)
1467 IDirectPlayX_Release( pDPserver
[i
] );
1470 /* - Only session password set */
1473 U2(dpsd_server
[i
]).lpszPasswordA
= (LPSTR
) "password";
1474 dpsd_server
[i
].dwFlags
= 0;
1475 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1478 callbackData
.dwFlags
= 0;
1479 callbackData
.dwCounter1
= -1;
1480 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1481 &callbackData
, callbackData
.dwFlags
);
1482 checkHR( DP_OK
, hr
);
1483 check( 0, callbackData
.dwCounter1
);
1485 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1486 callbackData
.dwCounter1
= -1;
1487 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1488 &callbackData
, callbackData
.dwFlags
);
1489 checkHR( DP_OK
, hr
);
1490 check( 2, callbackData
.dwCounter1
); /* Both sessions automatically
1491 set DPSESSION_PASSWORDREQUIRED */
1493 /* - Only session flag set */
1494 for (i
=4; i
<=5; i
++)
1496 IDirectPlayX_Release( pDPserver
[i
] );
1497 U2(dpsd_server
[i
]).lpszPasswordA
= NULL
;
1499 dpsd_server
[4].dwFlags
= DPSESSION_PRIVATE
;
1500 dpsd_server
[5].dwFlags
= DPSESSION_PASSWORDREQUIRED
;
1501 for (i
=4; i
<=5; i
++)
1503 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1506 callbackData
.dwFlags
= 0;
1507 callbackData
.dwCounter1
= -1;
1508 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1509 &callbackData
, callbackData
.dwFlags
);
1510 checkHR( DP_OK
, hr
);
1511 check( 2, callbackData
.dwCounter1
); /* Without password,
1512 the flag is ignored */
1514 /* - Both session flag and password set */
1515 for (i
=4; i
<=5; i
++)
1517 IDirectPlayX_Release( pDPserver
[i
] );
1518 U2(dpsd_server
[i
]).lpszPasswordA
= (LPSTR
) "password";
1520 dpsd_server
[4].dwFlags
= DPSESSION_PRIVATE
;
1521 dpsd_server
[5].dwFlags
= DPSESSION_PASSWORDREQUIRED
;
1522 for (i
=4; i
<=5; i
++)
1524 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1527 /* - Listing without password */
1528 callbackData
.dwCounter1
= -1;
1529 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1530 &callbackData
, callbackData
.dwFlags
);
1531 checkHR( DP_OK
, hr
);
1532 check( 0, callbackData
.dwCounter1
);
1534 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1535 callbackData
.dwCounter1
= -1;
1536 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1537 &callbackData
, callbackData
.dwFlags
);
1538 checkHR( DP_OK
, hr
);
1539 check( 1, callbackData
.dwCounter1
);
1541 /* - Listing with incorrect password */
1542 U2(dpsd
).lpszPasswordA
= (LPSTR
) "bad_password";
1543 callbackData
.dwFlags
= 0;
1544 callbackData
.dwCounter1
= -1;
1545 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1546 &callbackData
, callbackData
.dwFlags
);
1547 checkHR( DP_OK
, hr
);
1548 check( 0, callbackData
.dwCounter1
);
1550 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1551 callbackData
.dwCounter1
= -1;
1552 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1553 &callbackData
, callbackData
.dwFlags
);
1554 checkHR( DP_OK
, hr
);
1555 check( 1, callbackData
.dwCounter1
);
1557 /* - Listing with correct password */
1558 U2(dpsd
).lpszPasswordA
= (LPSTR
) "password";
1559 callbackData
.dwCounter1
= -1;
1560 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1561 &callbackData
, callbackData
.dwFlags
);
1562 checkHR( DP_OK
, hr
);
1563 check( 2, callbackData
.dwCounter1
);
1566 U2(dpsd
).lpszPasswordA
= NULL
;
1567 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1568 callbackData
.dwCounter1
= -1;
1569 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1570 &callbackData
, callbackData
.dwFlags
);
1571 checkHR( DP_OK
, hr
);
1572 check( 2, callbackData
.dwCounter1
); /* Read cache of last sync enumeration,
1573 even private sessions */
1578 /* - Creating two servers with different application GUIDs */
1579 for (i
=4; i
<=5; i
++)
1581 IDirectPlayX_Release( pDPserver
[i
] );
1582 dpsd_server
[i
].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1583 DPSESSION_DIRECTPLAYPROTOCOL
);
1584 U2(dpsd_server
[i
]).lpszPasswordA
= NULL
;
1585 dpsd_server
[i
].dwMaxPlayers
= 10;
1587 U1(dpsd_server
[4]).lpszSessionNameA
= (LPSTR
) "normal1";
1588 dpsd_server
[4].guidApplication
= appGuid
;
1589 U1(dpsd_server
[5]).lpszSessionNameA
= (LPSTR
) "normal2";
1590 dpsd_server
[5].guidApplication
= appGuid2
;
1591 for (i
=4; i
<=5; i
++)
1593 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1596 callbackData
.dwFlags
= 0;
1598 dpsd
.guidApplication
= appGuid2
;
1599 callbackData
.dwCounter1
= -1;
1600 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1601 &callbackData
, callbackData
.dwFlags
);
1602 checkHR( DP_OK
, hr
);
1603 check( 1, callbackData
.dwCounter1
); /* Only one of the sessions */
1605 dpsd
.guidApplication
= appGuid
;
1606 callbackData
.dwCounter1
= -1;
1607 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1608 &callbackData
, callbackData
.dwFlags
);
1609 checkHR( DP_OK
, hr
);
1610 check( 1, callbackData
.dwCounter1
); /* The other session */
1612 For some reason, if we enum 1st with appGuid and 2nd with appGuid2,
1613 in the second enum we get the 2 sessions. Dplay fault? Elves? */
1615 dpsd
.guidApplication
= GUID_NULL
;
1616 callbackData
.dwCounter1
= -1;
1617 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1618 &callbackData
, callbackData
.dwFlags
);
1619 checkHR( DP_OK
, hr
);
1620 check( 2, callbackData
.dwCounter1
); /* Both sessions */
1622 for (i
=4; i
<=5; i
++)
1624 IDirectPlayX_Release( pDPserver
[i
] );
1626 IDirectPlayX_Release( pDP
);
1633 static void test_SessionDesc(void)
1636 IDirectPlay4
*pDP
[2];
1637 DPSESSIONDESC2 dpsd
;
1638 LPDPSESSIONDESC2 lpData
[2];
1644 CallbackData callbackData
;
1649 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1650 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
1651 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1652 if (FAILED(hr
)) return;
1654 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1656 /* Service provider not initialized */
1657 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1658 checkHR( DPERR_UNINITIALIZED
, hr
);
1660 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1661 checkHR( DPERR_UNINITIALIZED
, hr
);
1664 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
1665 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
1668 /* No sessions open */
1669 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1670 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
1672 if ( hr
== DPERR_UNINITIALIZED
)
1674 todo_wine
win_skip("Get/SetSessionDesc not implemented\n");
1678 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1679 checkHR( DPERR_NOSESSIONS
, hr
);
1682 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1683 dpsd
.guidApplication
= appGuid
;
1684 dpsd
.dwMaxPlayers
= 10;
1688 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1690 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
1695 /* Players, only to receive messages */
1696 IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
, 0, 0 );
1698 lpData
[i
] = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
1700 lpDataMsg
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
1703 /* Incorrect parameters */
1704 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1705 checkHR( DPERR_INVALIDPARAMS
, hr
);
1706 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1707 checkHR( DPERR_INVALIDPARAM
, hr
);
1708 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], NULL
);
1709 checkHR( DPERR_INVALIDPARAM
, hr
);
1711 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1712 checkHR( DPERR_INVALIDPARAMS
, hr
);
1713 check( -1, dwDataSize
);
1715 /* Get: Insufficient buffer size */
1717 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1718 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1719 check( dpsd
.dwSize
, dwDataSize
);
1721 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1722 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1723 check( dpsd
.dwSize
, dwDataSize
);
1725 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, &dwDataSize
);
1726 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1727 check( dpsd
.dwSize
, dwDataSize
);
1729 /* Get: Regular operation
1730 * i=0: Local session
1731 * i=1: Remote session */
1734 hr
= IDirectPlayX_GetSessionDesc( pDP
[i
], lpData
[i
], &dwDataSize
);
1735 checkHR( DP_OK
, hr
);
1736 check( sizeof(DPSESSIONDESC2
), dwDataSize
);
1737 check( sizeof(DPSESSIONDESC2
), lpData
[i
]->dwSize
);
1738 checkGuid( &appGuid
, &lpData
[i
]->guidApplication
);
1739 check( dpsd
.dwMaxPlayers
, lpData
[i
]->dwMaxPlayers
);
1742 checkGuid( &lpData
[0]->guidInstance
, &lpData
[1]->guidInstance
);
1744 /* Set: Regular operation */
1745 U1(dpsd
).lpszSessionNameA
= (LPSTR
) "Wahaa";
1746 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1747 checkHR( DP_OK
, hr
);
1750 hr
= IDirectPlayX_GetSessionDesc( pDP
[1], lpData
[1], &dwDataSize
);
1751 checkHR( DP_OK
, hr
);
1752 checkStr( U1(dpsd
).lpszSessionNameA
, U1(*lpData
[1]).lpszSessionNameA
);
1755 /* Set: Failing to modify a remote session */
1756 hr
= IDirectPlayX_SetSessionDesc( pDP
[1], &dpsd
, 0 );
1757 checkHR( DPERR_ACCESSDENIED
, hr
);
1759 /* Trying to change immutable properties */
1761 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1762 checkHR( DP_OK
, hr
);
1763 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
1764 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1765 checkHR( DPERR_INVALIDPARAMS
, hr
);
1767 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1768 checkHR( DP_OK
, hr
);
1771 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1772 checkHR( DPERR_INVALIDPARAMS
, hr
);
1773 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1774 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1775 checkHR( DP_OK
, hr
);
1777 /* Changing the GUIDs and size is ignored */
1778 dpsd
.guidApplication
= appGuid2
;
1779 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1780 checkHR( DP_OK
, hr
);
1781 dpsd
.guidInstance
= appGuid2
;
1782 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1783 checkHR( DP_OK
, hr
);
1785 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1786 checkHR( DP_OK
, hr
);
1787 checkGuid( &appGuid
, &lpData
[0]->guidApplication
);
1788 checkGuid( &lpData
[1]->guidInstance
, &lpData
[0]->guidInstance
);
1789 check( sizeof(DPSESSIONDESC2
), lpData
[0]->dwSize
);
1792 /* Checking system messages */
1793 check_messages( pDP
[0], dpid
, 2, &callbackData
);
1794 checkStr( "S0,S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
1795 checkStr( "48,90,90,90,90,90,90,", callbackData
.szTrace2
);
1796 check_messages( pDP
[1], dpid
, 2, &callbackData
);
1797 checkStr( "S1,S1,S1,S1,S1,S1,", callbackData
.szTrace1
);
1798 checkStr( "90,90,90,90,90,90,", callbackData
.szTrace2
);
1800 HeapFree( GetProcessHeap(), 0, lpDataMsg
);
1803 HeapFree( GetProcessHeap(), 0, lpData
[i
] );
1804 IDirectPlayX_Release( pDP
[i
] );
1811 static void test_CreatePlayer(void)
1814 IDirectPlay4
*pDP
[2];
1815 DPSESSIONDESC2 dpsd
;
1821 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1822 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[0] );
1823 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1824 if (FAILED(hr
)) return;
1826 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1827 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[1] );
1828 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1829 if (FAILED(hr
)) return;
1831 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1832 ZeroMemory( &name
, sizeof(DPNAME
) );
1835 /* Connection not initialized */
1836 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1837 checkHR( DPERR_UNINITIALIZED
, hr
);
1840 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
1841 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
1844 /* Session not open */
1845 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1846 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1848 if ( hr
== DPERR_UNINITIALIZED
)
1850 todo_wine
win_skip( "CreatePlayer not implemented\n" );
1854 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1855 dpsd
.guidApplication
= appGuid
;
1856 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1860 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1861 checkHR( DP_OK
, hr
);
1867 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, &name
, NULL
, NULL
, 0, 0 );
1868 checkHR( DP_OK
, hr
);
1871 name
.dwSize
= sizeof(DPNAME
);
1872 U1(name
).lpszShortNameA
= (LPSTR
) "test";
1873 U2(name
).lpszLongNameA
= NULL
;
1876 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, &name
, NULL
, NULL
,
1878 checkHR( DP_OK
, hr
);
1882 hr
= IDirectPlayX_CreatePlayer( pDP
[0], NULL
, NULL
, NULL
, NULL
,
1884 checkHR( DPERR_INVALIDPARAMS
, hr
);
1887 /* There can only be one server player */
1888 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1889 0, DPPLAYER_SERVERPLAYER
);
1890 checkHR( DP_OK
, hr
);
1891 check( DPID_SERVERPLAYER
, dpid
);
1893 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1894 0, DPPLAYER_SERVERPLAYER
);
1895 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1897 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1899 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1900 0, DPPLAYER_SERVERPLAYER
);
1901 checkHR( DP_OK
, hr
);
1902 check( DPID_SERVERPLAYER
, dpid
);
1903 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1907 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1909 checkHR( DP_OK
, hr
);
1911 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1912 0, DPPLAYER_SERVERPLAYER
);
1913 checkHR( DP_OK
, hr
);
1914 check( DPID_SERVERPLAYER
, dpid
);
1915 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1917 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1918 0, DPPLAYER_SPECTATOR
);
1919 checkHR( DP_OK
, hr
);
1921 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1922 0, ( DPPLAYER_SERVERPLAYER
|
1923 DPPLAYER_SPECTATOR
) );
1924 checkHR( DP_OK
, hr
);
1925 check( DPID_SERVERPLAYER
, dpid
);
1926 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1929 /* Session with DPSESSION_NEWPLAYERSDISABLED */
1930 IDirectPlayX_Close( pDP
[0] );
1931 dpsd
.dwFlags
= DPSESSION_NEWPLAYERSDISABLED
;
1932 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1933 checkHR( DP_OK
, hr
);
1936 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1938 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1940 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1941 0, DPPLAYER_SERVERPLAYER
);
1942 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1944 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1945 0, DPPLAYER_SPECTATOR
);
1946 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1949 /* Creating players in a Client/Server session */
1950 IDirectPlayX_Close( pDP
[0] );
1951 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
1952 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1953 checkHR( DP_OK
, hr
);
1954 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
1956 checkHR( DP_OK
, hr
);
1959 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1961 checkHR( DPERR_ACCESSDENIED
, hr
);
1963 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1964 0, DPPLAYER_SERVERPLAYER
);
1965 checkHR( DP_OK
, hr
);
1966 check( DPID_SERVERPLAYER
, dpid
);
1968 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
, NULL
, NULL
, NULL
,
1969 0, DPPLAYER_SERVERPLAYER
);
1970 checkHR( DPERR_INVALIDFLAGS
, hr
);
1972 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
, NULL
, NULL
, NULL
,
1974 checkHR( DP_OK
, hr
);
1977 IDirectPlayX_Release( pDP
[0] );
1978 IDirectPlayX_Release( pDP
[1] );
1984 static void test_GetPlayerCaps(void)
1987 IDirectPlay4
*pDP
[2];
1988 DPSESSIONDESC2 dpsd
;
1999 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2000 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2001 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2002 if (FAILED(hr
)) return;
2004 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2005 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2006 dpsd
.guidApplication
= appGuid
;
2007 dpsd
.dwMaxPlayers
= 10;
2009 ZeroMemory( &playerCaps
, sizeof(DPCAPS
) );
2012 /* Uninitialized service provider */
2013 playerCaps
.dwSize
= 0;
2014 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2015 checkHR( DPERR_UNINITIALIZED
, hr
);
2017 playerCaps
.dwSize
= sizeof(DPCAPS
);
2018 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2019 checkHR( DPERR_UNINITIALIZED
, hr
);
2022 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2023 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2027 playerCaps
.dwSize
= 0;
2029 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2030 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
2032 if ( hr
== DPERR_UNINITIALIZED
)
2034 todo_wine
win_skip( "GetPlayerCaps not implemented\n" );
2038 playerCaps
.dwSize
= sizeof(DPCAPS
);
2040 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2041 checkHR( DPERR_INVALIDPLAYER
, hr
);
2043 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2044 checkHR( DPERR_INVALIDPLAYER
, hr
);
2047 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2048 checkHR( DP_OK
, hr
);
2049 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2051 checkHR( DP_OK
, hr
);
2055 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
2056 NULL
, NULL
, NULL
, 0, 0 );
2057 checkHR( DP_OK
, hr
);
2061 /* Uninitialized playerCaps */
2062 playerCaps
.dwSize
= 0;
2064 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2065 checkHR( DPERR_INVALIDPARAMS
, hr
);
2067 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2068 checkHR( DPERR_INVALIDPARAMS
, hr
);
2070 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[0], &playerCaps
, 0 );
2071 checkHR( DPERR_INVALIDPARAMS
, hr
);
2074 /* Invalid player */
2075 playerCaps
.dwSize
= sizeof(DPCAPS
);
2077 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2078 checkHR( DPERR_INVALIDPLAYER
, hr
);
2080 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2081 checkHR( DPERR_INVALIDPLAYER
, hr
);
2083 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[0], &playerCaps
, 0 );
2084 checkHR( DP_OK
, hr
);
2087 /* Regular parameters */
2091 dwFlags
<=DPGETCAPS_GUARANTEED
;
2092 dwFlags
+=DPGETCAPS_GUARANTEED
)
2095 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[i
],
2096 &playerCaps
, dwFlags
);
2097 checkHR( DP_OK
, hr
);
2100 check( sizeof(DPCAPS
), playerCaps
.dwSize
);
2101 check( 40, playerCaps
.dwSize
);
2102 check( 0, playerCaps
.dwMaxQueueSize
);
2103 check( 0, playerCaps
.dwHundredBaud
);
2104 check( 0, playerCaps
.dwLatency
);
2105 check( 65536, playerCaps
.dwMaxLocalPlayers
);
2106 check( 20, playerCaps
.dwHeaderLength
);
2110 checkFlags( DPCAPS_ISHOST
|
2111 DPCAPS_GUARANTEEDOPTIMIZED
|
2112 DPCAPS_GUARANTEEDSUPPORTED
|
2113 DPCAPS_ASYNCSUPPORTED
|
2115 playerCaps
.dwFlags
, FLAGS_DPCAPS
);
2118 checkFlags( DPCAPS_ISHOST
|
2119 DPCAPS_GUARANTEEDOPTIMIZED
|
2120 DPCAPS_GUARANTEEDSUPPORTED
|
2121 DPCAPS_ASYNCSUPPORTED
,
2122 playerCaps
.dwFlags
, FLAGS_DPCAPS
);
2124 if ( dwFlags
== DPGETCAPS_GUARANTEED
)
2126 check( 1048547, playerCaps
.dwMaxBufferSize
);
2127 check( 64, playerCaps
.dwMaxPlayers
);
2131 check( 65479, playerCaps
.dwMaxBufferSize
);
2132 check( 65536, playerCaps
.dwMaxPlayers
);
2139 IDirectPlayX_Release( pDP
[0] );
2140 IDirectPlayX_Release( pDP
[1] );
2147 static void test_PlayerData(void)
2150 DPSESSIONDESC2 dpsd
;
2154 /* lpDataFake has to be bigger than the rest, limits lpDataGet size */
2155 LPCSTR lpDataFake
= "big_fake_data_chunk";
2156 DWORD dwDataSizeFake
= strlen(lpDataFake
)+1;
2158 LPCSTR lpData
= "remote_data";
2159 DWORD dwDataSize
= strlen(lpData
)+1;
2161 LPCSTR lpDataLocal
= "local_data";
2162 DWORD dwDataSizeLocal
= strlen(lpDataLocal
)+1;
2164 LPSTR lpDataGet
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
2166 DWORD dwDataSizeGet
= dwDataSizeFake
;
2169 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2170 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
2171 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2172 if (FAILED(hr
)) return;
2174 /* No service provider */
2175 hr
= IDirectPlayX_SetPlayerData( pDP
, 0, (LPVOID
) lpData
,
2177 checkHR( DPERR_UNINITIALIZED
, hr
);
2179 hr
= IDirectPlayX_GetPlayerData( pDP
, 0, lpDataGet
, &dwDataSizeGet
, 0 );
2180 checkHR( DPERR_UNINITIALIZED
, hr
);
2183 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
2185 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2186 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2187 dpsd
.guidApplication
= appGuid
;
2188 IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
2191 /* Invalid player */
2192 hr
= IDirectPlayX_SetPlayerData( pDP
, 0, (LPVOID
) lpData
,
2194 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2196 hr
= IDirectPlayX_GetPlayerData( pDP
, 0, lpDataGet
, &dwDataSizeGet
, 0 );
2197 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2199 if ( hr
== DPERR_UNINITIALIZED
)
2201 todo_wine
win_skip( "Get/SetPlayerData not implemented\n" );
2205 /* Create the player */
2206 /* By default, the data is remote */
2207 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, NULL
, NULL
, (LPVOID
) lpData
,
2209 checkHR( DP_OK
, hr
);
2211 /* Invalid parameters */
2212 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, NULL
, dwDataSize
, 0 );
2213 checkHR( DPERR_INVALIDPARAMS
, hr
);
2214 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, lpDataGet
, -1, 0 );
2215 checkHR( DPERR_INVALIDPARAMS
, hr
);
2217 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, NULL
, 0 );
2218 checkHR( DPERR_INVALIDPARAMS
, hr
);
2222 * Remote data (default)
2226 /* Buffer redimension */
2227 dwDataSizeGet
= dwDataSizeFake
;
2228 strcpy(lpDataGet
, lpDataFake
);
2229 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
,
2230 &dwDataSizeGet
, 0 );
2231 check( DPERR_BUFFERTOOSMALL
, hr
);
2232 check( dwDataSize
, dwDataSizeGet
);
2233 checkStr( lpDataFake
, lpDataGet
);
2236 strcpy(lpDataGet
, lpDataFake
);
2237 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2238 check( DPERR_BUFFERTOOSMALL
, hr
);
2239 check( dwDataSize
, dwDataSizeGet
);
2241 strcpy(lpDataGet
, lpDataFake
);
2242 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2243 checkHR( DP_OK
, hr
);
2244 check( dwDataSize
, dwDataSizeGet
);
2245 checkStr( lpData
, lpDataGet
);
2247 /* Normal operation */
2248 dwDataSizeGet
= dwDataSizeFake
;
2249 strcpy(lpDataGet
, lpDataFake
);
2250 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2251 checkHR( DP_OK
, hr
);
2252 check( dwDataSize
, dwDataSizeGet
);
2253 checkStr( lpData
, lpDataGet
);
2256 dwDataSizeGet
= dwDataSizeFake
;
2257 strcpy(lpDataGet
, lpDataFake
);
2258 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2259 checkHR( DP_OK
, hr
);
2260 check( dwDataSize
, dwDataSizeGet
); /* Remote: works as expected */
2261 checkStr( lpData
, lpDataGet
);
2263 dwDataSizeGet
= dwDataSizeFake
;
2264 strcpy(lpDataGet
, lpDataFake
);
2265 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2267 checkHR( DP_OK
, hr
);
2268 check( dwDataSize
, dwDataSizeGet
); /* Same behaviour as in previous test */
2269 checkStr( lpData
, lpDataGet
);
2271 dwDataSizeGet
= dwDataSizeFake
;
2272 strcpy(lpDataGet
, lpDataFake
);
2273 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2275 checkHR( DP_OK
, hr
);
2276 check( 0, dwDataSizeGet
); /* Sets size to 0 (as local data doesn't exist) */
2277 checkStr( lpDataFake
, lpDataGet
);
2279 dwDataSizeGet
= dwDataSizeFake
;
2280 strcpy(lpDataGet
, lpDataFake
);
2281 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2282 DPGET_LOCAL
| DPGET_REMOTE
);
2283 checkHR( DP_OK
, hr
);
2284 check( 0, dwDataSizeGet
); /* Same behaviour as in previous test */
2285 checkStr( lpDataFake
, lpDataGet
);
2287 /* Getting local data (which doesn't exist), buffer size is ignored */
2289 strcpy(lpDataGet
, lpDataFake
);
2290 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2292 checkHR( DP_OK
, hr
);
2293 check( 0, dwDataSizeGet
); /* Sets size to 0 */
2294 checkStr( lpDataFake
, lpDataGet
);
2296 dwDataSizeGet
= dwDataSizeFake
;
2297 strcpy(lpDataGet
, lpDataFake
);
2298 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
, &dwDataSizeGet
,
2300 checkHR( DP_OK
, hr
);
2301 check( 0, dwDataSizeGet
); /* Sets size to 0 */
2302 checkStr( lpDataFake
, lpDataGet
);
2311 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2313 DPSET_LOCAL
| DPSET_GUARANTEED
);
2314 checkHR( DPERR_INVALIDPARAMS
, hr
);
2316 /* Correct parameters */
2317 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2318 dwDataSizeLocal
, DPSET_LOCAL
);
2319 checkHR( DP_OK
, hr
);
2321 /* Flag tests (again) */
2322 dwDataSizeGet
= dwDataSizeFake
;
2323 strcpy(lpDataGet
, lpDataFake
);
2324 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2325 checkHR( DP_OK
, hr
);
2326 check( dwDataSize
, dwDataSizeGet
); /* Remote: works as expected */
2327 checkStr( lpData
, lpDataGet
);
2329 dwDataSizeGet
= dwDataSizeFake
;
2330 strcpy(lpDataGet
, lpDataFake
);
2331 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2333 checkHR( DP_OK
, hr
);
2334 check( dwDataSize
, dwDataSizeGet
); /* Like in previous test */
2335 checkStr( lpData
, lpDataGet
);
2337 dwDataSizeGet
= dwDataSizeFake
;
2338 strcpy(lpDataGet
, lpDataFake
);
2339 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2341 checkHR( DP_OK
, hr
);
2342 check( dwDataSizeLocal
, dwDataSizeGet
); /* Local: works as expected */
2343 checkStr( lpDataLocal
, lpDataGet
);
2345 dwDataSizeGet
= dwDataSizeFake
;
2346 strcpy(lpDataGet
, lpDataFake
);
2347 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2348 DPGET_LOCAL
| DPGET_REMOTE
);
2349 checkHR( DP_OK
, hr
);
2350 check( dwDataSizeLocal
, dwDataSizeGet
); /* Like in previous test */
2351 checkStr( lpDataLocal
, lpDataGet
);
2353 /* Small buffer works as expected again */
2355 strcpy(lpDataGet
, lpDataFake
);
2356 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2358 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2359 check( dwDataSizeLocal
, dwDataSizeGet
);
2360 checkStr( lpDataFake
, lpDataGet
);
2362 dwDataSizeGet
= dwDataSizeFake
;
2363 strcpy(lpDataGet
, lpDataFake
);
2364 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
,
2365 &dwDataSizeGet
, DPGET_LOCAL
);
2366 check( DPERR_BUFFERTOOSMALL
, hr
);
2367 check( dwDataSizeLocal
, dwDataSizeGet
);
2368 checkStr( lpDataFake
, lpDataGet
);
2372 * Changing remote data
2376 /* Remote data := local data */
2377 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2379 DPSET_GUARANTEED
| DPSET_REMOTE
);
2380 checkHR( DP_OK
, hr
);
2381 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2382 dwDataSizeLocal
, 0 );
2383 checkHR( DP_OK
, hr
);
2385 dwDataSizeGet
= dwDataSizeFake
;
2386 strcpy(lpDataGet
, lpDataFake
);
2387 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2388 checkHR( DP_OK
, hr
);
2389 check( dwDataSizeLocal
, dwDataSizeGet
);
2390 checkStr( lpDataLocal
, lpDataGet
);
2392 /* Remote data := fake data */
2393 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataFake
,
2394 dwDataSizeFake
, DPSET_REMOTE
);
2395 checkHR( DP_OK
, hr
);
2397 dwDataSizeGet
= dwDataSizeFake
+ 1;
2398 strcpy(lpDataGet
, lpData
);
2399 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2400 checkHR( DP_OK
, hr
);
2401 check( dwDataSizeFake
, dwDataSizeGet
);
2402 checkStr( lpDataFake
, lpDataGet
);
2405 HeapFree( GetProcessHeap(), 0, lpDataGet
);
2406 IDirectPlayX_Release( pDP
);
2412 static void test_PlayerName(void)
2415 IDirectPlay4
*pDP
[2];
2416 DPSESSIONDESC2 dpsd
;
2422 DWORD dwDataSize
= 1024;
2423 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2424 CallbackData callbackData
;
2429 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2430 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2431 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2432 if (FAILED(hr
)) return;
2434 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2435 ZeroMemory( &playerName
, sizeof(DPNAME
) );
2438 /* Service provider not initialized */
2439 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2440 checkHR( DPERR_UNINITIALIZED
, hr
);
2443 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2444 checkHR( DPERR_UNINITIALIZED
, hr
);
2445 check( 1024, dwDataSize
);
2448 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2449 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2452 /* Session not initialized */
2453 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2454 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2456 if ( hr
== DPERR_UNINITIALIZED
)
2458 todo_wine
win_skip( "Get/SetPlayerName not implemented\n" );
2463 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2464 checkHR( DPERR_INVALIDPLAYER
, hr
);
2465 check( 1024, dwDataSize
);
2468 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2469 dpsd
.guidApplication
= appGuid
;
2470 dpsd
.dwMaxPlayers
= 10;
2471 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2472 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2475 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
2476 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
2479 /* Name not initialized */
2480 playerName
.dwSize
= -1;
2481 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, 0 );
2482 checkHR( DP_OK
, hr
);
2485 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2486 checkHR( DPERR_INVALIDPLAYER
, hr
);
2487 check( 1024, dwDataSize
);
2490 playerName
.dwSize
= sizeof(DPNAME
);
2491 U1(playerName
).lpszShortNameA
= (LPSTR
) "player_name";
2492 U2(playerName
).lpszLongNameA
= (LPSTR
) "player_long_name";
2495 /* Invalid parameters */
2496 hr
= IDirectPlayX_SetPlayerName( pDP
[0], -1, &playerName
, 0 );
2497 checkHR( DPERR_INVALIDPLAYER
, hr
);
2498 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2499 checkHR( DPERR_INVALIDPLAYER
, hr
);
2500 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, -1 );
2501 checkHR( DPERR_INVALIDPARAMS
, hr
);
2504 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2505 checkHR( DPERR_INVALIDPLAYER
, hr
);
2506 check( 1024, dwDataSize
);
2509 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2510 checkHR( DPERR_INVALIDPARAMS
, hr
);
2511 check( -1, dwDataSize
);
2513 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, NULL
);
2514 checkHR( DPERR_INVALIDPARAMS
, hr
);
2516 /* Trying to modify remote player */
2517 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[1], &playerName
, 0 );
2518 checkHR( DPERR_ACCESSDENIED
, hr
);
2521 /* Regular operation */
2522 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, 0 );
2523 checkHR( DP_OK
, hr
);
2525 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2526 checkHR( DP_OK
, hr
);
2527 check( 45, dwDataSize
);
2528 checkStr( U1(playerName
).lpszShortNameA
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2529 checkStr( U2(playerName
).lpszLongNameA
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2530 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2532 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], NULL
, 0 );
2533 checkHR( DP_OK
, hr
);
2535 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2536 checkHR( DP_OK
, hr
);
2537 check( 16, dwDataSize
);
2538 checkLP( NULL
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2539 checkLP( NULL
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2540 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2543 /* Small buffer in get operation */
2545 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], NULL
, &dwDataSize
);
2546 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2547 check( 16, dwDataSize
);
2550 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2551 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2552 check( 16, dwDataSize
);
2554 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2555 checkHR( DP_OK
, hr
);
2556 check( 16, dwDataSize
);
2557 checkLP( NULL
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2558 checkLP( NULL
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2559 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2563 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2565 checkHR( DP_OK
, hr
);
2567 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2568 checkHR( DP_OK
, hr
);
2569 check( 45, dwDataSize
);
2570 checkStr( U1(playerName
).lpszShortNameA
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2571 checkStr( U2(playerName
).lpszLongNameA
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2572 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2574 /* - Local (no propagation) */
2575 U1(playerName
).lpszShortNameA
= (LPSTR
) "no_propagation";
2576 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2578 checkHR( DP_OK
, hr
);
2581 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0],
2582 lpData
, &dwDataSize
); /* Local fetch */
2583 checkHR( DP_OK
, hr
);
2584 check( 48, dwDataSize
);
2585 checkStr( "no_propagation", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2588 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2589 lpData
, &dwDataSize
); /* Remote fetch */
2590 checkHR( DP_OK
, hr
);
2591 check( 45, dwDataSize
);
2592 checkStr( "player_name", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2596 U1(playerName
).lpszShortNameA
= (LPSTR
) "no_propagation_2";
2597 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2598 DPSET_LOCAL
| DPSET_REMOTE
);
2599 checkHR( DP_OK
, hr
);
2602 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0],
2603 lpData
, &dwDataSize
); /* Local fetch */
2604 checkHR( DP_OK
, hr
);
2605 check( 50, dwDataSize
);
2606 checkStr( "no_propagation_2", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2609 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2610 lpData
, &dwDataSize
); /* Remote fetch */
2611 checkHR( DP_OK
, hr
);
2612 check( 45, dwDataSize
);
2613 checkStr( "player_name", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2615 /* - Remote (propagation, default) */
2616 U1(playerName
).lpszShortNameA
= (LPSTR
) "propagation";
2617 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2619 checkHR( DP_OK
, hr
);
2622 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2623 lpData
, &dwDataSize
); /* Remote fetch */
2624 checkHR( DP_OK
, hr
);
2625 check( 45, dwDataSize
);
2626 checkStr( "propagation", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2629 U1(playerName
).lpszShortNameA
= (LPSTR
) "propagation_2";
2630 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2632 checkHR( DP_OK
, hr
);
2635 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2636 lpData
, &dwDataSize
); /* Remote fetch */
2637 checkHR( DP_OK
, hr
);
2638 check( 47, dwDataSize
);
2639 checkStr( "propagation_2", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2642 /* Checking system messages */
2643 check_messages( pDP
[0], dpid
, 2, &callbackData
);
2644 checkStr( "S0,S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
2645 checkStr( "48,28,57,28,57,57,59,", callbackData
.szTrace2
);
2646 check_messages( pDP
[1], dpid
, 2, &callbackData
);
2647 checkStr( "S1,S1,S1,S1,S1,S1,", callbackData
.szTrace1
);
2648 checkStr( "28,57,28,57,57,59,", callbackData
.szTrace2
);
2651 HeapFree( GetProcessHeap(), 0, lpData
);
2652 IDirectPlayX_Release( pDP
[0] );
2653 IDirectPlayX_Release( pDP
[1] );
2657 /* GetPlayerAccount */
2659 static BOOL CALLBACK
EnumSessions_cb_join_secure( LPCDPSESSIONDESC2 lpThisSD
,
2660 LPDWORD lpdwTimeOut
,
2664 IDirectPlay4
*pDP
= lpContext
;
2665 DPSESSIONDESC2 dpsd
;
2666 DPCREDENTIALS dpCredentials
;
2669 if (dwFlags
& DPESC_TIMEDOUT
)
2674 checkFlags( DPSESSION_SECURESERVER
, lpThisSD
->dwFlags
, FLAGS_DPSESSION
);
2676 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2677 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2678 dpsd
.guidApplication
= appGuid
;
2679 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
2681 ZeroMemory( &dpCredentials
, sizeof(DPCREDENTIALS
) );
2682 dpCredentials
.dwSize
= sizeof(DPCREDENTIALS
);
2683 U1(dpCredentials
).lpszUsernameA
= (LPSTR
) "user";
2684 U2(dpCredentials
).lpszPasswordA
= (LPSTR
) "pass";
2685 hr
= IDirectPlayX_SecureOpen( pDP
, &dpsd
, DPOPEN_JOIN
,
2686 NULL
, &dpCredentials
);
2687 checkHR( DPERR_LOGONDENIED
, hr
); /* TODO: Make this work */
2692 static void test_GetPlayerAccount(void)
2695 IDirectPlay4
*pDP
[2];
2696 DPSESSIONDESC2 dpsd
;
2701 DWORD dwDataSize
= 1024;
2702 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2707 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2708 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2709 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2710 if (FAILED(hr
)) return;
2712 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2713 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2714 dpsd
.guidApplication
= appGuid
;
2715 dpsd
.dwMaxPlayers
= 10;
2717 /* Uninitialized service provider */
2718 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0, lpData
, &dwDataSize
);
2719 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
2723 todo_wine
win_skip( "GetPlayerAccount not implemented\n" );
2728 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2729 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2733 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0, lpData
, &dwDataSize
);
2734 checkHR( DPERR_NOSESSIONS
, hr
);
2737 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2738 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2743 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
,
2745 checkHR( DP_OK
, hr
);
2749 /* Session is not secure */
2751 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2752 lpData
, &dwDataSize
);
2753 checkHR( DPERR_UNSUPPORTED
, hr
);
2754 check( 1024, dwDataSize
);
2757 /* Open a secure session */
2760 hr
= IDirectPlayX_Close( pDP
[i
] );
2761 checkHR( DP_OK
, hr
);
2764 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
2765 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
2766 checkHR( DP_OK
, hr
);
2768 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
2769 NULL
, NULL
, NULL
, 0, 0 );
2770 checkHR( DP_OK
, hr
);
2772 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0,
2773 EnumSessions_cb_join_secure
, pDP
[1], 0 );
2774 checkHR( DP_OK
, hr
);
2776 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
2777 NULL
, NULL
, NULL
, 0, 0 );
2778 checkHR( DPERR_INVALIDPARAMS
, hr
);
2780 /* TODO: Player creation so that this works */
2782 /* Invalid player */
2784 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0,
2785 lpData
, &dwDataSize
);
2786 checkHR( DPERR_INVALIDPLAYER
, hr
);
2787 check( 1024, dwDataSize
);
2791 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], -1,
2792 lpData
, &dwDataSize
);
2793 checkHR( DPERR_INVALIDFLAGS
, hr
);
2794 check( 1024, dwDataSize
);
2797 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 1,
2798 lpData
, &dwDataSize
);
2799 checkHR( DPERR_INVALIDFLAGS
, hr
);
2800 check( 1024, dwDataSize
);
2804 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2805 NULL
, &dwDataSize
);
2806 checkHR( DPERR_INVALIDPLAYER
, hr
);
2807 check( 0, dwDataSize
);
2810 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2811 lpData
, &dwDataSize
);
2812 checkHR( DPERR_INVALIDPLAYER
, hr
);
2813 check( 0, dwDataSize
);
2815 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2816 lpData
, &dwDataSize
);
2817 checkHR( DPERR_INVALIDPLAYER
, hr
);
2818 check( 0, dwDataSize
);
2820 /* Normal operation */
2822 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2823 lpData
, &dwDataSize
);
2824 checkHR( DPERR_INVALIDPLAYER
, hr
);
2825 check( 1024, dwDataSize
);
2828 HeapFree( GetProcessHeap(), 0, lpData
);
2829 IDirectPlayX_Release( pDP
[0] );
2830 IDirectPlayX_Release( pDP
[1] );
2834 /* GetPlayerAddress */
2836 static BOOL CALLBACK
EnumAddress_cb( REFGUID guidDataType
,
2841 lpCallbackData callbackData
= lpContext
;
2842 static REFGUID types
[] = { &DPAID_TotalSize
,
2843 &DPAID_ServiceProvider
,
2846 static DWORD sizes
[] = { 4, 16, 12, 24, 4, 16, 10, 20 };
2849 checkGuid( types
[callbackData
->dwCounter1
%4], guidDataType
);
2850 check( sizes
[callbackData
->dwCounter1
], dwDataSize
);
2852 switch(callbackData
->dwCounter1
)
2855 check( 136, *(LPDWORD
) lpData
);
2858 check( 130, *(LPDWORD
) lpData
);
2862 checkGuid( &DPSPGUID_TCPIP
, lpData
);
2865 checkStr( "127.0.0.1", (LPSTR
) lpData
);
2871 callbackData
->dwCounter1
++;
2876 static void test_GetPlayerAddress(void)
2879 IDirectPlay4
*pDP
[2];
2880 IDirectPlayLobby3
*pDPL
;
2881 DPSESSIONDESC2 dpsd
;
2883 CallbackData callbackData
;
2887 DWORD dwDataSize
= 1024;
2888 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2893 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2894 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2895 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2896 if (FAILED(hr
)) return;
2898 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2899 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
2900 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
2901 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n" );
2902 if (FAILED(hr
)) return;
2904 /* Uninitialized service provider */
2905 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0, lpData
, &dwDataSize
);
2906 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
2910 todo_wine
win_skip( "GetPlayerAddress not implemented\n" );
2914 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2915 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2920 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0, lpData
, &dwDataSize
);
2921 checkHR( DPERR_UNSUPPORTED
, hr
);
2922 check( 1024, dwDataSize
);
2925 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 1, lpData
, &dwDataSize
);
2926 checkHR( DPERR_INVALIDPLAYER
, hr
);
2927 check( 1024, dwDataSize
);
2930 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2931 dpsd
.guidApplication
= appGuid
;
2932 dpsd
.dwMaxPlayers
= 10;
2933 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2934 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2939 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
,
2941 checkHR( DP_OK
, hr
);
2944 /* Invalid player */
2946 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0,
2947 lpData
, &dwDataSize
);
2948 checkHR( DPERR_UNSUPPORTED
, hr
);
2949 check( 1024, dwDataSize
);
2952 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 1,
2953 lpData
, &dwDataSize
);
2954 checkHR( DPERR_INVALIDPLAYER
, hr
);
2955 check( 1024, dwDataSize
);
2959 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2960 NULL
, &dwDataSize
);
2961 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2962 check( 136, dwDataSize
);
2965 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2966 lpData
, &dwDataSize
);
2967 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2968 check( 136, dwDataSize
);
2970 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2971 lpData
, &dwDataSize
);
2972 checkHR( DP_OK
, hr
);
2973 check( 136, dwDataSize
);
2976 /* Regular parameters */
2977 callbackData
.dwCounter1
= 0;
2981 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2982 lpData
, &dwDataSize
);
2983 checkHR( DP_OK
, hr
);
2984 check( 136, dwDataSize
);
2986 hr
= IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb
, lpData
, dwDataSize
,
2988 checkHR( DP_OK
, hr
);
2990 check( 4, callbackData
.dwCounter1
);
2994 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[1],
2995 lpData
, &dwDataSize
);
2996 checkHR( DP_OK
, hr
);
2997 check( 130, dwDataSize
);
2999 hr
= IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb
, lpData
, dwDataSize
,
3001 checkHR( DP_OK
, hr
);
3003 check( 8, callbackData
.dwCounter1
);
3006 HeapFree( GetProcessHeap(), 0, lpData
);
3007 IDirectPlayX_Release( pDP
[0] );
3008 IDirectPlayX_Release( pDP
[1] );
3012 /* GetPlayerFlags */
3014 static void test_GetPlayerFlags(void)
3017 IDirectPlay4
*pDP
[2];
3018 DPSESSIONDESC2 dpsd
;
3028 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3029 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3030 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3031 if (FAILED(hr
)) return;
3033 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3034 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3035 dpsd
.guidApplication
= appGuid
;
3036 dpsd
.dwMaxPlayers
= 10;
3038 /* Uninitialized service provider */
3039 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3040 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
3044 todo_wine
win_skip( "GetPlayerFlags not implemented\n" );
3048 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3049 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3053 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3054 checkHR( DPERR_INVALIDPLAYER
, hr
);
3056 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 1, &dwFlags
);
3057 checkHR( DPERR_INVALIDPLAYER
, hr
);
3060 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
3061 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
3066 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
3067 NULL
, NULL
, NULL
, 0, 0 );
3068 checkHR( DP_OK
, hr
);
3070 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2],
3072 0, DPPLAYER_SPECTATOR
);
3073 checkHR( DP_OK
, hr
);
3074 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[3],
3076 0, DPPLAYER_SERVERPLAYER
);
3077 checkHR( DP_OK
, hr
);
3080 /* Invalid player */
3081 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3082 checkHR( DPERR_INVALIDPLAYER
, hr
);
3084 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 2, &dwFlags
);
3085 checkHR( DPERR_INVALIDPLAYER
, hr
);
3087 /* Invalid parameters */
3088 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[0], NULL
);
3089 checkHR( DPERR_INVALIDPARAMS
, hr
);
3092 /* Regular parameters */
3093 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[0], &dwFlags
);
3094 checkHR( DP_OK
, hr
);
3095 checkFlags( dwFlags
, DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3097 hr
= IDirectPlayX_GetPlayerFlags( pDP
[1], dpid
[1], &dwFlags
);
3098 checkHR( DP_OK
, hr
);
3099 checkFlags( dwFlags
, DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3101 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[1], &dwFlags
);
3102 checkHR( DP_OK
, hr
);
3103 checkFlags( dwFlags
, 0, FLAGS_DPPLAYER
);
3105 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[2], &dwFlags
);
3106 checkHR( DP_OK
, hr
);
3107 checkFlags( dwFlags
, DPPLAYER_SPECTATOR
| DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3109 hr
= IDirectPlayX_GetPlayerFlags( pDP
[1], dpid
[3], &dwFlags
);
3110 checkHR( DP_OK
, hr
);
3111 checkFlags( dwFlags
, DPPLAYER_SERVERPLAYER
, FLAGS_DPPLAYER
);
3114 IDirectPlayX_Release( pDP
[0] );
3115 IDirectPlayX_Release( pDP
[1] );
3120 CreateGroupInGroup */
3122 static void test_CreateGroup(void)
3126 DPSESSIONDESC2 dpsd
;
3127 DPID idFrom
, idTo
, dpid
, idGroup
, idGroupParent
;
3132 LPCSTR lpData
= "data";
3133 DWORD dwDataSize
= strlen(lpData
)+1;
3134 LPDPMSG_CREATEPLAYERORGROUP lpDataGet
= HeapAlloc( GetProcessHeap(),
3137 DWORD dwDataSizeGet
= 1024;
3138 CallbackData callbackData
;
3141 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3142 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
3143 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3144 if (FAILED(hr
)) return;
3145 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3146 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3147 dpsd
.guidApplication
= appGuid
;
3148 dpsd
.dwMaxPlayers
= 10;
3149 ZeroMemory( &groupName
, sizeof(DPNAME
) );
3152 /* No service provider */
3153 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
, NULL
, NULL
, 0, 0 );
3154 checkHR( DPERR_UNINITIALIZED
, hr
);
3156 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 0, &idGroup
, NULL
, NULL
, 0, 0 );
3157 checkHR( DPERR_UNINITIALIZED
, hr
);
3161 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
3165 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3167 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
3169 if ( hr
== DPERR_UNINITIALIZED
)
3171 todo_wine
win_skip( "CreateGroup not implemented\n" );
3175 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 0, &idGroup
,
3177 checkHR( DPERR_INVALIDGROUP
, hr
);
3179 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 2, &idGroup
,
3181 checkHR( DPERR_INVALIDGROUP
, hr
);
3184 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3185 checkHR( DP_OK
, hr
);
3186 IDirectPlayX_CreatePlayer( pDP
, &dpid
,
3187 NULL
, NULL
, NULL
, 0, 0 );
3192 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3194 checkHR( DP_OK
, hr
);
3196 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3198 checkHR( DP_OK
, hr
);
3200 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3201 &groupName
, NULL
, 0, 0 );
3202 checkHR( DP_OK
, hr
);
3204 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3205 &groupName
, NULL
, 0, 0 );
3206 checkHR( DP_OK
, hr
);
3209 groupName
.dwSize
= sizeof(DPNAME
);
3210 U1(groupName
).lpszShortNameA
= (LPSTR
) lpData
;
3213 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3214 &groupName
, NULL
, 0, 0 );
3215 checkHR( DP_OK
, hr
);
3217 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3218 &groupName
, NULL
, 0, 0 );
3219 checkHR( DP_OK
, hr
);
3222 /* Message checking */
3225 dwDataSizeGet
= 1024;
3226 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3228 checkHR( DP_OK
, hr
);
3229 if ( NULL
== U1(lpDataGet
->dpnName
).lpszShortNameA
)
3231 check( 48, dwDataSizeGet
);
3235 check( 48 + dwDataSize
, dwDataSizeGet
);
3236 checkStr( lpData
, U1(lpDataGet
->dpnName
).lpszShortNameA
);
3238 check( DPID_SYSMSG
, idFrom
);
3239 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3240 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3241 checkFlags( DPGROUP_LOCAL
, lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3243 check_messages( pDP
, &dpid
, 1, &callbackData
);
3244 checkStr( "", callbackData
.szTrace1
);
3248 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3249 NULL
, (LPVOID
) lpData
, -1, 0 );
3250 checkHR( DPERR_INVALIDPARAMS
, hr
);
3252 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3253 NULL
, (LPVOID
) lpData
, 0, 0 );
3254 checkHR( DP_OK
, hr
);
3256 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3257 NULL
, NULL
, dwDataSize
, 0 );
3258 checkHR( DPERR_INVALIDPARAMS
, hr
);
3260 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3261 NULL
, (LPVOID
) lpData
, dwDataSize
, 0 );
3262 checkHR( DP_OK
, hr
);
3265 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3266 NULL
, (LPVOID
) lpData
, -1, 0 );
3267 checkHR( DPERR_INVALIDPARAMS
, hr
);
3269 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3270 NULL
, (LPVOID
) lpData
, 0, 0 );
3271 checkHR( DP_OK
, hr
);
3273 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3274 NULL
, NULL
, dwDataSize
, 0 );
3275 checkHR( DPERR_INVALIDPARAMS
, hr
);
3277 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3278 NULL
, (LPVOID
)lpData
, dwDataSize
, 0 );
3279 checkHR( DP_OK
, hr
);
3282 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroupParent
,
3284 checkHR( DP_OK
, hr
);
3287 /* Message checking */
3290 dwDataSizeGet
= 1024;
3291 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3293 checkHR( DP_OK
, hr
);
3294 check( 48 + lpDataGet
->dwDataSize
, dwDataSizeGet
);
3295 check( DPID_SYSMSG
, idFrom
);
3296 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3297 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3298 checkFlags( DPGROUP_LOCAL
, lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3300 check_messages( pDP
, &dpid
, 1, &callbackData
);
3301 checkStr( "", callbackData
.szTrace1
);
3304 /* Flags and idGroupParent */
3305 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3307 checkHR( DP_OK
, hr
);
3309 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3310 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
3311 checkHR( DP_OK
, hr
);
3313 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3314 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
3315 checkHR( DP_OK
, hr
);
3317 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3319 DPGROUP_HIDDEN
| DPGROUP_STAGINGAREA
);
3320 checkHR( DP_OK
, hr
);
3323 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3325 checkHR( DP_OK
, hr
);
3327 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3328 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
3329 checkHR( DP_OK
, hr
);
3331 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3332 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
3333 checkHR( DP_OK
, hr
);
3335 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3338 DPGROUP_STAGINGAREA
);
3339 checkHR( DP_OK
, hr
);
3342 /* Message checking */
3345 dwDataSizeGet
= 1024;
3346 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3348 checkHR( DP_OK
, hr
);
3349 check( 48, dwDataSizeGet
);
3350 check( DPID_SYSMSG
, idFrom
);
3351 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3352 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3354 if ( lpDataGet
->dpIdParent
!= 0 )
3356 check( idGroupParent
, lpDataGet
->dpIdParent
);
3362 checkFlags( DPGROUP_LOCAL
,
3363 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3366 checkFlags( DPGROUP_LOCAL
| DPGROUP_HIDDEN
,
3367 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3370 checkFlags( DPGROUP_STAGINGAREA
| DPGROUP_LOCAL
,
3371 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3374 checkFlags( DPGROUP_STAGINGAREA
| DPGROUP_LOCAL
| DPGROUP_HIDDEN
,
3375 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3380 check_messages( pDP
, &dpid
, 1, &callbackData
);
3381 checkStr( "", callbackData
.szTrace1
);
3384 /* If a group is created in C/S mode, no messages are sent */
3387 IDirectPlayX_Close( pDP
);
3390 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3391 checkHR( DP_OK
, hr
);
3392 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, NULL
, NULL
, NULL
, 0, 0 );
3393 checkHR( DP_OK
, hr
);
3395 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
, NULL
, NULL
, 0, 0 );
3396 checkHR( DP_OK
, hr
);
3398 /* Messages are received */
3399 check_messages( pDP
, &dpid
, 1, &callbackData
);
3400 checkStr( "S0,", callbackData
.szTrace1
);
3403 /* - Client/Server */
3404 IDirectPlayX_Close( pDP
);
3406 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
3407 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3408 checkHR( DP_OK
, hr
);
3409 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
,
3410 NULL
, NULL
, NULL
, 0,
3411 DPPLAYER_SERVERPLAYER
);
3412 checkHR( DP_OK
, hr
);
3414 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3416 checkHR( DP_OK
, hr
);
3419 check_messages( pDP
, &dpid
, 1, &callbackData
);
3420 checkStr( "S0,", callbackData
.szTrace1
); /* Or at least there
3421 shouldn't be messages... */
3424 HeapFree( GetProcessHeap(), 0, lpDataGet
);
3425 IDirectPlayX_Release( pDP
);
3431 static void test_GroupOwner(void)
3434 IDirectPlay4
*pDP
[2];
3435 DPSESSIONDESC2 dpsd
;
3436 DPID dpid
[2], idGroup
, idOwner
;
3443 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3444 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3445 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3446 if (FAILED(hr
)) return;
3448 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3449 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3450 dpsd
.guidApplication
= appGuid
;
3451 dpsd
.dwMaxPlayers
= 10;
3455 /* Service provider not initialized */
3456 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3457 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
3458 check( 0, idOwner
);
3462 todo_wine
win_skip( "GetGroupOwner not implemented\n" );
3468 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
3470 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
3471 checkHR( DP_OK
, hr
);
3472 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
3474 checkHR( DP_OK
, hr
);
3478 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
3479 NULL
, NULL
, NULL
, 0, 0 );
3480 checkHR( DP_OK
, hr
);
3484 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3485 checkHR( DPERR_INVALIDGROUP
, hr
);
3487 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
, NULL
, NULL
, 0, 0 );
3488 checkHR( DP_OK
, hr
);
3490 /* Fails, because we need a lobby session */
3491 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3492 checkHR( DPERR_UNSUPPORTED
, hr
);
3497 * - Check migration of the ownership of a group
3498 * when the owner leaves
3502 IDirectPlayX_Release( pDP
[0] );
3503 IDirectPlayX_Release( pDP
[1] );
3509 static BOOL CALLBACK
EnumPlayers_cb( DPID dpId
,
3515 lpCallbackData callbackData
= lpContext
;
3516 char playerIndex
= dpid2char( callbackData
->dpid
,
3517 callbackData
->dpidSize
,
3521 /* Trace to study player ids */
3522 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = playerIndex
;
3523 callbackData
->dwCounter1
++;
3524 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = '\0';
3526 /* Trace to study flags received */
3527 strcat( callbackData
->szTrace2
,
3528 ( dwFlags2str(dwFlags
, FLAGS_DPENUMPLAYERS
) +
3529 strlen("DPENUMPLAYERS_") ) );
3530 strcat( callbackData
->szTrace2
, ":" );
3533 if ( playerIndex
< '5' )
3535 check( DPPLAYERTYPE_PLAYER
, dwPlayerType
);
3539 check( DPPLAYERTYPE_GROUP
, dwPlayerType
);
3546 static BOOL CALLBACK
EnumSessions_cb_EnumPlayers( LPCDPSESSIONDESC2 lpThisSD
,
3547 LPDWORD lpdwTimeOut
,
3551 lpCallbackData callbackData
= lpContext
;
3554 if (dwFlags
& DPESC_TIMEDOUT
)
3560 callbackData
->dwCounter1
= 0;
3561 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, NULL
, EnumPlayers_cb
,
3563 checkHR( DPERR_NOSESSIONS
, hr
);
3564 check( 0, callbackData
->dwCounter1
);
3566 /* guid = appGuid */
3567 callbackData
->dwCounter1
= 0;
3568 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, (LPGUID
) &appGuid
,
3569 EnumPlayers_cb
, &callbackData
, 0 );
3570 checkHR( DPERR_NOSESSIONS
, hr
);
3571 check( 0, callbackData
->dwCounter1
);
3573 callbackData
->dwCounter1
= 0;
3574 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, (LPGUID
) &appGuid
,
3575 EnumPlayers_cb
, &callbackData
,
3576 DPENUMPLAYERS_SESSION
);
3577 checkHR( DPERR_NOSESSIONS
, hr
);
3578 check( 0, callbackData
->dwCounter1
);
3580 /* guid = guidInstance */
3581 callbackData
->dwCounter1
= 0;
3582 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
,
3583 (LPGUID
) &lpThisSD
->guidInstance
,
3584 EnumPlayers_cb
, &callbackData
, 0 );
3585 checkHR( DPERR_NOSESSIONS
, hr
);
3586 check( 0, callbackData
->dwCounter1
);
3588 callbackData
->dwCounter1
= 0;
3589 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
,
3590 (LPGUID
) &lpThisSD
->guidInstance
,
3591 EnumPlayers_cb
, &callbackData
,
3592 DPENUMPLAYERS_SESSION
);
3593 checkHR( DPERR_GENERIC
, hr
); /* Why? */
3594 check( 0, callbackData
->dwCounter1
);
3600 static void test_EnumPlayers(void)
3602 IDirectPlay4
*pDP
[3];
3603 DPSESSIONDESC2 dpsd
[3];
3604 DPID dpid
[5+2]; /* 5 players, 2 groups */
3605 CallbackData callbackData
;
3612 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3613 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3614 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3615 if (FAILED(hr
)) return;
3617 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
3618 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
3621 dpsd
[0].guidApplication
= appGuid
;
3622 dpsd
[1].guidApplication
= appGuid2
;
3623 dpsd
[2].guidApplication
= GUID_NULL
;
3625 callbackData
.dpid
= dpid
;
3626 callbackData
.dpidSize
= 5+2;
3629 /* Uninitialized service provider */
3630 callbackData
.dwCounter1
= 0;
3631 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, NULL
,
3633 checkHR( DPERR_UNINITIALIZED
, hr
);
3634 check( 0, callbackData
.dwCounter1
);
3637 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3638 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3639 init_TCPIP_provider( pDP
[2], "127.0.0.1", 0 );
3643 callbackData
.dwCounter1
= 0;
3644 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3646 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
3647 check( 0, callbackData
.dwCounter1
);
3649 if ( hr
== DPERR_UNINITIALIZED
)
3651 todo_wine
win_skip( "EnumPlayers not implemented\n" );
3655 callbackData
.dwCounter1
= 0;
3656 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3658 checkHR( DPERR_NOSESSIONS
, hr
);
3659 check( 0, callbackData
.dwCounter1
);
3661 callbackData
.dwCounter1
= 0;
3662 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3663 &callbackData
, DPENUMPLAYERS_SESSION
);
3664 checkHR( DPERR_NOSESSIONS
, hr
);
3665 check( 0, callbackData
.dwCounter1
);
3668 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
3669 checkHR( DP_OK
, hr
);
3670 hr
= IDirectPlayX_Open( pDP
[1], &dpsd
[1], DPOPEN_CREATE
);
3671 checkHR( DP_OK
, hr
);
3675 callbackData
.dwCounter1
= 0;
3676 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3678 checkHR( DP_OK
, hr
);
3679 check( 0, callbackData
.dwCounter1
);
3682 /* Create players */
3683 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
3684 NULL
, NULL
, NULL
, 0,
3685 DPPLAYER_SERVERPLAYER
);
3686 checkHR( DP_OK
, hr
);
3687 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
3688 NULL
, NULL
, NULL
, 0,
3690 checkHR( DP_OK
, hr
);
3692 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2],
3693 NULL
, NULL
, NULL
, 0,
3695 checkHR( DP_OK
, hr
);
3696 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[5],
3698 checkHR( DP_OK
, hr
);
3701 /* Invalid parameters */
3702 callbackData
.dwCounter1
= 0;
3703 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, NULL
,
3705 checkHR( DPERR_INVALIDPARAMS
, hr
);
3706 check( 0, callbackData
.dwCounter1
);
3708 callbackData
.dwCounter1
= 0;
3709 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3710 &callbackData
, DPENUMPLAYERS_SESSION
);
3711 checkHR( DPERR_INVALIDPARAMS
, hr
);
3712 check( 0, callbackData
.dwCounter1
);
3715 /* Regular operation */
3716 callbackData
.dwCounter1
= 0;
3717 callbackData
.szTrace2
[0] = 0;
3718 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3720 checkHR( DP_OK
, hr
);
3721 check( 2, callbackData
.dwCounter1
);
3722 checkStr( "20", callbackData
.szTrace1
);
3723 checkStr( "ALL:SERVERPLAYER:", callbackData
.szTrace2
);
3725 callbackData
.dwCounter1
= 0;
3726 callbackData
.szTrace2
[0] = 0;
3727 hr
= IDirectPlayX_EnumPlayers( pDP
[1], NULL
, EnumPlayers_cb
,
3729 checkHR( DP_OK
, hr
);
3730 check( 1, callbackData
.dwCounter1
);
3731 checkStr( "1", callbackData
.szTrace1
);
3732 checkStr( "ALL:", callbackData
.szTrace2
);
3734 callbackData
.dwCounter1
= 0;
3735 callbackData
.szTrace2
[0] = 0;
3736 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3738 checkHR( DP_OK
, hr
);
3739 check( 2, callbackData
.dwCounter1
); /* Guid is ignored */
3740 checkStr( "20", callbackData
.szTrace1
);
3741 checkStr( "ALL:SERVERPLAYER:", callbackData
.szTrace2
);
3744 /* Enumerating from a remote session */
3745 /* - Session not open */
3746 callbackData
.pDP
= pDP
[2];
3747 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[2], 0,
3748 EnumSessions_cb_EnumPlayers
,
3750 checkHR( DP_OK
, hr
);
3753 /* - Open session */
3754 callbackData
.pDP
= pDP
[2];
3755 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[0], 0, EnumSessions_cb_join
,
3757 checkHR( DP_OK
, hr
);
3758 hr
= IDirectPlayX_CreatePlayer( pDP
[2], &dpid
[3],
3759 NULL
, NULL
, NULL
, 0,
3760 DPPLAYER_SPECTATOR
);
3761 checkHR( DP_OK
, hr
);
3762 hr
= IDirectPlayX_CreatePlayer( pDP
[2], &dpid
[4],
3763 NULL
, NULL
, NULL
, 0,
3765 checkHR( DP_OK
, hr
);
3766 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[6],
3768 checkHR( DP_OK
, hr
);
3770 callbackData
.dwCounter1
= 0;
3771 callbackData
.szTrace2
[0] = 0;
3772 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3774 checkHR( DP_OK
, hr
);
3775 check( 4, callbackData
.dwCounter1
);
3776 checkStr( "4302", callbackData
.szTrace1
);
3777 checkStr( "ALL:SPECTATOR:SERVERPLAYER:ALL:", callbackData
.szTrace2
);
3782 callbackData
.dwCounter1
= 0;
3783 callbackData
.szTrace2
[0] = 0;
3784 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3785 &callbackData
, DPENUMPLAYERS_ALL
);
3786 checkHR( DP_OK
, hr
);
3787 check( 4, callbackData
.dwCounter1
);
3788 checkStr( "4302", callbackData
.szTrace1
);
3789 checkStr( "ALL:SPECTATOR:SERVERPLAYER:ALL:", callbackData
.szTrace2
);
3791 callbackData
.dwCounter1
= 0;
3792 callbackData
.szTrace2
[0] = 0;
3793 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3794 &callbackData
, DPENUMPLAYERS_GROUP
);
3795 checkHR( DP_OK
, hr
);
3796 check( 6, callbackData
.dwCounter1
);
3797 checkStr( "430256", callbackData
.szTrace1
);
3799 "GROUP,DPENUMPLAYERS_SPECTATOR:"
3800 "GROUP,DPENUMPLAYERS_SERVERPLAYER:"
3801 "GROUP:ALL:ALL:", callbackData
.szTrace2
);
3803 callbackData
.dwCounter1
= 0;
3804 callbackData
.szTrace2
[0] = 0;
3805 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3806 &callbackData
, DPENUMPLAYERS_LOCAL
);
3807 checkHR( DP_OK
, hr
);
3808 check( 2, callbackData
.dwCounter1
);
3809 checkStr( "43", callbackData
.szTrace1
);
3811 "LOCAL,DPENUMPLAYERS_SPECTATOR:", callbackData
.szTrace2
);
3813 callbackData
.dwCounter1
= 0;
3814 callbackData
.szTrace2
[0] = 0;
3815 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3816 &callbackData
, DPENUMPLAYERS_SERVERPLAYER
);
3817 checkHR( DP_OK
, hr
);
3818 check( 1, callbackData
.dwCounter1
);
3819 checkStr( "0", callbackData
.szTrace1
);
3820 checkStr( "SERVERPLAYER:", callbackData
.szTrace2
);
3822 callbackData
.dwCounter1
= 0;
3823 callbackData
.szTrace2
[0] = 0;
3824 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3825 &callbackData
, DPENUMPLAYERS_SPECTATOR
);
3826 checkHR( DP_OK
, hr
);
3827 check( 1, callbackData
.dwCounter1
);
3828 checkStr( "3", callbackData
.szTrace1
);
3829 checkStr( "SPECTATOR:", callbackData
.szTrace2
);
3832 IDirectPlayX_Release( pDP
[0] );
3833 IDirectPlayX_Release( pDP
[1] );
3834 IDirectPlayX_Release( pDP
[2] );
3840 static BOOL CALLBACK
EnumGroups_cb( DPID dpId
,
3846 lpCallbackData callbackData
= lpContext
;
3847 char playerIndex
= dpid2char( callbackData
->dpid
,
3848 callbackData
->dpidSize
,
3852 /* Trace to study player ids */
3853 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = playerIndex
;
3854 callbackData
->dwCounter1
++;
3855 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = '\0';
3857 /* Trace to study flags received */
3858 strcat( callbackData
->szTrace2
,
3859 ( dwFlags2str(dwFlags
, FLAGS_DPENUMGROUPS
) +
3860 strlen("DPENUMGROUPS_") ) );
3861 strcat( callbackData
->szTrace2
, ":" );
3864 check( DPPLAYERTYPE_GROUP
, dwPlayerType
);
3869 static BOOL CALLBACK
EnumSessions_cb_EnumGroups( LPCDPSESSIONDESC2 lpThisSD
,
3870 LPDWORD lpdwTimeOut
,
3874 lpCallbackData callbackData
= lpContext
;
3877 if (dwFlags
& DPESC_TIMEDOUT
)
3883 callbackData
->dwCounter1
= 0;
3884 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, NULL
,
3885 EnumGroups_cb
, &callbackData
, 0 );
3886 checkHR( DPERR_NOSESSIONS
, hr
);
3887 check( 0, callbackData
->dwCounter1
);
3889 /* guid = appGuid */
3890 callbackData
->dwCounter1
= 0;
3891 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, (LPGUID
) &appGuid
,
3892 EnumGroups_cb
, &callbackData
, 0 );
3893 checkHR( DPERR_NOSESSIONS
, hr
);
3894 check( 0, callbackData
->dwCounter1
);
3896 callbackData
->dwCounter1
= 0;
3897 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, (LPGUID
) &appGuid
,
3898 EnumGroups_cb
, &callbackData
,
3899 DPENUMGROUPS_SESSION
);
3900 checkHR( DPERR_NOSESSIONS
, hr
);
3901 check( 0, callbackData
->dwCounter1
);
3903 /* guid = guidInstance */
3904 callbackData
->dwCounter1
= 0;
3905 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
,
3906 (LPGUID
) &lpThisSD
->guidInstance
,
3907 EnumGroups_cb
, &callbackData
, 0 );
3908 checkHR( DPERR_NOSESSIONS
, hr
);
3909 check( 0, callbackData
->dwCounter1
);
3911 callbackData
->dwCounter1
= 0;
3912 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
,
3913 (LPGUID
) &lpThisSD
->guidInstance
,
3914 EnumGroups_cb
, &callbackData
,
3915 DPENUMGROUPS_SESSION
);
3916 checkHR( DPERR_GENERIC
, hr
); /* Why? */
3917 check( 0, callbackData
->dwCounter1
);
3923 static void test_EnumGroups(void)
3925 IDirectPlay4
*pDP
[3];
3926 DPSESSIONDESC2 dpsd
[3];
3928 CallbackData callbackData
;
3935 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3936 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3937 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3938 if (FAILED(hr
)) return;
3940 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
3941 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
3944 dpsd
[0].guidApplication
= appGuid
;
3945 dpsd
[1].guidApplication
= appGuid2
;
3946 dpsd
[2].guidApplication
= GUID_NULL
;
3948 callbackData
.dpid
= dpid
;
3949 callbackData
.dpidSize
= 5;
3952 /* Uninitialized service provider */
3953 callbackData
.dwCounter1
= 0;
3954 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
3956 checkHR( DPERR_UNINITIALIZED
, hr
);
3957 check( 0, callbackData
.dwCounter1
);
3960 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3961 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3962 init_TCPIP_provider( pDP
[2], "127.0.0.1", 0 );
3966 callbackData
.dwCounter1
= 0;
3967 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
3969 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
3970 check( 0, callbackData
.dwCounter1
);
3972 if ( hr
== DPERR_UNINITIALIZED
)
3974 todo_wine
win_skip( "EnumGroups not implemented\n" );
3978 callbackData
.dwCounter1
= 0;
3979 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
3981 checkHR( DPERR_NOSESSIONS
, hr
);
3982 check( 0, callbackData
.dwCounter1
);
3984 callbackData
.dwCounter1
= 0;
3985 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
3986 &callbackData
, DPENUMGROUPS_SESSION
);
3987 checkHR( DPERR_NOSESSIONS
, hr
);
3988 check( 0, callbackData
.dwCounter1
);
3991 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
3992 checkHR( DP_OK
, hr
);
3993 hr
= IDirectPlayX_Open( pDP
[1], &dpsd
[1], DPOPEN_CREATE
);
3994 checkHR( DP_OK
, hr
);
3998 callbackData
.dwCounter1
= 0;
3999 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
4001 checkHR( DP_OK
, hr
);
4002 check( 0, callbackData
.dwCounter1
);
4006 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[0],
4008 checkHR( DP_OK
, hr
);
4009 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[0], &dpid
[3],
4011 checkHR( DP_OK
, hr
); /* Not a superior level group,
4012 won't appear in the enumerations */
4013 hr
= IDirectPlayX_CreateGroup( pDP
[1], &dpid
[1],
4015 checkHR( DP_OK
, hr
);
4016 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[2],
4017 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
4018 checkHR( DP_OK
, hr
);
4021 /* Invalid parameters */
4022 callbackData
.dwCounter1
= 0;
4023 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, NULL
,
4025 checkHR( DPERR_INVALIDPARAMS
, hr
);
4026 check( 0, callbackData
.dwCounter1
);
4028 callbackData
.dwCounter1
= 0;
4029 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
4030 &callbackData
, DPENUMGROUPS_SESSION
);
4031 checkHR( DPERR_INVALIDPARAMS
, hr
);
4032 check( 0, callbackData
.dwCounter1
);
4035 /* Regular operation */
4036 callbackData
.dwCounter1
= 0;
4037 callbackData
.szTrace2
[0] = 0;
4038 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
4040 checkHR( DP_OK
, hr
);
4041 check( 2, callbackData
.dwCounter1
);
4042 checkStr( "02", callbackData
.szTrace1
);
4043 checkStr( "ALL:HIDDEN:", callbackData
.szTrace2
);
4045 callbackData
.dwCounter1
= 0;
4046 callbackData
.szTrace2
[0] = 0;
4047 hr
= IDirectPlayX_EnumGroups( pDP
[1], NULL
, EnumGroups_cb
,
4049 checkHR( DP_OK
, hr
);
4050 check( 1, callbackData
.dwCounter1
);
4051 checkStr( "1", callbackData
.szTrace1
);
4052 checkStr( "ALL:", callbackData
.szTrace2
);
4054 callbackData
.dwCounter1
= 0;
4055 callbackData
.szTrace2
[0] = 0;
4056 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
4058 checkHR( DP_OK
, hr
);
4059 check( 2, callbackData
.dwCounter1
); /* Guid is ignored */
4060 checkStr( "02", callbackData
.szTrace1
);
4061 checkStr( "ALL:HIDDEN:", callbackData
.szTrace2
);
4064 /* Enumerating from a remote session */
4065 /* - Session not open */
4066 callbackData
.pDP
= pDP
[2];
4067 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[2], 0,
4068 EnumSessions_cb_EnumGroups
,
4070 checkHR( DP_OK
, hr
);
4072 /* - Open session */
4073 callbackData
.pDP
= pDP
[2];
4074 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[0], 0, EnumSessions_cb_join
,
4076 checkHR( DP_OK
, hr
);
4078 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[3],
4080 checkHR( DP_OK
, hr
);
4081 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[4],
4082 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
4083 checkHR( DP_OK
, hr
);
4086 callbackData
.dwCounter1
= 0;
4087 callbackData
.szTrace2
[0] = 0;
4088 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4090 checkHR( DP_OK
, hr
);
4091 check( 4, callbackData
.dwCounter1
);
4092 checkStr( "0234", callbackData
.szTrace1
);
4093 checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData
.szTrace2
);
4096 callbackData
.dwCounter1
= 0;
4097 callbackData
.szTrace2
[0] = 0;
4098 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4099 &callbackData
, DPENUMGROUPS_ALL
);
4100 checkHR( DP_OK
, hr
);
4101 check( 4, callbackData
.dwCounter1
);
4102 checkStr( "0234", callbackData
.szTrace1
);
4103 checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData
.szTrace2
);
4105 callbackData
.dwCounter1
= 0;
4106 callbackData
.szTrace2
[0] = 0;
4107 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4108 &callbackData
, DPENUMGROUPS_HIDDEN
);
4109 checkHR( DP_OK
, hr
);
4110 check( 1, callbackData
.dwCounter1
);
4111 checkStr( "2", callbackData
.szTrace1
);
4112 checkStr( "HIDDEN:", callbackData
.szTrace2
);
4114 callbackData
.dwCounter1
= 0;
4115 callbackData
.szTrace2
[0] = 0;
4116 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4117 &callbackData
, DPENUMGROUPS_LOCAL
);
4118 checkHR( DP_OK
, hr
);
4119 check( 2, callbackData
.dwCounter1
);
4120 checkStr( "34", callbackData
.szTrace1
);
4122 "LOCAL,DPENUMGROUPS_STAGINGAREA:", callbackData
.szTrace2
);
4124 callbackData
.dwCounter1
= 0;
4125 callbackData
.szTrace2
[0] = 0;
4126 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4127 &callbackData
, DPENUMGROUPS_REMOTE
);
4128 checkHR( DP_OK
, hr
);
4129 check( 2, callbackData
.dwCounter1
);
4130 checkStr( "02", callbackData
.szTrace1
);
4132 "REMOTE,DPENUMGROUPS_HIDDEN:", callbackData
.szTrace2
);
4134 callbackData
.dwCounter1
= 0;
4135 callbackData
.szTrace2
[0] = 0;
4136 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4137 &callbackData
, DPENUMGROUPS_STAGINGAREA
);
4138 checkHR( DP_OK
, hr
);
4139 check( 1, callbackData
.dwCounter1
);
4140 checkStr( "4", callbackData
.szTrace1
);
4141 checkStr( "STAGINGAREA:", callbackData
.szTrace2
);
4144 IDirectPlayX_Release( pDP
[0] );
4145 IDirectPlayX_Release( pDP
[1] );
4146 IDirectPlayX_Release( pDP
[2] );
4150 static void test_EnumGroupsInGroup(void)
4152 IDirectPlay4
*pDP
[2];
4153 DPSESSIONDESC2 dpsd
[2];
4155 CallbackData callbackData
;
4162 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4163 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4164 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4165 if (FAILED(hr
)) return;
4167 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
4168 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
4171 dpsd
[0].guidApplication
= appGuid
;
4172 dpsd
[1].guidApplication
= GUID_NULL
;
4174 callbackData
.dpid
= dpid
;
4175 callbackData
.dpidSize
= 6;
4178 /* Uninitialized service provider */
4179 callbackData
.dwCounter1
= 0;
4180 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 0, NULL
, EnumGroups_cb
,
4182 checkHR( DPERR_UNINITIALIZED
, hr
);
4183 check( 0, callbackData
.dwCounter1
);
4186 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4187 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4189 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
4190 todo_wine
checkHR( DP_OK
, hr
);
4192 if ( hr
== DPERR_UNINITIALIZED
)
4194 todo_wine
win_skip( "EnumGroupsInGroup not implemented\n" );
4206 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[0],
4208 checkHR( DP_OK
, hr
);
4209 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[1],
4211 checkHR( DP_OK
, hr
);
4212 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[2],
4214 checkHR( DP_OK
, hr
);
4215 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[3],
4218 checkHR( DP_OK
, hr
);
4219 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[4],
4221 DPGROUP_STAGINGAREA
);
4222 checkHR( DP_OK
, hr
);
4223 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[5],
4225 checkHR( DP_OK
, hr
);
4227 hr
= IDirectPlayX_AddGroupToGroup( pDP
[0], dpid
[1], dpid
[5] );
4228 checkHR( DP_OK
, hr
);
4231 /* Invalid parameters */
4232 callbackData
.dwCounter1
= 0;
4233 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 0, NULL
, EnumGroups_cb
,
4235 checkHR( DPERR_INVALIDGROUP
, hr
);
4236 check( 0, callbackData
.dwCounter1
);
4238 callbackData
.dwCounter1
= 0;
4239 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 10, NULL
, EnumGroups_cb
,
4241 checkHR( DPERR_INVALIDGROUP
, hr
);
4242 check( 0, callbackData
.dwCounter1
);
4244 callbackData
.dwCounter1
= 0;
4245 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], (LPGUID
) &appGuid
,
4246 NULL
, &callbackData
, 0 );
4247 checkHR( DPERR_INVALIDPARAMS
, hr
);
4248 check( 0, callbackData
.dwCounter1
);
4250 callbackData
.dwCounter1
= 0;
4251 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4252 &callbackData
, DPENUMGROUPS_SESSION
);
4253 checkHR( DPERR_INVALIDPARAMS
, hr
);
4254 check( 0, callbackData
.dwCounter1
);
4257 /* Regular operation */
4258 callbackData
.dwCounter1
= 0;
4259 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[0], NULL
, EnumGroups_cb
,
4261 checkHR( DP_OK
, hr
);
4262 check( 0, callbackData
.dwCounter1
);
4264 callbackData
.dwCounter1
= 0;
4265 callbackData
.szTrace2
[0] = 0;
4266 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4268 checkHR( DP_OK
, hr
);
4269 check( 4, callbackData
.dwCounter1
);
4270 checkStr( "5432", callbackData
.szTrace1
);
4271 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4273 callbackData
.dwCounter1
= 0;
4274 callbackData
.szTrace2
[0] = 0;
4275 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], (LPGUID
) &appGuid
,
4276 EnumGroups_cb
, &callbackData
, 0 );
4277 checkHR( DP_OK
, hr
);
4278 check( 4, callbackData
.dwCounter1
); /* Guid is ignored */
4279 checkStr( "5432", callbackData
.szTrace1
);
4280 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4283 /* Enumerating from a remote session */
4284 /* - Session not open */
4285 callbackData
.pDP
= pDP
[1];
4286 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
[1], 0,
4287 EnumSessions_cb_EnumGroups
,
4289 checkHR( DP_OK
, hr
);
4291 /* - Open session */
4292 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
[0], 0, EnumSessions_cb_join
,
4294 checkHR( DP_OK
, hr
);
4297 callbackData
.dwCounter1
= 0;
4298 callbackData
.szTrace2
[0] = 0;
4299 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4301 checkHR( DP_OK
, hr
);
4302 check( 4, callbackData
.dwCounter1
);
4303 checkStr( "5432", callbackData
.szTrace1
);
4304 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4307 callbackData
.dwCounter1
= 0;
4308 callbackData
.szTrace2
[0] = 0;
4309 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4310 &callbackData
, DPENUMGROUPS_ALL
);
4311 checkHR( DP_OK
, hr
);
4312 check( 4, callbackData
.dwCounter1
);
4313 checkStr( "5432", callbackData
.szTrace1
);
4314 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4316 callbackData
.dwCounter1
= 0;
4317 callbackData
.szTrace2
[0] = 0;
4318 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4319 &callbackData
, DPENUMGROUPS_HIDDEN
);
4320 checkHR( DP_OK
, hr
);
4321 check( 1, callbackData
.dwCounter1
);
4322 checkStr( "3", callbackData
.szTrace1
);
4323 checkStr( "HIDDEN:", callbackData
.szTrace2
);
4325 callbackData
.dwCounter1
= 0;
4326 callbackData
.szTrace2
[0] = 0;
4327 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4328 &callbackData
, DPENUMGROUPS_LOCAL
);
4329 checkHR( DP_OK
, hr
);
4330 check( 4, callbackData
.dwCounter1
);
4331 checkStr( "5432", callbackData
.szTrace1
);
4332 checkStr( "LOCAL,DPENUMGROUPS_SHORTCUT:"
4333 "LOCAL,DPENUMGROUPS_STAGINGAREA:"
4334 "LOCAL,DPENUMGROUPS_HIDDEN:LOCAL:", callbackData
.szTrace2
);
4336 callbackData
.dwCounter1
= 0;
4337 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4338 &callbackData
, DPENUMGROUPS_REMOTE
);
4339 checkHR( DP_OK
, hr
);
4340 check( 0, callbackData
.dwCounter1
);
4342 callbackData
.dwCounter1
= 0;
4343 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4344 &callbackData
, DPENUMGROUPS_LOCAL
);
4345 checkHR( DP_OK
, hr
);
4346 check( 0, callbackData
.dwCounter1
);
4348 callbackData
.dwCounter1
= 0;
4349 callbackData
.szTrace2
[0] = 0;
4350 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4351 &callbackData
, DPENUMGROUPS_REMOTE
);
4352 checkHR( DP_OK
, hr
);
4353 check( 4, callbackData
.dwCounter1
);
4354 checkStr( "5432", callbackData
.szTrace1
);
4355 checkStr( "REMOTE,DPENUMGROUPS_SHORTCUT:"
4356 "REMOTE,DPENUMGROUPS_STAGINGAREA:"
4357 "REMOTE,DPENUMGROUPS_HIDDEN:REMOTE:", callbackData
.szTrace2
);
4359 callbackData
.dwCounter1
= 0;
4360 callbackData
.szTrace2
[0] = 0;
4361 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4362 &callbackData
, DPENUMGROUPS_SHORTCUT
);
4363 checkHR( DP_OK
, hr
);
4364 check( 1, callbackData
.dwCounter1
);
4365 checkStr( "5", callbackData
.szTrace1
);
4366 checkStr( "SHORTCUT:", callbackData
.szTrace2
);
4368 callbackData
.dwCounter1
= 0;
4369 callbackData
.szTrace2
[0] = 0;
4370 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4372 DPENUMGROUPS_STAGINGAREA
);
4373 checkHR( DP_OK
, hr
);
4374 check( 1, callbackData
.dwCounter1
);
4375 checkStr( "4", callbackData
.szTrace1
);
4376 checkStr( "STAGINGAREA:", callbackData
.szTrace2
);
4379 IDirectPlayX_Release( pDP
[0] );
4380 IDirectPlayX_Release( pDP
[1] );
4384 static void test_groups_p2p(void)
4387 IDirectPlay4
*pDP
[2];
4388 DPSESSIONDESC2 dpsd
;
4389 DPID idPlayer
[6], idGroup
[3];
4393 DWORD dwDataSize
= 1024;
4394 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
4395 CallbackData callbackData
;
4400 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4401 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4402 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4403 if (FAILED(hr
)) return;
4405 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4406 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4407 dpsd
.guidApplication
= appGuid
;
4408 dpsd
.dwMaxPlayers
= 10;
4411 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4412 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4414 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4415 todo_wine
checkHR( DP_OK
, hr
);
4416 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4418 todo_wine
checkHR( DP_OK
, hr
);
4420 if ( hr
== DPERR_UNINITIALIZED
)
4422 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
4427 /* Create players */
4428 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4429 NULL
, NULL
, NULL
, 0, 0 );
4430 checkHR( DP_OK
, hr
);
4431 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[1],
4432 NULL
, NULL
, NULL
, 0, 0 );
4433 checkHR( DP_OK
, hr
);
4434 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[2],
4435 NULL
, NULL
, NULL
, 0, 0 );
4436 checkHR( DP_OK
, hr
);
4437 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[3],
4438 NULL
, NULL
, NULL
, 0, 0 );
4439 checkHR( DP_OK
, hr
);
4440 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[4],
4441 NULL
, NULL
, NULL
, 0, 0 );
4442 checkHR( DP_OK
, hr
);
4443 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[5],
4444 NULL
, NULL
, NULL
, 0, 0 );
4445 checkHR( DP_OK
, hr
);
4447 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
[0],
4449 checkHR( DP_OK
, hr
);
4450 hr
= IDirectPlayX_CreateGroup( pDP
[1], &idGroup
[2],
4452 checkHR( DP_OK
, hr
);
4453 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[1], idGroup
[2], &idGroup
[1],
4455 checkHR( DP_OK
, hr
);
4459 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4460 checkStr( "S0," "S1,S0,"
4461 "S2,S1,S0," "S2,S1,S0,"
4462 "S2,S1,S0," "S2,S1,S0,"
4463 "S2,S1,S0," "S2,S1,S0,", callbackData
.szTrace1
);
4464 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4465 checkStr( "S3," "S4,S3,"
4466 "S5,S4,S3," "S5,S4,S3,"
4467 "S5,S4,S3,", callbackData
.szTrace1
);
4472 * Player 1 | Group 0 | pDP 0
4474 * Player 3 | Group 1 ) |
4475 * Player 4 | | Group 2 | pDP 1
4480 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[0] );
4481 checkHR( DP_OK
, hr
);
4482 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[1] );
4483 checkHR( DP_OK
, hr
);
4484 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[2] );
4485 checkHR( DP_OK
, hr
);
4486 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[3] );
4487 checkHR( DP_OK
, hr
);
4488 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[4] );
4489 checkHR( DP_OK
, hr
);
4490 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[4] );
4491 checkHR( DP_OK
, hr
);
4492 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[5] );
4493 checkHR( DP_OK
, hr
);
4495 hr
= IDirectPlayX_AddGroupToGroup( pDP
[1], idGroup
[2], idGroup
[1] );
4496 checkHR( DP_OK
, hr
);
4499 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4500 checkStr( "S2,S1,S0," "S2,S1,S0," "S2,S1,S0,"
4501 "S2,S1,S0," "S2,S1,S0," "S2,S1,S0,"
4502 "S2,S1,S0,", callbackData
.szTrace1
);
4503 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4504 checkStr( "S5,S4,S3," "S5,S4,S3," "S5,S4,S3,"
4505 "S5,S4,S3," "S5,S4,S3," "S5,S4,S3,"
4506 "S5,S4,S3,", callbackData
.szTrace1
);
4509 /* Sending broadcast messages, and checking who receives them */
4513 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], DPID_ALLPLAYERS
, 0,
4514 lpData
, dwDataSize
);
4515 checkHR( DP_OK
, hr
);
4516 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4517 checkStr( "02,01,", callbackData
.szTrace1
);
4518 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4519 checkStr( "05,04,03,", callbackData
.szTrace1
);
4522 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[0], 0,
4523 lpData
, dwDataSize
);
4524 checkHR( DP_OK
, hr
);
4525 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4526 checkStr( "02,01,", callbackData
.szTrace1
);
4527 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4528 checkStr( "", callbackData
.szTrace1
);
4530 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[1], 0,
4531 lpData
, dwDataSize
);
4532 checkHR( DP_OK
, hr
);
4533 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4534 checkStr( "", callbackData
.szTrace1
);
4535 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4536 checkStr( "04,03,", callbackData
.szTrace1
);
4538 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[2], 0,
4539 lpData
, dwDataSize
);
4540 checkHR( DP_OK
, hr
);
4541 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4542 checkStr( "", callbackData
.szTrace1
);
4543 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4544 checkStr( "05,04,", callbackData
.szTrace1
);
4547 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], DPID_ALLPLAYERS
, 0,
4548 lpData
, dwDataSize
);
4549 checkHR( DP_OK
, hr
);
4550 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4551 checkStr( "32,31,30,", callbackData
.szTrace1
);
4552 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4553 checkStr( "35,34,", callbackData
.szTrace1
);
4555 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[0], 0,
4556 lpData
, dwDataSize
);
4557 checkHR( DP_OK
, hr
);
4558 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4559 checkStr( "32,31,30,", callbackData
.szTrace1
);
4560 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4561 checkStr( "", callbackData
.szTrace1
);
4563 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[1], 0,
4564 lpData
, dwDataSize
);
4565 checkHR( DP_OK
, hr
);
4566 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4567 checkStr( "", callbackData
.szTrace1
);
4568 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4569 checkStr( "34,", callbackData
.szTrace1
);
4571 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[2], 0,
4572 lpData
, dwDataSize
);
4573 checkHR( DP_OK
, hr
);
4574 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4575 checkStr( "", callbackData
.szTrace1
);
4576 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4577 checkStr( "35,34,", callbackData
.szTrace1
);
4580 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], DPID_ALLPLAYERS
, 0,
4581 lpData
, dwDataSize
);
4582 checkHR( DP_OK
, hr
);
4583 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4584 checkStr( "52,51,50,", callbackData
.szTrace1
);
4585 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4586 checkStr( "54,53,", callbackData
.szTrace1
);
4588 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[0], 0,
4589 lpData
, dwDataSize
);
4590 checkHR( DP_OK
, hr
);
4591 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4592 checkStr( "52,51,50,", callbackData
.szTrace1
);
4593 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4594 checkStr( "", callbackData
.szTrace1
);
4596 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[1], 0,
4597 lpData
, dwDataSize
);
4598 checkHR( DP_OK
, hr
);
4599 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4600 checkStr( "", callbackData
.szTrace1
);
4601 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4602 checkStr( "54,53,", callbackData
.szTrace1
);
4604 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[2], 0,
4605 lpData
, dwDataSize
);
4606 checkHR( DP_OK
, hr
);
4607 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4608 checkStr( "", callbackData
.szTrace1
);
4609 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4610 checkStr( "54,", callbackData
.szTrace1
);
4613 HeapFree( GetProcessHeap(), 0, lpData
);
4614 IDirectPlayX_Release( pDP
[0] );
4615 IDirectPlayX_Release( pDP
[1] );
4619 static void test_groups_cs(void)
4622 IDirectPlay4
*pDP
[2];
4623 DPSESSIONDESC2 dpsd
;
4624 DPID idPlayer
[6], idGroup
[3];
4625 CallbackData callbackData
;
4629 DWORD dwDataSize
= 1024;
4630 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
4635 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4636 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4637 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4638 if (FAILED(hr
)) return;
4640 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4641 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4642 dpsd
.guidApplication
= appGuid
;
4643 dpsd
.dwMaxPlayers
= 10;
4646 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4647 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4649 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
4650 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4651 todo_wine
checkHR( DP_OK
, hr
);
4653 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4655 todo_wine
checkHR( DP_OK
, hr
);
4657 if ( hr
== DPERR_UNINITIALIZED
)
4659 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
4664 /* Create players */
4665 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4666 NULL
, NULL
, NULL
, 0, 0 );
4667 checkHR( DPERR_ACCESSDENIED
, hr
);
4668 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4669 NULL
, NULL
, NULL
, 0,
4670 DPPLAYER_SERVERPLAYER
);
4671 checkHR( DP_OK
, hr
);
4672 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[1],
4673 NULL
, NULL
, NULL
, 0, 0 );
4674 checkHR( DPERR_ACCESSDENIED
, hr
);
4675 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[1],
4676 NULL
, NULL
, NULL
, 0, 0 );
4677 checkHR( DP_OK
, hr
);
4678 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[2],
4679 NULL
, NULL
, NULL
, 0, 0 );
4680 checkHR( DP_OK
, hr
);
4681 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[3],
4682 NULL
, NULL
, NULL
, 0, 0 );
4683 checkHR( DP_OK
, hr
);
4684 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[4],
4685 NULL
, NULL
, NULL
, 0, 0 );
4686 checkHR( DP_OK
, hr
);
4687 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[5],
4688 NULL
, NULL
, NULL
, 0, 0 );
4689 checkHR( DP_OK
, hr
);
4691 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
[0],
4693 checkHR( DP_OK
, hr
);
4694 hr
= IDirectPlayX_CreateGroup( pDP
[1], &idGroup
[2],
4696 checkHR( DP_OK
, hr
);
4697 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[1], idGroup
[2], &idGroup
[1],
4699 checkHR( DP_OK
, hr
);
4703 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4704 checkStr( "S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
4705 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4706 checkStr( "S1," "S2,S1," "S3,S2,S1," "S4,S3,S2,S1,"
4707 "S5,S4,S3,S2,S1," "S5,S4,S3,S2,S1,", callbackData
.szTrace1
);
4710 * Player 0 | | pDP 0
4711 * Player 1 | Group 0 |
4713 * Player 3 | Group 1 ) |
4714 * Player 4 | | Group 2 | pDP 1
4719 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[0] );
4720 checkHR( DP_OK
, hr
);
4721 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[1] );
4722 checkHR( DP_OK
, hr
);
4723 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[2] );
4724 checkHR( DP_OK
, hr
);
4725 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[3] );
4726 checkHR( DP_OK
, hr
);
4727 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[4] );
4728 checkHR( DP_OK
, hr
);
4729 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[4] );
4730 checkHR( DP_OK
, hr
);
4731 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[5] );
4732 checkHR( DP_OK
, hr
);
4734 hr
= IDirectPlayX_AddGroupToGroup( pDP
[1], idGroup
[2], idGroup
[1] );
4735 checkHR( DP_OK
, hr
);
4738 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4739 checkStr( "S0,S0,S0,S0,", callbackData
.szTrace1
);
4740 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4741 checkStr( "S5," "S4,S3,S2,S1," "S5,S4,S3,S2,S1,"
4742 "S5,S4,S3,S2,S1," "S5,S4,S3,S2,S1,", callbackData
.szTrace1
);
4745 /* Sending broadcast messages, and checking who receives them */
4748 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], DPID_ALLPLAYERS
, 0,
4749 lpData
, dwDataSize
);
4750 checkHR( DP_OK
, hr
);
4751 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4752 checkStr( "", callbackData
.szTrace1
);
4753 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4754 checkStr( "05,04,03,02,01,", callbackData
.szTrace1
);
4757 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[0], 0,
4758 lpData
, dwDataSize
);
4759 checkHR( DP_OK
, hr
);
4760 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4761 checkStr( "", callbackData
.szTrace1
);
4762 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4763 checkStr( "02,01,", callbackData
.szTrace1
);
4765 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[1], 0,
4766 lpData
, dwDataSize
);
4767 checkHR( DPERR_INVALIDPARAMS
, hr
);
4768 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4769 checkStr( "", callbackData
.szTrace1
);
4770 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4771 checkStr( "", callbackData
.szTrace1
);
4773 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[2], 0,
4774 lpData
, dwDataSize
);
4775 checkHR( DPERR_INVALIDPARAMS
, hr
);
4776 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4777 checkStr( "", callbackData
.szTrace1
);
4778 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4779 checkStr( "", callbackData
.szTrace1
);
4782 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], DPID_ALLPLAYERS
, 0,
4783 lpData
, dwDataSize
);
4784 checkHR( DP_OK
, hr
);
4785 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4786 checkStr( "30,", callbackData
.szTrace1
);
4787 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4788 checkStr( "35,34,32,31,", callbackData
.szTrace1
);
4790 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[0], 0,
4791 lpData
, dwDataSize
);
4792 checkHR( DPERR_INVALIDPARAMS
, hr
);
4793 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4794 checkStr( "", callbackData
.szTrace1
);
4795 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4796 checkStr( "", callbackData
.szTrace1
);
4798 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[1], 0,
4799 lpData
, dwDataSize
);
4800 checkHR( DP_OK
, hr
);
4801 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4802 checkStr( "", callbackData
.szTrace1
);
4803 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4804 checkStr( "34,", callbackData
.szTrace1
);
4806 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[2], 0,
4807 lpData
, dwDataSize
);
4808 checkHR( DP_OK
, hr
);
4809 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4810 checkStr( "", callbackData
.szTrace1
);
4811 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4812 checkStr( "35,34,", callbackData
.szTrace1
);
4815 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], DPID_ALLPLAYERS
, 0,
4816 lpData
, dwDataSize
);
4817 checkHR( DP_OK
, hr
);
4818 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4819 checkStr( "50,", callbackData
.szTrace1
);
4820 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4821 checkStr( "54,53,52,51,", callbackData
.szTrace1
);
4823 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[0], 0,
4824 lpData
, dwDataSize
);
4825 checkHR( DPERR_INVALIDPARAMS
, hr
);
4826 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4827 checkStr( "", callbackData
.szTrace1
);
4828 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4829 checkStr( "", callbackData
.szTrace1
);
4831 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[1], 0,
4832 lpData
, dwDataSize
);
4833 checkHR( DP_OK
, hr
);
4834 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4835 checkStr( "", callbackData
.szTrace1
);
4836 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4837 checkStr( "54,53,", callbackData
.szTrace1
);
4839 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[2], 0,
4840 lpData
, dwDataSize
);
4841 checkHR( DP_OK
, hr
);
4842 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4843 checkStr( "", callbackData
.szTrace1
);
4844 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4845 checkStr( "54,", callbackData
.szTrace1
);
4848 HeapFree( GetProcessHeap(), 0, lpData
);
4849 IDirectPlayX_Release( pDP
[0] );
4850 IDirectPlayX_Release( pDP
[1] );
4856 static void test_Send(void)
4859 IDirectPlay4
*pDP
[2];
4860 DPSESSIONDESC2 dpsd
;
4861 DPID dpid
[4], idFrom
, idTo
;
4862 CallbackData callbackData
;
4864 LPCSTR message
= "message";
4865 DWORD messageSize
= strlen(message
) + 1;
4866 DWORD dwDataSize
= 1024;
4867 LPDPMSG_GENERIC lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
4868 LPDPMSG_SECUREMESSAGE lpDataSecure
;
4874 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4875 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4876 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4877 if (FAILED(hr
)) return;
4879 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4882 /* Uninitialized service provider */
4883 hr
= IDirectPlayX_Send( pDP
[0], 0, 0, 0,
4884 (LPVOID
) message
, messageSize
);
4885 checkHR( DPERR_UNINITIALIZED
, hr
);
4888 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4889 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4891 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4892 dpsd
.guidApplication
= appGuid
;
4893 dpsd
.dwMaxPlayers
= 10;
4894 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4895 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4897 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4900 /* Incorrect players */
4901 hr
= IDirectPlayX_Send( pDP
[0], 0, 1, 2,
4902 (LPVOID
) message
, messageSize
);
4903 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
4905 if ( hr
== DPERR_UNINITIALIZED
)
4907 todo_wine
win_skip( "Send not implemented\n" );
4912 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
4913 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
4914 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
4915 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
4917 /* Purge player creation messages */
4918 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4919 checkStr( "S0," "S1,S0," "S2,S1,S0,", callbackData
.szTrace1
);
4920 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4921 checkStr( "", callbackData
.szTrace1
);
4924 /* Message to self: no error, but no message is sent */
4925 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[0], 0,
4926 (LPVOID
) message
, messageSize
);
4927 checkHR( DP_OK
, hr
);
4929 /* Send a message from a remote player */
4930 hr
= IDirectPlayX_Send( pDP
[1], dpid
[0], dpid
[1], 0,
4931 (LPVOID
) message
, messageSize
);
4932 checkHR( DPERR_ACCESSDENIED
, hr
);
4933 hr
= IDirectPlayX_Send( pDP
[1], dpid
[0], dpid
[3], 0,
4934 (LPVOID
) message
, messageSize
);
4935 checkHR( DPERR_ACCESSDENIED
, hr
);
4938 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0,
4939 NULL
, messageSize
);
4940 checkHR( DPERR_INVALIDPARAMS
, hr
);
4941 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0,
4942 (LPVOID
) message
, 0 );
4943 checkHR( DPERR_INVALIDPARAMS
, hr
);
4946 /* Checking no message was sent */
4947 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4948 checkStr( "", callbackData
.szTrace1
);
4949 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4950 checkStr( "", callbackData
.szTrace1
);
4953 /* Regular parameters */
4954 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
4956 (LPVOID
) message
, messageSize
);
4957 checkHR( DP_OK
, hr
);
4959 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[1],
4960 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4961 lpData
, &dwDataSize
);
4962 checkHR( DP_OK
, hr
);
4963 checkStr( message
, (LPSTR
) lpData
);
4964 check( strlen(message
)+1, dwDataSize
);
4966 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4967 checkStr( "", callbackData
.szTrace1
);
4968 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4969 checkStr( "", callbackData
.szTrace1
);
4972 /* Message to a remote player */
4973 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[3], 0,
4974 (LPVOID
) message
, messageSize
);
4975 checkHR( DP_OK
, hr
);
4977 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[3],
4978 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4979 lpData
, &dwDataSize
);
4980 checkHR( DPERR_NOMESSAGES
, hr
);
4981 hr
= IDirectPlayX_Receive( pDP
[1], &dpid
[0], &dpid
[3],
4982 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4983 lpData
, &dwDataSize
);
4984 checkHR( DP_OK
, hr
);
4985 checkStr( message
, (LPSTR
) lpData
);
4986 check( strlen(message
)+1, dwDataSize
);
4988 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4989 checkStr( "", callbackData
.szTrace1
);
4990 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4991 checkStr( "", callbackData
.szTrace1
);
4996 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], DPID_ALLPLAYERS
, 0,
4997 (LPVOID
) message
, messageSize
);
4998 checkHR( DP_OK
, hr
);
5002 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[i
],
5003 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
5004 lpData
, &dwDataSize
);
5005 checkHR( DP_OK
, hr
);
5006 checkStr( message
, (LPSTR
) lpData
);
5008 hr
= IDirectPlayX_Receive( pDP
[1], &dpid
[0], &dpid
[3],
5009 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
5010 lpData
, &dwDataSize
);
5011 checkHR( DP_OK
, hr
);
5012 checkStr( message
, (LPSTR
) lpData
);
5014 check_messages( pDP
[0], dpid
, 4, &callbackData
);
5015 checkStr( "", callbackData
.szTrace1
);
5016 check_messages( pDP
[1], dpid
, 4, &callbackData
);
5017 checkStr( "", callbackData
.szTrace1
);
5020 hr
= IDirectPlayX_Send( pDP
[0], DPID_ALLPLAYERS
, dpid
[1],
5022 (LPVOID
) message
, messageSize
);
5023 checkHR( DPERR_INVALIDPLAYER
, hr
);
5024 hr
= IDirectPlayX_Send( pDP
[0], DPID_ALLPLAYERS
, DPID_ALLPLAYERS
,
5026 (LPVOID
) message
, messageSize
);
5027 checkHR( DPERR_INVALIDPLAYER
, hr
);
5031 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5033 (LPVOID
) message
, messageSize
);
5034 checkHR( DP_OK
, hr
);
5036 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[1],
5037 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
5038 lpData
, &dwDataSize
);
5039 checkHR( DP_OK
, hr
);
5040 checkStr( message
, (LPSTR
)lpData
);
5042 /* - Inorrect flags */
5043 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5045 (LPVOID
) message
, messageSize
);
5046 checkHR( DPERR_INVALIDPARAMS
, hr
);
5047 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5049 (LPVOID
) message
, messageSize
);
5050 checkHR( DPERR_INVALIDPARAMS
, hr
);
5051 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5052 DPSEND_ENCRYPTED
| DPSEND_SIGNED
,
5053 (LPVOID
) message
, messageSize
);
5054 checkHR( DPERR_INVALIDPARAMS
, hr
);
5056 /* - Correct flags, but session is not secure */
5057 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5058 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5059 (LPVOID
) message
, messageSize
);
5060 checkHR( DPERR_INVALIDPARAMS
, hr
);
5061 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5062 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5063 (LPVOID
) message
, messageSize
);
5064 checkHR( DPERR_INVALIDPARAMS
, hr
);
5065 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5066 ( DPSEND_ENCRYPTED
|
5068 DPSEND_GUARANTEED
),
5069 (LPVOID
) message
, messageSize
);
5070 checkHR( DPERR_INVALIDPARAMS
, hr
);
5072 /* - Correct flags, secure session incorrectly opened (without flags) */
5073 hr
= IDirectPlayX_Close( pDP
[0] );
5074 checkHR( DP_OK
, hr
);
5077 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
5078 checkHR( DP_OK
, hr
);
5080 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[i
], NULL
, NULL
, NULL
, 0, 0 );
5082 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5083 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5084 (LPVOID
) message
, messageSize
);
5085 checkHR( DPERR_INVALIDPARAMS
, hr
);
5086 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5087 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5088 (LPVOID
) message
, messageSize
);
5089 checkHR( DPERR_INVALIDPARAMS
, hr
);
5090 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5091 ( DPSEND_ENCRYPTED
|
5093 DPSEND_GUARANTEED
),
5094 (LPVOID
) message
, messageSize
);
5095 checkHR( DPERR_INVALIDPARAMS
, hr
);
5097 /* - Correct flags, secure session */
5098 hr
= IDirectPlayX_Close( pDP
[0] );
5099 checkHR( DP_OK
, hr
);
5101 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
5102 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
5103 checkHR( DP_OK
, hr
);
5104 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5105 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5108 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5109 checkStr( "S0,", callbackData
.szTrace1
);
5112 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5113 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5114 (LPVOID
) message
, messageSize
);
5115 checkHR( DP_OK
, hr
);
5116 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5117 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5118 (LPVOID
) message
, messageSize
);
5119 checkHR( DP_OK
, hr
);
5120 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5121 ( DPSEND_ENCRYPTED
|
5123 DPSEND_GUARANTEED
),
5124 (LPVOID
) message
, messageSize
);
5125 checkHR( DP_OK
, hr
);
5131 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, 0, lpData
,
5134 lpDataSecure
= (LPDPMSG_SECUREMESSAGE
) lpData
;
5136 checkHR( DP_OK
, hr
);
5137 checkConv( DPSYS_SECUREMESSAGE
, lpData
->dwType
, dpMsgType2str
);
5138 check( DPID_SYSMSG
, idFrom
);
5139 check( dpid
[1], idTo
);
5140 check( dpid
[0], lpDataSecure
->dpIdFrom
);
5141 checkStr( message
, (LPSTR
) lpDataSecure
->lpData
);
5142 check( strlen(message
)+1, lpDataSecure
->dwDataSize
);
5147 checkFlags( DPSEND_ENCRYPTED
,
5148 lpDataSecure
->dwFlags
,
5152 checkFlags( DPSEND_SIGNED
,
5153 lpDataSecure
->dwFlags
,
5157 checkFlags( DPSEND_SIGNED
| DPSEND_ENCRYPTED
,
5158 lpDataSecure
->dwFlags
,
5164 check_messages( pDP
[0], dpid
, 4, &callbackData
);
5165 checkStr( "", callbackData
.szTrace1
);
5168 /* - Even in a secure session, incorrect flags still not working */
5169 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5171 (LPVOID
) message
, messageSize
);
5172 checkHR( DPERR_INVALIDPARAMS
, hr
);
5173 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5175 (LPVOID
) message
, messageSize
);
5176 checkHR( DPERR_INVALIDPARAMS
, hr
);
5177 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5178 DPSEND_ENCRYPTED
| DPSEND_SIGNED
,
5179 (LPVOID
) message
, messageSize
);
5180 checkHR( DPERR_INVALIDPARAMS
, hr
);
5183 HeapFree( GetProcessHeap(), 0, lpData
);
5184 IDirectPlayX_Release( pDP
[0] );
5185 IDirectPlayX_Release( pDP
[1] );
5191 static void test_Receive(void)
5195 DPSESSIONDESC2 dpsd
;
5196 DPID dpid
[4], idFrom
, idTo
;
5198 LPCSTR message
= "message";
5199 DWORD messageSize
= strlen(message
) + 1;
5200 DWORD dwDataSize
= 1024;
5201 LPDPMSG_GENERIC lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
5203 LPDPMSG_CREATEPLAYERORGROUP lpDataCreate
;
5204 LPDPMSG_DESTROYPLAYERORGROUP lpDataDestroy
;
5210 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5211 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
5212 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5213 if (FAILED(hr
)) return;
5215 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5216 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5217 dpsd
.guidApplication
= appGuid
;
5219 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
5221 IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
5224 /* Invalid parameters */
5225 hr
= IDirectPlayX_Receive( pDP
, NULL
, &idTo
, 0,
5226 lpData
, &dwDataSize
);
5227 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
5229 if ( hr
== DPERR_UNINITIALIZED
)
5231 todo_wine
win_skip( "Receive not implemented\n" );
5235 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, NULL
, 0,
5236 lpData
, &dwDataSize
);
5237 checkHR( DPERR_INVALIDPARAMS
, hr
);
5238 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5240 checkHR( DPERR_INVALIDPARAMS
, hr
);
5242 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5243 lpData
, &dwDataSize
);
5244 checkHR( DPERR_INVALIDPARAMS
, hr
);
5246 /* No messages yet */
5247 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5248 NULL
, &dwDataSize
);
5249 checkHR( DPERR_NOMESSAGES
, hr
);
5251 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5252 lpData
, &dwDataSize
);
5253 checkHR( DPERR_NOMESSAGES
, hr
);
5256 IDirectPlayX_CreatePlayer( pDP
, &dpid
[0], NULL
, 0, NULL
, 0, 0 );
5257 IDirectPlayX_CreatePlayer( pDP
, &dpid
[1], NULL
, 0, NULL
, 0,
5258 DPPLAYER_SPECTATOR
);
5259 IDirectPlayX_CreatePlayer( pDP
, &dpid
[2], NULL
, 0, NULL
, 0, 0 );
5260 IDirectPlayX_CreatePlayer( pDP
, &dpid
[3], NULL
, 0, NULL
, 0, 0 );
5267 IDirectPlayX_GetMessageCount( pDP
, dpid
[i
], &dwCount
);
5268 check( 3-i
, dwCount
);
5272 IDirectPlayX_DestroyPlayer( pDP
, dpid
[3] );
5273 IDirectPlayX_DestroyPlayer( pDP
, dpid
[1] );
5278 IDirectPlayX_GetMessageCount( pDP
, dpid
[0], &dwCount
);
5279 check( 5, dwCount
);
5280 IDirectPlayX_GetMessageCount( pDP
, dpid
[1], &dwCount
);
5281 check( 5, dwCount
);
5282 IDirectPlayX_GetMessageCount( pDP
, dpid
[2], &dwCount
);
5283 check( 3, dwCount
);
5284 IDirectPlayX_GetMessageCount( pDP
, dpid
[3], &dwCount
);
5285 check( 3, dwCount
);
5288 /* Buffer too small */
5289 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idFrom
, 0,
5290 NULL
, &dwDataSize
);
5291 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
5292 check( 48, dwDataSize
);
5294 hr
= IDirectPlayX_Receive( pDP
, &idTo
, &idFrom
, 0,
5295 lpData
, &dwDataSize
);
5296 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
5297 check( 48, dwDataSize
);
5300 /* Checking the order or reception */
5301 for (i
=0; i
<11; i
++)
5304 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5305 lpData
, &dwDataSize
);
5307 checkHR( DP_OK
, hr
);
5308 check( DPID_SYSMSG
, idFrom
);
5310 if (i
<6) /* Player creation */
5312 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
5313 check( 48, dwDataSize
);
5314 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5315 check( DPPLAYERTYPE_PLAYER
, lpDataCreate
->dwPlayerType
);
5316 checkLP( NULL
, lpDataCreate
->lpData
);
5317 check( 0, lpDataCreate
->dwDataSize
);
5318 checkLP( NULL
, U1(lpDataCreate
->dpnName
).lpszShortNameA
);
5319 check( 0, lpDataCreate
->dpIdParent
);
5321 else /* Player destruction */
5323 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
,
5325 check( 52, dwDataSize
);
5326 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5327 check( DPPLAYERTYPE_PLAYER
, lpDataDestroy
->dwPlayerType
);
5328 checkLP( NULL
, lpDataDestroy
->lpLocalData
);
5329 check( 0, lpDataDestroy
->dwLocalDataSize
);
5330 checkLP( NULL
, lpDataDestroy
->lpRemoteData
);
5331 check( 0, lpDataDestroy
->dwRemoteDataSize
);
5332 checkLP( NULL
, U1(lpDataDestroy
->dpnName
).lpszShortNameA
);
5333 check( 0, lpDataDestroy
->dpIdParent
);
5340 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5341 check( dpid
[0], idTo
);
5342 check( dpid
[1], lpDataCreate
->dpId
);
5343 check( 1, lpDataCreate
->dwCurrentPlayers
);
5344 checkFlags( DPPLAYER_LOCAL
|DPPLAYER_SPECTATOR
, lpDataCreate
->dwFlags
,
5345 FLAGS_DPPLAYER
|FLAGS_DPGROUP
);
5350 check( dpid
[1], idTo
);
5351 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5352 check( dpid
[2], lpDataCreate
->dpId
);
5353 check( 2, lpDataCreate
->dwCurrentPlayers
);
5354 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5355 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5358 check( dpid
[0], idTo
);
5359 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5360 check( dpid
[2], lpDataCreate
->dpId
);
5361 check( 2, lpDataCreate
->dwCurrentPlayers
);
5362 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5363 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5368 check( dpid
[2], idTo
);
5369 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5370 check( dpid
[3], lpDataCreate
->dpId
);
5371 check( 3, lpDataCreate
->dwCurrentPlayers
);
5372 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5373 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5376 check( dpid
[1], idTo
);
5377 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5378 check( dpid
[3], lpDataCreate
->dpId
);
5379 check( 3, lpDataCreate
->dwCurrentPlayers
);
5380 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5381 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5384 check( dpid
[0], idTo
);
5385 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5386 check( dpid
[3], lpDataCreate
->dpId
);
5387 check( 3, lpDataCreate
->dwCurrentPlayers
);
5388 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5389 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5394 check( dpid
[2], idTo
);
5395 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5396 check( dpid
[3], lpDataDestroy
->dpId
);
5397 checkFlags( DPPLAYER_LOCAL
, lpDataDestroy
->dwFlags
,
5398 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5401 check( dpid
[1], idTo
);
5402 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5403 check( dpid
[3], lpDataDestroy
->dpId
);
5404 checkFlags( DPPLAYER_LOCAL
, lpDataDestroy
->dwFlags
,
5405 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5408 check( dpid
[0], idTo
);
5409 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5410 check( dpid
[3], lpDataDestroy
->dpId
);
5411 checkFlags( DPPLAYER_LOCAL
, lpDataDestroy
->dwFlags
,
5412 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5417 check( dpid
[2], idTo
);
5418 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5419 check( dpid
[1], lpDataDestroy
->dpId
);
5420 checkFlags( DPPLAYER_LOCAL
|
5421 DPPLAYER_SPECTATOR
, lpDataDestroy
->dwFlags
,
5422 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5425 check( dpid
[0], idTo
);
5426 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5427 check( dpid
[1], lpDataDestroy
->dpId
);
5428 checkFlags( DPPLAYER_LOCAL
|
5429 DPPLAYER_SPECTATOR
, lpDataDestroy
->dwFlags
,
5430 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5434 trace( "%s\n", dpMsgType2str(lpData
->dwType
) );
5439 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5440 checkHR( DPERR_NOMESSAGES
, hr
);
5443 /* New data message */
5444 hr
= IDirectPlayX_Send( pDP
, dpid
[0], dpid
[2], 0,
5445 (LPVOID
) message
, messageSize
);
5446 checkHR( DP_OK
, hr
);
5449 /* Ensuring DPRECEIVE_PEEK doesn't remove the messages from the queue */
5450 for (i
=0; i
<10; i
++)
5452 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, DPRECEIVE_PEEK
,
5453 lpData
, &dwDataSize
);
5454 checkHR( DP_OK
, hr
);
5455 checkStr( message
, (LPSTR
) lpData
);
5458 /* Removing the message from the queue */
5459 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5460 checkHR( DP_OK
, hr
);
5461 check( idFrom
, dpid
[0] );
5462 check( idTo
, dpid
[2] );
5463 checkStr( message
, (LPSTR
) lpData
);
5465 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5466 checkHR( DPERR_NOMESSAGES
, hr
);
5469 HeapFree( GetProcessHeap(), 0, lpData
);
5470 IDirectPlayX_Release( pDP
);
5474 /* GetMessageCount */
5476 static void test_GetMessageCount(void)
5479 IDirectPlay4
*pDP
[2];
5480 DPSESSIONDESC2 dpsd
;
5486 DWORD dwDataSize
= 1024;
5487 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
5488 CallbackData callbackData
;
5493 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5494 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
5495 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5496 if (FAILED(hr
)) return;
5498 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5501 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5502 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
5503 check( -1, dwCount
);
5507 todo_wine
win_skip( "GetMessageCount not implemented\n" );
5512 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
5513 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
5517 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5518 checkHR( DP_OK
, hr
);
5519 check( 0, dwCount
);
5522 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5523 dpsd
.guidApplication
= appGuid
;
5524 dpsd
.dwMaxPlayers
= 10;
5525 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
5526 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
5529 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5530 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5531 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
5532 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
5535 /* Incorrect parameters */
5537 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], NULL
);
5538 checkHR( DPERR_INVALIDPARAMS
, hr
);
5539 check( -1, dwCount
);
5542 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, NULL
);
5543 checkHR( DPERR_INVALIDPARAMS
, hr
);
5544 check( -1, dwCount
);
5547 hr
= IDirectPlayX_GetMessageCount( pDP
[0], -1, &dwCount
);
5548 checkHR( DPERR_INVALIDPLAYER
, hr
);
5549 check( -1, dwCount
);
5552 /* Correct parameters */
5553 /* Player creation messages */
5555 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5556 checkHR( DP_OK
, hr
);
5557 check( 5, dwCount
);
5560 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5561 checkHR( DP_OK
, hr
);
5562 check( 1, dwCount
);
5565 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5566 checkHR( DP_OK
, hr
);
5567 check( 3, dwCount
);
5570 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5571 checkHR( DP_OK
, hr
);
5572 check( 2, dwCount
);
5575 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[3], &dwCount
);
5576 checkHR( DP_OK
, hr
);
5577 /* Remote player: doesn't throw error but result is 0 and not 1 */
5578 check( 0, dwCount
);
5581 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5582 checkHR( DP_OK
, hr
);
5583 check( 1, dwCount
);
5586 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5587 checkHR( DP_OK
, hr
);
5588 check( 2, dwCount
);
5592 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5593 checkStr( "S0,S1,S0,S1,S0,", callbackData
.szTrace1
);
5594 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5595 checkStr( "S3,", callbackData
.szTrace1
);
5598 /* Ensure queues is purged */
5600 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5601 checkHR( DP_OK
, hr
);
5602 check( 0, dwCount
);
5605 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5606 checkHR( DP_OK
, hr
);
5607 check( 0, dwCount
);
5610 /* Send data messages */
5612 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0, lpData
, dwDataSize
);
5614 IDirectPlayX_Send( pDP
[0], dpid
[1], dpid
[2], 0, lpData
, dwDataSize
);
5616 IDirectPlayX_Send( pDP
[0], dpid
[2], dpid
[3], 0, lpData
, dwDataSize
);
5619 /* Check all messages are in the queues */
5621 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5622 checkHR( DP_OK
, hr
);
5623 check( 11, dwCount
);
5626 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5627 checkHR( DP_OK
, hr
);
5628 check( 7, dwCount
);
5631 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5632 checkHR( DP_OK
, hr
);
5633 check( 0, dwCount
);
5636 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5637 checkHR( DP_OK
, hr
);
5638 check( 5, dwCount
);
5641 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[2], &dwCount
);
5642 checkHR( DP_OK
, hr
);
5643 check( 6, dwCount
);
5646 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5647 checkHR( DP_OK
, hr
);
5648 check( 7, dwCount
);
5651 /* Purge queues again */
5652 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5653 checkStr( "01,01,01,01,01,"
5654 "12,12,12,12,12,12,", callbackData
.szTrace1
);
5655 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5656 checkStr( "23,23,23,23,23,23,23,", callbackData
.szTrace1
);
5659 /* Check queues are purged */
5661 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5662 checkHR( DP_OK
, hr
);
5663 check( 0, dwCount
);
5666 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5667 checkHR( DP_OK
, hr
);
5668 check( 0, dwCount
);
5671 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5672 checkHR( DP_OK
, hr
);
5673 check( 0, dwCount
);
5676 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5677 checkHR( DP_OK
, hr
);
5678 check( 0, dwCount
);
5681 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[2], &dwCount
);
5682 checkHR( DP_OK
, hr
);
5683 check( 0, dwCount
);
5686 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5687 checkHR( DP_OK
, hr
);
5688 check( 0, dwCount
);
5691 HeapFree( GetProcessHeap(), 0, lpData
);
5692 IDirectPlayX_Release( pDP
[0] );
5693 IDirectPlayX_Release( pDP
[1] );
5697 /* GetMessageQueue */
5699 static void test_GetMessageQueue(void)
5702 IDirectPlay4
*pDP
[2];
5703 DPSESSIONDESC2 dpsd
;
5705 CallbackData callbackData
;
5708 DWORD dwNumMsgs
, dwNumBytes
;
5710 DWORD dwDataSize
= 1024;
5711 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
5716 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5717 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
5718 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5719 if (FAILED(hr
)) return;
5721 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5724 dwNumMsgs
= dwNumBytes
= -1;
5725 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0, 0,
5726 &dwNumMsgs
, &dwNumBytes
);
5727 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
5728 check( -1, dwNumMsgs
);
5729 check( -1, dwNumBytes
);
5733 todo_wine
win_skip( "GetMessageQueue not implemented\n" );
5738 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
5739 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
5742 dwNumMsgs
= dwNumBytes
= -1;
5743 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0, 0,
5744 &dwNumMsgs
, &dwNumBytes
);
5745 checkHR( DP_OK
, hr
);
5746 check( 0, dwNumMsgs
);
5747 check( 0, dwNumBytes
);
5750 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5751 dpsd
.guidApplication
= appGuid
;
5752 dpsd
.dwMaxPlayers
= 10;
5753 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
5754 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
5757 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5758 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5759 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
5760 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
5764 /* Incorrect parameters */
5765 dwNumMsgs
= dwNumBytes
= -1;
5766 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], -1, dpid
[1],
5768 &dwNumMsgs
, &dwNumBytes
);
5769 checkHR( DPERR_INVALIDPLAYER
, hr
);
5770 check( -1, dwNumMsgs
);
5771 check( -1, dwNumBytes
);
5773 dwNumMsgs
= dwNumBytes
= -1;
5774 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], -1,
5776 &dwNumMsgs
, &dwNumBytes
);
5777 checkHR( DPERR_INVALIDPLAYER
, hr
);
5778 check( -1, dwNumMsgs
);
5779 check( -1, dwNumBytes
);
5781 dwNumMsgs
= dwNumBytes
= -1;
5782 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[0],
5784 &dwNumMsgs
, &dwNumBytes
);
5785 checkHR( DPERR_INVALIDFLAGS
, hr
);
5786 check( -1, dwNumMsgs
);
5787 check( -1, dwNumBytes
);
5789 dwNumMsgs
= dwNumBytes
= -1;
5790 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5791 ( DPMESSAGEQUEUE_SEND
|
5792 DPMESSAGEQUEUE_RECEIVE
),
5793 &dwNumMsgs
, &dwNumBytes
);
5794 checkHR( DPERR_INVALIDFLAGS
, hr
);
5795 check( -1, dwNumMsgs
);
5796 check( -1, dwNumBytes
);
5798 /* - Remote players */
5799 dwNumMsgs
= dwNumBytes
= -1;
5800 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[3],
5801 DPMESSAGEQUEUE_RECEIVE
,
5802 &dwNumMsgs
, &dwNumBytes
);
5803 checkHR( DPERR_INVALIDPLAYER
, hr
); /* Player 3 is remote */
5804 check( -1, dwNumMsgs
);
5805 check( -1, dwNumBytes
);
5807 dwNumMsgs
= dwNumBytes
= -1;
5808 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[3], 0,
5809 DPMESSAGEQUEUE_SEND
,
5810 &dwNumMsgs
, &dwNumBytes
);
5811 checkHR( DPERR_INVALIDPLAYER
, hr
); /* Player 3 is remote */
5812 check( -1, dwNumMsgs
);
5813 check( -1, dwNumBytes
);
5815 /* - Remote players, this time in the right place */
5816 dwNumMsgs
= dwNumBytes
= -1;
5817 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[3],
5818 DPMESSAGEQUEUE_SEND
,
5819 &dwNumMsgs
, &dwNumBytes
);
5820 checkHR( DP_OK
, hr
);
5821 check( 0, dwNumMsgs
);
5822 check( 0, dwNumBytes
);
5824 dwNumMsgs
= dwNumBytes
= -1;
5825 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[3], 0,
5826 DPMESSAGEQUEUE_RECEIVE
,
5827 &dwNumMsgs
, &dwNumBytes
);
5828 checkHR( DP_OK
, hr
);
5829 check( 0, dwNumMsgs
);
5830 check( 0, dwNumBytes
);
5833 /* Correct parameters */
5834 dwNumMsgs
= dwNumBytes
= -1;
5835 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[1],
5836 DPMESSAGEQUEUE_RECEIVE
,
5837 &dwNumMsgs
, &dwNumBytes
);
5838 checkHR( DP_OK
, hr
);
5839 check( 2, dwNumMsgs
);
5840 check( 96, dwNumBytes
);
5842 dwNumMsgs
= dwNumBytes
= -1;
5843 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], 0,
5844 DPMESSAGEQUEUE_RECEIVE
,
5845 &dwNumMsgs
, &dwNumBytes
);
5846 checkHR( DP_OK
, hr
);
5847 check( 0, dwNumMsgs
);
5848 check( 0, dwNumBytes
);
5850 dwNumMsgs
= dwNumBytes
= -1;
5851 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5852 DPMESSAGEQUEUE_RECEIVE
,
5853 &dwNumMsgs
, &dwNumBytes
);
5854 checkHR( DP_OK
, hr
);
5855 check( 5, dwNumMsgs
);
5856 check( 240, dwNumBytes
);
5858 dwNumMsgs
= dwNumBytes
= -1;
5859 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5860 DPMESSAGEQUEUE_RECEIVE
,
5861 NULL
, &dwNumBytes
);
5862 checkHR( DP_OK
, hr
);
5863 check( -1, dwNumMsgs
);
5864 check( 0, dwNumBytes
);
5866 dwNumMsgs
= dwNumBytes
= -1;
5867 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5868 DPMESSAGEQUEUE_RECEIVE
,
5870 checkHR( DP_OK
, hr
);
5871 check( 0, dwNumMsgs
);
5872 check( -1, dwNumBytes
);
5874 dwNumMsgs
= dwNumBytes
= -1;
5875 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5876 DPMESSAGEQUEUE_RECEIVE
,
5878 checkHR( DP_OK
, hr
);
5879 check( -1, dwNumMsgs
);
5880 check( -1, dwNumBytes
);
5882 dwNumMsgs
= dwNumBytes
= -1;
5883 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5884 DPMESSAGEQUEUE_RECEIVE
,
5885 &dwNumMsgs
, &dwNumBytes
);
5886 checkHR( DP_OK
, hr
);
5887 check( 0, dwNumMsgs
);
5888 check( 0, dwNumBytes
);
5891 /* Purge messages */
5892 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5893 checkStr( "S0,S1,S0,S1,S0,", callbackData
.szTrace1
);
5894 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5895 checkStr( "S3,", callbackData
.szTrace1
);
5897 /* Check queues are empty */
5898 dwNumMsgs
= dwNumBytes
= -1;
5899 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5900 DPMESSAGEQUEUE_RECEIVE
,
5901 &dwNumMsgs
, &dwNumBytes
);
5902 checkHR( DP_OK
, hr
);
5903 check( 0, dwNumMsgs
);
5904 check( 0, dwNumBytes
);
5907 /* Sending 4 data messages from 0 to 1 */
5911 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0, lpData
, dwDataSize
);
5913 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[3], 0, lpData
, dwDataSize
);
5915 IDirectPlayX_Send( pDP
[0], dpid
[1], dpid
[3], 0, lpData
, dwDataSize
);
5918 dwNumMsgs
= dwNumBytes
= -1;
5919 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5920 DPMESSAGEQUEUE_RECEIVE
,
5921 &dwNumMsgs
, &dwNumBytes
);
5922 checkHR( DP_OK
, hr
);
5923 check( 4, dwNumMsgs
);
5924 check( 4*dwDataSize
, dwNumBytes
);
5926 dwNumMsgs
= dwNumBytes
= -1;
5927 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[0], dpid
[3],
5928 DPMESSAGEQUEUE_RECEIVE
,
5929 &dwNumMsgs
, &dwNumBytes
);
5930 checkHR( DP_OK
, hr
);
5931 check( 3, dwNumMsgs
);
5932 check( 3*dwDataSize
, dwNumBytes
);
5934 dwNumMsgs
= dwNumBytes
= -1;
5935 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[1], dpid
[3],
5936 DPMESSAGEQUEUE_RECEIVE
,
5937 &dwNumMsgs
, &dwNumBytes
);
5938 checkHR( DP_OK
, hr
);
5939 check( 2, dwNumMsgs
);
5940 check( 2*dwDataSize
, dwNumBytes
);
5942 dwNumMsgs
= dwNumBytes
= -1;
5943 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], 0,
5944 DPMESSAGEQUEUE_RECEIVE
,
5945 &dwNumMsgs
, &dwNumBytes
);
5946 checkHR( DP_OK
, hr
);
5947 check( 4, dwNumMsgs
);
5948 check( 4*dwDataSize
, dwNumBytes
);
5950 dwNumMsgs
= dwNumBytes
= -1;
5951 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[0], 0,
5952 DPMESSAGEQUEUE_RECEIVE
,
5953 &dwNumMsgs
, &dwNumBytes
);
5954 checkHR( DP_OK
, hr
);
5955 check( 3, dwNumMsgs
);
5956 check( 3*dwDataSize
, dwNumBytes
);
5958 dwNumMsgs
= dwNumBytes
= -1;
5959 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], 0, dpid
[3],
5960 DPMESSAGEQUEUE_RECEIVE
,
5961 &dwNumMsgs
, &dwNumBytes
);
5962 checkHR( DP_OK
, hr
);
5963 check( 5, dwNumMsgs
);
5964 check( 5*dwDataSize
, dwNumBytes
);
5966 dwNumMsgs
= dwNumBytes
= -1;
5967 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5968 DPMESSAGEQUEUE_RECEIVE
,
5969 &dwNumMsgs
, &dwNumBytes
);
5970 checkHR( DP_OK
, hr
);
5971 check( 4, dwNumMsgs
);
5972 check( 4*dwDataSize
, dwNumBytes
);
5974 dwNumMsgs
= dwNumBytes
= -1;
5975 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], 0, 0,
5976 DPMESSAGEQUEUE_RECEIVE
,
5977 &dwNumMsgs
, &dwNumBytes
);
5978 checkHR( DP_OK
, hr
);
5979 check( 5, dwNumMsgs
);
5980 check( 5*dwDataSize
, dwNumBytes
);
5983 dwNumMsgs
= dwNumBytes
= -1;
5984 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5985 DPMESSAGEQUEUE_SEND
,
5986 &dwNumMsgs
, &dwNumBytes
);
5987 checkHR( DP_OK
, hr
);
5988 check( 0, dwNumMsgs
);
5989 check( 0, dwNumBytes
);
5991 dwNumMsgs
= dwNumBytes
= -1;
5992 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5994 &dwNumMsgs
, &dwNumBytes
);
5995 checkHR( DP_OK
, hr
);
5996 check( 0, dwNumMsgs
);
5997 check( 0, dwNumBytes
);
6000 HeapFree( GetProcessHeap(), 0, lpData
);
6001 IDirectPlayX_Release( pDP
[0] );
6002 IDirectPlayX_Release( pDP
[1] );
6006 /* Remote data replication */
6008 static void test_remote_data_replication(void)
6011 IDirectPlay4
*pDP
[2];
6012 DPSESSIONDESC2 dpsd
;
6013 DPID dpid
[2], idFrom
, idTo
;
6014 CallbackData callbackData
;
6017 DWORD dwFlags
, dwDataSize
= 1024;
6020 LPDPMSG_SETPLAYERORGROUPDATA lpData
= HeapAlloc( GetProcessHeap(),
6024 LPCSTR lpDataLocal
[] = { "local_0", "local_1" };
6025 LPCSTR lpDataRemote
[] = { "remote_0", "remote_1" };
6026 LPCSTR lpDataFake
= "ugly_fake_data";
6027 LPSTR lpDataGet
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 32 );
6028 DWORD dwDataSizeLocal
= strlen(lpDataLocal
[0])+1,
6029 dwDataSizeRemote
= strlen(lpDataRemote
[0])+1,
6030 dwDataSizeFake
= strlen(lpDataFake
)+1,
6036 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
6037 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
6038 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
6039 if (FAILED(hr
)) return;
6040 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
6042 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
6043 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
6044 dpsd
.guidApplication
= appGuid
;
6047 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
6048 todo_wine
checkHR( DP_OK
, hr
);
6050 if ( hr
== DPERR_UNINITIALIZED
)
6052 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
6056 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
6057 NULL
, NULL
, NULL
, 0, 0 );
6058 checkHR( DP_OK
, hr
);
6061 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
6063 checkHR( DP_OK
, hr
);
6065 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
6066 NULL
, NULL
, NULL
, 0, 0 );
6067 checkHR( DP_OK
, hr
);
6072 /* Local (0,0) (1,1) */
6073 IDirectPlayX_GetPlayerFlags( pDP
[i
], dpid
[i
], &dwFlags
);
6074 checkFlags( DPPLAYER_LOCAL
, dwFlags
, FLAGS_DPPLAYER
);
6075 /* Remote (0,1) (1,0) */
6076 IDirectPlayX_GetPlayerFlags( pDP
[i
], dpid
[!i
], &dwFlags
);
6077 checkFlags( 0, dwFlags
, FLAGS_DPPLAYER
);
6080 /* Set data for a local player */
6083 hr
= IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[i
],
6084 (LPVOID
) lpDataLocal
[i
],
6087 checkHR( DP_OK
, hr
);
6088 hr
= IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[i
],
6089 (LPVOID
) lpDataRemote
[i
],
6092 checkHR( DP_OK
, hr
);
6095 /* Retrieve data locally (0->0, 1->1) */
6098 dwDataSizeGet
= dwDataSizeFake
;
6099 strcpy( lpDataGet
, lpDataFake
);
6100 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[i
],
6101 lpDataGet
, &dwDataSizeGet
,
6103 checkHR( DP_OK
, hr
);
6104 check( dwDataSizeLocal
, dwDataSizeGet
);
6105 checkStr( lpDataLocal
[i
], lpDataGet
);
6107 dwDataSizeGet
= dwDataSizeFake
;
6108 strcpy( lpDataGet
, lpDataFake
);
6109 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[i
],
6110 lpDataGet
, &dwDataSizeGet
,
6112 checkHR( DP_OK
, hr
);
6113 check( dwDataSizeRemote
, dwDataSizeGet
);
6114 checkStr( lpDataRemote
[i
], lpDataGet
);
6118 /* Set data for a remote player */
6119 /* This should fail with DPERR_ACCESSDENIED,
6120 but for some reason it doesn't */
6123 IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[!i
],
6124 (LPVOID
) lpDataLocal
[!i
],
6127 checkHR( DP_OK
, hr
);
6128 IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[!i
],
6129 (LPVOID
) lpDataRemote
[!i
],
6132 checkHR( DP_OK
, hr
);
6135 /* Retrieve crossed data (0->1, 1->0) */
6138 dwDataSizeGet
= dwDataSizeFake
;
6139 strcpy( lpDataGet
, lpDataFake
);
6140 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[!i
],
6141 lpDataGet
, &dwDataSizeGet
,
6143 checkHR( DP_OK
, hr
);
6144 check( dwDataSizeLocal
, dwDataSizeGet
);
6145 checkStr( lpDataLocal
[!i
], lpDataGet
);
6147 dwDataSizeGet
= dwDataSizeFake
;
6148 strcpy( lpDataGet
, lpDataFake
);
6149 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[!i
],
6150 lpDataGet
, &dwDataSizeGet
,
6152 checkHR( DP_OK
, hr
);
6153 check( dwDataSizeRemote
, dwDataSizeGet
);
6154 checkStr( lpDataRemote
[!i
], lpDataGet
);
6158 /* Purge "new player" messages from queue */
6159 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
6160 checkHR( DP_OK
, hr
);
6161 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6163 /* Check number of messages in queue */
6166 IDirectPlayX_GetMessageCount( pDP
[i
], dpid
[i
], &dwCount
);
6167 check( 2, dwCount
);
6168 IDirectPlayX_GetMessageCount( pDP
[i
], dpid
[!i
], &dwCount
);
6169 check( 0, dwCount
);
6172 /* Checking system messages */
6177 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0, lpData
,
6179 checkHR( DP_OK
, hr
);
6180 check( 29, dwDataSize
);
6181 check( DPID_SYSMSG
, idFrom
);
6182 check( dpid
[i
], idTo
);
6183 checkConv( DPSYS_SETPLAYERORGROUPDATA
, lpData
->dwType
,
6185 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6186 check( dpid
[j
], lpData
->dpId
);
6187 checkStr( lpDataRemote
[j
], (LPSTR
) lpData
->lpData
);
6188 check( dwDataSizeRemote
, lpData
->dwDataSize
);
6191 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0,
6192 lpData
, &dwDataSize
);
6193 checkHR( DPERR_NOMESSAGES
, hr
);
6197 /* Changing remote data */
6198 hr
= IDirectPlayX_SetPlayerData( pDP
[0], dpid
[0],
6199 (LPVOID
) lpDataRemote
[0], dwDataSizeRemote
,
6201 checkHR( DP_OK
, hr
);
6203 /* Checking system messages (j=0) */
6206 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0,
6207 lpData
, &dwDataSize
);
6208 checkHR( DP_OK
, hr
);
6209 check( 29, dwDataSize
);
6210 check( DPID_SYSMSG
, idFrom
);
6211 check( dpid
[i
], idTo
);
6212 checkConv( DPSYS_SETPLAYERORGROUPDATA
, lpData
->dwType
, dpMsgType2str
);
6213 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6214 check( dpid
[0], lpData
->dpId
);
6215 checkStr( lpDataRemote
[0], (LPSTR
) lpData
->lpData
);
6216 check( dwDataSizeRemote
, lpData
->dwDataSize
);
6220 /* Queue is empty */
6221 check_messages( pDP
[0], dpid
, 2, &callbackData
);
6222 checkStr( "", callbackData
.szTrace1
);
6223 check_messages( pDP
[1], dpid
, 2, &callbackData
);
6224 checkStr( "", callbackData
.szTrace1
);
6227 HeapFree( GetProcessHeap(), 0, lpDataGet
);
6228 HeapFree( GetProcessHeap(), 0, lpData
);
6229 IDirectPlayX_Release( pDP
[0] );
6230 IDirectPlayX_Release( pDP
[1] );
6234 /* Host migration */
6236 static void test_host_migration(void)
6239 IDirectPlay4
*pDP
[2];
6240 DPSESSIONDESC2 dpsd
;
6241 DPID dpid
[2], idFrom
, idTo
;
6246 DWORD dwDataSize
= 1024;
6247 LPDPMSG_DESTROYPLAYERORGROUP lpData
= HeapAlloc( GetProcessHeap(),
6254 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
6255 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
6256 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
6257 if (FAILED(hr
)) return;
6258 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
6260 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
6261 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
6262 dpsd
.guidApplication
= appGuid
;
6263 dpsd
.dwMaxPlayers
= 10;
6264 dpsd
.dwFlags
= DPSESSION_MIGRATEHOST
;
6267 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
6268 todo_wine
checkHR( DP_OK
, hr
);
6272 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
6276 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
6277 checkHR( DP_OK
, hr
);
6280 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
6282 checkHR( DP_OK
, hr
);
6284 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
6285 checkHR( DP_OK
, hr
);
6288 /* Host: One message in queue */
6289 IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
6290 check( 1, dwCount
);
6292 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6293 lpData
, &dwDataSize
);
6294 checkHR( DP_OK
, hr
);
6295 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6297 /* Peer: No messages */
6298 IDirectPlayX_GetMessageCount( pDP
[1], dpid
[1], &dwCount
);
6299 check( 0, dwCount
);
6300 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6301 lpData
, &dwDataSize
);
6302 checkHR( DPERR_NOMESSAGES
, hr
);
6306 IDirectPlayX_Close( pDP
[0] );
6309 /* Host: Queue is cleaned */
6310 IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
6311 check( 0, dwCount
);
6312 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6313 lpData
, &dwDataSize
);
6314 checkHR( DPERR_NOMESSAGES
, hr
);
6316 /* Peer: gets message of player destruction */
6317 IDirectPlayX_GetMessageCount( pDP
[1], dpid
[1], &dwCount
);
6318 check( 2, dwCount
);
6320 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6321 lpData
, &dwDataSize
);
6322 checkHR( DP_OK
, hr
);
6323 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6326 /* Message analysis */
6329 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, 0,
6330 lpData
, &dwDataSize
);
6331 checkHR( DP_OK
, hr
);
6332 check( DPID_SYSMSG
, idFrom
);
6333 check( dpid
[1], idTo
); /* Peer player id */
6337 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
,
6339 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6340 check( dpid
[0], lpData
->dpId
); /* Host player id */
6341 checkLP( NULL
, lpData
->lpLocalData
);
6342 check( 0, lpData
->dwLocalDataSize
);
6343 checkLP( NULL
, lpData
->lpRemoteData
);
6344 check( 0, lpData
->dwRemoteDataSize
);
6345 checkLP( NULL
, U1(lpData
->dpnName
).lpszShortNameA
);
6346 check( 0, lpData
->dpIdParent
);
6347 checkFlags( 0, lpData
->dwFlags
,
6348 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
6351 checkConv( DPSYS_HOST
, lpData
->dwType
, dpMsgType2str
);
6358 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
6359 checkHR( DPERR_NOMESSAGES
, hr
);
6362 HeapFree( GetProcessHeap(), 0, lpData
);
6363 IDirectPlayX_Release( pDP
[0] );
6364 IDirectPlayX_Release( pDP
[1] );
6368 static void test_COM(void)
6371 IDirectPlay2A
*dp2A
;
6373 IDirectPlay3A
*dp3A
;
6375 IDirectPlay4A
*dp4A
;
6376 IDirectPlay4
*dp4
= (IDirectPlay4
*)0xdeadbeef;
6381 /* COM aggregation */
6382 hr
= CoCreateInstance(&CLSID_DirectPlay
, (IUnknown
*)&dp4
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
,
6384 ok(hr
== CLASS_E_NOAGGREGATION
|| broken(hr
== E_INVALIDARG
),
6385 "DirectPlay create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
6386 ok(!dp4
|| dp4
== (IDirectPlay4
*)0xdeadbeef, "dp4 = %p\n", dp4
);
6389 hr
= CoCreateInstance(&CLSID_DirectPlay
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlayLobby
,
6391 ok(hr
== E_NOINTERFACE
, "DirectPlay create failed: %08x, expected E_NOINTERFACE\n", hr
);
6393 /* Different refcount for all DirectPlay Interfaces */
6394 hr
= CoCreateInstance(&CLSID_DirectPlay
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlay4
,
6396 ok(hr
== S_OK
, "DirectPlay create failed: %08x, expected S_OK\n", hr
);
6397 refcount
= IDirectPlayX_AddRef(dp4
);
6398 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6400 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay2A
, (void**)&dp2A
);
6401 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay2A failed: %08x\n", hr
);
6402 refcount
= IDirectPlay2_AddRef(dp2A
);
6403 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6404 IDirectPlay2_Release(dp2A
);
6406 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay2
, (void**)&dp2
);
6407 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay2 failed: %08x\n", hr
);
6408 refcount
= IDirectPlay2_AddRef(dp2
);
6409 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6410 IDirectPlay2_Release(dp2
);
6412 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay3A
, (void**)&dp3A
);
6413 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay3A failed: %08x\n", hr
);
6414 refcount
= IDirectPlay3_AddRef(dp3A
);
6415 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6416 IDirectPlay3_Release(dp3A
);
6418 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay3
, (void**)&dp3
);
6419 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay3 failed: %08x\n", hr
);
6420 refcount
= IDirectPlay3_AddRef(dp3
);
6421 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6422 IDirectPlay3_Release(dp3
);
6424 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay4A
, (void**)&dp4A
);
6425 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay4A failed: %08x\n", hr
);
6426 refcount
= IDirectPlayX_AddRef(dp4A
);
6427 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6428 IDirectPlayX_Release(dp4A
);
6430 /* IDirectPlay and IUnknown share a refcount */
6431 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay
, (void**)&dp
);
6432 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay failed: %08x\n", hr
);
6433 refcount
= IDirectPlayX_AddRef(dp
);
6434 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6435 IDirectPlay_Release(dp
);
6437 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IUnknown
, (void**)&unk
);
6438 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
6439 refcount
= IUnknown_AddRef(unk
);
6440 ok(refcount
== 3, "refcount == %u, expected 3\n", refcount
);
6441 refcount
= IUnknown_Release(unk
);
6442 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6444 IUnknown_Release(unk
);
6445 IDirectPlay_Release(dp
);
6446 IDirectPlayX_Release(dp4A
);
6447 IDirectPlay3_Release(dp3
);
6448 IDirectPlay3_Release(dp3A
);
6449 IDirectPlay2_Release(dp2
);
6450 IDirectPlay2_Release(dp2A
);
6451 IDirectPlayX_Release(dp4
);
6452 refcount
= IDirectPlayX_Release(dp4
);
6453 ok(refcount
== 0, "refcount == %u, expected 0\n", refcount
);
6456 static void test_COM_dplobby(void)
6458 IDirectPlayLobby
*dpl
= (IDirectPlayLobby
*)0xdeadbeef;
6459 IDirectPlayLobbyA
*dplA
;
6460 IDirectPlayLobby2A
*dpl2A
;
6461 IDirectPlayLobby2
*dpl2
;
6462 IDirectPlayLobby3A
*dpl3A
;
6463 IDirectPlayLobby3
*dpl3
;
6468 /* COM aggregation */
6469 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, (IUnknown
*)&dpl
, CLSCTX_INPROC_SERVER
,
6470 &IID_IUnknown
, (void**)&dpl
);
6471 ok(hr
== CLASS_E_NOAGGREGATION
|| broken(hr
== E_INVALIDARG
),
6472 "DirectPlayLobby create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
6473 ok(!dpl
|| dpl
== (IDirectPlayLobby
*)0xdeadbeef, "dp4 = %p\n", dpl
);
6476 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlay
,
6478 ok(hr
== E_NOINTERFACE
, "DirectPlayLobby create failed: %08x, expected E_NOINTERFACE\n", hr
);
6480 /* Different refcount for all DirectPlayLobby Interfaces */
6481 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlayLobby
,
6483 ok(hr
== S_OK
, "DirectPlayLobby create failed: %08x, expected S_OK\n", hr
);
6484 refcount
= IDirectPlayLobby_AddRef(dpl
);
6485 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6487 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobbyA
, (void**)&dplA
);
6488 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobbyA failed: %08x\n", hr
);
6489 refcount
= IDirectPlayLobby_AddRef(dplA
);
6490 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6491 IDirectPlayLobby_Release(dplA
);
6493 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby2
, (void**)&dpl2
);
6494 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby2 failed: %08x\n", hr
);
6495 refcount
= IDirectPlayLobby_AddRef(dpl2
);
6496 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6497 IDirectPlayLobby_Release(dpl2
);
6499 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby2A
, (void**)&dpl2A
);
6500 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby2A failed: %08x\n", hr
);
6501 refcount
= IDirectPlayLobby_AddRef(dpl2A
);
6502 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6503 IDirectPlayLobby_Release(dpl2A
);
6505 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby3
, (void**)&dpl3
);
6506 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby3 failed: %08x\n", hr
);
6507 refcount
= IDirectPlayLobby_AddRef(dpl3
);
6508 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6509 IDirectPlayLobby_Release(dpl3
);
6511 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby3A
, (void**)&dpl3A
);
6512 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby3A failed: %08x\n", hr
);
6513 refcount
= IDirectPlayLobby_AddRef(dpl3A
);
6514 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6515 IDirectPlayLobby_Release(dpl3A
);
6517 /* IDirectPlayLobby and IUnknown share a refcount */
6518 hr
= IDirectPlayX_QueryInterface(dpl
, &IID_IUnknown
, (void**)&unk
);
6519 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
6520 refcount
= IUnknown_AddRef(unk
);
6521 ok(refcount
== 4, "refcount == %u, expected 4\n", refcount
);
6522 IDirectPlayLobby_Release(unk
);
6524 IUnknown_Release(unk
);
6525 IDirectPlayLobby_Release(dpl3
);
6526 IDirectPlayLobby_Release(dpl3A
);
6527 IDirectPlayLobby_Release(dpl2
);
6528 IDirectPlayLobby_Release(dpl2A
);
6529 IDirectPlayLobby_Release(dplA
);
6530 IDirectPlayLobby_Release(dpl
);
6531 refcount
= IDirectPlayLobby_Release(dpl
);
6532 ok(refcount
== 0, "refcount == %u, expected 0\n", refcount
);
6538 CoInitialize( NULL
);
6543 if (!winetest_interactive
)
6545 skip("Run in interactive mode to run dplayx tests.\n");
6549 trace("Running in interactive mode, tests will take a while\n");
6551 test_DirectPlayCreate();
6552 test_EnumConnections();
6553 test_InitializeConnection();
6556 /* test_Open() takes almost a minute, */
6558 /* test_EnumSession takes three minutes */
6559 test_EnumSessions();
6562 /* test_CreatePlayer() takes over a minute */
6563 test_CreatePlayer();
6564 test_GetPlayerCaps();
6568 /* test_GetPlayerAccount() takes over 30s */
6569 test_GetPlayerAccount();
6570 test_GetPlayerAddress();
6571 test_GetPlayerFlags();
6578 test_EnumGroupsInGroup();
6585 test_GetMessageCount();
6586 test_GetMessageQueue();
6588 test_remote_data_replication();
6589 test_host_migration();