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