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 if (!guid
) return "(null)";
92 /* Service providers */
93 if (IsEqualGUID(guid
, &DPSPGUID_IPX
))
94 return "DPSPGUID_IPX";
95 if (IsEqualGUID(guid
, &DPSPGUID_TCPIP
))
96 return "DPSPGUID_TCPIP";
97 if (IsEqualGUID(guid
, &DPSPGUID_SERIAL
))
98 return "DPSPGUID_SERIAL";
99 if (IsEqualGUID(guid
, &DPSPGUID_MODEM
))
100 return "DPSPGUID_MODEM";
101 /* DirectPlay Address IDs */
102 if (IsEqualGUID(guid
, &DPAID_TotalSize
))
103 return "DPAID_TotalSize";
104 if (IsEqualGUID(guid
, &DPAID_ServiceProvider
))
105 return "DPAID_ServiceProvider";
106 if (IsEqualGUID(guid
, &DPAID_LobbyProvider
))
107 return "DPAID_LobbyProvider";
108 if (IsEqualGUID(guid
, &DPAID_Phone
))
109 return "DPAID_Phone";
110 if (IsEqualGUID(guid
, &DPAID_PhoneW
))
111 return "DPAID_PhoneW";
112 if (IsEqualGUID(guid
, &DPAID_Modem
))
113 return "DPAID_Modem";
114 if (IsEqualGUID(guid
, &DPAID_ModemW
))
115 return "DPAID_ModemW";
116 if (IsEqualGUID(guid
, &DPAID_INet
))
118 if (IsEqualGUID(guid
, &DPAID_INetW
))
119 return "DPAID_INetW";
120 if (IsEqualGUID(guid
, &DPAID_INetPort
))
121 return "DPAID_INetPort";
122 if (IsEqualGUID(guid
, &DPAID_ComPort
))
123 return "DPAID_ComPort";
125 return wine_dbgstr_guid(guid
);
129 static LPCSTR
dpResult2str(HRESULT hr
)
133 case DP_OK
: return "DP_OK";
134 case DPERR_ALREADYINITIALIZED
: return "DPERR_ALREADYINITIALIZED";
135 case DPERR_ACCESSDENIED
: return "DPERR_ACCESSDENIED";
136 case DPERR_ACTIVEPLAYERS
: return "DPERR_ACTIVEPLAYERS";
137 case DPERR_BUFFERTOOSMALL
: return "DPERR_BUFFERTOOSMALL";
138 case DPERR_CANTADDPLAYER
: return "DPERR_CANTADDPLAYER";
139 case DPERR_CANTCREATEGROUP
: return "DPERR_CANTCREATEGROUP";
140 case DPERR_CANTCREATEPLAYER
: return "DPERR_CANTCREATEPLAYER";
141 case DPERR_CANTCREATESESSION
: return "DPERR_CANTCREATESESSION";
142 case DPERR_CAPSNOTAVAILABLEYET
: return "DPERR_CAPSNOTAVAILABLEYET";
143 case DPERR_EXCEPTION
: return "DPERR_EXCEPTION";
144 case DPERR_GENERIC
: return "DPERR_GENERIC";
145 case DPERR_INVALIDFLAGS
: return "DPERR_INVALIDFLAGS";
146 case DPERR_INVALIDOBJECT
: return "DPERR_INVALIDOBJECT";
147 case DPERR_INVALIDPARAMS
: return "DPERR_INVALIDPARAMS";
148 /* symbol with the same value: DPERR_INVALIDPARAM */
149 case DPERR_INVALIDPLAYER
: return "DPERR_INVALIDPLAYER";
150 case DPERR_INVALIDGROUP
: return "DPERR_INVALIDGROUP";
151 case DPERR_NOCAPS
: return "DPERR_NOCAPS";
152 case DPERR_NOCONNECTION
: return "DPERR_NOCONNECTION";
153 case DPERR_NOMEMORY
: return "DPERR_NOMEMORY";
154 /* symbol with the same value: DPERR_OUTOFMEMORY */
155 case DPERR_NOMESSAGES
: return "DPERR_NOMESSAGES";
156 case DPERR_NONAMESERVERFOUND
: return "DPERR_NONAMESERVERFOUND";
157 case DPERR_NOPLAYERS
: return "DPERR_NOPLAYERS";
158 case DPERR_NOSESSIONS
: return "DPERR_NOSESSIONS";
159 case DPERR_PENDING
: return "DPERR_PENDING";
160 case DPERR_SENDTOOBIG
: return "DPERR_SENDTOOBIG";
161 case DPERR_TIMEOUT
: return "DPERR_TIMEOUT";
162 case DPERR_UNAVAILABLE
: return "DPERR_UNAVAILABLE";
163 case DPERR_UNSUPPORTED
: return "DPERR_UNSUPPORTED";
164 case DPERR_BUSY
: return "DPERR_BUSY";
165 case DPERR_USERCANCEL
: return "DPERR_USERCANCEL";
166 case DPERR_NOINTERFACE
: return "DPERR_NOINTERFACE";
167 case DPERR_CANNOTCREATESERVER
: return "DPERR_CANNOTCREATESERVER";
168 case DPERR_PLAYERLOST
: return "DPERR_PLAYERLOST";
169 case DPERR_SESSIONLOST
: return "DPERR_SESSIONLOST";
170 case DPERR_UNINITIALIZED
: return "DPERR_UNINITIALIZED";
171 case DPERR_NONEWPLAYERS
: return "DPERR_NONEWPLAYERS";
172 case DPERR_INVALIDPASSWORD
: return "DPERR_INVALIDPASSWORD";
173 case DPERR_CONNECTING
: return "DPERR_CONNECTING";
174 case DPERR_CONNECTIONLOST
: return "DPERR_CONNECTIONLOST";
175 case DPERR_UNKNOWNMESSAGE
: return "DPERR_UNKNOWNMESSAGE";
176 case DPERR_CANCELFAILED
: return "DPERR_CANCELFAILED";
177 case DPERR_INVALIDPRIORITY
: return "DPERR_INVALIDPRIORITY";
178 case DPERR_NOTHANDLED
: return "DPERR_NOTHANDLED";
179 case DPERR_CANCELLED
: return "DPERR_CANCELLED";
180 case DPERR_ABORTED
: return "DPERR_ABORTED";
181 case DPERR_BUFFERTOOLARGE
: return "DPERR_BUFFERTOOLARGE";
182 case DPERR_CANTCREATEPROCESS
: return "DPERR_CANTCREATEPROCESS";
183 case DPERR_APPNOTSTARTED
: return "DPERR_APPNOTSTARTED";
184 case DPERR_INVALIDINTERFACE
: return "DPERR_INVALIDINTERFACE";
185 case DPERR_NOSERVICEPROVIDER
: return "DPERR_NOSERVICEPROVIDER";
186 case DPERR_UNKNOWNAPPLICATION
: return "DPERR_UNKNOWNAPPLICATION";
187 case DPERR_NOTLOBBIED
: return "DPERR_NOTLOBBIED";
188 case DPERR_SERVICEPROVIDERLOADED
: return "DPERR_SERVICEPROVIDERLOADED";
189 case DPERR_ALREADYREGISTERED
: return "DPERR_ALREADYREGISTERED";
190 case DPERR_NOTREGISTERED
: return "DPERR_NOTREGISTERED";
191 case DPERR_AUTHENTICATIONFAILED
: return "DPERR_AUTHENTICATIONFAILED";
192 case DPERR_CANTLOADSSPI
: return "DPERR_CANTLOADSSPI";
193 case DPERR_ENCRYPTIONFAILED
: return "DPERR_ENCRYPTIONFAILED";
194 case DPERR_SIGNFAILED
: return "DPERR_SIGNFAILED";
195 case DPERR_CANTLOADSECURITYPACKAGE
: return "DPERR_CANTLOADSECURITYPACKAGE";
196 case DPERR_ENCRYPTIONNOTSUPPORTED
: return "DPERR_ENCRYPTIONNOTSUPPORTED";
197 case DPERR_CANTLOADCAPI
: return "DPERR_CANTLOADCAPI";
198 case DPERR_NOTLOGGEDIN
: return "DPERR_NOTLOGGEDIN";
199 case DPERR_LOGONDENIED
: return "DPERR_LOGONDENIED";
200 case CLASS_E_NOAGGREGATION
: return "CLASS_E_NOAGGREGATION";
204 LPSTR buffer
= get_temp_buffer();
205 sprintf( buffer
, "%d", HRESULT_CODE(hr
) );
211 static LPCSTR
dpMsgType2str(DWORD dwType
)
215 case DPSYS_CREATEPLAYERORGROUP
: return "DPSYS_CREATEPLAYERORGROUP";
216 case DPSYS_DESTROYPLAYERORGROUP
: return "DPSYS_DESTROYPLAYERORGROUP";
217 case DPSYS_ADDPLAYERTOGROUP
: return "DPSYS_ADDPLAYERTOGROUP";
218 case DPSYS_DELETEPLAYERFROMGROUP
: return "DPSYS_DELETEPLAYERFROMGROUP";
219 case DPSYS_SESSIONLOST
: return "DPSYS_SESSIONLOST";
220 case DPSYS_HOST
: return "DPSYS_HOST";
221 case DPSYS_SETPLAYERORGROUPDATA
: return "DPSYS_SETPLAYERORGROUPDATA";
222 case DPSYS_SETPLAYERORGROUPNAME
: return "DPSYS_SETPLAYERORGROUPNAME";
223 case DPSYS_SETSESSIONDESC
: return "DPSYS_SETSESSIONDESC";
224 case DPSYS_ADDGROUPTOGROUP
: return "DPSYS_ADDGROUPTOGROUP";
225 case DPSYS_DELETEGROUPFROMGROUP
: return "DPSYS_DELETEGROUPFROMGROUP";
226 case DPSYS_SECUREMESSAGE
: return "DPSYS_SECUREMESSAGE";
227 case DPSYS_STARTSESSION
: return "DPSYS_STARTSESSION";
228 case DPSYS_CHAT
: return "DPSYS_DPSYS_CHAT";
229 case DPSYS_SETGROUPOWNER
: return "DPSYS_SETGROUPOWNER";
230 case DPSYS_SENDCOMPLETE
: return "DPSYS_SENDCOMPLETE";
232 default: return "UNKNOWN";
236 static LPCSTR
dwFlags2str(DWORD dwFlags
, DWORD flagType
)
239 #define FLAGS_DPCONNECTION (1<<0)
240 #define FLAGS_DPENUMPLAYERS (1<<1)
241 #define FLAGS_DPENUMGROUPS (1<<2)
242 #define FLAGS_DPPLAYER (1<<3)
243 #define FLAGS_DPGROUP (1<<4)
244 #define FLAGS_DPENUMSESSIONS (1<<5)
245 #define FLAGS_DPGETCAPS (1<<6)
246 #define FLAGS_DPGET (1<<7)
247 #define FLAGS_DPRECEIVE (1<<8)
248 #define FLAGS_DPSEND (1<<9)
249 #define FLAGS_DPSET (1<<10)
250 #define FLAGS_DPMESSAGEQUEUE (1<<11)
251 #define FLAGS_DPCONNECT (1<<12)
252 #define FLAGS_DPOPEN (1<<13)
253 #define FLAGS_DPSESSION (1<<14)
254 #define FLAGS_DPLCONNECTION (1<<15)
255 #define FLAGS_DPESC (1<<16)
256 #define FLAGS_DPCAPS (1<<17)
258 LPSTR flags
= get_temp_buffer();
260 /* EnumConnections */
262 if (flagType
& FLAGS_DPCONNECTION
)
264 if (dwFlags
& DPCONNECTION_DIRECTPLAY
)
265 strcat(flags
, "DPCONNECTION_DIRECTPLAY,");
266 if (dwFlags
& DPCONNECTION_DIRECTPLAYLOBBY
)
267 strcat(flags
, "DPCONNECTION_DIRECTPLAYLOBBY,");
273 if (flagType
& FLAGS_DPENUMPLAYERS
)
275 if (dwFlags
== DPENUMPLAYERS_ALL
)
276 strcat(flags
, "DPENUMPLAYERS_ALL,");
277 if (dwFlags
& DPENUMPLAYERS_LOCAL
)
278 strcat(flags
, "DPENUMPLAYERS_LOCAL,");
279 if (dwFlags
& DPENUMPLAYERS_REMOTE
)
280 strcat(flags
, "DPENUMPLAYERS_REMOTE,");
281 if (dwFlags
& DPENUMPLAYERS_GROUP
)
282 strcat(flags
, "DPENUMPLAYERS_GROUP,");
283 if (dwFlags
& DPENUMPLAYERS_SESSION
)
284 strcat(flags
, "DPENUMPLAYERS_SESSION,");
285 if (dwFlags
& DPENUMPLAYERS_SERVERPLAYER
)
286 strcat(flags
, "DPENUMPLAYERS_SERVERPLAYER,");
287 if (dwFlags
& DPENUMPLAYERS_SPECTATOR
)
288 strcat(flags
, "DPENUMPLAYERS_SPECTATOR,");
289 if (dwFlags
& DPENUMPLAYERS_OWNER
)
290 strcat(flags
, "DPENUMPLAYERS_OWNER,");
292 if (flagType
& FLAGS_DPENUMGROUPS
)
294 if (dwFlags
== DPENUMGROUPS_ALL
)
295 strcat(flags
, "DPENUMGROUPS_ALL,");
296 if (dwFlags
& DPENUMPLAYERS_LOCAL
)
297 strcat(flags
, "DPENUMGROUPS_LOCAL,");
298 if (dwFlags
& DPENUMPLAYERS_REMOTE
)
299 strcat(flags
, "DPENUMGROUPS_REMOTE,");
300 if (dwFlags
& DPENUMPLAYERS_GROUP
)
301 strcat(flags
, "DPENUMGROUPS_GROUP,");
302 if (dwFlags
& DPENUMPLAYERS_SESSION
)
303 strcat(flags
, "DPENUMGROUPS_SESSION,");
304 if (dwFlags
& DPENUMGROUPS_SHORTCUT
)
305 strcat(flags
, "DPENUMGROUPS_SHORTCUT,");
306 if (dwFlags
& DPENUMGROUPS_STAGINGAREA
)
307 strcat(flags
, "DPENUMGROUPS_STAGINGAREA,");
308 if (dwFlags
& DPENUMGROUPS_HIDDEN
)
309 strcat(flags
, "DPENUMGROUPS_HIDDEN,");
314 if (flagType
& FLAGS_DPPLAYER
)
316 if (dwFlags
& DPPLAYER_SERVERPLAYER
)
317 strcat(flags
, "DPPLAYER_SERVERPLAYER,");
318 if (dwFlags
& DPPLAYER_SPECTATOR
)
319 strcat(flags
, "DPPLAYER_SPECTATOR,");
320 if (dwFlags
& DPPLAYER_LOCAL
)
321 strcat(flags
, "DPPLAYER_LOCAL,");
322 if (dwFlags
& DPPLAYER_OWNER
)
323 strcat(flags
, "DPPLAYER_OWNER,");
328 if (flagType
& FLAGS_DPGROUP
)
330 if (dwFlags
& DPGROUP_STAGINGAREA
)
331 strcat(flags
, "DPGROUP_STAGINGAREA,");
332 if (dwFlags
& DPGROUP_LOCAL
)
333 strcat(flags
, "DPGROUP_LOCAL,");
334 if (dwFlags
& DPGROUP_HIDDEN
)
335 strcat(flags
, "DPGROUP_HIDDEN,");
340 if (flagType
& FLAGS_DPENUMSESSIONS
)
342 if (dwFlags
& DPENUMSESSIONS_AVAILABLE
)
343 strcat(flags
, "DPENUMSESSIONS_AVAILABLE,");
344 if (dwFlags
& DPENUMSESSIONS_ALL
)
345 strcat(flags
, "DPENUMSESSIONS_ALL,");
346 if (dwFlags
& DPENUMSESSIONS_ASYNC
)
347 strcat(flags
, "DPENUMSESSIONS_ASYNC,");
348 if (dwFlags
& DPENUMSESSIONS_STOPASYNC
)
349 strcat(flags
, "DPENUMSESSIONS_STOPASYNC,");
350 if (dwFlags
& DPENUMSESSIONS_PASSWORDREQUIRED
)
351 strcat(flags
, "DPENUMSESSIONS_PASSWORDREQUIRED,");
352 if (dwFlags
& DPENUMSESSIONS_RETURNSTATUS
)
353 strcat(flags
, "DPENUMSESSIONS_RETURNSTATUS,");
359 if (flagType
& FLAGS_DPGETCAPS
)
361 if (dwFlags
& DPGETCAPS_GUARANTEED
)
362 strcat(flags
, "DPGETCAPS_GUARANTEED,");
368 if (flagType
& FLAGS_DPGET
)
370 if (dwFlags
== DPGET_REMOTE
)
371 strcat(flags
, "DPGET_REMOTE,");
372 if (dwFlags
& DPGET_LOCAL
)
373 strcat(flags
, "DPGET_LOCAL,");
378 if (flagType
& FLAGS_DPRECEIVE
)
380 if (dwFlags
& DPRECEIVE_ALL
)
381 strcat(flags
, "DPRECEIVE_ALL,");
382 if (dwFlags
& DPRECEIVE_TOPLAYER
)
383 strcat(flags
, "DPRECEIVE_TOPLAYER,");
384 if (dwFlags
& DPRECEIVE_FROMPLAYER
)
385 strcat(flags
, "DPRECEIVE_FROMPLAYER,");
386 if (dwFlags
& DPRECEIVE_PEEK
)
387 strcat(flags
, "DPRECEIVE_PEEK,");
392 if (flagType
& FLAGS_DPSEND
)
394 /*if (dwFlags == DPSEND_NONGUARANTEED)
395 strcat(flags, "DPSEND_NONGUARANTEED,");*/
396 if (dwFlags
== DPSEND_MAX_PRIORITY
) /* = DPSEND_MAX_PRI */
398 strcat(flags
, "DPSEND_MAX_PRIORITY,");
402 if (dwFlags
& DPSEND_GUARANTEED
)
403 strcat(flags
, "DPSEND_GUARANTEED,");
404 if (dwFlags
& DPSEND_HIGHPRIORITY
)
405 strcat(flags
, "DPSEND_HIGHPRIORITY,");
406 if (dwFlags
& DPSEND_OPENSTREAM
)
407 strcat(flags
, "DPSEND_OPENSTREAM,");
408 if (dwFlags
& DPSEND_CLOSESTREAM
)
409 strcat(flags
, "DPSEND_CLOSESTREAM,");
410 if (dwFlags
& DPSEND_SIGNED
)
411 strcat(flags
, "DPSEND_SIGNED,");
412 if (dwFlags
& DPSEND_ENCRYPTED
)
413 strcat(flags
, "DPSEND_ENCRYPTED,");
414 if (dwFlags
& DPSEND_LOBBYSYSTEMMESSAGE
)
415 strcat(flags
, "DPSEND_LOBBYSYSTEMMESSAGE,");
416 if (dwFlags
& DPSEND_ASYNC
)
417 strcat(flags
, "DPSEND_ASYNC,");
418 if (dwFlags
& DPSEND_NOSENDCOMPLETEMSG
)
419 strcat(flags
, "DPSEND_NOSENDCOMPLETEMSG,");
429 if (flagType
& FLAGS_DPSET
)
431 if (dwFlags
== DPSET_REMOTE
)
432 strcat(flags
, "DPSET_REMOTE,");
433 if (dwFlags
& DPSET_LOCAL
)
434 strcat(flags
, "DPSET_LOCAL,");
435 if (dwFlags
& DPSET_GUARANTEED
)
436 strcat(flags
, "DPSET_GUARANTEED,");
439 /* GetMessageQueue */
441 if (flagType
& FLAGS_DPMESSAGEQUEUE
)
443 if (dwFlags
& DPMESSAGEQUEUE_SEND
)
444 strcat(flags
, "DPMESSAGEQUEUE_SEND,");
445 if (dwFlags
& DPMESSAGEQUEUE_RECEIVE
)
446 strcat(flags
, "DPMESSAGEQUEUE_RECEIVE,");
451 if (flagType
& FLAGS_DPCONNECT
)
453 if (dwFlags
& DPCONNECT_RETURNSTATUS
)
454 strcat(flags
, "DPCONNECT_RETURNSTATUS,");
459 if (flagType
& FLAGS_DPOPEN
)
461 if (dwFlags
& DPOPEN_JOIN
)
462 strcat(flags
, "DPOPEN_JOIN,");
463 if (dwFlags
& DPOPEN_CREATE
)
464 strcat(flags
, "DPOPEN_CREATE,");
465 if (dwFlags
& DPOPEN_RETURNSTATUS
)
466 strcat(flags
, "DPOPEN_RETURNSTATUS,");
471 if (flagType
& FLAGS_DPSESSION
)
473 if (dwFlags
& DPSESSION_NEWPLAYERSDISABLED
)
474 strcat(flags
, "DPSESSION_NEWPLAYERSDISABLED,");
475 if (dwFlags
& DPSESSION_MIGRATEHOST
)
476 strcat(flags
, "DPSESSION_MIGRATEHOST,");
477 if (dwFlags
& DPSESSION_NOMESSAGEID
)
478 strcat(flags
, "DPSESSION_NOMESSAGEID,");
479 if (dwFlags
& DPSESSION_JOINDISABLED
)
480 strcat(flags
, "DPSESSION_JOINDISABLED,");
481 if (dwFlags
& DPSESSION_KEEPALIVE
)
482 strcat(flags
, "DPSESSION_KEEPALIVE,");
483 if (dwFlags
& DPSESSION_NODATAMESSAGES
)
484 strcat(flags
, "DPSESSION_NODATAMESSAGES,");
485 if (dwFlags
& DPSESSION_SECURESERVER
)
486 strcat(flags
, "DPSESSION_SECURESERVER,");
487 if (dwFlags
& DPSESSION_PRIVATE
)
488 strcat(flags
, "DPSESSION_PRIVATE,");
489 if (dwFlags
& DPSESSION_PASSWORDREQUIRED
)
490 strcat(flags
, "DPSESSION_PASSWORDREQUIRED,");
491 if (dwFlags
& DPSESSION_MULTICASTSERVER
)
492 strcat(flags
, "DPSESSION_MULTICASTSERVER,");
493 if (dwFlags
& DPSESSION_CLIENTSERVER
)
494 strcat(flags
, "DPSESSION_CLIENTSERVER,");
496 if (dwFlags
& DPSESSION_DIRECTPLAYPROTOCOL
)
497 strcat(flags
, "DPSESSION_DIRECTPLAYPROTOCOL,");
498 if (dwFlags
& DPSESSION_NOPRESERVEORDER
)
499 strcat(flags
, "DPSESSION_NOPRESERVEORDER,");
500 if (dwFlags
& DPSESSION_OPTIMIZELATENCY
)
501 strcat(flags
, "DPSESSION_OPTIMIZELATENCY,");
507 if (flagType
& FLAGS_DPLCONNECTION
)
509 if (dwFlags
& DPLCONNECTION_CREATESESSION
)
510 strcat(flags
, "DPLCONNECTION_CREATESESSION,");
511 if (dwFlags
& DPLCONNECTION_JOINSESSION
)
512 strcat(flags
, "DPLCONNECTION_JOINSESSION,");
515 /* EnumSessionsCallback2 */
517 if (flagType
& FLAGS_DPESC
)
519 if (dwFlags
& DPESC_TIMEDOUT
)
520 strcat(flags
, "DPESC_TIMEDOUT,");
526 if (flagType
& FLAGS_DPCAPS
)
528 if (dwFlags
& DPCAPS_ISHOST
)
529 strcat(flags
, "DPCAPS_ISHOST,");
530 if (dwFlags
& DPCAPS_GROUPOPTIMIZED
)
531 strcat(flags
, "DPCAPS_GROUPOPTIMIZED,");
532 if (dwFlags
& DPCAPS_KEEPALIVEOPTIMIZED
)
533 strcat(flags
, "DPCAPS_KEEPALIVEOPTIMIZED,");
534 if (dwFlags
& DPCAPS_GUARANTEEDOPTIMIZED
)
535 strcat(flags
, "DPCAPS_GUARANTEEDOPTIMIZED,");
536 if (dwFlags
& DPCAPS_GUARANTEEDSUPPORTED
)
537 strcat(flags
, "DPCAPS_GUARANTEEDSUPPORTED,");
538 if (dwFlags
& DPCAPS_SIGNINGSUPPORTED
)
539 strcat(flags
, "DPCAPS_SIGNINGSUPPORTED,");
540 if (dwFlags
& DPCAPS_ENCRYPTIONSUPPORTED
)
541 strcat(flags
, "DPCAPS_ENCRYPTIONSUPPORTED,");
542 if (dwFlags
& DPCAPS_ASYNCCANCELSUPPORTED
)
543 strcat(flags
, "DPCAPS_ASYNCCANCELSUPPORTED,");
544 if (dwFlags
& DPCAPS_ASYNCCANCELALLSUPPORTED
)
545 strcat(flags
, "DPCAPS_ASYNCCANCELALLSUPPORTED,");
546 if (dwFlags
& DPCAPS_SENDTIMEOUTSUPPORTED
)
547 strcat(flags
, "DPCAPS_SENDTIMEOUTSUPPORTED,");
548 if (dwFlags
& DPCAPS_SENDPRIORITYSUPPORTED
)
549 strcat(flags
, "DPCAPS_SENDPRIORITYSUPPORTED,");
550 if (dwFlags
& DPCAPS_ASYNCSUPPORTED
)
551 strcat(flags
, "DPCAPS_ASYNCSUPPORTED,");
553 if (dwFlags
& DPPLAYERCAPS_LOCAL
)
554 strcat(flags
, "DPPLAYERCAPS_LOCAL,");
557 if ((strlen(flags
) == 0) && (dwFlags
!= 0))
558 strcpy(flags
, "UNKNOWN");
560 flags
[strlen(flags
)-1] = '\0';
565 static char dpid2char(DPID
* dpid
, DWORD dpidSize
, DPID idPlayer
)
568 if ( idPlayer
== DPID_SYSMSG
)
570 for (i
=0; i
<dpidSize
; i
++)
572 if ( idPlayer
== dpid
[i
] )
578 static void check_messages( IDirectPlay4
*pDP
, DPID
*dpid
, DWORD dpidSize
,
579 lpCallbackData callbackData
)
581 /* Retrieves all messages from the queue of pDP, performing tests
582 * to check if we are receiving what we expect.
584 * Information about the messages is stores in callbackData:
586 * callbackData->dwCounter1: Number of messages received.
587 * callbackData->szTrace1: Traces for sender and receiver.
588 * We store the position a dpid holds in the dpid array.
591 * trace string: "01,02,03,14"
592 * expanded: [ '01', '02', '03', '14' ]
594 * \ \ \ ) message 3: from 1 to 4
595 * \ \ ) message 2: from 0 to 3
596 * \ ) message 1: from 0 to 2
597 * ) message 0: from 0 to 1
600 * sender of message i = character in place 3*i of the array
601 * receiver of message i = character in place 3*i+1 of the array
603 * A sender value of 'S' means DPID_SYSMSG, this is, a system message.
605 * callbackData->szTrace2: Traces for message sizes.
610 DWORD dwDataSize
= 1024;
611 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
615 callbackData
->szTrace2
[0] = '\0';
618 while ( DP_OK
== (hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
619 lpData
, &dwDataSize
)) )
622 callbackData
->szTrace1
[ 3*i
] = dpid2char( dpid
, dpidSize
, idFrom
);
623 callbackData
->szTrace1
[ 3*i
+1 ] = dpid2char( dpid
, dpidSize
, idTo
);
624 callbackData
->szTrace1
[ 3*i
+2 ] = ',';
626 sprintf( temp
, "%d,", dwDataSize
);
627 strcat( callbackData
->szTrace2
, temp
);
633 checkHR( DPERR_NOMESSAGES
, hr
);
635 callbackData
->szTrace1
[ 3*i
] = '\0';
636 callbackData
->dwCounter1
= i
;
639 HeapFree( GetProcessHeap(), 0, lpData
);
642 static void init_TCPIP_provider( IDirectPlay4
*pDP
, LPCSTR strIPAddressString
, WORD port
)
645 DPCOMPOUNDADDRESSELEMENT addressElements
[3];
646 LPVOID pAddress
= NULL
;
647 DWORD dwAddressSize
= 0;
648 IDirectPlayLobby3
*pDPL
;
651 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
652 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
653 ok (SUCCEEDED (hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n");
654 if (FAILED (hr
)) return;
656 /* Service provider */
657 addressElements
[0].guidDataType
= DPAID_ServiceProvider
;
658 addressElements
[0].dwDataSize
= sizeof(GUID
);
659 addressElements
[0].lpData
= (LPVOID
) &DPSPGUID_TCPIP
;
661 /* IP address string */
662 addressElements
[1].guidDataType
= DPAID_INet
;
663 addressElements
[1].dwDataSize
= lstrlenA(strIPAddressString
) + 1;
664 addressElements
[1].lpData
= (LPVOID
) strIPAddressString
;
666 /* Optional Port number */
669 addressElements
[2].guidDataType
= DPAID_INetPort
;
670 addressElements
[2].dwDataSize
= sizeof(WORD
);
671 addressElements
[2].lpData
= &port
;
675 hr
= IDirectPlayLobby_CreateCompoundAddress( pDPL
, addressElements
, 2,
676 NULL
, &dwAddressSize
);
677 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
679 if( hr
== DPERR_BUFFERTOOSMALL
)
681 pAddress
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwAddressSize
);
682 hr
= IDirectPlayLobby_CreateCompoundAddress( pDPL
, addressElements
, 2,
683 pAddress
, &dwAddressSize
);
684 checkHR( DP_OK
, hr
);
687 hr
= IDirectPlayX_InitializeConnection( pDP
, pAddress
, 0 );
688 todo_wine
checkHR( DP_OK
, hr
);
690 HeapFree( GetProcessHeap(), 0, pAddress
);
694 static BOOL CALLBACK
EnumSessions_cb_join( LPCDPSESSIONDESC2 lpThisSD
,
699 IDirectPlay4
*pDP
= lpContext
;
703 if (dwFlags
& DPESC_TIMEDOUT
)
708 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
709 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
710 dpsd
.guidApplication
= appGuid
;
711 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
713 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
714 checkHR( DP_OK
, hr
);
720 /* DirectPlayCreate */
722 static void test_DirectPlayCreate(void)
728 /* TODO: Check how it behaves with pUnk!=NULL */
731 hr
= DirectPlayCreate( NULL
, NULL
, NULL
);
732 checkHR( DPERR_INVALIDPARAMS
, hr
);
733 hr
= DirectPlayCreate( (LPGUID
) &GUID_NULL
, NULL
, NULL
);
734 checkHR( DPERR_INVALIDPARAMS
, hr
);
735 hr
= DirectPlayCreate( (LPGUID
) &DPSPGUID_TCPIP
, NULL
, NULL
);
736 checkHR( DPERR_INVALIDPARAMS
, hr
);
738 /* pUnk==NULL, pDP!=NULL */
739 hr
= DirectPlayCreate( NULL
, &pDP
, NULL
);
740 checkHR( DPERR_INVALIDPARAMS
, hr
);
741 hr
= DirectPlayCreate( (LPGUID
) &GUID_NULL
, &pDP
, NULL
);
742 checkHR( DP_OK
, hr
);
744 IDirectPlayX_Release( pDP
);
745 hr
= DirectPlayCreate( (LPGUID
) &DPSPGUID_TCPIP
, &pDP
, NULL
);
746 todo_wine
checkHR( DP_OK
, hr
);
748 IDirectPlayX_Release( pDP
);
752 /* EnumConnections */
754 static BOOL CALLBACK
EnumAddress_cb2( REFGUID guidDataType
,
759 lpCallbackData callbackData
= lpContext
;
761 static REFGUID types
[] = { &DPAID_TotalSize
,
762 &DPAID_ServiceProvider
,
764 static DWORD sizes
[] = { 4, 16, 0 };
765 static REFGUID sps
[] = { &DPSPGUID_SERIAL
, &DPSPGUID_MODEM
,
766 &DPSPGUID_IPX
, &DPSPGUID_TCPIP
};
769 checkGuid( types
[ callbackData
->dwCounter2
], guidDataType
);
770 check( sizes
[ callbackData
->dwCounter2
], dwDataSize
);
772 if ( IsEqualGUID( types
[0], guidDataType
) )
774 todo_wine
check( 80, *((LPDWORD
) lpData
) );
776 else if ( IsEqualGUID( types
[1], guidDataType
) )
778 todo_wine
checkGuid( sps
[ callbackData
->dwCounter1
], lpData
);
781 callbackData
->dwCounter2
++;
786 static BOOL CALLBACK
EnumConnections_cb( LPCGUID lpguidSP
,
788 DWORD dwConnectionSize
,
794 lpCallbackData callbackData
= lpContext
;
795 IDirectPlayLobby
*pDPL
;
799 if (!callbackData
->dwFlags
)
801 callbackData
->dwFlags
= DPCONNECTION_DIRECTPLAY
;
804 checkFlags( callbackData
->dwFlags
, dwFlags
, FLAGS_DPCONNECTION
);
806 /* Get info from lpConnection */
807 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
808 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
809 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n");
813 callbackData
->dwCounter2
= 0;
814 IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb2
, lpConnection
,
815 dwConnectionSize
, callbackData
);
816 todo_wine
check( 3, callbackData
->dwCounter2
);
818 callbackData
->dwCounter1
++;
823 static void test_EnumConnections(void)
827 CallbackData callbackData
;
831 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
832 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
834 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
835 if (FAILED(hr
)) return;
837 callbackData
.dwCounter1
= 0;
838 callbackData
.dwFlags
= 0;
839 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
840 &callbackData
, callbackData
.dwFlags
);
841 checkHR( DP_OK
, hr
);
842 check( 4, callbackData
.dwCounter1
);
844 callbackData
.dwCounter1
= 0;
845 callbackData
.dwFlags
= 0;
846 hr
= IDirectPlayX_EnumConnections( pDP
, NULL
, 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
, &appGuid
, NULL
,
854 &callbackData
, callbackData
.dwFlags
);
855 checkHR( DPERR_INVALIDPARAMS
, hr
);
856 check( 0, callbackData
.dwCounter1
);
860 callbackData
.dwCounter1
= 0;
861 callbackData
.dwFlags
= DPCONNECTION_DIRECTPLAY
;
862 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
863 &callbackData
, callbackData
.dwFlags
);
864 checkHR( DP_OK
, hr
);
865 check( 4, callbackData
.dwCounter1
);
867 callbackData
.dwCounter1
= 0;
868 callbackData
.dwFlags
= DPCONNECTION_DIRECTPLAYLOBBY
;
869 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
870 &callbackData
, callbackData
.dwFlags
);
871 checkHR( DP_OK
, hr
);
872 check( 0, callbackData
.dwCounter1
);
874 callbackData
.dwCounter1
= 0;
875 callbackData
.dwFlags
= ( DPCONNECTION_DIRECTPLAY
|
876 DPCONNECTION_DIRECTPLAYLOBBY
);
877 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
878 &callbackData
, callbackData
.dwFlags
);
879 checkHR( DP_OK
, hr
);
880 check( 4, callbackData
.dwCounter1
);
882 callbackData
.dwCounter1
= 0;
883 callbackData
.dwFlags
= ~( DPCONNECTION_DIRECTPLAY
|
884 DPCONNECTION_DIRECTPLAYLOBBY
);
885 hr
= IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb
,
886 &callbackData
, callbackData
.dwFlags
);
887 checkHR( DPERR_INVALIDFLAGS
, hr
);
888 check( 0, callbackData
.dwCounter1
);
891 IDirectPlayX_Release( pDP
);
894 /* InitializeConnection */
896 static BOOL CALLBACK
EnumConnections_cb2( LPCGUID lpguidSP
,
898 DWORD dwConnectionSize
,
903 IDirectPlay4
*pDP
= lpContext
;
906 /* Incorrect parameters */
907 hr
= IDirectPlayX_InitializeConnection( pDP
, NULL
, 1 );
908 checkHR( DPERR_INVALIDPARAMS
, hr
);
909 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 1 );
910 checkHR( DPERR_INVALIDFLAGS
, hr
);
913 We're only interested in ensuring that the TCP/IP provider works */
915 if( IsEqualGUID(lpguidSP
, &DPSPGUID_TCPIP
) )
917 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 0 );
918 todo_wine
checkHR( DP_OK
, hr
);
919 hr
= IDirectPlayX_InitializeConnection( pDP
, lpConnection
, 0 );
920 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
926 static void test_InitializeConnection(void)
932 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
933 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
935 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
936 if (FAILED(hr
)) return;
938 IDirectPlayX_EnumConnections( pDP
, &appGuid
, EnumConnections_cb2
, pDP
, 0 );
940 IDirectPlayX_Release( pDP
);
945 static void test_GetCaps(void)
954 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
955 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
956 ok (SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n");
957 if (FAILED(hr
)) return;
959 ZeroMemory( &dpcaps
, sizeof(DPCAPS
) );
961 /* Service provider not ininitialized */
962 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, 0 );
963 checkHR( DPERR_UNINITIALIZED
, hr
);
965 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
967 /* dpcaps not ininitialized */
968 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, 0 );
969 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
971 dpcaps
.dwSize
= sizeof(DPCAPS
);
974 dwFlags
<=DPGETCAPS_GUARANTEED
;
975 dwFlags
+=DPGETCAPS_GUARANTEED
)
978 hr
= IDirectPlayX_GetCaps( pDP
, &dpcaps
, dwFlags
);
979 todo_wine
checkHR( DP_OK
, hr
);
984 check( sizeof(DPCAPS
), dpcaps
.dwSize
);
985 check( DPCAPS_ASYNCSUPPORTED
|
986 DPCAPS_GUARANTEEDOPTIMIZED
|
987 DPCAPS_GUARANTEEDSUPPORTED
,
989 check( 0, dpcaps
.dwMaxQueueSize
);
990 check( 0, dpcaps
.dwHundredBaud
);
991 check( 500, dpcaps
.dwLatency
);
992 check( 65536, dpcaps
.dwMaxLocalPlayers
);
993 check( 20, dpcaps
.dwHeaderLength
);
994 check( 5000, dpcaps
.dwTimeout
);
999 check( 65479, dpcaps
.dwMaxBufferSize
);
1000 check( 65536, dpcaps
.dwMaxPlayers
);
1002 case DPGETCAPS_GUARANTEED
:
1003 check( 1048547, dpcaps
.dwMaxBufferSize
);
1004 check( 64, dpcaps
.dwMaxPlayers
);
1011 IDirectPlayX_Release( pDP
);
1016 static BOOL CALLBACK
EnumSessions_cb2( LPCDPSESSIONDESC2 lpThisSD
,
1017 LPDWORD lpdwTimeOut
,
1021 IDirectPlay4
*pDP
= lpContext
;
1022 DPSESSIONDESC2 dpsd
;
1025 if (dwFlags
& DPESC_TIMEDOUT
)
1029 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1030 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1031 dpsd
.guidApplication
= appGuid
;
1032 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
1034 if ( lpThisSD
->dwFlags
& DPSESSION_PASSWORDREQUIRED
)
1036 /* Incorrect password */
1037 U2(dpsd
).lpszPasswordA
= (LPSTR
) "sonic boom";
1038 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1039 checkHR( DPERR_INVALIDPASSWORD
, hr
);
1041 /* Correct password */
1042 U2(dpsd
).lpszPasswordA
= (LPSTR
) "hadouken";
1043 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1044 checkHR( DP_OK
, hr
);
1048 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1049 checkHR( DP_OK
, hr
);
1052 hr
= IDirectPlayX_Close( pDP
);
1053 checkHR( DP_OK
, hr
);
1058 static void test_Open(void)
1061 IDirectPlay4
*pDP
, *pDP_server
;
1062 DPSESSIONDESC2 dpsd
, dpsd_server
;
1066 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1067 &IID_IDirectPlay4A
, (LPVOID
*) &pDP_server
);
1068 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1069 if (FAILED(hr
)) return;
1071 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1072 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1073 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1074 if (FAILED(hr
)) return;
1076 ZeroMemory( &dpsd_server
, sizeof(DPSESSIONDESC2
) );
1077 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1079 /* Service provider not initialized */
1080 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1081 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1083 init_TCPIP_provider( pDP_server
, "127.0.0.1", 0 );
1084 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1086 /* Uninitialized dpsd */
1087 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1088 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1091 dpsd_server
.dwSize
= sizeof(DPSESSIONDESC2
);
1092 dpsd_server
.guidApplication
= appGuid
;
1093 dpsd_server
.dwMaxPlayers
= 10;
1096 /* Regular operation */
1097 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1098 todo_wine
checkHR( DP_OK
, hr
);
1101 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1102 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
1105 IDirectPlayX_Close( pDP_server
);
1107 dpsd_server
.dwFlags
= DPSESSION_CLIENTSERVER
| DPSESSION_MIGRATEHOST
;
1108 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1109 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1111 dpsd_server
.dwFlags
= DPSESSION_MULTICASTSERVER
| DPSESSION_MIGRATEHOST
;
1112 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1113 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1115 dpsd_server
.dwFlags
= DPSESSION_SECURESERVER
| DPSESSION_MIGRATEHOST
;
1116 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1117 todo_wine
checkHR( DPERR_INVALIDFLAGS
, hr
);
1120 /* Joining sessions */
1121 /* - Checking how strict dplay is with sizes */
1123 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1124 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1126 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
)-1;
1127 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1128 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1130 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
)+1;
1131 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1132 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1134 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1135 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1136 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
); /* Only checks for size, not guids */
1139 dpsd
.guidApplication
= appGuid
;
1140 dpsd
.guidInstance
= appGuid
;
1143 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
);
1144 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
1145 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_JOIN
| DPOPEN_CREATE
);
1146 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
); /* Second flag is ignored */
1148 dpsd_server
.dwFlags
= 0;
1151 /* Join to normal session */
1152 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1153 todo_wine
checkHR( DP_OK
, hr
);
1155 IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb2
, pDP
, 0 );
1158 /* Already initialized session */
1159 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1160 todo_wine
checkHR( DPERR_ALREADYINITIALIZED
, hr
);
1163 /* Checking which is the error checking order */
1164 dpsd_server
.dwSize
= 0;
1166 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1167 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1169 dpsd_server
.dwSize
= sizeof(DPSESSIONDESC2
);
1172 /* Join to protected session */
1173 IDirectPlayX_Close( pDP_server
);
1174 U2(dpsd_server
).lpszPasswordA
= (LPSTR
) "hadouken";
1175 hr
= IDirectPlayX_Open( pDP_server
, &dpsd_server
, DPOPEN_CREATE
);
1176 todo_wine
checkHR( DP_OK
, hr
);
1178 IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb2
,
1179 pDP
, DPENUMSESSIONS_PASSWORDREQUIRED
);
1182 IDirectPlayX_Release( pDP
);
1183 IDirectPlayX_Release( pDP_server
);
1189 static BOOL CALLBACK
EnumSessions_cb( LPCDPSESSIONDESC2 lpThisSD
,
1190 LPDWORD lpdwTimeOut
,
1194 lpCallbackData callbackData
= lpContext
;
1195 callbackData
->dwCounter1
++;
1197 if ( dwFlags
& DPESC_TIMEDOUT
)
1199 check( TRUE
, lpThisSD
== NULL
);
1202 check( FALSE
, lpThisSD
== NULL
);
1205 if ( U2(*lpThisSD
).lpszPasswordA
!= NULL
)
1207 check( TRUE
, (lpThisSD
->dwFlags
& DPSESSION_PASSWORDREQUIRED
) != 0 );
1210 if ( lpThisSD
->dwFlags
& DPSESSION_NEWPLAYERSDISABLED
)
1212 check( 0, lpThisSD
->dwCurrentPlayers
);
1215 check( sizeof(*lpThisSD
), lpThisSD
->dwSize
);
1216 checkLP( NULL
, U2(*lpThisSD
).lpszPasswordA
);
1221 static IDirectPlay4
*create_session(DPSESSIONDESC2
*lpdpsd
)
1229 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1230 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1231 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1232 if (FAILED(hr
)) return NULL
;
1234 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1236 hr
= IDirectPlayX_Open( pDP
, lpdpsd
, DPOPEN_CREATE
);
1237 todo_wine
checkHR( DP_OK
, hr
);
1239 if ( ! (lpdpsd
->dwFlags
& DPSESSION_NEWPLAYERSDISABLED
) )
1241 ZeroMemory( &name
, sizeof(DPNAME
) );
1242 name
.dwSize
= sizeof(DPNAME
);
1243 U1(name
).lpszShortNameA
= (LPSTR
) "bofh";
1245 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, &name
, NULL
, NULL
,
1246 0, DPPLAYER_SERVERPLAYER
);
1247 todo_wine
checkHR( DP_OK
, hr
);
1254 static void test_EnumSessions(void)
1257 #define N_SESSIONS 6
1259 IDirectPlay4
*pDP
, *pDPserver
[N_SESSIONS
];
1260 DPSESSIONDESC2 dpsd
, dpsd_server
[N_SESSIONS
];
1261 CallbackData callbackData
;
1266 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1267 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
1268 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1269 if (FAILED(hr
)) return;
1271 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1272 callbackData
.dwCounter1
= -1; /* So that after a call to EnumSessions
1273 we get the exact number of sessions */
1274 callbackData
.dwFlags
= 0;
1277 /* Service provider not initialized */
1278 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1280 checkHR( DPERR_UNINITIALIZED
, hr
);
1283 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
1286 /* Session with no size */
1287 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1289 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1291 if ( hr
== DPERR_UNINITIALIZED
)
1293 todo_wine
win_skip( "EnumSessions not implemented\n" );
1297 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1301 callbackData
.dwCounter1
= -1;
1302 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1304 checkHR( DP_OK
, hr
);
1305 check( 0, callbackData
.dwCounter1
);
1308 dpsd
.guidApplication
= appGuid
;
1310 /* Set up sessions */
1311 for (i
=0; i
<N_SESSIONS
; i
++)
1313 memcpy( &dpsd_server
[i
], &dpsd
, sizeof(DPSESSIONDESC2
) );
1316 U1(dpsd_server
[0]).lpszSessionNameA
= (LPSTR
) "normal";
1317 dpsd_server
[0].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1318 DPSESSION_DIRECTPLAYPROTOCOL
);
1319 dpsd_server
[0].dwMaxPlayers
= 10;
1321 U1(dpsd_server
[1]).lpszSessionNameA
= (LPSTR
) "full";
1322 dpsd_server
[1].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1323 DPSESSION_DIRECTPLAYPROTOCOL
);
1324 dpsd_server
[1].dwMaxPlayers
= 1;
1326 U1(dpsd_server
[2]).lpszSessionNameA
= (LPSTR
) "no new";
1327 dpsd_server
[2].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1328 DPSESSION_DIRECTPLAYPROTOCOL
|
1329 DPSESSION_NEWPLAYERSDISABLED
);
1330 dpsd_server
[2].dwMaxPlayers
= 10;
1332 U1(dpsd_server
[3]).lpszSessionNameA
= (LPSTR
) "no join";
1333 dpsd_server
[3].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1334 DPSESSION_DIRECTPLAYPROTOCOL
|
1335 DPSESSION_JOINDISABLED
);
1336 dpsd_server
[3].dwMaxPlayers
= 10;
1338 U1(dpsd_server
[4]).lpszSessionNameA
= (LPSTR
) "private";
1339 dpsd_server
[4].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1340 DPSESSION_DIRECTPLAYPROTOCOL
|
1341 DPSESSION_PRIVATE
);
1342 dpsd_server
[4].dwMaxPlayers
= 10;
1343 U2(dpsd_server
[4]).lpszPasswordA
= (LPSTR
) "password";
1345 U1(dpsd_server
[5]).lpszSessionNameA
= (LPSTR
) "protected";
1346 dpsd_server
[5].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1347 DPSESSION_DIRECTPLAYPROTOCOL
|
1348 DPSESSION_PASSWORDREQUIRED
);
1349 dpsd_server
[5].dwMaxPlayers
= 10;
1350 U2(dpsd_server
[5]).lpszPasswordA
= (LPSTR
) "password";
1353 for (i
=0; i
<N_SESSIONS
; i
++)
1355 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1356 if (!pDPserver
[i
]) return;
1360 /* Invalid params */
1361 callbackData
.dwCounter1
= -1;
1362 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1363 &callbackData
, -1 );
1364 checkHR( DPERR_INVALIDPARAMS
, hr
);
1366 hr
= IDirectPlayX_EnumSessions( pDP
, NULL
, 0, EnumSessions_cb
,
1368 checkHR( DPERR_INVALIDPARAMS
, hr
);
1370 check( -1, callbackData
.dwCounter1
);
1374 callbackData
.dwFlags
= DPENUMSESSIONS_ALL
; /* Doesn't list private,
1376 callbackData
.dwCounter1
= -1;
1377 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1378 &callbackData
, callbackData
.dwFlags
);
1379 checkHR( DP_OK
, hr
);
1380 check( N_SESSIONS
-2, callbackData
.dwCounter1
);
1382 /* Doesn't list private */
1383 callbackData
.dwFlags
= ( DPENUMSESSIONS_ALL
|
1384 DPENUMSESSIONS_PASSWORDREQUIRED
);
1385 callbackData
.dwCounter1
= -1;
1386 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1387 &callbackData
, callbackData
.dwFlags
);
1388 checkHR( DP_OK
, hr
);
1389 check( N_SESSIONS
-1, callbackData
.dwCounter1
);
1391 /* Doesn't list full, no new, no join, private, protected */
1392 callbackData
.dwFlags
= DPENUMSESSIONS_AVAILABLE
;
1393 callbackData
.dwCounter1
= -1;
1394 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1395 &callbackData
, callbackData
.dwFlags
);
1396 checkHR( DP_OK
, hr
);
1397 check( N_SESSIONS
-5, callbackData
.dwCounter1
);
1399 /* Like with DPENUMSESSIONS_AVAILABLE */
1400 callbackData
.dwFlags
= 0;
1401 callbackData
.dwCounter1
= -1;
1402 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1403 &callbackData
, callbackData
.dwFlags
);
1404 checkHR( DP_OK
, hr
);
1405 check( N_SESSIONS
-5, callbackData
.dwCounter1
);
1407 /* Doesn't list full, no new, no join, private */
1408 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1409 callbackData
.dwCounter1
= -1;
1410 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1411 &callbackData
, callbackData
.dwFlags
);
1412 checkHR( DP_OK
, hr
);
1413 check( N_SESSIONS
-4, callbackData
.dwCounter1
);
1416 /* Async enumeration */
1417 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1418 callbackData
.dwCounter1
= -1;
1419 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1420 &callbackData
, callbackData
.dwFlags
);
1421 checkHR( DP_OK
, hr
);
1422 check( N_SESSIONS
-4, callbackData
.dwCounter1
); /* Read cache of last
1425 callbackData
.dwFlags
= DPENUMSESSIONS_STOPASYNC
;
1426 callbackData
.dwCounter1
= -1;
1427 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1428 &callbackData
, callbackData
.dwFlags
);
1429 checkHR( DP_OK
, hr
);
1430 check( 0, callbackData
.dwCounter1
); /* Stop enumeration */
1432 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
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
); /* Start enumeration */
1439 Sleep(500); /* Give time to fill the cache */
1441 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1442 callbackData
.dwCounter1
= -1;
1443 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1444 &callbackData
, callbackData
.dwFlags
);
1445 checkHR( DP_OK
, hr
);
1446 check( N_SESSIONS
-5, callbackData
.dwCounter1
); /* Retrieve results */
1448 callbackData
.dwFlags
= DPENUMSESSIONS_STOPASYNC
;
1449 callbackData
.dwCounter1
= -1;
1450 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1451 &callbackData
, callbackData
.dwFlags
);
1452 checkHR( DP_OK
, hr
);
1453 check( 0, callbackData
.dwCounter1
); /* Stop enumeration */
1456 /* Specific tests for passworded sessions */
1458 for (i
=0; i
<N_SESSIONS
; i
++)
1460 IDirectPlayX_Release( pDPserver
[i
] );
1463 /* - Only session password set */
1466 U2(dpsd_server
[i
]).lpszPasswordA
= (LPSTR
) "password";
1467 dpsd_server
[i
].dwFlags
= 0;
1468 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1471 callbackData
.dwFlags
= 0;
1472 callbackData
.dwCounter1
= -1;
1473 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1474 &callbackData
, callbackData
.dwFlags
);
1475 checkHR( DP_OK
, hr
);
1476 check( 0, callbackData
.dwCounter1
);
1478 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1479 callbackData
.dwCounter1
= -1;
1480 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1481 &callbackData
, callbackData
.dwFlags
);
1482 checkHR( DP_OK
, hr
);
1483 check( 2, callbackData
.dwCounter1
); /* Both sessions automatically
1484 set DPSESSION_PASSWORDREQUIRED */
1486 /* - Only session flag set */
1487 for (i
=4; i
<=5; i
++)
1489 IDirectPlayX_Release( pDPserver
[i
] );
1490 U2(dpsd_server
[i
]).lpszPasswordA
= NULL
;
1492 dpsd_server
[4].dwFlags
= DPSESSION_PRIVATE
;
1493 dpsd_server
[5].dwFlags
= DPSESSION_PASSWORDREQUIRED
;
1494 for (i
=4; i
<=5; i
++)
1496 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1499 callbackData
.dwFlags
= 0;
1500 callbackData
.dwCounter1
= -1;
1501 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1502 &callbackData
, callbackData
.dwFlags
);
1503 checkHR( DP_OK
, hr
);
1504 check( 2, callbackData
.dwCounter1
); /* Without password,
1505 the flag is ignored */
1507 /* - Both session flag and password set */
1508 for (i
=4; i
<=5; i
++)
1510 IDirectPlayX_Release( pDPserver
[i
] );
1511 U2(dpsd_server
[i
]).lpszPasswordA
= (LPSTR
) "password";
1513 dpsd_server
[4].dwFlags
= DPSESSION_PRIVATE
;
1514 dpsd_server
[5].dwFlags
= DPSESSION_PASSWORDREQUIRED
;
1515 for (i
=4; i
<=5; i
++)
1517 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1520 /* - Listing without password */
1521 callbackData
.dwCounter1
= -1;
1522 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1523 &callbackData
, callbackData
.dwFlags
);
1524 checkHR( DP_OK
, hr
);
1525 check( 0, callbackData
.dwCounter1
);
1527 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1528 callbackData
.dwCounter1
= -1;
1529 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1530 &callbackData
, callbackData
.dwFlags
);
1531 checkHR( DP_OK
, hr
);
1532 check( 1, callbackData
.dwCounter1
);
1534 /* - Listing with incorrect password */
1535 U2(dpsd
).lpszPasswordA
= (LPSTR
) "bad_password";
1536 callbackData
.dwFlags
= 0;
1537 callbackData
.dwCounter1
= -1;
1538 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1539 &callbackData
, callbackData
.dwFlags
);
1540 checkHR( DP_OK
, hr
);
1541 check( 0, callbackData
.dwCounter1
);
1543 callbackData
.dwFlags
= DPENUMSESSIONS_PASSWORDREQUIRED
;
1544 callbackData
.dwCounter1
= -1;
1545 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1546 &callbackData
, callbackData
.dwFlags
);
1547 checkHR( DP_OK
, hr
);
1548 check( 1, callbackData
.dwCounter1
);
1550 /* - Listing with correct password */
1551 U2(dpsd
).lpszPasswordA
= (LPSTR
) "password";
1552 callbackData
.dwCounter1
= -1;
1553 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1554 &callbackData
, callbackData
.dwFlags
);
1555 checkHR( DP_OK
, hr
);
1556 check( 2, callbackData
.dwCounter1
);
1559 U2(dpsd
).lpszPasswordA
= NULL
;
1560 callbackData
.dwFlags
= DPENUMSESSIONS_ASYNC
;
1561 callbackData
.dwCounter1
= -1;
1562 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1563 &callbackData
, callbackData
.dwFlags
);
1564 checkHR( DP_OK
, hr
);
1565 check( 2, callbackData
.dwCounter1
); /* Read cache of last sync enumeration,
1566 even private sessions */
1571 /* - Creating two servers with different application GUIDs */
1572 for (i
=4; i
<=5; i
++)
1574 IDirectPlayX_Release( pDPserver
[i
] );
1575 dpsd_server
[i
].dwFlags
= ( DPSESSION_CLIENTSERVER
|
1576 DPSESSION_DIRECTPLAYPROTOCOL
);
1577 U2(dpsd_server
[i
]).lpszPasswordA
= NULL
;
1578 dpsd_server
[i
].dwMaxPlayers
= 10;
1580 U1(dpsd_server
[4]).lpszSessionNameA
= (LPSTR
) "normal1";
1581 dpsd_server
[4].guidApplication
= appGuid
;
1582 U1(dpsd_server
[5]).lpszSessionNameA
= (LPSTR
) "normal2";
1583 dpsd_server
[5].guidApplication
= appGuid2
;
1584 for (i
=4; i
<=5; i
++)
1586 pDPserver
[i
] = create_session( &dpsd_server
[i
] );
1589 callbackData
.dwFlags
= 0;
1591 dpsd
.guidApplication
= appGuid2
;
1592 callbackData
.dwCounter1
= -1;
1593 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1594 &callbackData
, callbackData
.dwFlags
);
1595 checkHR( DP_OK
, hr
);
1596 check( 1, callbackData
.dwCounter1
); /* Only one of the sessions */
1598 dpsd
.guidApplication
= appGuid
;
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
); /* The other session */
1605 For some reason, if we enum 1st with appGuid and 2nd with appGuid2,
1606 in the second enum we get the 2 sessions. Dplay fault? Elves? */
1608 dpsd
.guidApplication
= GUID_NULL
;
1609 callbackData
.dwCounter1
= -1;
1610 hr
= IDirectPlayX_EnumSessions( pDP
, &dpsd
, 0, EnumSessions_cb
,
1611 &callbackData
, callbackData
.dwFlags
);
1612 checkHR( DP_OK
, hr
);
1613 check( 2, callbackData
.dwCounter1
); /* Both sessions */
1615 for (i
=4; i
<=5; i
++)
1617 IDirectPlayX_Release( pDPserver
[i
] );
1619 IDirectPlayX_Release( pDP
);
1626 static void test_SessionDesc(void)
1629 IDirectPlay4
*pDP
[2];
1630 DPSESSIONDESC2 dpsd
;
1631 LPDPSESSIONDESC2 lpData
[2];
1637 CallbackData callbackData
;
1642 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1643 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
1644 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1645 if (FAILED(hr
)) return;
1647 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1649 /* Service provider not initialized */
1650 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1651 checkHR( DPERR_UNINITIALIZED
, hr
);
1653 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1654 checkHR( DPERR_UNINITIALIZED
, hr
);
1657 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
1658 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
1661 /* No sessions open */
1662 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1663 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
1665 if ( hr
== DPERR_UNINITIALIZED
)
1667 todo_wine
win_skip("Get/SetSessionDesc not implemented\n");
1671 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1672 checkHR( DPERR_NOSESSIONS
, hr
);
1675 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1676 dpsd
.guidApplication
= appGuid
;
1677 dpsd
.dwMaxPlayers
= 10;
1681 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1683 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
1688 /* Players, only to receive messages */
1689 IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
, 0, 0 );
1691 lpData
[i
] = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
1693 lpDataMsg
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
1696 /* Incorrect parameters */
1697 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], NULL
, 0 );
1698 checkHR( DPERR_INVALIDPARAMS
, hr
);
1699 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, NULL
);
1700 checkHR( DPERR_INVALIDPARAM
, hr
);
1701 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], NULL
);
1702 checkHR( DPERR_INVALIDPARAM
, hr
);
1704 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1705 checkHR( DPERR_INVALIDPARAMS
, hr
);
1706 check( -1, dwDataSize
);
1708 /* Get: Insufficient buffer size */
1710 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1711 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1712 check( dpsd
.dwSize
, dwDataSize
);
1714 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1715 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1716 check( dpsd
.dwSize
, dwDataSize
);
1718 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], NULL
, &dwDataSize
);
1719 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
1720 check( dpsd
.dwSize
, dwDataSize
);
1722 /* Get: Regular operation
1723 * i=0: Local session
1724 * i=1: Remote session */
1727 hr
= IDirectPlayX_GetSessionDesc( pDP
[i
], lpData
[i
], &dwDataSize
);
1728 checkHR( DP_OK
, hr
);
1729 check( sizeof(DPSESSIONDESC2
), dwDataSize
);
1730 check( sizeof(DPSESSIONDESC2
), lpData
[i
]->dwSize
);
1731 checkGuid( &appGuid
, &lpData
[i
]->guidApplication
);
1732 check( dpsd
.dwMaxPlayers
, lpData
[i
]->dwMaxPlayers
);
1735 checkGuid( &lpData
[0]->guidInstance
, &lpData
[1]->guidInstance
);
1737 /* Set: Regular operation */
1738 U1(dpsd
).lpszSessionNameA
= (LPSTR
) "Wahaa";
1739 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1740 checkHR( DP_OK
, hr
);
1743 hr
= IDirectPlayX_GetSessionDesc( pDP
[1], lpData
[1], &dwDataSize
);
1744 checkHR( DP_OK
, hr
);
1745 checkStr( U1(dpsd
).lpszSessionNameA
, U1(*lpData
[1]).lpszSessionNameA
);
1748 /* Set: Failing to modify a remote session */
1749 hr
= IDirectPlayX_SetSessionDesc( pDP
[1], &dpsd
, 0 );
1750 checkHR( DPERR_ACCESSDENIED
, hr
);
1752 /* Trying to change immutable properties */
1754 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1755 checkHR( DP_OK
, hr
);
1756 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
1757 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1758 checkHR( DPERR_INVALIDPARAMS
, hr
);
1760 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1761 checkHR( DP_OK
, hr
);
1764 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1765 checkHR( DPERR_INVALIDPARAMS
, hr
);
1766 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1767 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1768 checkHR( DP_OK
, hr
);
1770 /* Changing the GUIDs and size is ignored */
1771 dpsd
.guidApplication
= appGuid2
;
1772 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1773 checkHR( DP_OK
, hr
);
1774 dpsd
.guidInstance
= appGuid2
;
1775 hr
= IDirectPlayX_SetSessionDesc( pDP
[0], &dpsd
, 0 );
1776 checkHR( DP_OK
, hr
);
1778 hr
= IDirectPlayX_GetSessionDesc( pDP
[0], lpData
[0], &dwDataSize
);
1779 checkHR( DP_OK
, hr
);
1780 checkGuid( &appGuid
, &lpData
[0]->guidApplication
);
1781 checkGuid( &lpData
[1]->guidInstance
, &lpData
[0]->guidInstance
);
1782 check( sizeof(DPSESSIONDESC2
), lpData
[0]->dwSize
);
1785 /* Checking system messages */
1786 check_messages( pDP
[0], dpid
, 2, &callbackData
);
1787 checkStr( "S0,S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
1788 checkStr( "48,90,90,90,90,90,90,", callbackData
.szTrace2
);
1789 check_messages( pDP
[1], dpid
, 2, &callbackData
);
1790 checkStr( "S1,S1,S1,S1,S1,S1,", callbackData
.szTrace1
);
1791 checkStr( "90,90,90,90,90,90,", callbackData
.szTrace2
);
1793 HeapFree( GetProcessHeap(), 0, lpDataMsg
);
1796 HeapFree( GetProcessHeap(), 0, lpData
[i
] );
1797 IDirectPlayX_Release( pDP
[i
] );
1804 static void test_CreatePlayer(void)
1807 IDirectPlay4
*pDP
[2];
1808 DPSESSIONDESC2 dpsd
;
1814 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1815 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[0] );
1816 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1817 if (FAILED(hr
)) return;
1819 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1820 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[1] );
1821 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1822 if (FAILED(hr
)) return;
1824 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1825 ZeroMemory( &name
, sizeof(DPNAME
) );
1828 /* Connection not initialized */
1829 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1830 checkHR( DPERR_UNINITIALIZED
, hr
);
1833 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
1834 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
1837 /* Session not open */
1838 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1839 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
1841 if ( hr
== DPERR_UNINITIALIZED
)
1843 todo_wine
win_skip( "CreatePlayer not implemented\n" );
1847 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1848 dpsd
.guidApplication
= appGuid
;
1849 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1853 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
, 0, 0 );
1854 checkHR( DP_OK
, hr
);
1860 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, &name
, NULL
, NULL
, 0, 0 );
1861 checkHR( DP_OK
, hr
);
1864 name
.dwSize
= sizeof(DPNAME
);
1865 U1(name
).lpszShortNameA
= (LPSTR
) "test";
1866 U2(name
).lpszLongNameA
= NULL
;
1869 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, &name
, NULL
, NULL
,
1871 checkHR( DP_OK
, hr
);
1875 hr
= IDirectPlayX_CreatePlayer( pDP
[0], NULL
, NULL
, NULL
, NULL
,
1877 checkHR( DPERR_INVALIDPARAMS
, hr
);
1880 /* There can only be one server player */
1881 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1882 0, DPPLAYER_SERVERPLAYER
);
1883 checkHR( DP_OK
, hr
);
1884 check( DPID_SERVERPLAYER
, dpid
);
1886 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1887 0, DPPLAYER_SERVERPLAYER
);
1888 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1890 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1892 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1893 0, DPPLAYER_SERVERPLAYER
);
1894 checkHR( DP_OK
, hr
);
1895 check( DPID_SERVERPLAYER
, dpid
);
1896 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1900 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1902 checkHR( DP_OK
, hr
);
1904 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1905 0, DPPLAYER_SERVERPLAYER
);
1906 checkHR( DP_OK
, hr
);
1907 check( DPID_SERVERPLAYER
, dpid
);
1908 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1910 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1911 0, DPPLAYER_SPECTATOR
);
1912 checkHR( DP_OK
, hr
);
1914 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1915 0, ( DPPLAYER_SERVERPLAYER
|
1916 DPPLAYER_SPECTATOR
) );
1917 checkHR( DP_OK
, hr
);
1918 check( DPID_SERVERPLAYER
, dpid
);
1919 IDirectPlayX_DestroyPlayer( pDP
[0], dpid
);
1922 /* Session with DPSESSION_NEWPLAYERSDISABLED */
1923 IDirectPlayX_Close( pDP
[0] );
1924 dpsd
.dwFlags
= DPSESSION_NEWPLAYERSDISABLED
;
1925 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1926 checkHR( DP_OK
, hr
);
1929 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1931 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1933 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1934 0, DPPLAYER_SERVERPLAYER
);
1935 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1937 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1938 0, DPPLAYER_SPECTATOR
);
1939 checkHR( DPERR_CANTCREATEPLAYER
, hr
);
1942 /* Creating players in a Client/Server session */
1943 IDirectPlayX_Close( pDP
[0] );
1944 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
1945 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
1946 checkHR( DP_OK
, hr
);
1947 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
1949 checkHR( DP_OK
, hr
);
1952 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1954 checkHR( DPERR_ACCESSDENIED
, hr
);
1956 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
, NULL
, NULL
, NULL
,
1957 0, DPPLAYER_SERVERPLAYER
);
1958 checkHR( DP_OK
, hr
);
1959 check( DPID_SERVERPLAYER
, dpid
);
1961 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
, NULL
, NULL
, NULL
,
1962 0, DPPLAYER_SERVERPLAYER
);
1963 checkHR( DPERR_INVALIDFLAGS
, hr
);
1965 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
, NULL
, NULL
, NULL
,
1967 checkHR( DP_OK
, hr
);
1970 IDirectPlayX_Release( pDP
[0] );
1971 IDirectPlayX_Release( pDP
[1] );
1977 static void test_GetPlayerCaps(void)
1980 IDirectPlay4
*pDP
[2];
1981 DPSESSIONDESC2 dpsd
;
1992 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
1993 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
1994 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
1995 if (FAILED(hr
)) return;
1997 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
1998 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
1999 dpsd
.guidApplication
= appGuid
;
2000 dpsd
.dwMaxPlayers
= 10;
2002 ZeroMemory( &playerCaps
, sizeof(DPCAPS
) );
2005 /* Uninitialized service provider */
2006 playerCaps
.dwSize
= 0;
2007 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2008 checkHR( DPERR_UNINITIALIZED
, hr
);
2010 playerCaps
.dwSize
= sizeof(DPCAPS
);
2011 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2012 checkHR( DPERR_UNINITIALIZED
, hr
);
2015 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2016 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2020 playerCaps
.dwSize
= 0;
2022 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2023 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
2025 if ( hr
== DPERR_UNINITIALIZED
)
2027 todo_wine
win_skip( "GetPlayerCaps not implemented\n" );
2031 playerCaps
.dwSize
= sizeof(DPCAPS
);
2033 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2034 checkHR( DPERR_INVALIDPLAYER
, hr
);
2036 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2037 checkHR( DPERR_INVALIDPLAYER
, hr
);
2040 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2041 checkHR( DP_OK
, hr
);
2042 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2044 checkHR( DP_OK
, hr
);
2048 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
2049 NULL
, NULL
, NULL
, 0, 0 );
2050 checkHR( DP_OK
, hr
);
2054 /* Uninitialized playerCaps */
2055 playerCaps
.dwSize
= 0;
2057 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2058 checkHR( DPERR_INVALIDPARAMS
, hr
);
2060 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2061 checkHR( DPERR_INVALIDPARAMS
, hr
);
2063 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[0], &playerCaps
, 0 );
2064 checkHR( DPERR_INVALIDPARAMS
, hr
);
2067 /* Invalid player */
2068 playerCaps
.dwSize
= sizeof(DPCAPS
);
2070 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 0, &playerCaps
, 0 );
2071 checkHR( DPERR_INVALIDPLAYER
, hr
);
2073 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], 2, &playerCaps
, 0 );
2074 checkHR( DPERR_INVALIDPLAYER
, hr
);
2076 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[0], &playerCaps
, 0 );
2077 checkHR( DP_OK
, hr
);
2080 /* Regular parameters */
2084 dwFlags
<=DPGETCAPS_GUARANTEED
;
2085 dwFlags
+=DPGETCAPS_GUARANTEED
)
2088 hr
= IDirectPlayX_GetPlayerCaps( pDP
[0], dpid
[i
],
2089 &playerCaps
, dwFlags
);
2090 checkHR( DP_OK
, hr
);
2093 check( sizeof(DPCAPS
), playerCaps
.dwSize
);
2094 check( 40, playerCaps
.dwSize
);
2095 check( 0, playerCaps
.dwMaxQueueSize
);
2096 check( 0, playerCaps
.dwHundredBaud
);
2097 check( 0, playerCaps
.dwLatency
);
2098 check( 65536, playerCaps
.dwMaxLocalPlayers
);
2099 check( 20, playerCaps
.dwHeaderLength
);
2103 checkFlags( DPCAPS_ISHOST
|
2104 DPCAPS_GUARANTEEDOPTIMIZED
|
2105 DPCAPS_GUARANTEEDSUPPORTED
|
2106 DPCAPS_ASYNCSUPPORTED
|
2108 playerCaps
.dwFlags
, FLAGS_DPCAPS
);
2111 checkFlags( DPCAPS_ISHOST
|
2112 DPCAPS_GUARANTEEDOPTIMIZED
|
2113 DPCAPS_GUARANTEEDSUPPORTED
|
2114 DPCAPS_ASYNCSUPPORTED
,
2115 playerCaps
.dwFlags
, FLAGS_DPCAPS
);
2117 if ( dwFlags
== DPGETCAPS_GUARANTEED
)
2119 check( 1048547, playerCaps
.dwMaxBufferSize
);
2120 check( 64, playerCaps
.dwMaxPlayers
);
2124 check( 65479, playerCaps
.dwMaxBufferSize
);
2125 check( 65536, playerCaps
.dwMaxPlayers
);
2132 IDirectPlayX_Release( pDP
[0] );
2133 IDirectPlayX_Release( pDP
[1] );
2140 static void test_PlayerData(void)
2143 DPSESSIONDESC2 dpsd
;
2147 /* lpDataFake has to be bigger than the rest, limits lpDataGet size */
2148 LPCSTR lpDataFake
= "big_fake_data_chunk";
2149 DWORD dwDataSizeFake
= strlen(lpDataFake
)+1;
2151 LPCSTR lpData
= "remote_data";
2152 DWORD dwDataSize
= strlen(lpData
)+1;
2154 LPCSTR lpDataLocal
= "local_data";
2155 DWORD dwDataSizeLocal
= strlen(lpDataLocal
)+1;
2157 LPSTR lpDataGet
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
2159 DWORD dwDataSizeGet
= dwDataSizeFake
;
2162 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2163 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
2164 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2165 if (FAILED(hr
)) return;
2167 /* No service provider */
2168 hr
= IDirectPlayX_SetPlayerData( pDP
, 0, (LPVOID
) lpData
,
2170 checkHR( DPERR_UNINITIALIZED
, hr
);
2172 hr
= IDirectPlayX_GetPlayerData( pDP
, 0, lpDataGet
, &dwDataSizeGet
, 0 );
2173 checkHR( DPERR_UNINITIALIZED
, hr
);
2176 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
2178 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2179 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2180 dpsd
.guidApplication
= appGuid
;
2181 IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
2184 /* Invalid player */
2185 hr
= IDirectPlayX_SetPlayerData( pDP
, 0, (LPVOID
) lpData
,
2187 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2189 hr
= IDirectPlayX_GetPlayerData( pDP
, 0, lpDataGet
, &dwDataSizeGet
, 0 );
2190 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2192 if ( hr
== DPERR_UNINITIALIZED
)
2194 todo_wine
win_skip( "Get/SetPlayerData not implemented\n" );
2198 /* Create the player */
2199 /* By default, the data is remote */
2200 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, NULL
, NULL
, (LPVOID
) lpData
,
2202 checkHR( DP_OK
, hr
);
2204 /* Invalid parameters */
2205 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, NULL
, dwDataSize
, 0 );
2206 checkHR( DPERR_INVALIDPARAMS
, hr
);
2207 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, lpDataGet
, -1, 0 );
2208 checkHR( DPERR_INVALIDPARAMS
, hr
);
2210 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, NULL
, 0 );
2211 checkHR( DPERR_INVALIDPARAMS
, hr
);
2215 * Remote data (default)
2219 /* Buffer redimension */
2220 dwDataSizeGet
= dwDataSizeFake
;
2221 strcpy(lpDataGet
, lpDataFake
);
2222 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
,
2223 &dwDataSizeGet
, 0 );
2224 check( DPERR_BUFFERTOOSMALL
, hr
);
2225 check( dwDataSize
, dwDataSizeGet
);
2226 checkStr( lpDataFake
, lpDataGet
);
2229 strcpy(lpDataGet
, lpDataFake
);
2230 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2231 check( DPERR_BUFFERTOOSMALL
, hr
);
2232 check( dwDataSize
, dwDataSizeGet
);
2234 strcpy(lpDataGet
, lpDataFake
);
2235 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2236 checkHR( DP_OK
, hr
);
2237 check( dwDataSize
, dwDataSizeGet
);
2238 checkStr( lpData
, lpDataGet
);
2240 /* Normal operation */
2241 dwDataSizeGet
= dwDataSizeFake
;
2242 strcpy(lpDataGet
, lpDataFake
);
2243 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2244 checkHR( DP_OK
, hr
);
2245 check( dwDataSize
, dwDataSizeGet
);
2246 checkStr( lpData
, lpDataGet
);
2249 dwDataSizeGet
= dwDataSizeFake
;
2250 strcpy(lpDataGet
, lpDataFake
);
2251 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2252 checkHR( DP_OK
, hr
);
2253 check( dwDataSize
, dwDataSizeGet
); /* Remote: works as expected */
2254 checkStr( lpData
, lpDataGet
);
2256 dwDataSizeGet
= dwDataSizeFake
;
2257 strcpy(lpDataGet
, lpDataFake
);
2258 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2260 checkHR( DP_OK
, hr
);
2261 check( dwDataSize
, dwDataSizeGet
); /* Same behaviour as in previous test */
2262 checkStr( lpData
, lpDataGet
);
2264 dwDataSizeGet
= dwDataSizeFake
;
2265 strcpy(lpDataGet
, lpDataFake
);
2266 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2268 checkHR( DP_OK
, hr
);
2269 check( 0, dwDataSizeGet
); /* Sets size to 0 (as local data doesn't exist) */
2270 checkStr( lpDataFake
, lpDataGet
);
2272 dwDataSizeGet
= dwDataSizeFake
;
2273 strcpy(lpDataGet
, lpDataFake
);
2274 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2275 DPGET_LOCAL
| DPGET_REMOTE
);
2276 checkHR( DP_OK
, hr
);
2277 check( 0, dwDataSizeGet
); /* Same behaviour as in previous test */
2278 checkStr( lpDataFake
, lpDataGet
);
2280 /* Getting local data (which doesn't exist), buffer size is ignored */
2282 strcpy(lpDataGet
, lpDataFake
);
2283 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2285 checkHR( DP_OK
, hr
);
2286 check( 0, dwDataSizeGet
); /* Sets size to 0 */
2287 checkStr( lpDataFake
, lpDataGet
);
2289 dwDataSizeGet
= dwDataSizeFake
;
2290 strcpy(lpDataGet
, lpDataFake
);
2291 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
, &dwDataSizeGet
,
2293 checkHR( DP_OK
, hr
);
2294 check( 0, dwDataSizeGet
); /* Sets size to 0 */
2295 checkStr( lpDataFake
, lpDataGet
);
2304 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2306 DPSET_LOCAL
| DPSET_GUARANTEED
);
2307 checkHR( DPERR_INVALIDPARAMS
, hr
);
2309 /* Correct parameters */
2310 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2311 dwDataSizeLocal
, DPSET_LOCAL
);
2312 checkHR( DP_OK
, hr
);
2314 /* Flag tests (again) */
2315 dwDataSizeGet
= dwDataSizeFake
;
2316 strcpy(lpDataGet
, lpDataFake
);
2317 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2318 checkHR( DP_OK
, hr
);
2319 check( dwDataSize
, dwDataSizeGet
); /* Remote: works as expected */
2320 checkStr( lpData
, lpDataGet
);
2322 dwDataSizeGet
= dwDataSizeFake
;
2323 strcpy(lpDataGet
, lpDataFake
);
2324 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2326 checkHR( DP_OK
, hr
);
2327 check( dwDataSize
, dwDataSizeGet
); /* Like in previous test */
2328 checkStr( lpData
, lpDataGet
);
2330 dwDataSizeGet
= dwDataSizeFake
;
2331 strcpy(lpDataGet
, lpDataFake
);
2332 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2334 checkHR( DP_OK
, hr
);
2335 check( dwDataSizeLocal
, dwDataSizeGet
); /* Local: works as expected */
2336 checkStr( lpDataLocal
, lpDataGet
);
2338 dwDataSizeGet
= dwDataSizeFake
;
2339 strcpy(lpDataGet
, lpDataFake
);
2340 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2341 DPGET_LOCAL
| DPGET_REMOTE
);
2342 checkHR( DP_OK
, hr
);
2343 check( dwDataSizeLocal
, dwDataSizeGet
); /* Like in previous test */
2344 checkStr( lpDataLocal
, lpDataGet
);
2346 /* Small buffer works as expected again */
2348 strcpy(lpDataGet
, lpDataFake
);
2349 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
,
2351 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2352 check( dwDataSizeLocal
, dwDataSizeGet
);
2353 checkStr( lpDataFake
, lpDataGet
);
2355 dwDataSizeGet
= dwDataSizeFake
;
2356 strcpy(lpDataGet
, lpDataFake
);
2357 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, NULL
,
2358 &dwDataSizeGet
, DPGET_LOCAL
);
2359 check( DPERR_BUFFERTOOSMALL
, hr
);
2360 check( dwDataSizeLocal
, dwDataSizeGet
);
2361 checkStr( lpDataFake
, lpDataGet
);
2365 * Changing remote data
2369 /* Remote data := local data */
2370 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2372 DPSET_GUARANTEED
| DPSET_REMOTE
);
2373 checkHR( DP_OK
, hr
);
2374 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataLocal
,
2375 dwDataSizeLocal
, 0 );
2376 checkHR( DP_OK
, hr
);
2378 dwDataSizeGet
= dwDataSizeFake
;
2379 strcpy(lpDataGet
, lpDataFake
);
2380 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2381 checkHR( DP_OK
, hr
);
2382 check( dwDataSizeLocal
, dwDataSizeGet
);
2383 checkStr( lpDataLocal
, lpDataGet
);
2385 /* Remote data := fake data */
2386 hr
= IDirectPlayX_SetPlayerData( pDP
, dpid
, (LPVOID
) lpDataFake
,
2387 dwDataSizeFake
, DPSET_REMOTE
);
2388 checkHR( DP_OK
, hr
);
2390 dwDataSizeGet
= dwDataSizeFake
+ 1;
2391 strcpy(lpDataGet
, lpData
);
2392 hr
= IDirectPlayX_GetPlayerData( pDP
, dpid
, lpDataGet
, &dwDataSizeGet
, 0 );
2393 checkHR( DP_OK
, hr
);
2394 check( dwDataSizeFake
, dwDataSizeGet
);
2395 checkStr( lpDataFake
, lpDataGet
);
2398 HeapFree( GetProcessHeap(), 0, lpDataGet
);
2399 IDirectPlayX_Release( pDP
);
2405 static void test_PlayerName(void)
2408 IDirectPlay4
*pDP
[2];
2409 DPSESSIONDESC2 dpsd
;
2415 DWORD dwDataSize
= 1024;
2416 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2417 CallbackData callbackData
;
2422 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2423 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2424 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2425 if (FAILED(hr
)) return;
2427 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2428 ZeroMemory( &playerName
, sizeof(DPNAME
) );
2431 /* Service provider not initialized */
2432 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2433 checkHR( DPERR_UNINITIALIZED
, hr
);
2436 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2437 checkHR( DPERR_UNINITIALIZED
, hr
);
2438 check( 1024, dwDataSize
);
2441 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2442 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2445 /* Session not initialized */
2446 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2447 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
2449 if ( hr
== DPERR_UNINITIALIZED
)
2451 todo_wine
win_skip( "Get/SetPlayerName not implemented\n" );
2456 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2457 checkHR( DPERR_INVALIDPLAYER
, hr
);
2458 check( 1024, dwDataSize
);
2461 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2462 dpsd
.guidApplication
= appGuid
;
2463 dpsd
.dwMaxPlayers
= 10;
2464 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2465 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2468 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
2469 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
2472 /* Name not initialized */
2473 playerName
.dwSize
= -1;
2474 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, 0 );
2475 checkHR( DP_OK
, hr
);
2478 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2479 checkHR( DPERR_INVALIDPLAYER
, hr
);
2480 check( 1024, dwDataSize
);
2483 playerName
.dwSize
= sizeof(DPNAME
);
2484 U1(playerName
).lpszShortNameA
= (LPSTR
) "player_name";
2485 U2(playerName
).lpszLongNameA
= (LPSTR
) "player_long_name";
2488 /* Invalid parameters */
2489 hr
= IDirectPlayX_SetPlayerName( pDP
[0], -1, &playerName
, 0 );
2490 checkHR( DPERR_INVALIDPLAYER
, hr
);
2491 hr
= IDirectPlayX_SetPlayerName( pDP
[0], 0, &playerName
, 0 );
2492 checkHR( DPERR_INVALIDPLAYER
, hr
);
2493 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, -1 );
2494 checkHR( DPERR_INVALIDPARAMS
, hr
);
2497 hr
= IDirectPlayX_GetPlayerName( pDP
[0], 0, lpData
, &dwDataSize
);
2498 checkHR( DPERR_INVALIDPLAYER
, hr
);
2499 check( 1024, dwDataSize
);
2502 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2503 checkHR( DPERR_INVALIDPARAMS
, hr
);
2504 check( -1, dwDataSize
);
2506 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, NULL
);
2507 checkHR( DPERR_INVALIDPARAMS
, hr
);
2509 /* Trying to modify remote player */
2510 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[1], &playerName
, 0 );
2511 checkHR( DPERR_ACCESSDENIED
, hr
);
2514 /* Regular operation */
2515 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
, 0 );
2516 checkHR( DP_OK
, hr
);
2518 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2519 checkHR( DP_OK
, hr
);
2520 check( 45, dwDataSize
);
2521 checkStr( U1(playerName
).lpszShortNameA
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2522 checkStr( U2(playerName
).lpszLongNameA
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2523 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2525 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], NULL
, 0 );
2526 checkHR( DP_OK
, hr
);
2528 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2529 checkHR( DP_OK
, hr
);
2530 check( 16, dwDataSize
);
2531 checkLP( NULL
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2532 checkLP( NULL
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2533 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2536 /* Small buffer in get operation */
2538 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], NULL
, &dwDataSize
);
2539 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2540 check( 16, dwDataSize
);
2543 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2544 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2545 check( 16, dwDataSize
);
2547 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2548 checkHR( DP_OK
, hr
);
2549 check( 16, dwDataSize
);
2550 checkLP( NULL
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2551 checkLP( NULL
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2552 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2556 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2558 checkHR( DP_OK
, hr
);
2560 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0], lpData
, &dwDataSize
);
2561 checkHR( DP_OK
, hr
);
2562 check( 45, dwDataSize
);
2563 checkStr( U1(playerName
).lpszShortNameA
, U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2564 checkStr( U2(playerName
).lpszLongNameA
, U2(*(LPDPNAME
)lpData
).lpszLongNameA
);
2565 check( 0, ((LPDPNAME
)lpData
)->dwFlags
);
2567 /* - Local (no propagation) */
2568 U1(playerName
).lpszShortNameA
= (LPSTR
) "no_propagation";
2569 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2571 checkHR( DP_OK
, hr
);
2574 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0],
2575 lpData
, &dwDataSize
); /* Local fetch */
2576 checkHR( DP_OK
, hr
);
2577 check( 48, dwDataSize
);
2578 checkStr( "no_propagation", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2581 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2582 lpData
, &dwDataSize
); /* Remote fetch */
2583 checkHR( DP_OK
, hr
);
2584 check( 45, dwDataSize
);
2585 checkStr( "player_name", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2589 U1(playerName
).lpszShortNameA
= (LPSTR
) "no_propagation_2";
2590 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2591 DPSET_LOCAL
| DPSET_REMOTE
);
2592 checkHR( DP_OK
, hr
);
2595 hr
= IDirectPlayX_GetPlayerName( pDP
[0], dpid
[0],
2596 lpData
, &dwDataSize
); /* Local fetch */
2597 checkHR( DP_OK
, hr
);
2598 check( 50, dwDataSize
);
2599 checkStr( "no_propagation_2", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2602 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2603 lpData
, &dwDataSize
); /* Remote fetch */
2604 checkHR( DP_OK
, hr
);
2605 check( 45, dwDataSize
);
2606 checkStr( "player_name", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2608 /* - Remote (propagation, default) */
2609 U1(playerName
).lpszShortNameA
= (LPSTR
) "propagation";
2610 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2612 checkHR( DP_OK
, hr
);
2615 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2616 lpData
, &dwDataSize
); /* Remote fetch */
2617 checkHR( DP_OK
, hr
);
2618 check( 45, dwDataSize
);
2619 checkStr( "propagation", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2622 U1(playerName
).lpszShortNameA
= (LPSTR
) "propagation_2";
2623 hr
= IDirectPlayX_SetPlayerName( pDP
[0], dpid
[0], &playerName
,
2625 checkHR( DP_OK
, hr
);
2628 hr
= IDirectPlayX_GetPlayerName( pDP
[1], dpid
[0],
2629 lpData
, &dwDataSize
); /* Remote fetch */
2630 checkHR( DP_OK
, hr
);
2631 check( 47, dwDataSize
);
2632 checkStr( "propagation_2", U1(*(LPDPNAME
)lpData
).lpszShortNameA
);
2635 /* Checking system messages */
2636 check_messages( pDP
[0], dpid
, 2, &callbackData
);
2637 checkStr( "S0,S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
2638 checkStr( "48,28,57,28,57,57,59,", callbackData
.szTrace2
);
2639 check_messages( pDP
[1], dpid
, 2, &callbackData
);
2640 checkStr( "S1,S1,S1,S1,S1,S1,", callbackData
.szTrace1
);
2641 checkStr( "28,57,28,57,57,59,", callbackData
.szTrace2
);
2644 HeapFree( GetProcessHeap(), 0, lpData
);
2645 IDirectPlayX_Release( pDP
[0] );
2646 IDirectPlayX_Release( pDP
[1] );
2650 /* GetPlayerAccount */
2652 static BOOL CALLBACK
EnumSessions_cb_join_secure( LPCDPSESSIONDESC2 lpThisSD
,
2653 LPDWORD lpdwTimeOut
,
2657 IDirectPlay4
*pDP
= lpContext
;
2658 DPSESSIONDESC2 dpsd
;
2659 DPCREDENTIALS dpCredentials
;
2662 if (dwFlags
& DPESC_TIMEDOUT
)
2667 checkFlags( DPSESSION_SECURESERVER
, lpThisSD
->dwFlags
, FLAGS_DPSESSION
);
2669 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2670 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2671 dpsd
.guidApplication
= appGuid
;
2672 dpsd
.guidInstance
= lpThisSD
->guidInstance
;
2674 ZeroMemory( &dpCredentials
, sizeof(DPCREDENTIALS
) );
2675 dpCredentials
.dwSize
= sizeof(DPCREDENTIALS
);
2676 U1(dpCredentials
).lpszUsernameA
= (LPSTR
) "user";
2677 U2(dpCredentials
).lpszPasswordA
= (LPSTR
) "pass";
2678 hr
= IDirectPlayX_SecureOpen( pDP
, &dpsd
, DPOPEN_JOIN
,
2679 NULL
, &dpCredentials
);
2680 checkHR( DPERR_LOGONDENIED
, hr
); /* TODO: Make this work */
2685 static void test_GetPlayerAccount(void)
2688 IDirectPlay4
*pDP
[2];
2689 DPSESSIONDESC2 dpsd
;
2694 DWORD dwDataSize
= 1024;
2695 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2700 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2701 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2702 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2703 if (FAILED(hr
)) return;
2705 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2706 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2707 dpsd
.guidApplication
= appGuid
;
2708 dpsd
.dwMaxPlayers
= 10;
2710 /* Uninitialized service provider */
2711 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0, lpData
, &dwDataSize
);
2712 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
2716 todo_wine
win_skip( "GetPlayerAccount not implemented\n" );
2721 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2722 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2726 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0, lpData
, &dwDataSize
);
2727 checkHR( DPERR_NOSESSIONS
, hr
);
2730 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2731 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2736 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
,
2738 checkHR( DP_OK
, hr
);
2742 /* Session is not secure */
2744 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2745 lpData
, &dwDataSize
);
2746 checkHR( DPERR_UNSUPPORTED
, hr
);
2747 check( 1024, dwDataSize
);
2750 /* Open a secure session */
2753 hr
= IDirectPlayX_Close( pDP
[i
] );
2754 checkHR( DP_OK
, hr
);
2757 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
2758 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
2759 checkHR( DP_OK
, hr
);
2761 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
2762 NULL
, NULL
, NULL
, 0, 0 );
2763 checkHR( DP_OK
, hr
);
2765 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0,
2766 EnumSessions_cb_join_secure
, pDP
[1], 0 );
2767 checkHR( DP_OK
, hr
);
2769 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
2770 NULL
, NULL
, NULL
, 0, 0 );
2771 checkHR( DPERR_INVALIDPARAMS
, hr
);
2773 /* TODO: Player creation so that this works */
2775 /* Invalid player */
2777 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], 0, 0,
2778 lpData
, &dwDataSize
);
2779 checkHR( DPERR_INVALIDPLAYER
, hr
);
2780 check( 1024, dwDataSize
);
2784 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], -1,
2785 lpData
, &dwDataSize
);
2786 checkHR( DPERR_INVALIDFLAGS
, hr
);
2787 check( 1024, dwDataSize
);
2790 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 1,
2791 lpData
, &dwDataSize
);
2792 checkHR( DPERR_INVALIDFLAGS
, hr
);
2793 check( 1024, dwDataSize
);
2797 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2798 NULL
, &dwDataSize
);
2799 checkHR( DPERR_INVALIDPLAYER
, hr
);
2800 check( 0, dwDataSize
);
2803 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2804 lpData
, &dwDataSize
);
2805 checkHR( DPERR_INVALIDPLAYER
, hr
);
2806 check( 0, dwDataSize
);
2808 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2809 lpData
, &dwDataSize
);
2810 checkHR( DPERR_INVALIDPLAYER
, hr
);
2811 check( 0, dwDataSize
);
2813 /* Normal operation */
2815 hr
= IDirectPlayX_GetPlayerAccount( pDP
[0], dpid
[0], 0,
2816 lpData
, &dwDataSize
);
2817 checkHR( DPERR_INVALIDPLAYER
, hr
);
2818 check( 1024, dwDataSize
);
2821 HeapFree( GetProcessHeap(), 0, lpData
);
2822 IDirectPlayX_Release( pDP
[0] );
2823 IDirectPlayX_Release( pDP
[1] );
2827 /* GetPlayerAddress */
2829 static BOOL CALLBACK
EnumAddress_cb( REFGUID guidDataType
,
2834 lpCallbackData callbackData
= lpContext
;
2835 static REFGUID types
[] = { &DPAID_TotalSize
,
2836 &DPAID_ServiceProvider
,
2839 static DWORD sizes
[] = { 4, 16, 12, 24, 4, 16, 10, 20 };
2842 checkGuid( types
[callbackData
->dwCounter1
%4], guidDataType
);
2843 check( sizes
[callbackData
->dwCounter1
], dwDataSize
);
2845 switch(callbackData
->dwCounter1
)
2848 check( 136, *(LPDWORD
) lpData
);
2851 check( 130, *(LPDWORD
) lpData
);
2855 checkGuid( &DPSPGUID_TCPIP
, lpData
);
2858 checkStr( "127.0.0.1", (LPSTR
) lpData
);
2864 callbackData
->dwCounter1
++;
2869 static void test_GetPlayerAddress(void)
2872 IDirectPlay4
*pDP
[2];
2873 IDirectPlayLobby3
*pDPL
;
2874 DPSESSIONDESC2 dpsd
;
2876 CallbackData callbackData
;
2880 DWORD dwDataSize
= 1024;
2881 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
2886 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
2887 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
2888 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
2889 if (FAILED(hr
)) return;
2891 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
2892 hr
= CoCreateInstance( &CLSID_DirectPlayLobby
, NULL
, CLSCTX_ALL
,
2893 &IID_IDirectPlayLobby3A
, (LPVOID
*) &pDPL
);
2894 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlayLobby / IID_IDirectPlayLobby3A failed\n" );
2895 if (FAILED(hr
)) return;
2897 /* Uninitialized service provider */
2898 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0, lpData
, &dwDataSize
);
2899 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
2903 todo_wine
win_skip( "GetPlayerAddress not implemented\n" );
2907 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
2908 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
2913 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0, lpData
, &dwDataSize
);
2914 checkHR( DPERR_UNSUPPORTED
, hr
);
2915 check( 1024, dwDataSize
);
2918 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 1, lpData
, &dwDataSize
);
2919 checkHR( DPERR_INVALIDPLAYER
, hr
);
2920 check( 1024, dwDataSize
);
2923 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
2924 dpsd
.guidApplication
= appGuid
;
2925 dpsd
.dwMaxPlayers
= 10;
2926 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
2927 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
2932 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
], NULL
, NULL
, NULL
,
2934 checkHR( DP_OK
, hr
);
2937 /* Invalid player */
2939 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 0,
2940 lpData
, &dwDataSize
);
2941 checkHR( DPERR_UNSUPPORTED
, hr
);
2942 check( 1024, dwDataSize
);
2945 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], 1,
2946 lpData
, &dwDataSize
);
2947 checkHR( DPERR_INVALIDPLAYER
, hr
);
2948 check( 1024, dwDataSize
);
2952 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2953 NULL
, &dwDataSize
);
2954 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2955 check( 136, dwDataSize
);
2958 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2959 lpData
, &dwDataSize
);
2960 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
2961 check( 136, dwDataSize
);
2963 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2964 lpData
, &dwDataSize
);
2965 checkHR( DP_OK
, hr
);
2966 check( 136, dwDataSize
);
2969 /* Regular parameters */
2970 callbackData
.dwCounter1
= 0;
2974 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[0],
2975 lpData
, &dwDataSize
);
2976 checkHR( DP_OK
, hr
);
2977 check( 136, dwDataSize
);
2979 hr
= IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb
, lpData
, dwDataSize
,
2981 checkHR( DP_OK
, hr
);
2983 check( 4, callbackData
.dwCounter1
);
2987 hr
= IDirectPlayX_GetPlayerAddress( pDP
[0], dpid
[1],
2988 lpData
, &dwDataSize
);
2989 checkHR( DP_OK
, hr
);
2990 check( 130, dwDataSize
);
2992 hr
= IDirectPlayLobby_EnumAddress( pDPL
, EnumAddress_cb
, lpData
, dwDataSize
,
2994 checkHR( DP_OK
, hr
);
2996 check( 8, callbackData
.dwCounter1
);
2999 HeapFree( GetProcessHeap(), 0, lpData
);
3000 IDirectPlayX_Release( pDP
[0] );
3001 IDirectPlayX_Release( pDP
[1] );
3005 /* GetPlayerFlags */
3007 static void test_GetPlayerFlags(void)
3010 IDirectPlay4
*pDP
[2];
3011 DPSESSIONDESC2 dpsd
;
3021 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3022 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3023 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3024 if (FAILED(hr
)) return;
3026 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3027 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3028 dpsd
.guidApplication
= appGuid
;
3029 dpsd
.dwMaxPlayers
= 10;
3031 /* Uninitialized service provider */
3032 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3033 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
3037 todo_wine
win_skip( "GetPlayerFlags not implemented\n" );
3041 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3042 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3046 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3047 checkHR( DPERR_INVALIDPLAYER
, hr
);
3049 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 1, &dwFlags
);
3050 checkHR( DPERR_INVALIDPLAYER
, hr
);
3053 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
3054 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
3059 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
3060 NULL
, NULL
, NULL
, 0, 0 );
3061 checkHR( DP_OK
, hr
);
3063 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2],
3065 0, DPPLAYER_SPECTATOR
);
3066 checkHR( DP_OK
, hr
);
3067 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[3],
3069 0, DPPLAYER_SERVERPLAYER
);
3070 checkHR( DP_OK
, hr
);
3073 /* Invalid player */
3074 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 0, &dwFlags
);
3075 checkHR( DPERR_INVALIDPLAYER
, hr
);
3077 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], 2, &dwFlags
);
3078 checkHR( DPERR_INVALIDPLAYER
, hr
);
3080 /* Invalid parameters */
3081 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[0], NULL
);
3082 checkHR( DPERR_INVALIDPARAMS
, hr
);
3085 /* Regular parameters */
3086 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[0], &dwFlags
);
3087 checkHR( DP_OK
, hr
);
3088 checkFlags( dwFlags
, DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3090 hr
= IDirectPlayX_GetPlayerFlags( pDP
[1], dpid
[1], &dwFlags
);
3091 checkHR( DP_OK
, hr
);
3092 checkFlags( dwFlags
, DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3094 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[1], &dwFlags
);
3095 checkHR( DP_OK
, hr
);
3096 checkFlags( dwFlags
, 0, FLAGS_DPPLAYER
);
3098 hr
= IDirectPlayX_GetPlayerFlags( pDP
[0], dpid
[2], &dwFlags
);
3099 checkHR( DP_OK
, hr
);
3100 checkFlags( dwFlags
, DPPLAYER_SPECTATOR
| DPPLAYER_LOCAL
, FLAGS_DPPLAYER
);
3102 hr
= IDirectPlayX_GetPlayerFlags( pDP
[1], dpid
[3], &dwFlags
);
3103 checkHR( DP_OK
, hr
);
3104 checkFlags( dwFlags
, DPPLAYER_SERVERPLAYER
, FLAGS_DPPLAYER
);
3107 IDirectPlayX_Release( pDP
[0] );
3108 IDirectPlayX_Release( pDP
[1] );
3113 CreateGroupInGroup */
3115 static void test_CreateGroup(void)
3119 DPSESSIONDESC2 dpsd
;
3120 DPID idFrom
, idTo
, dpid
, idGroup
, idGroupParent
;
3125 LPCSTR lpData
= "data";
3126 DWORD dwDataSize
= strlen(lpData
)+1;
3127 LPDPMSG_CREATEPLAYERORGROUP lpDataGet
= HeapAlloc( GetProcessHeap(),
3130 DWORD dwDataSizeGet
= 1024;
3131 CallbackData callbackData
;
3134 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3135 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
3136 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3137 if (FAILED(hr
)) return;
3138 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3139 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3140 dpsd
.guidApplication
= appGuid
;
3141 dpsd
.dwMaxPlayers
= 10;
3142 ZeroMemory( &groupName
, sizeof(DPNAME
) );
3145 /* No service provider */
3146 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
, NULL
, NULL
, 0, 0 );
3147 checkHR( DPERR_UNINITIALIZED
, hr
);
3149 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 0, &idGroup
, NULL
, NULL
, 0, 0 );
3150 checkHR( DPERR_UNINITIALIZED
, hr
);
3154 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
3158 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3160 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
3162 if ( hr
== DPERR_UNINITIALIZED
)
3164 todo_wine
win_skip( "CreateGroup not implemented\n" );
3168 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 0, &idGroup
,
3170 checkHR( DPERR_INVALIDGROUP
, hr
);
3172 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, 2, &idGroup
,
3174 checkHR( DPERR_INVALIDGROUP
, hr
);
3177 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3178 checkHR( DP_OK
, hr
);
3179 IDirectPlayX_CreatePlayer( pDP
, &dpid
,
3180 NULL
, NULL
, NULL
, 0, 0 );
3185 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3187 checkHR( DP_OK
, hr
);
3189 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3191 checkHR( DP_OK
, hr
);
3193 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3194 &groupName
, NULL
, 0, 0 );
3195 checkHR( DP_OK
, hr
);
3197 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3198 &groupName
, NULL
, 0, 0 );
3199 checkHR( DP_OK
, hr
);
3202 groupName
.dwSize
= sizeof(DPNAME
);
3203 U1(groupName
).lpszShortNameA
= (LPSTR
) lpData
;
3206 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3207 &groupName
, NULL
, 0, 0 );
3208 checkHR( DP_OK
, hr
);
3210 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3211 &groupName
, NULL
, 0, 0 );
3212 checkHR( DP_OK
, hr
);
3215 /* Message checking */
3218 dwDataSizeGet
= 1024;
3219 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3221 checkHR( DP_OK
, hr
);
3222 if ( NULL
== U1(lpDataGet
->dpnName
).lpszShortNameA
)
3224 check( 48, dwDataSizeGet
);
3228 check( 48 + dwDataSize
, dwDataSizeGet
);
3229 checkStr( lpData
, U1(lpDataGet
->dpnName
).lpszShortNameA
);
3231 check( DPID_SYSMSG
, idFrom
);
3232 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3233 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3234 checkFlags( DPGROUP_LOCAL
, lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3236 check_messages( pDP
, &dpid
, 1, &callbackData
);
3237 checkStr( "", callbackData
.szTrace1
);
3241 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3242 NULL
, (LPVOID
) lpData
, -1, 0 );
3243 checkHR( DPERR_INVALIDPARAMS
, hr
);
3245 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3246 NULL
, (LPVOID
) lpData
, 0, 0 );
3247 checkHR( DP_OK
, hr
);
3249 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3250 NULL
, NULL
, dwDataSize
, 0 );
3251 checkHR( DPERR_INVALIDPARAMS
, hr
);
3253 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3254 NULL
, (LPVOID
) lpData
, dwDataSize
, 0 );
3255 checkHR( DP_OK
, hr
);
3258 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3259 NULL
, (LPVOID
) lpData
, -1, 0 );
3260 checkHR( DPERR_INVALIDPARAMS
, hr
);
3262 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3263 NULL
, (LPVOID
) lpData
, 0, 0 );
3264 checkHR( DP_OK
, hr
);
3266 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3267 NULL
, NULL
, dwDataSize
, 0 );
3268 checkHR( DPERR_INVALIDPARAMS
, hr
);
3270 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroup
, &idGroup
,
3271 NULL
, (LPVOID
)lpData
, dwDataSize
, 0 );
3272 checkHR( DP_OK
, hr
);
3275 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroupParent
,
3277 checkHR( DP_OK
, hr
);
3280 /* Message checking */
3283 dwDataSizeGet
= 1024;
3284 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3286 checkHR( DP_OK
, hr
);
3287 check( 48 + lpDataGet
->dwDataSize
, dwDataSizeGet
);
3288 check( DPID_SYSMSG
, idFrom
);
3289 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3290 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3291 checkFlags( DPGROUP_LOCAL
, lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3293 check_messages( pDP
, &dpid
, 1, &callbackData
);
3294 checkStr( "", callbackData
.szTrace1
);
3297 /* Flags and idGroupParent */
3298 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3300 checkHR( DP_OK
, hr
);
3302 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3303 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
3304 checkHR( DP_OK
, hr
);
3306 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3307 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
3308 checkHR( DP_OK
, hr
);
3310 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3312 DPGROUP_HIDDEN
| DPGROUP_STAGINGAREA
);
3313 checkHR( DP_OK
, hr
);
3316 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3318 checkHR( DP_OK
, hr
);
3320 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3321 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
3322 checkHR( DP_OK
, hr
);
3324 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3325 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
3326 checkHR( DP_OK
, hr
);
3328 hr
= IDirectPlayX_CreateGroupInGroup( pDP
, idGroupParent
, &idGroup
,
3331 DPGROUP_STAGINGAREA
);
3332 checkHR( DP_OK
, hr
);
3335 /* Message checking */
3338 dwDataSizeGet
= 1024;
3339 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpDataGet
,
3341 checkHR( DP_OK
, hr
);
3342 check( 48, dwDataSizeGet
);
3343 check( DPID_SYSMSG
, idFrom
);
3344 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpDataGet
->dwType
, dpMsgType2str
);
3345 check( DPPLAYERTYPE_GROUP
, lpDataGet
->dwPlayerType
);
3347 if ( lpDataGet
->dpIdParent
!= 0 )
3349 check( idGroupParent
, lpDataGet
->dpIdParent
);
3355 checkFlags( DPGROUP_LOCAL
,
3356 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3359 checkFlags( DPGROUP_LOCAL
| DPGROUP_HIDDEN
,
3360 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3363 checkFlags( DPGROUP_STAGINGAREA
| DPGROUP_LOCAL
,
3364 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3367 checkFlags( DPGROUP_STAGINGAREA
| DPGROUP_LOCAL
| DPGROUP_HIDDEN
,
3368 lpDataGet
->dwFlags
, FLAGS_DPGROUP
);
3373 check_messages( pDP
, &dpid
, 1, &callbackData
);
3374 checkStr( "", callbackData
.szTrace1
);
3377 /* If a group is created in C/S mode, no messages are sent */
3380 IDirectPlayX_Close( pDP
);
3383 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3384 checkHR( DP_OK
, hr
);
3385 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
, NULL
, NULL
, NULL
, 0, 0 );
3386 checkHR( DP_OK
, hr
);
3388 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
, NULL
, NULL
, 0, 0 );
3389 checkHR( DP_OK
, hr
);
3391 /* Messages are received */
3392 check_messages( pDP
, &dpid
, 1, &callbackData
);
3393 checkStr( "S0,", callbackData
.szTrace1
);
3396 /* - Client/Server */
3397 IDirectPlayX_Close( pDP
);
3399 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
3400 hr
= IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
3401 checkHR( DP_OK
, hr
);
3402 hr
= IDirectPlayX_CreatePlayer( pDP
, &dpid
,
3403 NULL
, NULL
, NULL
, 0,
3404 DPPLAYER_SERVERPLAYER
);
3405 checkHR( DP_OK
, hr
);
3407 hr
= IDirectPlayX_CreateGroup( pDP
, &idGroup
,
3409 checkHR( DP_OK
, hr
);
3412 check_messages( pDP
, &dpid
, 1, &callbackData
);
3413 checkStr( "S0,", callbackData
.szTrace1
); /* Or at least there
3414 shouldn't be messages... */
3417 HeapFree( GetProcessHeap(), 0, lpDataGet
);
3418 IDirectPlayX_Release( pDP
);
3424 static void test_GroupOwner(void)
3427 IDirectPlay4
*pDP
[2];
3428 DPSESSIONDESC2 dpsd
;
3429 DPID dpid
[2], idGroup
, idOwner
;
3436 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3437 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3438 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3439 if (FAILED(hr
)) return;
3441 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
3442 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
3443 dpsd
.guidApplication
= appGuid
;
3444 dpsd
.dwMaxPlayers
= 10;
3448 /* Service provider not initialized */
3449 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3450 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
3451 check( 0, idOwner
);
3455 todo_wine
win_skip( "GetGroupOwner not implemented\n" );
3461 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
3463 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
3464 checkHR( DP_OK
, hr
);
3465 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
3467 checkHR( DP_OK
, hr
);
3471 hr
= IDirectPlayX_CreatePlayer( pDP
[i
], &dpid
[i
],
3472 NULL
, NULL
, NULL
, 0, 0 );
3473 checkHR( DP_OK
, hr
);
3477 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3478 checkHR( DPERR_INVALIDGROUP
, hr
);
3480 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
, NULL
, NULL
, 0, 0 );
3481 checkHR( DP_OK
, hr
);
3483 /* Fails, because we need a lobby session */
3484 hr
= IDirectPlayX_GetGroupOwner( pDP
[0], idGroup
, &idOwner
);
3485 checkHR( DPERR_UNSUPPORTED
, hr
);
3490 * - Check migration of the ownership of a group
3491 * when the owner leaves
3495 IDirectPlayX_Release( pDP
[0] );
3496 IDirectPlayX_Release( pDP
[1] );
3502 static BOOL CALLBACK
EnumPlayers_cb( DPID dpId
,
3508 lpCallbackData callbackData
= lpContext
;
3509 char playerIndex
= dpid2char( callbackData
->dpid
,
3510 callbackData
->dpidSize
,
3514 /* Trace to study player ids */
3515 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = playerIndex
;
3516 callbackData
->dwCounter1
++;
3517 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = '\0';
3519 /* Trace to study flags received */
3520 strcat( callbackData
->szTrace2
,
3521 ( dwFlags2str(dwFlags
, FLAGS_DPENUMPLAYERS
) +
3522 strlen("DPENUMPLAYERS_") ) );
3523 strcat( callbackData
->szTrace2
, ":" );
3526 if ( playerIndex
< '5' )
3528 check( DPPLAYERTYPE_PLAYER
, dwPlayerType
);
3532 check( DPPLAYERTYPE_GROUP
, dwPlayerType
);
3539 static BOOL CALLBACK
EnumSessions_cb_EnumPlayers( LPCDPSESSIONDESC2 lpThisSD
,
3540 LPDWORD lpdwTimeOut
,
3544 lpCallbackData callbackData
= lpContext
;
3547 if (dwFlags
& DPESC_TIMEDOUT
)
3553 callbackData
->dwCounter1
= 0;
3554 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, NULL
, EnumPlayers_cb
,
3556 checkHR( DPERR_NOSESSIONS
, hr
);
3557 check( 0, callbackData
->dwCounter1
);
3559 /* guid = appGuid */
3560 callbackData
->dwCounter1
= 0;
3561 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, (LPGUID
) &appGuid
,
3562 EnumPlayers_cb
, &callbackData
, 0 );
3563 checkHR( DPERR_NOSESSIONS
, hr
);
3564 check( 0, callbackData
->dwCounter1
);
3566 callbackData
->dwCounter1
= 0;
3567 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
, (LPGUID
) &appGuid
,
3568 EnumPlayers_cb
, &callbackData
,
3569 DPENUMPLAYERS_SESSION
);
3570 checkHR( DPERR_NOSESSIONS
, hr
);
3571 check( 0, callbackData
->dwCounter1
);
3573 /* guid = guidInstance */
3574 callbackData
->dwCounter1
= 0;
3575 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
,
3576 (LPGUID
) &lpThisSD
->guidInstance
,
3577 EnumPlayers_cb
, &callbackData
, 0 );
3578 checkHR( DPERR_NOSESSIONS
, hr
);
3579 check( 0, callbackData
->dwCounter1
);
3581 callbackData
->dwCounter1
= 0;
3582 hr
= IDirectPlayX_EnumPlayers( callbackData
->pDP
,
3583 (LPGUID
) &lpThisSD
->guidInstance
,
3584 EnumPlayers_cb
, &callbackData
,
3585 DPENUMPLAYERS_SESSION
);
3586 checkHR( DPERR_GENERIC
, hr
); /* Why? */
3587 check( 0, callbackData
->dwCounter1
);
3593 static void test_EnumPlayers(void)
3595 IDirectPlay4
*pDP
[3];
3596 DPSESSIONDESC2 dpsd
[3];
3597 DPID dpid
[5+2]; /* 5 players, 2 groups */
3598 CallbackData callbackData
;
3605 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3606 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3607 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3608 if (FAILED(hr
)) return;
3610 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
3611 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
3614 dpsd
[0].guidApplication
= appGuid
;
3615 dpsd
[1].guidApplication
= appGuid2
;
3616 dpsd
[2].guidApplication
= GUID_NULL
;
3618 callbackData
.dpid
= dpid
;
3619 callbackData
.dpidSize
= 5+2;
3622 /* Uninitialized service provider */
3623 callbackData
.dwCounter1
= 0;
3624 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, NULL
,
3626 checkHR( DPERR_UNINITIALIZED
, hr
);
3627 check( 0, callbackData
.dwCounter1
);
3630 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3631 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3632 init_TCPIP_provider( pDP
[2], "127.0.0.1", 0 );
3636 callbackData
.dwCounter1
= 0;
3637 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3639 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
3640 check( 0, callbackData
.dwCounter1
);
3642 if ( hr
== DPERR_UNINITIALIZED
)
3644 todo_wine
win_skip( "EnumPlayers not implemented\n" );
3648 callbackData
.dwCounter1
= 0;
3649 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3651 checkHR( DPERR_NOSESSIONS
, hr
);
3652 check( 0, callbackData
.dwCounter1
);
3654 callbackData
.dwCounter1
= 0;
3655 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3656 &callbackData
, DPENUMPLAYERS_SESSION
);
3657 checkHR( DPERR_NOSESSIONS
, hr
);
3658 check( 0, callbackData
.dwCounter1
);
3661 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
3662 checkHR( DP_OK
, hr
);
3663 hr
= IDirectPlayX_Open( pDP
[1], &dpsd
[1], DPOPEN_CREATE
);
3664 checkHR( DP_OK
, hr
);
3668 callbackData
.dwCounter1
= 0;
3669 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3671 checkHR( DP_OK
, hr
);
3672 check( 0, callbackData
.dwCounter1
);
3675 /* Create players */
3676 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
3677 NULL
, NULL
, NULL
, 0,
3678 DPPLAYER_SERVERPLAYER
);
3679 checkHR( DP_OK
, hr
);
3680 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
3681 NULL
, NULL
, NULL
, 0,
3683 checkHR( DP_OK
, hr
);
3685 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2],
3686 NULL
, NULL
, NULL
, 0,
3688 checkHR( DP_OK
, hr
);
3689 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[5],
3691 checkHR( DP_OK
, hr
);
3694 /* Invalid parameters */
3695 callbackData
.dwCounter1
= 0;
3696 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, NULL
,
3698 checkHR( DPERR_INVALIDPARAMS
, hr
);
3699 check( 0, callbackData
.dwCounter1
);
3701 callbackData
.dwCounter1
= 0;
3702 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3703 &callbackData
, DPENUMPLAYERS_SESSION
);
3704 checkHR( DPERR_INVALIDPARAMS
, hr
);
3705 check( 0, callbackData
.dwCounter1
);
3708 /* Regular operation */
3709 callbackData
.dwCounter1
= 0;
3710 callbackData
.szTrace2
[0] = 0;
3711 hr
= IDirectPlayX_EnumPlayers( pDP
[0], NULL
, EnumPlayers_cb
,
3713 checkHR( DP_OK
, hr
);
3714 check( 2, callbackData
.dwCounter1
);
3715 checkStr( "20", callbackData
.szTrace1
);
3716 checkStr( "ALL:SERVERPLAYER:", callbackData
.szTrace2
);
3718 callbackData
.dwCounter1
= 0;
3719 callbackData
.szTrace2
[0] = 0;
3720 hr
= IDirectPlayX_EnumPlayers( pDP
[1], NULL
, EnumPlayers_cb
,
3722 checkHR( DP_OK
, hr
);
3723 check( 1, callbackData
.dwCounter1
);
3724 checkStr( "1", callbackData
.szTrace1
);
3725 checkStr( "ALL:", callbackData
.szTrace2
);
3727 callbackData
.dwCounter1
= 0;
3728 callbackData
.szTrace2
[0] = 0;
3729 hr
= IDirectPlayX_EnumPlayers( pDP
[0], (LPGUID
) &appGuid
, EnumPlayers_cb
,
3731 checkHR( DP_OK
, hr
);
3732 check( 2, callbackData
.dwCounter1
); /* Guid is ignored */
3733 checkStr( "20", callbackData
.szTrace1
);
3734 checkStr( "ALL:SERVERPLAYER:", callbackData
.szTrace2
);
3737 /* Enumerating from a remote session */
3738 /* - Session not open */
3739 callbackData
.pDP
= pDP
[2];
3740 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[2], 0,
3741 EnumSessions_cb_EnumPlayers
,
3743 checkHR( DP_OK
, hr
);
3746 /* - Open session */
3747 callbackData
.pDP
= pDP
[2];
3748 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[0], 0, EnumSessions_cb_join
,
3750 checkHR( DP_OK
, hr
);
3751 hr
= IDirectPlayX_CreatePlayer( pDP
[2], &dpid
[3],
3752 NULL
, NULL
, NULL
, 0,
3753 DPPLAYER_SPECTATOR
);
3754 checkHR( DP_OK
, hr
);
3755 hr
= IDirectPlayX_CreatePlayer( pDP
[2], &dpid
[4],
3756 NULL
, NULL
, NULL
, 0,
3758 checkHR( DP_OK
, hr
);
3759 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[6],
3761 checkHR( DP_OK
, hr
);
3763 callbackData
.dwCounter1
= 0;
3764 callbackData
.szTrace2
[0] = 0;
3765 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3767 checkHR( DP_OK
, hr
);
3768 check( 4, callbackData
.dwCounter1
);
3769 checkStr( "4302", callbackData
.szTrace1
);
3770 checkStr( "ALL:SPECTATOR:SERVERPLAYER:ALL:", callbackData
.szTrace2
);
3775 callbackData
.dwCounter1
= 0;
3776 callbackData
.szTrace2
[0] = 0;
3777 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3778 &callbackData
, DPENUMPLAYERS_ALL
);
3779 checkHR( DP_OK
, hr
);
3780 check( 4, callbackData
.dwCounter1
);
3781 checkStr( "4302", callbackData
.szTrace1
);
3782 checkStr( "ALL:SPECTATOR:SERVERPLAYER:ALL:", callbackData
.szTrace2
);
3784 callbackData
.dwCounter1
= 0;
3785 callbackData
.szTrace2
[0] = 0;
3786 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3787 &callbackData
, DPENUMPLAYERS_GROUP
);
3788 checkHR( DP_OK
, hr
);
3789 check( 6, callbackData
.dwCounter1
);
3790 checkStr( "430256", callbackData
.szTrace1
);
3792 "GROUP,DPENUMPLAYERS_SPECTATOR:"
3793 "GROUP,DPENUMPLAYERS_SERVERPLAYER:"
3794 "GROUP:ALL:ALL:", callbackData
.szTrace2
);
3796 callbackData
.dwCounter1
= 0;
3797 callbackData
.szTrace2
[0] = 0;
3798 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3799 &callbackData
, DPENUMPLAYERS_LOCAL
);
3800 checkHR( DP_OK
, hr
);
3801 check( 2, callbackData
.dwCounter1
);
3802 checkStr( "43", callbackData
.szTrace1
);
3804 "LOCAL,DPENUMPLAYERS_SPECTATOR:", callbackData
.szTrace2
);
3806 callbackData
.dwCounter1
= 0;
3807 callbackData
.szTrace2
[0] = 0;
3808 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3809 &callbackData
, DPENUMPLAYERS_SERVERPLAYER
);
3810 checkHR( DP_OK
, hr
);
3811 check( 1, callbackData
.dwCounter1
);
3812 checkStr( "0", callbackData
.szTrace1
);
3813 checkStr( "SERVERPLAYER:", callbackData
.szTrace2
);
3815 callbackData
.dwCounter1
= 0;
3816 callbackData
.szTrace2
[0] = 0;
3817 hr
= IDirectPlayX_EnumPlayers( pDP
[2], NULL
, EnumPlayers_cb
,
3818 &callbackData
, DPENUMPLAYERS_SPECTATOR
);
3819 checkHR( DP_OK
, hr
);
3820 check( 1, callbackData
.dwCounter1
);
3821 checkStr( "3", callbackData
.szTrace1
);
3822 checkStr( "SPECTATOR:", callbackData
.szTrace2
);
3825 IDirectPlayX_Release( pDP
[0] );
3826 IDirectPlayX_Release( pDP
[1] );
3827 IDirectPlayX_Release( pDP
[2] );
3833 static BOOL CALLBACK
EnumGroups_cb( DPID dpId
,
3839 lpCallbackData callbackData
= lpContext
;
3840 char playerIndex
= dpid2char( callbackData
->dpid
,
3841 callbackData
->dpidSize
,
3845 /* Trace to study player ids */
3846 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = playerIndex
;
3847 callbackData
->dwCounter1
++;
3848 callbackData
->szTrace1
[ callbackData
->dwCounter1
] = '\0';
3850 /* Trace to study flags received */
3851 strcat( callbackData
->szTrace2
,
3852 ( dwFlags2str(dwFlags
, FLAGS_DPENUMGROUPS
) +
3853 strlen("DPENUMGROUPS_") ) );
3854 strcat( callbackData
->szTrace2
, ":" );
3857 check( DPPLAYERTYPE_GROUP
, dwPlayerType
);
3862 static BOOL CALLBACK
EnumSessions_cb_EnumGroups( LPCDPSESSIONDESC2 lpThisSD
,
3863 LPDWORD lpdwTimeOut
,
3867 lpCallbackData callbackData
= lpContext
;
3870 if (dwFlags
& DPESC_TIMEDOUT
)
3876 callbackData
->dwCounter1
= 0;
3877 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, NULL
,
3878 EnumGroups_cb
, &callbackData
, 0 );
3879 checkHR( DPERR_NOSESSIONS
, hr
);
3880 check( 0, callbackData
->dwCounter1
);
3882 /* guid = appGuid */
3883 callbackData
->dwCounter1
= 0;
3884 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, (LPGUID
) &appGuid
,
3885 EnumGroups_cb
, &callbackData
, 0 );
3886 checkHR( DPERR_NOSESSIONS
, hr
);
3887 check( 0, callbackData
->dwCounter1
);
3889 callbackData
->dwCounter1
= 0;
3890 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
, (LPGUID
) &appGuid
,
3891 EnumGroups_cb
, &callbackData
,
3892 DPENUMGROUPS_SESSION
);
3893 checkHR( DPERR_NOSESSIONS
, hr
);
3894 check( 0, callbackData
->dwCounter1
);
3896 /* guid = guidInstance */
3897 callbackData
->dwCounter1
= 0;
3898 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
,
3899 (LPGUID
) &lpThisSD
->guidInstance
,
3900 EnumGroups_cb
, &callbackData
, 0 );
3901 checkHR( DPERR_NOSESSIONS
, hr
);
3902 check( 0, callbackData
->dwCounter1
);
3904 callbackData
->dwCounter1
= 0;
3905 hr
= IDirectPlayX_EnumGroups( callbackData
->pDP
,
3906 (LPGUID
) &lpThisSD
->guidInstance
,
3907 EnumGroups_cb
, &callbackData
,
3908 DPENUMGROUPS_SESSION
);
3909 checkHR( DPERR_GENERIC
, hr
); /* Why? */
3910 check( 0, callbackData
->dwCounter1
);
3916 static void test_EnumGroups(void)
3918 IDirectPlay4
*pDP
[3];
3919 DPSESSIONDESC2 dpsd
[3];
3921 CallbackData callbackData
;
3928 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
3929 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
3930 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
3931 if (FAILED(hr
)) return;
3933 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
3934 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
3937 dpsd
[0].guidApplication
= appGuid
;
3938 dpsd
[1].guidApplication
= appGuid2
;
3939 dpsd
[2].guidApplication
= GUID_NULL
;
3941 callbackData
.dpid
= dpid
;
3942 callbackData
.dpidSize
= 5;
3945 /* Uninitialized service provider */
3946 callbackData
.dwCounter1
= 0;
3947 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
3949 checkHR( DPERR_UNINITIALIZED
, hr
);
3950 check( 0, callbackData
.dwCounter1
);
3953 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
3954 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
3955 init_TCPIP_provider( pDP
[2], "127.0.0.1", 0 );
3959 callbackData
.dwCounter1
= 0;
3960 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
3962 todo_wine
checkHR( DPERR_NOSESSIONS
, hr
);
3963 check( 0, callbackData
.dwCounter1
);
3965 if ( hr
== DPERR_UNINITIALIZED
)
3967 todo_wine
win_skip( "EnumGroups not implemented\n" );
3971 callbackData
.dwCounter1
= 0;
3972 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
3974 checkHR( DPERR_NOSESSIONS
, hr
);
3975 check( 0, callbackData
.dwCounter1
);
3977 callbackData
.dwCounter1
= 0;
3978 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
3979 &callbackData
, DPENUMGROUPS_SESSION
);
3980 checkHR( DPERR_NOSESSIONS
, hr
);
3981 check( 0, callbackData
.dwCounter1
);
3984 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
3985 checkHR( DP_OK
, hr
);
3986 hr
= IDirectPlayX_Open( pDP
[1], &dpsd
[1], DPOPEN_CREATE
);
3987 checkHR( DP_OK
, hr
);
3991 callbackData
.dwCounter1
= 0;
3992 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
3994 checkHR( DP_OK
, hr
);
3995 check( 0, callbackData
.dwCounter1
);
3999 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[0],
4001 checkHR( DP_OK
, hr
);
4002 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[0], &dpid
[3],
4004 checkHR( DP_OK
, hr
); /* Not a superior level group,
4005 won't appear in the enumerations */
4006 hr
= IDirectPlayX_CreateGroup( pDP
[1], &dpid
[1],
4008 checkHR( DP_OK
, hr
);
4009 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[2],
4010 NULL
, NULL
, 0, DPGROUP_HIDDEN
);
4011 checkHR( DP_OK
, hr
);
4014 /* Invalid parameters */
4015 callbackData
.dwCounter1
= 0;
4016 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, NULL
,
4018 checkHR( DPERR_INVALIDPARAMS
, hr
);
4019 check( 0, callbackData
.dwCounter1
);
4021 callbackData
.dwCounter1
= 0;
4022 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
4023 &callbackData
, DPENUMGROUPS_SESSION
);
4024 checkHR( DPERR_INVALIDPARAMS
, hr
);
4025 check( 0, callbackData
.dwCounter1
);
4028 /* Regular operation */
4029 callbackData
.dwCounter1
= 0;
4030 callbackData
.szTrace2
[0] = 0;
4031 hr
= IDirectPlayX_EnumGroups( pDP
[0], NULL
, EnumGroups_cb
,
4033 checkHR( DP_OK
, hr
);
4034 check( 2, callbackData
.dwCounter1
);
4035 checkStr( "02", callbackData
.szTrace1
);
4036 checkStr( "ALL:HIDDEN:", callbackData
.szTrace2
);
4038 callbackData
.dwCounter1
= 0;
4039 callbackData
.szTrace2
[0] = 0;
4040 hr
= IDirectPlayX_EnumGroups( pDP
[1], NULL
, EnumGroups_cb
,
4042 checkHR( DP_OK
, hr
);
4043 check( 1, callbackData
.dwCounter1
);
4044 checkStr( "1", callbackData
.szTrace1
);
4045 checkStr( "ALL:", callbackData
.szTrace2
);
4047 callbackData
.dwCounter1
= 0;
4048 callbackData
.szTrace2
[0] = 0;
4049 hr
= IDirectPlayX_EnumGroups( pDP
[0], (LPGUID
) &appGuid
, EnumGroups_cb
,
4051 checkHR( DP_OK
, hr
);
4052 check( 2, callbackData
.dwCounter1
); /* Guid is ignored */
4053 checkStr( "02", callbackData
.szTrace1
);
4054 checkStr( "ALL:HIDDEN:", callbackData
.szTrace2
);
4057 /* Enumerating from a remote session */
4058 /* - Session not open */
4059 callbackData
.pDP
= pDP
[2];
4060 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[2], 0,
4061 EnumSessions_cb_EnumGroups
,
4063 checkHR( DP_OK
, hr
);
4065 /* - Open session */
4066 callbackData
.pDP
= pDP
[2];
4067 hr
= IDirectPlayX_EnumSessions( pDP
[2], &dpsd
[0], 0, EnumSessions_cb_join
,
4069 checkHR( DP_OK
, hr
);
4071 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[3],
4073 checkHR( DP_OK
, hr
);
4074 hr
= IDirectPlayX_CreateGroup( pDP
[2], &dpid
[4],
4075 NULL
, NULL
, 0, DPGROUP_STAGINGAREA
);
4076 checkHR( DP_OK
, hr
);
4079 callbackData
.dwCounter1
= 0;
4080 callbackData
.szTrace2
[0] = 0;
4081 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4083 checkHR( DP_OK
, hr
);
4084 check( 4, callbackData
.dwCounter1
);
4085 checkStr( "0234", callbackData
.szTrace1
);
4086 checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData
.szTrace2
);
4089 callbackData
.dwCounter1
= 0;
4090 callbackData
.szTrace2
[0] = 0;
4091 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4092 &callbackData
, DPENUMGROUPS_ALL
);
4093 checkHR( DP_OK
, hr
);
4094 check( 4, callbackData
.dwCounter1
);
4095 checkStr( "0234", callbackData
.szTrace1
);
4096 checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData
.szTrace2
);
4098 callbackData
.dwCounter1
= 0;
4099 callbackData
.szTrace2
[0] = 0;
4100 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4101 &callbackData
, DPENUMGROUPS_HIDDEN
);
4102 checkHR( DP_OK
, hr
);
4103 check( 1, callbackData
.dwCounter1
);
4104 checkStr( "2", callbackData
.szTrace1
);
4105 checkStr( "HIDDEN:", callbackData
.szTrace2
);
4107 callbackData
.dwCounter1
= 0;
4108 callbackData
.szTrace2
[0] = 0;
4109 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4110 &callbackData
, DPENUMGROUPS_LOCAL
);
4111 checkHR( DP_OK
, hr
);
4112 check( 2, callbackData
.dwCounter1
);
4113 checkStr( "34", callbackData
.szTrace1
);
4115 "LOCAL,DPENUMGROUPS_STAGINGAREA:", callbackData
.szTrace2
);
4117 callbackData
.dwCounter1
= 0;
4118 callbackData
.szTrace2
[0] = 0;
4119 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4120 &callbackData
, DPENUMGROUPS_REMOTE
);
4121 checkHR( DP_OK
, hr
);
4122 check( 2, callbackData
.dwCounter1
);
4123 checkStr( "02", callbackData
.szTrace1
);
4125 "REMOTE,DPENUMGROUPS_HIDDEN:", callbackData
.szTrace2
);
4127 callbackData
.dwCounter1
= 0;
4128 callbackData
.szTrace2
[0] = 0;
4129 hr
= IDirectPlayX_EnumGroups( pDP
[2], NULL
, EnumGroups_cb
,
4130 &callbackData
, DPENUMGROUPS_STAGINGAREA
);
4131 checkHR( DP_OK
, hr
);
4132 check( 1, callbackData
.dwCounter1
);
4133 checkStr( "4", callbackData
.szTrace1
);
4134 checkStr( "STAGINGAREA:", callbackData
.szTrace2
);
4137 IDirectPlayX_Release( pDP
[0] );
4138 IDirectPlayX_Release( pDP
[1] );
4139 IDirectPlayX_Release( pDP
[2] );
4143 static void test_EnumGroupsInGroup(void)
4145 IDirectPlay4
*pDP
[2];
4146 DPSESSIONDESC2 dpsd
[2];
4148 CallbackData callbackData
;
4155 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4156 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4157 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4158 if (FAILED(hr
)) return;
4160 ZeroMemory( &dpsd
[i
], sizeof(DPSESSIONDESC2
) );
4161 dpsd
[i
].dwSize
= sizeof(DPSESSIONDESC2
);
4164 dpsd
[0].guidApplication
= appGuid
;
4165 dpsd
[1].guidApplication
= GUID_NULL
;
4167 callbackData
.dpid
= dpid
;
4168 callbackData
.dpidSize
= 6;
4171 /* Uninitialized service provider */
4172 callbackData
.dwCounter1
= 0;
4173 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 0, NULL
, EnumGroups_cb
,
4175 checkHR( DPERR_UNINITIALIZED
, hr
);
4176 check( 0, callbackData
.dwCounter1
);
4179 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4180 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4182 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
[0], DPOPEN_CREATE
);
4183 todo_wine
checkHR( DP_OK
, hr
);
4185 if ( hr
== DPERR_UNINITIALIZED
)
4187 todo_wine
win_skip( "EnumGroupsInGroup not implemented\n" );
4199 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[0],
4201 checkHR( DP_OK
, hr
);
4202 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[1],
4204 checkHR( DP_OK
, hr
);
4205 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[2],
4207 checkHR( DP_OK
, hr
);
4208 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[3],
4211 checkHR( DP_OK
, hr
);
4212 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[0], dpid
[1], &dpid
[4],
4214 DPGROUP_STAGINGAREA
);
4215 checkHR( DP_OK
, hr
);
4216 hr
= IDirectPlayX_CreateGroup( pDP
[0], &dpid
[5],
4218 checkHR( DP_OK
, hr
);
4220 hr
= IDirectPlayX_AddGroupToGroup( pDP
[0], dpid
[1], dpid
[5] );
4221 checkHR( DP_OK
, hr
);
4224 /* Invalid parameters */
4225 callbackData
.dwCounter1
= 0;
4226 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 0, NULL
, EnumGroups_cb
,
4228 checkHR( DPERR_INVALIDGROUP
, hr
);
4229 check( 0, callbackData
.dwCounter1
);
4231 callbackData
.dwCounter1
= 0;
4232 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], 10, NULL
, EnumGroups_cb
,
4234 checkHR( DPERR_INVALIDGROUP
, hr
);
4235 check( 0, callbackData
.dwCounter1
);
4237 callbackData
.dwCounter1
= 0;
4238 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], (LPGUID
) &appGuid
,
4239 NULL
, &callbackData
, 0 );
4240 checkHR( DPERR_INVALIDPARAMS
, hr
);
4241 check( 0, callbackData
.dwCounter1
);
4243 callbackData
.dwCounter1
= 0;
4244 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4245 &callbackData
, DPENUMGROUPS_SESSION
);
4246 checkHR( DPERR_INVALIDPARAMS
, hr
);
4247 check( 0, callbackData
.dwCounter1
);
4250 /* Regular operation */
4251 callbackData
.dwCounter1
= 0;
4252 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[0], NULL
, EnumGroups_cb
,
4254 checkHR( DP_OK
, hr
);
4255 check( 0, callbackData
.dwCounter1
);
4257 callbackData
.dwCounter1
= 0;
4258 callbackData
.szTrace2
[0] = 0;
4259 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4261 checkHR( DP_OK
, hr
);
4262 check( 4, callbackData
.dwCounter1
);
4263 checkStr( "5432", callbackData
.szTrace1
);
4264 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4266 callbackData
.dwCounter1
= 0;
4267 callbackData
.szTrace2
[0] = 0;
4268 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], (LPGUID
) &appGuid
,
4269 EnumGroups_cb
, &callbackData
, 0 );
4270 checkHR( DP_OK
, hr
);
4271 check( 4, callbackData
.dwCounter1
); /* Guid is ignored */
4272 checkStr( "5432", callbackData
.szTrace1
);
4273 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4276 /* Enumerating from a remote session */
4277 /* - Session not open */
4278 callbackData
.pDP
= pDP
[1];
4279 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
[1], 0,
4280 EnumSessions_cb_EnumGroups
,
4282 checkHR( DP_OK
, hr
);
4284 /* - Open session */
4285 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
[0], 0, EnumSessions_cb_join
,
4287 checkHR( DP_OK
, hr
);
4290 callbackData
.dwCounter1
= 0;
4291 callbackData
.szTrace2
[0] = 0;
4292 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4294 checkHR( DP_OK
, hr
);
4295 check( 4, callbackData
.dwCounter1
);
4296 checkStr( "5432", callbackData
.szTrace1
);
4297 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4300 callbackData
.dwCounter1
= 0;
4301 callbackData
.szTrace2
[0] = 0;
4302 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4303 &callbackData
, DPENUMGROUPS_ALL
);
4304 checkHR( DP_OK
, hr
);
4305 check( 4, callbackData
.dwCounter1
);
4306 checkStr( "5432", callbackData
.szTrace1
);
4307 checkStr( "SHORTCUT:STAGINGAREA:HIDDEN:ALL:", callbackData
.szTrace2
);
4309 callbackData
.dwCounter1
= 0;
4310 callbackData
.szTrace2
[0] = 0;
4311 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4312 &callbackData
, DPENUMGROUPS_HIDDEN
);
4313 checkHR( DP_OK
, hr
);
4314 check( 1, callbackData
.dwCounter1
);
4315 checkStr( "3", callbackData
.szTrace1
);
4316 checkStr( "HIDDEN:", callbackData
.szTrace2
);
4318 callbackData
.dwCounter1
= 0;
4319 callbackData
.szTrace2
[0] = 0;
4320 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4321 &callbackData
, DPENUMGROUPS_LOCAL
);
4322 checkHR( DP_OK
, hr
);
4323 check( 4, callbackData
.dwCounter1
);
4324 checkStr( "5432", callbackData
.szTrace1
);
4325 checkStr( "LOCAL,DPENUMGROUPS_SHORTCUT:"
4326 "LOCAL,DPENUMGROUPS_STAGINGAREA:"
4327 "LOCAL,DPENUMGROUPS_HIDDEN:LOCAL:", callbackData
.szTrace2
);
4329 callbackData
.dwCounter1
= 0;
4330 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4331 &callbackData
, DPENUMGROUPS_REMOTE
);
4332 checkHR( DP_OK
, hr
);
4333 check( 0, callbackData
.dwCounter1
);
4335 callbackData
.dwCounter1
= 0;
4336 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4337 &callbackData
, DPENUMGROUPS_LOCAL
);
4338 checkHR( DP_OK
, hr
);
4339 check( 0, callbackData
.dwCounter1
);
4341 callbackData
.dwCounter1
= 0;
4342 callbackData
.szTrace2
[0] = 0;
4343 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[1], dpid
[1], NULL
, EnumGroups_cb
,
4344 &callbackData
, DPENUMGROUPS_REMOTE
);
4345 checkHR( DP_OK
, hr
);
4346 check( 4, callbackData
.dwCounter1
);
4347 checkStr( "5432", callbackData
.szTrace1
);
4348 checkStr( "REMOTE,DPENUMGROUPS_SHORTCUT:"
4349 "REMOTE,DPENUMGROUPS_STAGINGAREA:"
4350 "REMOTE,DPENUMGROUPS_HIDDEN:REMOTE:", callbackData
.szTrace2
);
4352 callbackData
.dwCounter1
= 0;
4353 callbackData
.szTrace2
[0] = 0;
4354 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4355 &callbackData
, DPENUMGROUPS_SHORTCUT
);
4356 checkHR( DP_OK
, hr
);
4357 check( 1, callbackData
.dwCounter1
);
4358 checkStr( "5", callbackData
.szTrace1
);
4359 checkStr( "SHORTCUT:", callbackData
.szTrace2
);
4361 callbackData
.dwCounter1
= 0;
4362 callbackData
.szTrace2
[0] = 0;
4363 hr
= IDirectPlayX_EnumGroupsInGroup( pDP
[0], dpid
[1], NULL
, EnumGroups_cb
,
4365 DPENUMGROUPS_STAGINGAREA
);
4366 checkHR( DP_OK
, hr
);
4367 check( 1, callbackData
.dwCounter1
);
4368 checkStr( "4", callbackData
.szTrace1
);
4369 checkStr( "STAGINGAREA:", callbackData
.szTrace2
);
4372 IDirectPlayX_Release( pDP
[0] );
4373 IDirectPlayX_Release( pDP
[1] );
4377 static void test_groups_p2p(void)
4380 IDirectPlay4
*pDP
[2];
4381 DPSESSIONDESC2 dpsd
;
4382 DPID idPlayer
[6], idGroup
[3];
4386 DWORD dwDataSize
= 1024;
4387 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
4388 CallbackData callbackData
;
4393 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4394 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4395 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4396 if (FAILED(hr
)) return;
4398 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4399 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4400 dpsd
.guidApplication
= appGuid
;
4401 dpsd
.dwMaxPlayers
= 10;
4404 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4405 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4407 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4408 todo_wine
checkHR( DP_OK
, hr
);
4409 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4411 todo_wine
checkHR( DP_OK
, hr
);
4413 if ( hr
== DPERR_UNINITIALIZED
)
4415 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
4420 /* Create players */
4421 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4422 NULL
, NULL
, NULL
, 0, 0 );
4423 checkHR( DP_OK
, hr
);
4424 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[1],
4425 NULL
, NULL
, NULL
, 0, 0 );
4426 checkHR( DP_OK
, hr
);
4427 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[2],
4428 NULL
, NULL
, NULL
, 0, 0 );
4429 checkHR( DP_OK
, hr
);
4430 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[3],
4431 NULL
, NULL
, NULL
, 0, 0 );
4432 checkHR( DP_OK
, hr
);
4433 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[4],
4434 NULL
, NULL
, NULL
, 0, 0 );
4435 checkHR( DP_OK
, hr
);
4436 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[5],
4437 NULL
, NULL
, NULL
, 0, 0 );
4438 checkHR( DP_OK
, hr
);
4440 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
[0],
4442 checkHR( DP_OK
, hr
);
4443 hr
= IDirectPlayX_CreateGroup( pDP
[1], &idGroup
[2],
4445 checkHR( DP_OK
, hr
);
4446 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[1], idGroup
[2], &idGroup
[1],
4448 checkHR( DP_OK
, hr
);
4452 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4453 checkStr( "S0," "S1,S0,"
4454 "S2,S1,S0," "S2,S1,S0,"
4455 "S2,S1,S0," "S2,S1,S0,"
4456 "S2,S1,S0," "S2,S1,S0,", callbackData
.szTrace1
);
4457 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4458 checkStr( "S3," "S4,S3,"
4459 "S5,S4,S3," "S5,S4,S3,"
4460 "S5,S4,S3,", callbackData
.szTrace1
);
4465 * Player 1 | Group 0 | pDP 0
4467 * Player 3 | Group 1 ) |
4468 * Player 4 | | Group 2 | pDP 1
4473 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[0] );
4474 checkHR( DP_OK
, hr
);
4475 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[1] );
4476 checkHR( DP_OK
, hr
);
4477 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[2] );
4478 checkHR( DP_OK
, hr
);
4479 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[3] );
4480 checkHR( DP_OK
, hr
);
4481 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[4] );
4482 checkHR( DP_OK
, hr
);
4483 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[4] );
4484 checkHR( DP_OK
, hr
);
4485 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[5] );
4486 checkHR( DP_OK
, hr
);
4488 hr
= IDirectPlayX_AddGroupToGroup( pDP
[1], idGroup
[2], idGroup
[1] );
4489 checkHR( DP_OK
, hr
);
4492 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4493 checkStr( "S2,S1,S0," "S2,S1,S0," "S2,S1,S0,"
4494 "S2,S1,S0," "S2,S1,S0," "S2,S1,S0,"
4495 "S2,S1,S0,", callbackData
.szTrace1
);
4496 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4497 checkStr( "S5,S4,S3," "S5,S4,S3," "S5,S4,S3,"
4498 "S5,S4,S3," "S5,S4,S3," "S5,S4,S3,"
4499 "S5,S4,S3,", callbackData
.szTrace1
);
4502 /* Sending broadcast messages, and checking who receives them */
4506 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], DPID_ALLPLAYERS
, 0,
4507 lpData
, dwDataSize
);
4508 checkHR( DP_OK
, hr
);
4509 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4510 checkStr( "02,01,", callbackData
.szTrace1
);
4511 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4512 checkStr( "05,04,03,", callbackData
.szTrace1
);
4515 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[0], 0,
4516 lpData
, dwDataSize
);
4517 checkHR( DP_OK
, hr
);
4518 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4519 checkStr( "02,01,", callbackData
.szTrace1
);
4520 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4521 checkStr( "", callbackData
.szTrace1
);
4523 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[1], 0,
4524 lpData
, dwDataSize
);
4525 checkHR( DP_OK
, hr
);
4526 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4527 checkStr( "", callbackData
.szTrace1
);
4528 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4529 checkStr( "04,03,", callbackData
.szTrace1
);
4531 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[2], 0,
4532 lpData
, dwDataSize
);
4533 checkHR( DP_OK
, hr
);
4534 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4535 checkStr( "", callbackData
.szTrace1
);
4536 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4537 checkStr( "05,04,", callbackData
.szTrace1
);
4540 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], DPID_ALLPLAYERS
, 0,
4541 lpData
, dwDataSize
);
4542 checkHR( DP_OK
, hr
);
4543 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4544 checkStr( "32,31,30,", callbackData
.szTrace1
);
4545 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4546 checkStr( "35,34,", callbackData
.szTrace1
);
4548 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[0], 0,
4549 lpData
, dwDataSize
);
4550 checkHR( DP_OK
, hr
);
4551 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4552 checkStr( "32,31,30,", callbackData
.szTrace1
);
4553 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4554 checkStr( "", callbackData
.szTrace1
);
4556 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[1], 0,
4557 lpData
, dwDataSize
);
4558 checkHR( DP_OK
, hr
);
4559 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4560 checkStr( "", callbackData
.szTrace1
);
4561 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4562 checkStr( "34,", callbackData
.szTrace1
);
4564 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[2], 0,
4565 lpData
, dwDataSize
);
4566 checkHR( DP_OK
, hr
);
4567 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4568 checkStr( "", callbackData
.szTrace1
);
4569 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4570 checkStr( "35,34,", callbackData
.szTrace1
);
4573 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], DPID_ALLPLAYERS
, 0,
4574 lpData
, dwDataSize
);
4575 checkHR( DP_OK
, hr
);
4576 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4577 checkStr( "52,51,50,", callbackData
.szTrace1
);
4578 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4579 checkStr( "54,53,", callbackData
.szTrace1
);
4581 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[0], 0,
4582 lpData
, dwDataSize
);
4583 checkHR( DP_OK
, hr
);
4584 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4585 checkStr( "52,51,50,", callbackData
.szTrace1
);
4586 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4587 checkStr( "", callbackData
.szTrace1
);
4589 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[1], 0,
4590 lpData
, dwDataSize
);
4591 checkHR( DP_OK
, hr
);
4592 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4593 checkStr( "", callbackData
.szTrace1
);
4594 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4595 checkStr( "54,53,", callbackData
.szTrace1
);
4597 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[2], 0,
4598 lpData
, dwDataSize
);
4599 checkHR( DP_OK
, hr
);
4600 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4601 checkStr( "", callbackData
.szTrace1
);
4602 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4603 checkStr( "54,", callbackData
.szTrace1
);
4606 HeapFree( GetProcessHeap(), 0, lpData
);
4607 IDirectPlayX_Release( pDP
[0] );
4608 IDirectPlayX_Release( pDP
[1] );
4612 static void test_groups_cs(void)
4615 IDirectPlay4
*pDP
[2];
4616 DPSESSIONDESC2 dpsd
;
4617 DPID idPlayer
[6], idGroup
[3];
4618 CallbackData callbackData
;
4622 DWORD dwDataSize
= 1024;
4623 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 1024 );
4628 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4629 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4630 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4631 if (FAILED(hr
)) return;
4633 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4634 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4635 dpsd
.guidApplication
= appGuid
;
4636 dpsd
.dwMaxPlayers
= 10;
4639 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4640 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4642 dpsd
.dwFlags
= DPSESSION_CLIENTSERVER
;
4643 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4644 todo_wine
checkHR( DP_OK
, hr
);
4646 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4648 todo_wine
checkHR( DP_OK
, hr
);
4650 if ( hr
== DPERR_UNINITIALIZED
)
4652 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
4657 /* Create players */
4658 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4659 NULL
, NULL
, NULL
, 0, 0 );
4660 checkHR( DPERR_ACCESSDENIED
, hr
);
4661 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[0],
4662 NULL
, NULL
, NULL
, 0,
4663 DPPLAYER_SERVERPLAYER
);
4664 checkHR( DP_OK
, hr
);
4665 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &idPlayer
[1],
4666 NULL
, NULL
, NULL
, 0, 0 );
4667 checkHR( DPERR_ACCESSDENIED
, hr
);
4668 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[1],
4669 NULL
, NULL
, NULL
, 0, 0 );
4670 checkHR( DP_OK
, hr
);
4671 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[2],
4672 NULL
, NULL
, NULL
, 0, 0 );
4673 checkHR( DP_OK
, hr
);
4674 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[3],
4675 NULL
, NULL
, NULL
, 0, 0 );
4676 checkHR( DP_OK
, hr
);
4677 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[4],
4678 NULL
, NULL
, NULL
, 0, 0 );
4679 checkHR( DP_OK
, hr
);
4680 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &idPlayer
[5],
4681 NULL
, NULL
, NULL
, 0, 0 );
4682 checkHR( DP_OK
, hr
);
4684 hr
= IDirectPlayX_CreateGroup( pDP
[0], &idGroup
[0],
4686 checkHR( DP_OK
, hr
);
4687 hr
= IDirectPlayX_CreateGroup( pDP
[1], &idGroup
[2],
4689 checkHR( DP_OK
, hr
);
4690 hr
= IDirectPlayX_CreateGroupInGroup( pDP
[1], idGroup
[2], &idGroup
[1],
4692 checkHR( DP_OK
, hr
);
4696 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4697 checkStr( "S0,S0,S0,S0,S0,S0,", callbackData
.szTrace1
);
4698 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4699 checkStr( "S1," "S2,S1," "S3,S2,S1," "S4,S3,S2,S1,"
4700 "S5,S4,S3,S2,S1," "S5,S4,S3,S2,S1,", callbackData
.szTrace1
);
4703 * Player 0 | | pDP 0
4704 * Player 1 | Group 0 |
4706 * Player 3 | Group 1 ) |
4707 * Player 4 | | Group 2 | pDP 1
4712 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[0] );
4713 checkHR( DP_OK
, hr
);
4714 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[1] );
4715 checkHR( DP_OK
, hr
);
4716 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[0], idGroup
[0], idPlayer
[2] );
4717 checkHR( DP_OK
, hr
);
4718 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[3] );
4719 checkHR( DP_OK
, hr
);
4720 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[1], idPlayer
[4] );
4721 checkHR( DP_OK
, hr
);
4722 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[4] );
4723 checkHR( DP_OK
, hr
);
4724 hr
= IDirectPlayX_AddPlayerToGroup( pDP
[1], idGroup
[2], idPlayer
[5] );
4725 checkHR( DP_OK
, hr
);
4727 hr
= IDirectPlayX_AddGroupToGroup( pDP
[1], idGroup
[2], idGroup
[1] );
4728 checkHR( DP_OK
, hr
);
4731 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4732 checkStr( "S0,S0,S0,S0,", callbackData
.szTrace1
);
4733 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4734 checkStr( "S5," "S4,S3,S2,S1," "S5,S4,S3,S2,S1,"
4735 "S5,S4,S3,S2,S1," "S5,S4,S3,S2,S1,", callbackData
.szTrace1
);
4738 /* Sending broadcast messages, and checking who receives them */
4741 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], DPID_ALLPLAYERS
, 0,
4742 lpData
, dwDataSize
);
4743 checkHR( DP_OK
, hr
);
4744 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4745 checkStr( "", callbackData
.szTrace1
);
4746 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4747 checkStr( "05,04,03,02,01,", callbackData
.szTrace1
);
4750 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[0], 0,
4751 lpData
, dwDataSize
);
4752 checkHR( DP_OK
, hr
);
4753 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4754 checkStr( "", callbackData
.szTrace1
);
4755 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4756 checkStr( "02,01,", callbackData
.szTrace1
);
4758 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[1], 0,
4759 lpData
, dwDataSize
);
4760 checkHR( DPERR_INVALIDPARAMS
, hr
);
4761 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4762 checkStr( "", callbackData
.szTrace1
);
4763 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4764 checkStr( "", callbackData
.szTrace1
);
4766 hr
= IDirectPlayX_Send( pDP
[0], idPlayer
[0], idGroup
[2], 0,
4767 lpData
, dwDataSize
);
4768 checkHR( DPERR_INVALIDPARAMS
, hr
);
4769 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4770 checkStr( "", callbackData
.szTrace1
);
4771 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4772 checkStr( "", callbackData
.szTrace1
);
4775 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], DPID_ALLPLAYERS
, 0,
4776 lpData
, dwDataSize
);
4777 checkHR( DP_OK
, hr
);
4778 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4779 checkStr( "30,", callbackData
.szTrace1
);
4780 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4781 checkStr( "35,34,32,31,", callbackData
.szTrace1
);
4783 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[0], 0,
4784 lpData
, dwDataSize
);
4785 checkHR( DPERR_INVALIDPARAMS
, hr
);
4786 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4787 checkStr( "", callbackData
.szTrace1
);
4788 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4789 checkStr( "", callbackData
.szTrace1
);
4791 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[1], 0,
4792 lpData
, dwDataSize
);
4793 checkHR( DP_OK
, hr
);
4794 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4795 checkStr( "", callbackData
.szTrace1
);
4796 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4797 checkStr( "34,", callbackData
.szTrace1
);
4799 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[3], idGroup
[2], 0,
4800 lpData
, dwDataSize
);
4801 checkHR( DP_OK
, hr
);
4802 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4803 checkStr( "", callbackData
.szTrace1
);
4804 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4805 checkStr( "35,34,", callbackData
.szTrace1
);
4808 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], DPID_ALLPLAYERS
, 0,
4809 lpData
, dwDataSize
);
4810 checkHR( DP_OK
, hr
);
4811 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4812 checkStr( "50,", callbackData
.szTrace1
);
4813 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4814 checkStr( "54,53,52,51,", callbackData
.szTrace1
);
4816 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[0], 0,
4817 lpData
, dwDataSize
);
4818 checkHR( DPERR_INVALIDPARAMS
, hr
);
4819 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4820 checkStr( "", callbackData
.szTrace1
);
4821 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4822 checkStr( "", callbackData
.szTrace1
);
4824 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[1], 0,
4825 lpData
, dwDataSize
);
4826 checkHR( DP_OK
, hr
);
4827 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4828 checkStr( "", callbackData
.szTrace1
);
4829 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4830 checkStr( "54,53,", callbackData
.szTrace1
);
4832 hr
= IDirectPlayX_Send( pDP
[1], idPlayer
[5], idGroup
[2], 0,
4833 lpData
, dwDataSize
);
4834 checkHR( DP_OK
, hr
);
4835 check_messages( pDP
[0], idPlayer
, 6, &callbackData
);
4836 checkStr( "", callbackData
.szTrace1
);
4837 check_messages( pDP
[1], idPlayer
, 6, &callbackData
);
4838 checkStr( "54,", callbackData
.szTrace1
);
4841 HeapFree( GetProcessHeap(), 0, lpData
);
4842 IDirectPlayX_Release( pDP
[0] );
4843 IDirectPlayX_Release( pDP
[1] );
4849 static void test_Send(void)
4852 IDirectPlay4
*pDP
[2];
4853 DPSESSIONDESC2 dpsd
;
4854 DPID dpid
[4], idFrom
, idTo
;
4855 CallbackData callbackData
;
4857 LPCSTR message
= "message";
4858 DWORD messageSize
= strlen(message
) + 1;
4859 DWORD dwDataSize
= 1024;
4860 LPDPMSG_GENERIC lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
4861 LPDPMSG_SECUREMESSAGE lpDataSecure
;
4867 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
4868 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
4869 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
4870 if (FAILED(hr
)) return;
4872 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
4875 /* Uninitialized service provider */
4876 hr
= IDirectPlayX_Send( pDP
[0], 0, 0, 0,
4877 (LPVOID
) message
, messageSize
);
4878 checkHR( DPERR_UNINITIALIZED
, hr
);
4881 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
4882 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
4884 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
4885 dpsd
.guidApplication
= appGuid
;
4886 dpsd
.dwMaxPlayers
= 10;
4887 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4888 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
4890 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
4893 /* Incorrect players */
4894 hr
= IDirectPlayX_Send( pDP
[0], 0, 1, 2,
4895 (LPVOID
) message
, messageSize
);
4896 todo_wine
checkHR( DPERR_INVALIDPLAYER
, hr
);
4898 if ( hr
== DPERR_UNINITIALIZED
)
4900 todo_wine
win_skip( "Send not implemented\n" );
4905 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
4906 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
4907 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
4908 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
4910 /* Purge player creation messages */
4911 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4912 checkStr( "S0," "S1,S0," "S2,S1,S0,", callbackData
.szTrace1
);
4913 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4914 checkStr( "", callbackData
.szTrace1
);
4917 /* Message to self: no error, but no message is sent */
4918 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[0], 0,
4919 (LPVOID
) message
, messageSize
);
4920 checkHR( DP_OK
, hr
);
4922 /* Send a message from a remote player */
4923 hr
= IDirectPlayX_Send( pDP
[1], dpid
[0], dpid
[1], 0,
4924 (LPVOID
) message
, messageSize
);
4925 checkHR( DPERR_ACCESSDENIED
, hr
);
4926 hr
= IDirectPlayX_Send( pDP
[1], dpid
[0], dpid
[3], 0,
4927 (LPVOID
) message
, messageSize
);
4928 checkHR( DPERR_ACCESSDENIED
, hr
);
4931 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0,
4932 NULL
, messageSize
);
4933 checkHR( DPERR_INVALIDPARAMS
, hr
);
4934 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0,
4935 (LPVOID
) message
, 0 );
4936 checkHR( DPERR_INVALIDPARAMS
, hr
);
4939 /* Checking no message was sent */
4940 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4941 checkStr( "", callbackData
.szTrace1
);
4942 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4943 checkStr( "", callbackData
.szTrace1
);
4946 /* Regular parameters */
4947 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
4949 (LPVOID
) message
, messageSize
);
4950 checkHR( DP_OK
, hr
);
4952 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[1],
4953 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4954 lpData
, &dwDataSize
);
4955 checkHR( DP_OK
, hr
);
4956 checkStr( message
, (LPSTR
) lpData
);
4957 check( strlen(message
)+1, dwDataSize
);
4959 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4960 checkStr( "", callbackData
.szTrace1
);
4961 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4962 checkStr( "", callbackData
.szTrace1
);
4965 /* Message to a remote player */
4966 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[3], 0,
4967 (LPVOID
) message
, messageSize
);
4968 checkHR( DP_OK
, hr
);
4970 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[3],
4971 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4972 lpData
, &dwDataSize
);
4973 checkHR( DPERR_NOMESSAGES
, hr
);
4974 hr
= IDirectPlayX_Receive( pDP
[1], &dpid
[0], &dpid
[3],
4975 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4976 lpData
, &dwDataSize
);
4977 checkHR( DP_OK
, hr
);
4978 checkStr( message
, (LPSTR
) lpData
);
4979 check( strlen(message
)+1, dwDataSize
);
4981 check_messages( pDP
[0], dpid
, 4, &callbackData
);
4982 checkStr( "", callbackData
.szTrace1
);
4983 check_messages( pDP
[1], dpid
, 4, &callbackData
);
4984 checkStr( "", callbackData
.szTrace1
);
4989 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], DPID_ALLPLAYERS
, 0,
4990 (LPVOID
) message
, messageSize
);
4991 checkHR( DP_OK
, hr
);
4995 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[i
],
4996 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
4997 lpData
, &dwDataSize
);
4998 checkHR( DP_OK
, hr
);
4999 checkStr( message
, (LPSTR
) lpData
);
5001 hr
= IDirectPlayX_Receive( pDP
[1], &dpid
[0], &dpid
[3],
5002 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
5003 lpData
, &dwDataSize
);
5004 checkHR( DP_OK
, hr
);
5005 checkStr( message
, (LPSTR
) lpData
);
5007 check_messages( pDP
[0], dpid
, 4, &callbackData
);
5008 checkStr( "", callbackData
.szTrace1
);
5009 check_messages( pDP
[1], dpid
, 4, &callbackData
);
5010 checkStr( "", callbackData
.szTrace1
);
5013 hr
= IDirectPlayX_Send( pDP
[0], DPID_ALLPLAYERS
, dpid
[1],
5015 (LPVOID
) message
, messageSize
);
5016 checkHR( DPERR_INVALIDPLAYER
, hr
);
5017 hr
= IDirectPlayX_Send( pDP
[0], DPID_ALLPLAYERS
, DPID_ALLPLAYERS
,
5019 (LPVOID
) message
, messageSize
);
5020 checkHR( DPERR_INVALIDPLAYER
, hr
);
5024 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5026 (LPVOID
) message
, messageSize
);
5027 checkHR( DP_OK
, hr
);
5029 hr
= IDirectPlayX_Receive( pDP
[0], &dpid
[0], &dpid
[1],
5030 DPRECEIVE_FROMPLAYER
| DPRECEIVE_TOPLAYER
,
5031 lpData
, &dwDataSize
);
5032 checkHR( DP_OK
, hr
);
5033 checkStr( message
, (LPSTR
)lpData
);
5035 /* - Inorrect flags */
5036 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5038 (LPVOID
) message
, messageSize
);
5039 checkHR( DPERR_INVALIDPARAMS
, hr
);
5040 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5042 (LPVOID
) message
, messageSize
);
5043 checkHR( DPERR_INVALIDPARAMS
, hr
);
5044 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5045 DPSEND_ENCRYPTED
| DPSEND_SIGNED
,
5046 (LPVOID
) message
, messageSize
);
5047 checkHR( DPERR_INVALIDPARAMS
, hr
);
5049 /* - Correct flags, but session is not secure */
5050 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5051 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5052 (LPVOID
) message
, messageSize
);
5053 checkHR( DPERR_INVALIDPARAMS
, hr
);
5054 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5055 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5056 (LPVOID
) message
, messageSize
);
5057 checkHR( DPERR_INVALIDPARAMS
, hr
);
5058 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5059 ( DPSEND_ENCRYPTED
|
5061 DPSEND_GUARANTEED
),
5062 (LPVOID
) message
, messageSize
);
5063 checkHR( DPERR_INVALIDPARAMS
, hr
);
5065 /* - Correct flags, secure session incorrectly opened (without flags) */
5066 hr
= IDirectPlayX_Close( pDP
[0] );
5067 checkHR( DP_OK
, hr
);
5070 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
5071 checkHR( DP_OK
, hr
);
5073 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[i
], NULL
, NULL
, NULL
, 0, 0 );
5075 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5076 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5077 (LPVOID
) message
, messageSize
);
5078 checkHR( DPERR_INVALIDPARAMS
, hr
);
5079 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5080 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5081 (LPVOID
) message
, messageSize
);
5082 checkHR( DPERR_INVALIDPARAMS
, hr
);
5083 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5084 ( DPSEND_ENCRYPTED
|
5086 DPSEND_GUARANTEED
),
5087 (LPVOID
) message
, messageSize
);
5088 checkHR( DPERR_INVALIDPARAMS
, hr
);
5090 /* - Correct flags, secure session */
5091 hr
= IDirectPlayX_Close( pDP
[0] );
5092 checkHR( DP_OK
, hr
);
5094 dpsd
.dwFlags
= DPSESSION_SECURESERVER
;
5095 hr
= IDirectPlayX_SecureOpen( pDP
[0], &dpsd
, DPOPEN_CREATE
, NULL
, NULL
);
5096 checkHR( DP_OK
, hr
);
5097 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5098 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5101 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5102 checkStr( "S0,", callbackData
.szTrace1
);
5105 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5106 DPSEND_ENCRYPTED
| DPSEND_GUARANTEED
,
5107 (LPVOID
) message
, messageSize
);
5108 checkHR( DP_OK
, hr
);
5109 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5110 DPSEND_SIGNED
| DPSEND_GUARANTEED
,
5111 (LPVOID
) message
, messageSize
);
5112 checkHR( DP_OK
, hr
);
5113 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5114 ( DPSEND_ENCRYPTED
|
5116 DPSEND_GUARANTEED
),
5117 (LPVOID
) message
, messageSize
);
5118 checkHR( DP_OK
, hr
);
5124 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, 0, lpData
,
5127 lpDataSecure
= (LPDPMSG_SECUREMESSAGE
) lpData
;
5129 checkHR( DP_OK
, hr
);
5130 checkConv( DPSYS_SECUREMESSAGE
, lpData
->dwType
, dpMsgType2str
);
5131 check( DPID_SYSMSG
, idFrom
);
5132 check( dpid
[1], idTo
);
5133 check( dpid
[0], lpDataSecure
->dpIdFrom
);
5134 checkStr( message
, (LPSTR
) lpDataSecure
->lpData
);
5135 check( strlen(message
)+1, lpDataSecure
->dwDataSize
);
5140 checkFlags( DPSEND_ENCRYPTED
,
5141 lpDataSecure
->dwFlags
,
5145 checkFlags( DPSEND_SIGNED
,
5146 lpDataSecure
->dwFlags
,
5150 checkFlags( DPSEND_SIGNED
| DPSEND_ENCRYPTED
,
5151 lpDataSecure
->dwFlags
,
5157 check_messages( pDP
[0], dpid
, 4, &callbackData
);
5158 checkStr( "", callbackData
.szTrace1
);
5161 /* - Even in a secure session, incorrect flags still not working */
5162 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5164 (LPVOID
) message
, messageSize
);
5165 checkHR( DPERR_INVALIDPARAMS
, hr
);
5166 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5168 (LPVOID
) message
, messageSize
);
5169 checkHR( DPERR_INVALIDPARAMS
, hr
);
5170 hr
= IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1],
5171 DPSEND_ENCRYPTED
| DPSEND_SIGNED
,
5172 (LPVOID
) message
, messageSize
);
5173 checkHR( DPERR_INVALIDPARAMS
, hr
);
5176 HeapFree( GetProcessHeap(), 0, lpData
);
5177 IDirectPlayX_Release( pDP
[0] );
5178 IDirectPlayX_Release( pDP
[1] );
5184 static void test_Receive(void)
5188 DPSESSIONDESC2 dpsd
;
5189 DPID dpid
[4], idFrom
, idTo
;
5191 LPCSTR message
= "message";
5192 DWORD messageSize
= strlen(message
) + 1;
5193 DWORD dwDataSize
= 1024;
5194 LPDPMSG_GENERIC lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
5196 LPDPMSG_CREATEPLAYERORGROUP lpDataCreate
;
5197 LPDPMSG_DESTROYPLAYERORGROUP lpDataDestroy
;
5203 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5204 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
);
5205 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5206 if (FAILED(hr
)) return;
5208 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5209 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5210 dpsd
.guidApplication
= appGuid
;
5212 init_TCPIP_provider( pDP
, "127.0.0.1", 0 );
5214 IDirectPlayX_Open( pDP
, &dpsd
, DPOPEN_CREATE
);
5217 /* Invalid parameters */
5218 hr
= IDirectPlayX_Receive( pDP
, NULL
, &idTo
, 0,
5219 lpData
, &dwDataSize
);
5220 todo_wine
checkHR( DPERR_INVALIDPARAMS
, hr
);
5222 if ( hr
== DPERR_UNINITIALIZED
)
5224 todo_wine
win_skip( "Receive not implemented\n" );
5228 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, NULL
, 0,
5229 lpData
, &dwDataSize
);
5230 checkHR( DPERR_INVALIDPARAMS
, hr
);
5231 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5233 checkHR( DPERR_INVALIDPARAMS
, hr
);
5235 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5236 lpData
, &dwDataSize
);
5237 checkHR( DPERR_INVALIDPARAMS
, hr
);
5239 /* No messages yet */
5240 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5241 NULL
, &dwDataSize
);
5242 checkHR( DPERR_NOMESSAGES
, hr
);
5244 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5245 lpData
, &dwDataSize
);
5246 checkHR( DPERR_NOMESSAGES
, hr
);
5249 IDirectPlayX_CreatePlayer( pDP
, &dpid
[0], NULL
, 0, NULL
, 0, 0 );
5250 IDirectPlayX_CreatePlayer( pDP
, &dpid
[1], NULL
, 0, NULL
, 0,
5251 DPPLAYER_SPECTATOR
);
5252 IDirectPlayX_CreatePlayer( pDP
, &dpid
[2], NULL
, 0, NULL
, 0, 0 );
5253 IDirectPlayX_CreatePlayer( pDP
, &dpid
[3], NULL
, 0, NULL
, 0, 0 );
5260 IDirectPlayX_GetMessageCount( pDP
, dpid
[i
], &dwCount
);
5261 check( 3-i
, dwCount
);
5265 IDirectPlayX_DestroyPlayer( pDP
, dpid
[3] );
5266 IDirectPlayX_DestroyPlayer( pDP
, dpid
[1] );
5271 IDirectPlayX_GetMessageCount( pDP
, dpid
[0], &dwCount
);
5272 check( 5, dwCount
);
5273 IDirectPlayX_GetMessageCount( pDP
, dpid
[1], &dwCount
);
5274 check( 5, dwCount
);
5275 IDirectPlayX_GetMessageCount( pDP
, dpid
[2], &dwCount
);
5276 check( 3, dwCount
);
5277 IDirectPlayX_GetMessageCount( pDP
, dpid
[3], &dwCount
);
5278 check( 3, dwCount
);
5281 /* Buffer too small */
5282 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idFrom
, 0,
5283 NULL
, &dwDataSize
);
5284 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
5285 check( 48, dwDataSize
);
5287 hr
= IDirectPlayX_Receive( pDP
, &idTo
, &idFrom
, 0,
5288 lpData
, &dwDataSize
);
5289 checkHR( DPERR_BUFFERTOOSMALL
, hr
);
5290 check( 48, dwDataSize
);
5293 /* Checking the order or reception */
5294 for (i
=0; i
<11; i
++)
5297 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0,
5298 lpData
, &dwDataSize
);
5300 checkHR( DP_OK
, hr
);
5301 check( DPID_SYSMSG
, idFrom
);
5303 if (i
<6) /* Player creation */
5305 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
5306 check( 48, dwDataSize
);
5307 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5308 check( DPPLAYERTYPE_PLAYER
, lpDataCreate
->dwPlayerType
);
5309 checkLP( NULL
, lpDataCreate
->lpData
);
5310 check( 0, lpDataCreate
->dwDataSize
);
5311 checkLP( NULL
, U1(lpDataCreate
->dpnName
).lpszShortNameA
);
5312 check( 0, lpDataCreate
->dpIdParent
);
5314 else /* Player destruction */
5316 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
,
5318 check( 52, dwDataSize
);
5319 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5320 check( DPPLAYERTYPE_PLAYER
, lpDataDestroy
->dwPlayerType
);
5321 checkLP( NULL
, lpDataDestroy
->lpLocalData
);
5322 check( 0, lpDataDestroy
->dwLocalDataSize
);
5323 checkLP( NULL
, lpDataDestroy
->lpRemoteData
);
5324 check( 0, lpDataDestroy
->dwRemoteDataSize
);
5325 checkLP( NULL
, U1(lpDataDestroy
->dpnName
).lpszShortNameA
);
5326 check( 0, lpDataDestroy
->dpIdParent
);
5333 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5334 check( dpid
[0], idTo
);
5335 check( dpid
[1], lpDataCreate
->dpId
);
5336 check( 1, lpDataCreate
->dwCurrentPlayers
);
5337 checkFlags( DPPLAYER_LOCAL
|DPPLAYER_SPECTATOR
, lpDataCreate
->dwFlags
,
5338 FLAGS_DPPLAYER
|FLAGS_DPGROUP
);
5343 check( dpid
[1], idTo
);
5344 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5345 check( dpid
[2], lpDataCreate
->dpId
);
5346 check( 2, lpDataCreate
->dwCurrentPlayers
);
5347 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5348 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5351 check( dpid
[0], idTo
);
5352 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5353 check( dpid
[2], lpDataCreate
->dpId
);
5354 check( 2, lpDataCreate
->dwCurrentPlayers
);
5355 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5356 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5361 check( dpid
[2], idTo
);
5362 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5363 check( dpid
[3], lpDataCreate
->dpId
);
5364 check( 3, lpDataCreate
->dwCurrentPlayers
);
5365 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5366 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5369 check( dpid
[1], idTo
);
5370 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5371 check( dpid
[3], lpDataCreate
->dpId
);
5372 check( 3, lpDataCreate
->dwCurrentPlayers
);
5373 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5374 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5377 check( dpid
[0], idTo
);
5378 lpDataCreate
= (LPDPMSG_CREATEPLAYERORGROUP
) lpData
;
5379 check( dpid
[3], lpDataCreate
->dpId
);
5380 check( 3, lpDataCreate
->dwCurrentPlayers
);
5381 checkFlags( DPPLAYER_LOCAL
, lpDataCreate
->dwFlags
,
5382 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5387 check( dpid
[2], idTo
);
5388 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5389 check( dpid
[3], lpDataDestroy
->dpId
);
5390 checkFlags( DPPLAYER_LOCAL
, lpDataDestroy
->dwFlags
,
5391 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5394 check( dpid
[1], 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
[0], idTo
);
5402 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5403 check( dpid
[3], lpDataDestroy
->dpId
);
5404 checkFlags( DPPLAYER_LOCAL
, lpDataDestroy
->dwFlags
,
5405 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5410 check( dpid
[2], idTo
);
5411 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5412 check( dpid
[1], lpDataDestroy
->dpId
);
5413 checkFlags( DPPLAYER_LOCAL
|
5414 DPPLAYER_SPECTATOR
, lpDataDestroy
->dwFlags
,
5415 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5418 check( dpid
[0], idTo
);
5419 lpDataDestroy
= (LPDPMSG_DESTROYPLAYERORGROUP
) lpData
;
5420 check( dpid
[1], lpDataDestroy
->dpId
);
5421 checkFlags( DPPLAYER_LOCAL
|
5422 DPPLAYER_SPECTATOR
, lpDataDestroy
->dwFlags
,
5423 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
5427 trace( "%s\n", dpMsgType2str(lpData
->dwType
) );
5432 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5433 checkHR( DPERR_NOMESSAGES
, hr
);
5436 /* New data message */
5437 hr
= IDirectPlayX_Send( pDP
, dpid
[0], dpid
[2], 0,
5438 (LPVOID
) message
, messageSize
);
5439 checkHR( DP_OK
, hr
);
5442 /* Ensuring DPRECEIVE_PEEK doesn't remove the messages from the queue */
5443 for (i
=0; i
<10; i
++)
5445 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, DPRECEIVE_PEEK
,
5446 lpData
, &dwDataSize
);
5447 checkHR( DP_OK
, hr
);
5448 checkStr( message
, (LPSTR
) lpData
);
5451 /* Removing the message from the queue */
5452 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5453 checkHR( DP_OK
, hr
);
5454 check( idFrom
, dpid
[0] );
5455 check( idTo
, dpid
[2] );
5456 checkStr( message
, (LPSTR
) lpData
);
5458 hr
= IDirectPlayX_Receive( pDP
, &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
5459 checkHR( DPERR_NOMESSAGES
, hr
);
5462 HeapFree( GetProcessHeap(), 0, lpData
);
5463 IDirectPlayX_Release( pDP
);
5467 /* GetMessageCount */
5469 static void test_GetMessageCount(void)
5472 IDirectPlay4
*pDP
[2];
5473 DPSESSIONDESC2 dpsd
;
5479 DWORD dwDataSize
= 1024;
5480 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
5481 CallbackData callbackData
;
5486 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5487 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
5488 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5489 if (FAILED(hr
)) return;
5491 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5494 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5495 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
5496 check( -1, dwCount
);
5500 todo_wine
win_skip( "GetMessageCount not implemented\n" );
5505 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
5506 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
5510 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5511 checkHR( DP_OK
, hr
);
5512 check( 0, dwCount
);
5515 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5516 dpsd
.guidApplication
= appGuid
;
5517 dpsd
.dwMaxPlayers
= 10;
5518 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
5519 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
5522 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5523 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5524 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
5525 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
5528 /* Incorrect parameters */
5530 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], NULL
);
5531 checkHR( DPERR_INVALIDPARAMS
, hr
);
5532 check( -1, dwCount
);
5535 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, NULL
);
5536 checkHR( DPERR_INVALIDPARAMS
, hr
);
5537 check( -1, dwCount
);
5540 hr
= IDirectPlayX_GetMessageCount( pDP
[0], -1, &dwCount
);
5541 checkHR( DPERR_INVALIDPLAYER
, hr
);
5542 check( -1, dwCount
);
5545 /* Correct parameters */
5546 /* Player creation messages */
5548 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5549 checkHR( DP_OK
, hr
);
5550 check( 5, dwCount
);
5553 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5554 checkHR( DP_OK
, hr
);
5555 check( 1, dwCount
);
5558 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5559 checkHR( DP_OK
, hr
);
5560 check( 3, dwCount
);
5563 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5564 checkHR( DP_OK
, hr
);
5565 check( 2, dwCount
);
5568 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[3], &dwCount
);
5569 checkHR( DP_OK
, hr
);
5570 /* Remote player: doesn't throw error but result is 0 and not 1 */
5571 check( 0, dwCount
);
5574 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5575 checkHR( DP_OK
, hr
);
5576 check( 1, dwCount
);
5579 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5580 checkHR( DP_OK
, hr
);
5581 check( 2, dwCount
);
5585 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5586 checkStr( "S0,S1,S0,S1,S0,", callbackData
.szTrace1
);
5587 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5588 checkStr( "S3,", callbackData
.szTrace1
);
5591 /* Ensure queues is purged */
5593 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5594 checkHR( DP_OK
, hr
);
5595 check( 0, dwCount
);
5598 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5599 checkHR( DP_OK
, hr
);
5600 check( 0, dwCount
);
5603 /* Send data messages */
5605 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0, lpData
, dwDataSize
);
5607 IDirectPlayX_Send( pDP
[0], dpid
[1], dpid
[2], 0, lpData
, dwDataSize
);
5609 IDirectPlayX_Send( pDP
[0], dpid
[2], dpid
[3], 0, lpData
, dwDataSize
);
5612 /* Check all messages are in the queues */
5614 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5615 checkHR( DP_OK
, hr
);
5616 check( 11, dwCount
);
5619 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5620 checkHR( DP_OK
, hr
);
5621 check( 7, dwCount
);
5624 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5625 checkHR( DP_OK
, hr
);
5626 check( 0, dwCount
);
5629 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5630 checkHR( DP_OK
, hr
);
5631 check( 5, dwCount
);
5634 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[2], &dwCount
);
5635 checkHR( DP_OK
, hr
);
5636 check( 6, dwCount
);
5639 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5640 checkHR( DP_OK
, hr
);
5641 check( 7, dwCount
);
5644 /* Purge queues again */
5645 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5646 checkStr( "01,01,01,01,01,"
5647 "12,12,12,12,12,12,", callbackData
.szTrace1
);
5648 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5649 checkStr( "23,23,23,23,23,23,23,", callbackData
.szTrace1
);
5652 /* Check queues are purged */
5654 hr
= IDirectPlayX_GetMessageCount( pDP
[0], 0, &dwCount
);
5655 checkHR( DP_OK
, hr
);
5656 check( 0, dwCount
);
5659 hr
= IDirectPlayX_GetMessageCount( pDP
[1], 0, &dwCount
);
5660 checkHR( DP_OK
, hr
);
5661 check( 0, dwCount
);
5664 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
5665 checkHR( DP_OK
, hr
);
5666 check( 0, dwCount
);
5669 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[1], &dwCount
);
5670 checkHR( DP_OK
, hr
);
5671 check( 0, dwCount
);
5674 hr
= IDirectPlayX_GetMessageCount( pDP
[0], dpid
[2], &dwCount
);
5675 checkHR( DP_OK
, hr
);
5676 check( 0, dwCount
);
5679 hr
= IDirectPlayX_GetMessageCount( pDP
[1], dpid
[3], &dwCount
);
5680 checkHR( DP_OK
, hr
);
5681 check( 0, dwCount
);
5684 HeapFree( GetProcessHeap(), 0, lpData
);
5685 IDirectPlayX_Release( pDP
[0] );
5686 IDirectPlayX_Release( pDP
[1] );
5690 /* GetMessageQueue */
5692 static void test_GetMessageQueue(void)
5695 IDirectPlay4
*pDP
[2];
5696 DPSESSIONDESC2 dpsd
;
5698 CallbackData callbackData
;
5701 DWORD dwNumMsgs
, dwNumBytes
;
5703 DWORD dwDataSize
= 1024;
5704 LPVOID lpData
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, dwDataSize
);
5709 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
5710 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
5711 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
5712 if (FAILED(hr
)) return;
5714 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
5717 dwNumMsgs
= dwNumBytes
= -1;
5718 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0, 0,
5719 &dwNumMsgs
, &dwNumBytes
);
5720 todo_wine
checkHR( DPERR_UNINITIALIZED
, hr
);
5721 check( -1, dwNumMsgs
);
5722 check( -1, dwNumBytes
);
5726 todo_wine
win_skip( "GetMessageQueue not implemented\n" );
5731 init_TCPIP_provider( pDP
[0], "127.0.0.1", 0 );
5732 init_TCPIP_provider( pDP
[1], "127.0.0.1", 0 );
5735 dwNumMsgs
= dwNumBytes
= -1;
5736 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0, 0,
5737 &dwNumMsgs
, &dwNumBytes
);
5738 checkHR( DP_OK
, hr
);
5739 check( 0, dwNumMsgs
);
5740 check( 0, dwNumBytes
);
5743 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
5744 dpsd
.guidApplication
= appGuid
;
5745 dpsd
.dwMaxPlayers
= 10;
5746 IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
5747 IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
5750 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
5751 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
5752 IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[3], NULL
, NULL
, NULL
, 0, 0 );
5753 IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[2], NULL
, NULL
, NULL
, 0, 0 );
5757 /* Incorrect parameters */
5758 dwNumMsgs
= dwNumBytes
= -1;
5759 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], -1, dpid
[1],
5761 &dwNumMsgs
, &dwNumBytes
);
5762 checkHR( DPERR_INVALIDPLAYER
, hr
);
5763 check( -1, dwNumMsgs
);
5764 check( -1, dwNumBytes
);
5766 dwNumMsgs
= dwNumBytes
= -1;
5767 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], -1,
5769 &dwNumMsgs
, &dwNumBytes
);
5770 checkHR( DPERR_INVALIDPLAYER
, hr
);
5771 check( -1, dwNumMsgs
);
5772 check( -1, dwNumBytes
);
5774 dwNumMsgs
= dwNumBytes
= -1;
5775 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[0],
5777 &dwNumMsgs
, &dwNumBytes
);
5778 checkHR( DPERR_INVALIDFLAGS
, hr
);
5779 check( -1, dwNumMsgs
);
5780 check( -1, dwNumBytes
);
5782 dwNumMsgs
= dwNumBytes
= -1;
5783 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5784 ( DPMESSAGEQUEUE_SEND
|
5785 DPMESSAGEQUEUE_RECEIVE
),
5786 &dwNumMsgs
, &dwNumBytes
);
5787 checkHR( DPERR_INVALIDFLAGS
, hr
);
5788 check( -1, dwNumMsgs
);
5789 check( -1, dwNumBytes
);
5791 /* - Remote players */
5792 dwNumMsgs
= dwNumBytes
= -1;
5793 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[3],
5794 DPMESSAGEQUEUE_RECEIVE
,
5795 &dwNumMsgs
, &dwNumBytes
);
5796 checkHR( DPERR_INVALIDPLAYER
, hr
); /* Player 3 is remote */
5797 check( -1, dwNumMsgs
);
5798 check( -1, dwNumBytes
);
5800 dwNumMsgs
= dwNumBytes
= -1;
5801 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[3], 0,
5802 DPMESSAGEQUEUE_SEND
,
5803 &dwNumMsgs
, &dwNumBytes
);
5804 checkHR( DPERR_INVALIDPLAYER
, hr
); /* Player 3 is remote */
5805 check( -1, dwNumMsgs
);
5806 check( -1, dwNumBytes
);
5808 /* - Remote players, this time in the right place */
5809 dwNumMsgs
= dwNumBytes
= -1;
5810 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[3],
5811 DPMESSAGEQUEUE_SEND
,
5812 &dwNumMsgs
, &dwNumBytes
);
5813 checkHR( DP_OK
, hr
);
5814 check( 0, dwNumMsgs
);
5815 check( 0, dwNumBytes
);
5817 dwNumMsgs
= dwNumBytes
= -1;
5818 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[3], 0,
5819 DPMESSAGEQUEUE_RECEIVE
,
5820 &dwNumMsgs
, &dwNumBytes
);
5821 checkHR( DP_OK
, hr
);
5822 check( 0, dwNumMsgs
);
5823 check( 0, dwNumBytes
);
5826 /* Correct parameters */
5827 dwNumMsgs
= dwNumBytes
= -1;
5828 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, dpid
[1],
5829 DPMESSAGEQUEUE_RECEIVE
,
5830 &dwNumMsgs
, &dwNumBytes
);
5831 checkHR( DP_OK
, hr
);
5832 check( 2, dwNumMsgs
);
5833 check( 96, dwNumBytes
);
5835 dwNumMsgs
= dwNumBytes
= -1;
5836 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], 0,
5837 DPMESSAGEQUEUE_RECEIVE
,
5838 &dwNumMsgs
, &dwNumBytes
);
5839 checkHR( DP_OK
, hr
);
5840 check( 0, dwNumMsgs
);
5841 check( 0, dwNumBytes
);
5843 dwNumMsgs
= dwNumBytes
= -1;
5844 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5845 DPMESSAGEQUEUE_RECEIVE
,
5846 &dwNumMsgs
, &dwNumBytes
);
5847 checkHR( DP_OK
, hr
);
5848 check( 5, dwNumMsgs
);
5849 check( 240, dwNumBytes
);
5851 dwNumMsgs
= dwNumBytes
= -1;
5852 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5853 DPMESSAGEQUEUE_RECEIVE
,
5854 NULL
, &dwNumBytes
);
5855 checkHR( DP_OK
, hr
);
5856 check( -1, dwNumMsgs
);
5857 check( 0, dwNumBytes
);
5859 dwNumMsgs
= dwNumBytes
= -1;
5860 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5861 DPMESSAGEQUEUE_RECEIVE
,
5863 checkHR( DP_OK
, hr
);
5864 check( 0, dwNumMsgs
);
5865 check( -1, dwNumBytes
);
5867 dwNumMsgs
= dwNumBytes
= -1;
5868 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5869 DPMESSAGEQUEUE_RECEIVE
,
5871 checkHR( DP_OK
, hr
);
5872 check( -1, dwNumMsgs
);
5873 check( -1, dwNumBytes
);
5875 dwNumMsgs
= dwNumBytes
= -1;
5876 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5877 DPMESSAGEQUEUE_RECEIVE
,
5878 &dwNumMsgs
, &dwNumBytes
);
5879 checkHR( DP_OK
, hr
);
5880 check( 0, dwNumMsgs
);
5881 check( 0, dwNumBytes
);
5884 /* Purge messages */
5885 check_messages( pDP
[0], dpid
, 6, &callbackData
);
5886 checkStr( "S0,S1,S0,S1,S0,", callbackData
.szTrace1
);
5887 check_messages( pDP
[1], dpid
, 6, &callbackData
);
5888 checkStr( "S3,", callbackData
.szTrace1
);
5890 /* Check queues are empty */
5891 dwNumMsgs
= dwNumBytes
= -1;
5892 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5893 DPMESSAGEQUEUE_RECEIVE
,
5894 &dwNumMsgs
, &dwNumBytes
);
5895 checkHR( DP_OK
, hr
);
5896 check( 0, dwNumMsgs
);
5897 check( 0, dwNumBytes
);
5900 /* Sending 4 data messages from 0 to 1 */
5904 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[1], 0, lpData
, dwDataSize
);
5906 IDirectPlayX_Send( pDP
[0], dpid
[0], dpid
[3], 0, lpData
, dwDataSize
);
5908 IDirectPlayX_Send( pDP
[0], dpid
[1], dpid
[3], 0, lpData
, dwDataSize
);
5911 dwNumMsgs
= dwNumBytes
= -1;
5912 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5913 DPMESSAGEQUEUE_RECEIVE
,
5914 &dwNumMsgs
, &dwNumBytes
);
5915 checkHR( DP_OK
, hr
);
5916 check( 4, dwNumMsgs
);
5917 check( 4*dwDataSize
, dwNumBytes
);
5919 dwNumMsgs
= dwNumBytes
= -1;
5920 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[0], dpid
[3],
5921 DPMESSAGEQUEUE_RECEIVE
,
5922 &dwNumMsgs
, &dwNumBytes
);
5923 checkHR( DP_OK
, hr
);
5924 check( 3, dwNumMsgs
);
5925 check( 3*dwDataSize
, dwNumBytes
);
5927 dwNumMsgs
= dwNumBytes
= -1;
5928 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[1], dpid
[3],
5929 DPMESSAGEQUEUE_RECEIVE
,
5930 &dwNumMsgs
, &dwNumBytes
);
5931 checkHR( DP_OK
, hr
);
5932 check( 2, dwNumMsgs
);
5933 check( 2*dwDataSize
, dwNumBytes
);
5935 dwNumMsgs
= dwNumBytes
= -1;
5936 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], 0,
5937 DPMESSAGEQUEUE_RECEIVE
,
5938 &dwNumMsgs
, &dwNumBytes
);
5939 checkHR( DP_OK
, hr
);
5940 check( 4, dwNumMsgs
);
5941 check( 4*dwDataSize
, dwNumBytes
);
5943 dwNumMsgs
= dwNumBytes
= -1;
5944 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], dpid
[0], 0,
5945 DPMESSAGEQUEUE_RECEIVE
,
5946 &dwNumMsgs
, &dwNumBytes
);
5947 checkHR( DP_OK
, hr
);
5948 check( 3, dwNumMsgs
);
5949 check( 3*dwDataSize
, dwNumBytes
);
5951 dwNumMsgs
= dwNumBytes
= -1;
5952 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], 0, dpid
[3],
5953 DPMESSAGEQUEUE_RECEIVE
,
5954 &dwNumMsgs
, &dwNumBytes
);
5955 checkHR( DP_OK
, hr
);
5956 check( 5, dwNumMsgs
);
5957 check( 5*dwDataSize
, dwNumBytes
);
5959 dwNumMsgs
= dwNumBytes
= -1;
5960 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], 0, 0,
5961 DPMESSAGEQUEUE_RECEIVE
,
5962 &dwNumMsgs
, &dwNumBytes
);
5963 checkHR( DP_OK
, hr
);
5964 check( 4, dwNumMsgs
);
5965 check( 4*dwDataSize
, dwNumBytes
);
5967 dwNumMsgs
= dwNumBytes
= -1;
5968 hr
= IDirectPlayX_GetMessageQueue( pDP
[1], 0, 0,
5969 DPMESSAGEQUEUE_RECEIVE
,
5970 &dwNumMsgs
, &dwNumBytes
);
5971 checkHR( DP_OK
, hr
);
5972 check( 5, dwNumMsgs
);
5973 check( 5*dwDataSize
, dwNumBytes
);
5976 dwNumMsgs
= dwNumBytes
= -1;
5977 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5978 DPMESSAGEQUEUE_SEND
,
5979 &dwNumMsgs
, &dwNumBytes
);
5980 checkHR( DP_OK
, hr
);
5981 check( 0, dwNumMsgs
);
5982 check( 0, dwNumBytes
);
5984 dwNumMsgs
= dwNumBytes
= -1;
5985 hr
= IDirectPlayX_GetMessageQueue( pDP
[0], dpid
[0], dpid
[1],
5987 &dwNumMsgs
, &dwNumBytes
);
5988 checkHR( DP_OK
, hr
);
5989 check( 0, dwNumMsgs
);
5990 check( 0, dwNumBytes
);
5993 HeapFree( GetProcessHeap(), 0, lpData
);
5994 IDirectPlayX_Release( pDP
[0] );
5995 IDirectPlayX_Release( pDP
[1] );
5999 /* Remote data replication */
6001 static void test_remote_data_replication(void)
6004 IDirectPlay4
*pDP
[2];
6005 DPSESSIONDESC2 dpsd
;
6006 DPID dpid
[2], idFrom
, idTo
;
6007 CallbackData callbackData
;
6010 DWORD dwFlags
, dwDataSize
= 1024;
6013 LPDPMSG_SETPLAYERORGROUPDATA lpData
= HeapAlloc( GetProcessHeap(),
6017 LPCSTR lpDataLocal
[] = { "local_0", "local_1" };
6018 LPCSTR lpDataRemote
[] = { "remote_0", "remote_1" };
6019 LPCSTR lpDataFake
= "ugly_fake_data";
6020 LPSTR lpDataGet
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, 32 );
6021 DWORD dwDataSizeLocal
= strlen(lpDataLocal
[0])+1,
6022 dwDataSizeRemote
= strlen(lpDataRemote
[0])+1,
6023 dwDataSizeFake
= strlen(lpDataFake
)+1,
6029 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
6030 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
6031 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
6032 if (FAILED(hr
)) return;
6033 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
6035 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
6036 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
6037 dpsd
.guidApplication
= appGuid
;
6040 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
6041 todo_wine
checkHR( DP_OK
, hr
);
6043 if ( hr
== DPERR_UNINITIALIZED
)
6045 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
6049 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0],
6050 NULL
, NULL
, NULL
, 0, 0 );
6051 checkHR( DP_OK
, hr
);
6054 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
6056 checkHR( DP_OK
, hr
);
6058 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1],
6059 NULL
, NULL
, NULL
, 0, 0 );
6060 checkHR( DP_OK
, hr
);
6065 /* Local (0,0) (1,1) */
6066 IDirectPlayX_GetPlayerFlags( pDP
[i
], dpid
[i
], &dwFlags
);
6067 checkFlags( DPPLAYER_LOCAL
, dwFlags
, FLAGS_DPPLAYER
);
6068 /* Remote (0,1) (1,0) */
6069 IDirectPlayX_GetPlayerFlags( pDP
[i
], dpid
[!i
], &dwFlags
);
6070 checkFlags( 0, dwFlags
, FLAGS_DPPLAYER
);
6073 /* Set data for a local player */
6076 hr
= IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[i
],
6077 (LPVOID
) lpDataLocal
[i
],
6080 checkHR( DP_OK
, hr
);
6081 hr
= IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[i
],
6082 (LPVOID
) lpDataRemote
[i
],
6085 checkHR( DP_OK
, hr
);
6088 /* Retrieve data locally (0->0, 1->1) */
6091 dwDataSizeGet
= dwDataSizeFake
;
6092 strcpy( lpDataGet
, lpDataFake
);
6093 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[i
],
6094 lpDataGet
, &dwDataSizeGet
,
6096 checkHR( DP_OK
, hr
);
6097 check( dwDataSizeLocal
, dwDataSizeGet
);
6098 checkStr( lpDataLocal
[i
], lpDataGet
);
6100 dwDataSizeGet
= dwDataSizeFake
;
6101 strcpy( lpDataGet
, lpDataFake
);
6102 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[i
],
6103 lpDataGet
, &dwDataSizeGet
,
6105 checkHR( DP_OK
, hr
);
6106 check( dwDataSizeRemote
, dwDataSizeGet
);
6107 checkStr( lpDataRemote
[i
], lpDataGet
);
6111 /* Set data for a remote player */
6112 /* This should fail with DPERR_ACCESSDENIED,
6113 but for some reason it doesn't */
6116 IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[!i
],
6117 (LPVOID
) lpDataLocal
[!i
],
6120 checkHR( DP_OK
, hr
);
6121 IDirectPlayX_SetPlayerData( pDP
[i
], dpid
[!i
],
6122 (LPVOID
) lpDataRemote
[!i
],
6125 checkHR( DP_OK
, hr
);
6128 /* Retrieve crossed data (0->1, 1->0) */
6131 dwDataSizeGet
= dwDataSizeFake
;
6132 strcpy( lpDataGet
, lpDataFake
);
6133 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[!i
],
6134 lpDataGet
, &dwDataSizeGet
,
6136 checkHR( DP_OK
, hr
);
6137 check( dwDataSizeLocal
, dwDataSizeGet
);
6138 checkStr( lpDataLocal
[!i
], lpDataGet
);
6140 dwDataSizeGet
= dwDataSizeFake
;
6141 strcpy( lpDataGet
, lpDataFake
);
6142 hr
= IDirectPlayX_GetPlayerData( pDP
[i
], dpid
[!i
],
6143 lpDataGet
, &dwDataSizeGet
,
6145 checkHR( DP_OK
, hr
);
6146 check( dwDataSizeRemote
, dwDataSizeGet
);
6147 checkStr( lpDataRemote
[!i
], lpDataGet
);
6151 /* Purge "new player" messages from queue */
6152 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
6153 checkHR( DP_OK
, hr
);
6154 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6156 /* Check number of messages in queue */
6159 IDirectPlayX_GetMessageCount( pDP
[i
], dpid
[i
], &dwCount
);
6160 check( 2, dwCount
);
6161 IDirectPlayX_GetMessageCount( pDP
[i
], dpid
[!i
], &dwCount
);
6162 check( 0, dwCount
);
6165 /* Checking system messages */
6170 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0, lpData
,
6172 checkHR( DP_OK
, hr
);
6173 check( 29, dwDataSize
);
6174 check( DPID_SYSMSG
, idFrom
);
6175 check( dpid
[i
], idTo
);
6176 checkConv( DPSYS_SETPLAYERORGROUPDATA
, lpData
->dwType
,
6178 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6179 check( dpid
[j
], lpData
->dpId
);
6180 checkStr( lpDataRemote
[j
], (LPSTR
) lpData
->lpData
);
6181 check( dwDataSizeRemote
, lpData
->dwDataSize
);
6184 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0,
6185 lpData
, &dwDataSize
);
6186 checkHR( DPERR_NOMESSAGES
, hr
);
6190 /* Changing remote data */
6191 hr
= IDirectPlayX_SetPlayerData( pDP
[0], dpid
[0],
6192 (LPVOID
) lpDataRemote
[0], dwDataSizeRemote
,
6194 checkHR( DP_OK
, hr
);
6196 /* Checking system messages (j=0) */
6199 hr
= IDirectPlayX_Receive( pDP
[i
], &idFrom
, &idTo
, 0,
6200 lpData
, &dwDataSize
);
6201 checkHR( DP_OK
, hr
);
6202 check( 29, dwDataSize
);
6203 check( DPID_SYSMSG
, idFrom
);
6204 check( dpid
[i
], idTo
);
6205 checkConv( DPSYS_SETPLAYERORGROUPDATA
, lpData
->dwType
, dpMsgType2str
);
6206 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6207 check( dpid
[0], lpData
->dpId
);
6208 checkStr( lpDataRemote
[0], (LPSTR
) lpData
->lpData
);
6209 check( dwDataSizeRemote
, lpData
->dwDataSize
);
6213 /* Queue is empty */
6214 check_messages( pDP
[0], dpid
, 2, &callbackData
);
6215 checkStr( "", callbackData
.szTrace1
);
6216 check_messages( pDP
[1], dpid
, 2, &callbackData
);
6217 checkStr( "", callbackData
.szTrace1
);
6220 HeapFree( GetProcessHeap(), 0, lpDataGet
);
6221 HeapFree( GetProcessHeap(), 0, lpData
);
6222 IDirectPlayX_Release( pDP
[0] );
6223 IDirectPlayX_Release( pDP
[1] );
6227 /* Host migration */
6229 static void test_host_migration(void)
6232 IDirectPlay4
*pDP
[2];
6233 DPSESSIONDESC2 dpsd
;
6234 DPID dpid
[2], idFrom
, idTo
;
6239 DWORD dwDataSize
= 1024;
6240 LPDPMSG_DESTROYPLAYERORGROUP lpData
= HeapAlloc( GetProcessHeap(),
6247 hr
= CoCreateInstance( &CLSID_DirectPlay
, NULL
, CLSCTX_ALL
,
6248 &IID_IDirectPlay4A
, (LPVOID
*) &pDP
[i
] );
6249 ok( SUCCEEDED(hr
), "CCI of CLSID_DirectPlay / IID_IDirectPlay4A failed\n" );
6250 if (FAILED(hr
)) return;
6251 init_TCPIP_provider( pDP
[i
], "127.0.0.1", 0 );
6253 ZeroMemory( &dpsd
, sizeof(DPSESSIONDESC2
) );
6254 dpsd
.dwSize
= sizeof(DPSESSIONDESC2
);
6255 dpsd
.guidApplication
= appGuid
;
6256 dpsd
.dwMaxPlayers
= 10;
6257 dpsd
.dwFlags
= DPSESSION_MIGRATEHOST
;
6260 hr
= IDirectPlayX_Open( pDP
[0], &dpsd
, DPOPEN_CREATE
);
6261 todo_wine
checkHR( DP_OK
, hr
);
6265 todo_wine
win_skip( "dplay not implemented enough for this test yet\n" );
6269 hr
= IDirectPlayX_CreatePlayer( pDP
[0], &dpid
[0], NULL
, NULL
, NULL
, 0, 0 );
6270 checkHR( DP_OK
, hr
);
6273 hr
= IDirectPlayX_EnumSessions( pDP
[1], &dpsd
, 0, EnumSessions_cb_join
,
6275 checkHR( DP_OK
, hr
);
6277 hr
= IDirectPlayX_CreatePlayer( pDP
[1], &dpid
[1], NULL
, NULL
, NULL
, 0, 0 );
6278 checkHR( DP_OK
, hr
);
6281 /* Host: One message in queue */
6282 IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
6283 check( 1, dwCount
);
6285 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6286 lpData
, &dwDataSize
);
6287 checkHR( DP_OK
, hr
);
6288 checkConv( DPSYS_CREATEPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6290 /* Peer: No messages */
6291 IDirectPlayX_GetMessageCount( pDP
[1], dpid
[1], &dwCount
);
6292 check( 0, dwCount
);
6293 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6294 lpData
, &dwDataSize
);
6295 checkHR( DPERR_NOMESSAGES
, hr
);
6299 IDirectPlayX_Close( pDP
[0] );
6302 /* Host: Queue is cleaned */
6303 IDirectPlayX_GetMessageCount( pDP
[0], dpid
[0], &dwCount
);
6304 check( 0, dwCount
);
6305 hr
= IDirectPlayX_Receive( pDP
[0], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6306 lpData
, &dwDataSize
);
6307 checkHR( DPERR_NOMESSAGES
, hr
);
6309 /* Peer: gets message of player destruction */
6310 IDirectPlayX_GetMessageCount( pDP
[1], dpid
[1], &dwCount
);
6311 check( 2, dwCount
);
6313 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, DPRECEIVE_PEEK
,
6314 lpData
, &dwDataSize
);
6315 checkHR( DP_OK
, hr
);
6316 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
, dpMsgType2str
);
6319 /* Message analysis */
6322 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, 0,
6323 lpData
, &dwDataSize
);
6324 checkHR( DP_OK
, hr
);
6325 check( DPID_SYSMSG
, idFrom
);
6326 check( dpid
[1], idTo
); /* Peer player id */
6330 checkConv( DPSYS_DESTROYPLAYERORGROUP
, lpData
->dwType
,
6332 check( DPPLAYERTYPE_PLAYER
, lpData
->dwPlayerType
);
6333 check( dpid
[0], lpData
->dpId
); /* Host player id */
6334 checkLP( NULL
, lpData
->lpLocalData
);
6335 check( 0, lpData
->dwLocalDataSize
);
6336 checkLP( NULL
, lpData
->lpRemoteData
);
6337 check( 0, lpData
->dwRemoteDataSize
);
6338 checkLP( NULL
, U1(lpData
->dpnName
).lpszShortNameA
);
6339 check( 0, lpData
->dpIdParent
);
6340 checkFlags( 0, lpData
->dwFlags
,
6341 FLAGS_DPPLAYER
| FLAGS_DPGROUP
);
6344 checkConv( DPSYS_HOST
, lpData
->dwType
, dpMsgType2str
);
6351 hr
= IDirectPlayX_Receive( pDP
[1], &idFrom
, &idTo
, 0, lpData
, &dwDataSize
);
6352 checkHR( DPERR_NOMESSAGES
, hr
);
6355 HeapFree( GetProcessHeap(), 0, lpData
);
6356 IDirectPlayX_Release( pDP
[0] );
6357 IDirectPlayX_Release( pDP
[1] );
6361 static void test_COM(void)
6364 IDirectPlay2A
*dp2A
;
6366 IDirectPlay3A
*dp3A
;
6368 IDirectPlay4A
*dp4A
;
6369 IDirectPlay4
*dp4
= (IDirectPlay4
*)0xdeadbeef;
6374 /* COM aggregation */
6375 hr
= CoCreateInstance(&CLSID_DirectPlay
, (IUnknown
*)&dp4
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
,
6377 ok(hr
== CLASS_E_NOAGGREGATION
|| broken(hr
== E_INVALIDARG
),
6378 "DirectPlay create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
6379 ok(!dp4
|| dp4
== (IDirectPlay4
*)0xdeadbeef, "dp4 = %p\n", dp4
);
6382 hr
= CoCreateInstance(&CLSID_DirectPlay
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlayLobby
,
6384 ok(hr
== E_NOINTERFACE
, "DirectPlay create failed: %08x, expected E_NOINTERFACE\n", hr
);
6386 /* Different refcount for all DirectPlay Interfaces */
6387 hr
= CoCreateInstance(&CLSID_DirectPlay
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlay4
,
6389 ok(hr
== S_OK
, "DirectPlay create failed: %08x, expected S_OK\n", hr
);
6390 refcount
= IDirectPlayX_AddRef(dp4
);
6391 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6393 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay2A
, (void**)&dp2A
);
6394 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay2A failed: %08x\n", hr
);
6395 refcount
= IDirectPlay2_AddRef(dp2A
);
6396 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6397 IDirectPlay2_Release(dp2A
);
6399 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay2
, (void**)&dp2
);
6400 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay2 failed: %08x\n", hr
);
6401 refcount
= IDirectPlay2_AddRef(dp2
);
6402 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6403 IDirectPlay2_Release(dp2
);
6405 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay3A
, (void**)&dp3A
);
6406 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay3A failed: %08x\n", hr
);
6407 refcount
= IDirectPlay3_AddRef(dp3A
);
6408 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6409 IDirectPlay3_Release(dp3A
);
6411 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay3
, (void**)&dp3
);
6412 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay3 failed: %08x\n", hr
);
6413 refcount
= IDirectPlay3_AddRef(dp3
);
6414 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6415 IDirectPlay3_Release(dp3
);
6417 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay4A
, (void**)&dp4A
);
6418 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay4A failed: %08x\n", hr
);
6419 refcount
= IDirectPlayX_AddRef(dp4A
);
6420 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6421 IDirectPlayX_Release(dp4A
);
6423 /* IDirectPlay and IUnknown share a refcount */
6424 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IDirectPlay
, (void**)&dp
);
6425 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlay failed: %08x\n", hr
);
6426 refcount
= IDirectPlayX_AddRef(dp
);
6427 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6428 IDirectPlay_Release(dp
);
6430 hr
= IDirectPlayX_QueryInterface(dp4
, &IID_IUnknown
, (void**)&unk
);
6431 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
6432 refcount
= IUnknown_AddRef(unk
);
6433 ok(refcount
== 3, "refcount == %u, expected 3\n", refcount
);
6434 refcount
= IUnknown_Release(unk
);
6435 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6437 IUnknown_Release(unk
);
6438 IDirectPlay_Release(dp
);
6439 IDirectPlayX_Release(dp4A
);
6440 IDirectPlay3_Release(dp3
);
6441 IDirectPlay3_Release(dp3A
);
6442 IDirectPlay2_Release(dp2
);
6443 IDirectPlay2_Release(dp2A
);
6444 IDirectPlayX_Release(dp4
);
6445 refcount
= IDirectPlayX_Release(dp4
);
6446 ok(refcount
== 0, "refcount == %u, expected 0\n", refcount
);
6449 static void test_COM_dplobby(void)
6451 IDirectPlayLobby
*dpl
= (IDirectPlayLobby
*)0xdeadbeef;
6452 IDirectPlayLobbyA
*dplA
;
6453 IDirectPlayLobby2A
*dpl2A
;
6454 IDirectPlayLobby2
*dpl2
;
6455 IDirectPlayLobby3A
*dpl3A
;
6456 IDirectPlayLobby3
*dpl3
;
6461 /* COM aggregation */
6462 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, (IUnknown
*)&dpl
, CLSCTX_INPROC_SERVER
,
6463 &IID_IUnknown
, (void**)&dpl
);
6464 ok(hr
== CLASS_E_NOAGGREGATION
|| broken(hr
== E_INVALIDARG
),
6465 "DirectPlayLobby create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
6466 ok(!dpl
|| dpl
== (IDirectPlayLobby
*)0xdeadbeef, "dpl = %p\n", dpl
);
6469 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlay
,
6471 ok(hr
== E_NOINTERFACE
, "DirectPlayLobby create failed: %08x, expected E_NOINTERFACE\n", hr
);
6473 /* Different refcount for all DirectPlayLobby Interfaces */
6474 hr
= CoCreateInstance(&CLSID_DirectPlayLobby
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IDirectPlayLobby
,
6476 ok(hr
== S_OK
, "DirectPlayLobby create failed: %08x, expected S_OK\n", hr
);
6477 refcount
= IDirectPlayLobby_AddRef(dpl
);
6478 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6480 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobbyA
, (void**)&dplA
);
6481 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobbyA failed: %08x\n", hr
);
6482 refcount
= IDirectPlayLobby_AddRef(dplA
);
6483 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6484 IDirectPlayLobby_Release(dplA
);
6486 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby2
, (void**)&dpl2
);
6487 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby2 failed: %08x\n", hr
);
6488 refcount
= IDirectPlayLobby_AddRef(dpl2
);
6489 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6490 IDirectPlayLobby_Release(dpl2
);
6492 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby2A
, (void**)&dpl2A
);
6493 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby2A failed: %08x\n", hr
);
6494 refcount
= IDirectPlayLobby_AddRef(dpl2A
);
6495 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6496 IDirectPlayLobby_Release(dpl2A
);
6498 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby3
, (void**)&dpl3
);
6499 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby3 failed: %08x\n", hr
);
6500 refcount
= IDirectPlayLobby_AddRef(dpl3
);
6501 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6502 IDirectPlayLobby_Release(dpl3
);
6504 hr
= IDirectPlayLobby_QueryInterface(dpl
, &IID_IDirectPlayLobby3A
, (void**)&dpl3A
);
6505 ok(hr
== S_OK
, "QueryInterface for IID_IDirectPlayLobby3A failed: %08x\n", hr
);
6506 refcount
= IDirectPlayLobby_AddRef(dpl3A
);
6507 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
6508 IDirectPlayLobby_Release(dpl3A
);
6510 /* IDirectPlayLobby and IUnknown share a refcount */
6511 hr
= IDirectPlayX_QueryInterface(dpl
, &IID_IUnknown
, (void**)&unk
);
6512 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
6513 refcount
= IUnknown_AddRef(unk
);
6514 ok(refcount
== 4, "refcount == %u, expected 4\n", refcount
);
6515 IDirectPlayLobby_Release(unk
);
6517 IUnknown_Release(unk
);
6518 IDirectPlayLobby_Release(dpl3
);
6519 IDirectPlayLobby_Release(dpl3A
);
6520 IDirectPlayLobby_Release(dpl2
);
6521 IDirectPlayLobby_Release(dpl2A
);
6522 IDirectPlayLobby_Release(dplA
);
6523 IDirectPlayLobby_Release(dpl
);
6524 refcount
= IDirectPlayLobby_Release(dpl
);
6525 ok(refcount
== 0, "refcount == %u, expected 0\n", refcount
);
6531 CoInitialize( NULL
);
6536 if (!winetest_interactive
)
6538 skip("Run in interactive mode to run dplayx tests.\n");
6542 trace("Running in interactive mode, tests will take a while\n");
6544 test_DirectPlayCreate();
6545 test_EnumConnections();
6546 test_InitializeConnection();
6549 /* test_Open() takes almost a minute, */
6551 /* test_EnumSession takes three minutes */
6552 test_EnumSessions();
6555 /* test_CreatePlayer() takes over a minute */
6556 test_CreatePlayer();
6557 test_GetPlayerCaps();
6561 /* test_GetPlayerAccount() takes over 30s */
6562 test_GetPlayerAccount();
6563 test_GetPlayerAddress();
6564 test_GetPlayerFlags();
6571 test_EnumGroupsInGroup();
6578 test_GetMessageCount();
6579 test_GetMessageQueue();
6581 test_remote_data_replication();
6582 test_host_migration();