1 /* Direct Play 2,3,4 Implementation
3 * Copyright 1998,1999 - Peter Hunnisett
5 * <presently under construction - contact hunnise@nortelnetworks.com>
15 #include "debugtools.h"
18 #include "dplayx_global.h"
20 /* FIXME: This stuff shouldn't really be here. It indicates a poor architectural coupling */
22 extern HRESULT DPL_CreateCompoundAddress ( LPCDPCOMPOUNDADDRESSELEMENT lpElements, DWORD dwElementCount,
23 LPVOID lpAddress, LPDWORD lpdwAddressSize, BOOL bAnsiInterface );
25 DEFAULT_DEBUG_CHANNEL(dplay)
28 /*****************************************************************************
29 * Predeclare the interface implementation structures
31 typedef struct IDirectPlay2Impl IDirectPlay2AImpl;
32 typedef struct IDirectPlay2Impl IDirectPlay2Impl;
33 typedef struct IDirectPlay3Impl IDirectPlay3AImpl;
34 typedef struct IDirectPlay3Impl IDirectPlay3Impl;
35 typedef struct IDirectPlay4Impl IDirectPlay4AImpl;
36 typedef struct IDirectPlay4Impl IDirectPlay4Impl;
38 /*****************************************************************************
39 * IDirectPlay implementation structure
41 * The philosophy behind this extra pointer derefernce is that I wanted to
42 * have the same structure for all types of objects without having to do
43 * alot of casting. I also only wanted to implement an interface in the
44 * object it was "released" with IUnknown interface being implemented in the 1 version.
45 * Of course, with these new interfaces comes the data required to keep the state required
46 * by these interfaces. So, basically, the pointers contain the data associated with
47 * a release. If you use the data associated with release 3 in a release 2 object, you'll
48 * get a run time trap, as that won't have any data.
51 typedef struct tagDirectPlayIUnknownData
54 CRITICAL_SECTION DP_lock;
55 } DirectPlayIUnknownData;
57 /* Contains all dp1 and dp2 data members */
58 typedef struct tagDirectPlay2Data
63 typedef struct tagDirectPlay3Data
65 BOOL connectionInitialized;
68 typedef struct tagDirectPlay4Data
73 #define DP_IMPL_FIELDS \
74 DirectPlayIUnknownData* unk; \
75 DirectPlay2Data* dp2; \
76 DirectPlay3Data* dp3; \
79 struct IDirectPlay2Impl
81 ICOM_VFIELD(IDirectPlay2);
85 struct IDirectPlay3Impl
87 ICOM_VFIELD(IDirectPlay3);
91 struct IDirectPlay4Impl
93 ICOM_VFIELD(IDirectPlay4);
97 /* Forward declarations of virtual tables */
98 static ICOM_VTABLE(IDirectPlay2) directPlay2AVT;
99 static ICOM_VTABLE(IDirectPlay3) directPlay3AVT;
100 static ICOM_VTABLE(IDirectPlay4) directPlay4AVT;
102 static ICOM_VTABLE(IDirectPlay2) directPlay2WVT;
103 static ICOM_VTABLE(IDirectPlay3) directPlay3WVT;
104 static ICOM_VTABLE(IDirectPlay4) directPlay4WVT;
106 BOOL DP_CreateIUnknown( LPVOID lpDP )
108 ICOM_THIS(IDirectPlay2AImpl,lpDP);
110 This->unk = (DirectPlayIUnknownData*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
111 sizeof( *(This->unk) ) );
112 if ( This->unk == NULL )
117 InitializeCriticalSection( &This->unk->DP_lock );
119 IDirectPlay_AddRef( (LPDIRECTPLAY2A)lpDP );
124 BOOL DP_DestroyIUnknown( LPVOID lpDP )
126 ICOM_THIS(IDirectPlay2AImpl,lpDP);
128 DeleteCriticalSection( &This->unk->DP_lock );
129 HeapFree( GetProcessHeap(), 0, This->unk );
134 BOOL DP_CreateDirectPlay2( LPVOID lpDP )
136 ICOM_THIS(IDirectPlay2AImpl,lpDP);
138 This->dp2 = (DirectPlay2Data*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
139 sizeof( *(This->dp2) ) );
140 if ( This->dp2 == NULL )
148 BOOL DP_DestroyDirectPlay2( LPVOID lpDP )
150 ICOM_THIS(IDirectPlay2AImpl,lpDP);
152 /* Delete the contents */
153 HeapFree( GetProcessHeap(), 0, This->dp2 );
158 BOOL DP_CreateDirectPlay3( LPVOID lpDP )
160 ICOM_THIS(IDirectPlay3AImpl,lpDP);
162 This->dp3 = (DirectPlay3Data*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
163 sizeof( *(This->dp3) ) );
164 if ( This->dp3 == NULL )
169 This->dp3->connectionInitialized = FALSE;
174 BOOL DP_DestroyDirectPlay3( LPVOID lpDP )
176 ICOM_THIS(IDirectPlay3AImpl,lpDP);
178 /* Delete the contents */
179 HeapFree( GetProcessHeap(), 0, This->dp3 );
184 BOOL DP_CreateDirectPlay4( LPVOID lpDP )
186 ICOM_THIS(IDirectPlay4AImpl,lpDP);
188 This->dp4 = (DirectPlay4Data*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
189 sizeof( *(This->dp4) ) );
190 if ( This->dp4 == NULL )
198 BOOL DP_DestroyDirectPlay4( LPVOID lpDP )
200 ICOM_THIS(IDirectPlay3AImpl,lpDP);
202 /* Delete the contents */
203 HeapFree( GetProcessHeap(), 0, This->dp4 );
209 /* Get a new interface. To be used by QueryInterface. */
211 HRESULT directPlay_QueryInterface
212 ( REFIID riid, LPVOID* ppvObj )
215 if( IsEqualGUID( &IID_IDirectPlay2, riid ) )
217 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
218 sizeof( IDirectPlay2Impl ) );
220 if( *ppvObj == NULL )
222 return DPERR_OUTOFMEMORY;
225 /* new scope for variable declaration */
227 ICOM_THIS(IDirectPlay2Impl,*ppvObj);
229 ICOM_VTBL(This) = &directPlay2WVT;
231 if ( DP_CreateIUnknown( (LPVOID)This ) &&
232 DP_CreateDirectPlay2( (LPVOID)This )
242 else if( IsEqualGUID( &IID_IDirectPlay2A, riid ) )
244 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
245 sizeof( IDirectPlay2AImpl ) );
247 if( *ppvObj == NULL )
249 return DPERR_OUTOFMEMORY;
252 /* new scope for variable declaration */
254 ICOM_THIS(IDirectPlay2AImpl,*ppvObj);
256 ICOM_VTBL(This) = &directPlay2AVT;
258 if ( DP_CreateIUnknown( (LPVOID)This ) &&
259 DP_CreateDirectPlay2( (LPVOID)This )
269 else if( IsEqualGUID( &IID_IDirectPlay3, riid ) )
271 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
272 sizeof( IDirectPlay3Impl ) );
274 if( *ppvObj == NULL )
276 return DPERR_OUTOFMEMORY;
279 /* new scope for variable declaration */
281 ICOM_THIS(IDirectPlay3Impl,*ppvObj);
283 ICOM_VTBL(This) = &directPlay3WVT;
285 if ( DP_CreateIUnknown( (LPVOID)This ) &&
286 DP_CreateDirectPlay2( (LPVOID)This ) &&
287 DP_CreateDirectPlay3( (LPVOID)This )
297 else if( IsEqualGUID( &IID_IDirectPlay3A, riid ) )
299 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
300 sizeof( IDirectPlay3AImpl ) );
302 if( *ppvObj == NULL )
304 return DPERR_OUTOFMEMORY;
307 /* new scope for variable declaration */
309 ICOM_THIS(IDirectPlay3AImpl,*ppvObj);
311 ICOM_VTBL(This) = &directPlay3AVT;
313 if ( DP_CreateIUnknown( (LPVOID)This ) &&
314 DP_CreateDirectPlay2( (LPVOID)This ) &&
315 DP_CreateDirectPlay3( (LPVOID)This )
325 else if( IsEqualGUID( &IID_IDirectPlay4, riid ) )
327 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
328 sizeof( IDirectPlay4Impl ) );
330 if( *ppvObj == NULL )
332 return DPERR_OUTOFMEMORY;
335 /* new scope for variable declaration */
337 ICOM_THIS(IDirectPlay4Impl,*ppvObj);
339 ICOM_VTBL(This) = &directPlay4WVT;
341 if ( DP_CreateIUnknown( (LPVOID)This ) &&
342 DP_CreateDirectPlay2( (LPVOID)This ) &&
343 DP_CreateDirectPlay3( (LPVOID)This ) &&
344 DP_CreateDirectPlay4( (LPVOID)This )
354 else if( IsEqualGUID( &IID_IDirectPlay4A, riid ) )
356 *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
357 sizeof( IDirectPlay4AImpl ) );
359 if( *ppvObj == NULL )
361 return DPERR_OUTOFMEMORY;
364 /* new scope for variable declaration */
366 ICOM_THIS(IDirectPlay4AImpl,*ppvObj);
368 ICOM_VTBL(This) = &directPlay4AVT;
370 if ( DP_CreateIUnknown( (LPVOID)This ) &&
371 DP_CreateDirectPlay2( (LPVOID)This ) &&
372 DP_CreateDirectPlay3( (LPVOID)This ) &&
373 DP_CreateDirectPlay4( (LPVOID)This )
384 /* Unsupported interface */
386 return E_NOINTERFACE;
390 DP_DestroyDirectPlay4( *ppvObj );
391 DP_DestroyDirectPlay3( *ppvObj );
392 DP_DestroyDirectPlay2( *ppvObj );
393 DP_DestroyIUnknown( *ppvObj );
394 HeapFree( GetProcessHeap(), 0, *ppvObj );
397 return DPERR_NOMEMORY;
402 /* Direct Play methods */
403 static HRESULT WINAPI DirectPlay2W_QueryInterface
404 ( LPDIRECTPLAY2 iface, REFIID riid, LPVOID* ppvObj )
406 ICOM_THIS(IDirectPlay2Impl,iface);
407 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
409 if( IsEqualGUID( &IID_IUnknown, riid ) ||
410 IsEqualGUID( &IID_IDirectPlay2, riid )
413 IDirectPlayX_AddRef( iface );
417 return directPlay_QueryInterface( riid, ppvObj );
420 static HRESULT WINAPI DirectPlay2A_QueryInterface
421 ( LPDIRECTPLAY2A iface, REFIID riid, LPVOID* ppvObj )
423 ICOM_THIS(IDirectPlay2Impl,iface);
424 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
426 if( IsEqualGUID( &IID_IUnknown, riid ) ||
427 IsEqualGUID( &IID_IDirectPlay2A, riid )
430 IDirectPlayX_AddRef( iface );
435 return directPlay_QueryInterface( riid, ppvObj );
438 static HRESULT WINAPI DirectPlay3WImpl_QueryInterface
439 ( LPDIRECTPLAY3 iface, REFIID riid, LPVOID* ppvObj )
441 ICOM_THIS(IDirectPlay3Impl,iface);
442 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
444 if( IsEqualGUID( &IID_IUnknown, riid ) ||
445 IsEqualGUID( &IID_IDirectPlay3, riid )
448 IDirectPlayX_AddRef( iface );
453 return directPlay_QueryInterface( riid, ppvObj );
456 static HRESULT WINAPI DirectPlay3AImpl_QueryInterface
457 ( LPDIRECTPLAY3A iface, REFIID riid, LPVOID* ppvObj )
459 ICOM_THIS(IDirectPlay3Impl,iface);
460 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
462 if( IsEqualGUID( &IID_IUnknown, riid ) ||
463 IsEqualGUID( &IID_IDirectPlay3A, riid )
466 IDirectPlayX_AddRef( iface );
471 return directPlay_QueryInterface( riid, ppvObj );
474 static HRESULT WINAPI DirectPlay4WImpl_QueryInterface
475 ( LPDIRECTPLAY4 iface, REFIID riid, LPVOID* ppvObj )
477 ICOM_THIS(IDirectPlay4Impl,iface);
478 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
480 if( IsEqualGUID( &IID_IUnknown, riid ) ||
481 IsEqualGUID( &IID_IDirectPlay4, riid )
484 IDirectPlayX_AddRef( iface );
489 return directPlay_QueryInterface( riid, ppvObj );
493 static HRESULT WINAPI DirectPlay4AImpl_QueryInterface
494 ( LPDIRECTPLAY4A iface, REFIID riid, LPVOID* ppvObj )
496 ICOM_THIS(IDirectPlay4Impl,iface);
497 TRACE("(%p)->(%p,%p)\n", This, riid, ppvObj );
499 if( IsEqualGUID( &IID_IUnknown, riid ) ||
500 IsEqualGUID( &IID_IDirectPlay4A, riid )
503 IDirectPlayX_AddRef( iface );
508 return directPlay_QueryInterface( riid, ppvObj );
512 /* Shared between all dplay types */
513 static ULONG WINAPI DirectPlay2AImpl_AddRef
514 ( LPDIRECTPLAY3 iface )
517 ICOM_THIS(IDirectPlay3Impl,iface);
519 EnterCriticalSection( &This->unk->DP_lock );
521 refCount = ++(This->unk->ref);
523 LeaveCriticalSection( &This->unk->DP_lock );
525 TRACE("ref count incremented to %lu for %p\n", refCount, This );
530 static ULONG WINAPI DirectPlay2AImpl_Release
531 ( LPDIRECTPLAY3 iface )
535 ICOM_THIS(IDirectPlay3Impl,iface);
537 EnterCriticalSection( &This->unk->DP_lock );
539 refCount = --(This->unk->ref);
541 LeaveCriticalSection( &This->unk->DP_lock );
543 TRACE("ref count decremented to %lu for %p\n", refCount, This );
545 /* Deallocate if this is the last reference to the object */
548 DP_DestroyDirectPlay4( This );
549 DP_DestroyDirectPlay3( This );
550 DP_DestroyDirectPlay2( This );
551 DP_DestroyIUnknown( This );
552 HeapFree( GetProcessHeap(), 0, This );
558 static HRESULT WINAPI DirectPlay2AImpl_AddPlayerToGroup
559 ( LPDIRECTPLAY2A iface, DPID idGroup, DPID idPlayer )
561 ICOM_THIS(IDirectPlay2Impl,iface);
562 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idPlayer );
566 static HRESULT WINAPI DirectPlay2WImpl_AddPlayerToGroup
567 ( LPDIRECTPLAY2 iface, DPID idGroup, DPID idPlayer )
569 ICOM_THIS(IDirectPlay2Impl,iface);
570 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idPlayer );
575 static HRESULT WINAPI DirectPlay2AImpl_Close
576 ( LPDIRECTPLAY2A iface )
578 ICOM_THIS(IDirectPlay2Impl,iface);
579 FIXME("(%p)->(): stub\n", This );
583 static HRESULT WINAPI DirectPlay2WImpl_Close
584 ( LPDIRECTPLAY2 iface )
586 ICOM_THIS(IDirectPlay2Impl,iface);
587 FIXME("(%p)->(): stub\n", This );
591 static HRESULT WINAPI DirectPlay2AImpl_CreateGroup
592 ( LPDIRECTPLAY2A iface, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
594 ICOM_THIS(IDirectPlay2Impl,iface);
595 FIXME("(%p)->(%p,%p,%p,0x%08lx,0x%08lx): stub\n", This, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags );
599 static HRESULT WINAPI DirectPlay2WImpl_CreateGroup
600 ( LPDIRECTPLAY2 iface, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
602 ICOM_THIS(IDirectPlay2Impl,iface);
603 FIXME("(%p)->(%p,%p,%p,0x%08lx,0x%08lx): stub\n", This, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags );
607 static HRESULT WINAPI DirectPlay2AImpl_CreatePlayer
608 ( LPDIRECTPLAY2A iface, LPDPID lpidPlayer, LPDPNAME lpPlayerName, HANDLE hEvent, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
610 ICOM_THIS(IDirectPlay2Impl,iface);
611 FIXME("(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags );
615 static HRESULT WINAPI DirectPlay2WImpl_CreatePlayer
616 ( LPDIRECTPLAY2 iface, LPDPID lpidPlayer, LPDPNAME lpPlayerName, HANDLE hEvent, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
618 ICOM_THIS(IDirectPlay2Impl,iface);
619 FIXME("(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags );
623 static HRESULT WINAPI DirectPlay2AImpl_DeletePlayerFromGroup
624 ( LPDIRECTPLAY2A iface, DPID idGroup, DPID idPlayer )
626 ICOM_THIS(IDirectPlay2Impl,iface);
627 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idPlayer );
631 static HRESULT WINAPI DirectPlay2WImpl_DeletePlayerFromGroup
632 ( LPDIRECTPLAY2 iface, DPID idGroup, DPID idPlayer )
634 ICOM_THIS(IDirectPlay2Impl,iface);
635 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idPlayer );
639 static HRESULT WINAPI DirectPlay2AImpl_DestroyGroup
640 ( LPDIRECTPLAY2A iface, DPID idGroup )
642 ICOM_THIS(IDirectPlay2Impl,iface);
643 FIXME("(%p)->(0x%08lx): stub\n", This, idGroup );
647 static HRESULT WINAPI DirectPlay2WImpl_DestroyGroup
648 ( LPDIRECTPLAY2 iface, DPID idGroup )
650 ICOM_THIS(IDirectPlay2Impl,iface);
651 FIXME("(%p)->(0x%08lx): stub\n", This, idGroup );
655 static HRESULT WINAPI DirectPlay2AImpl_DestroyPlayer
656 ( LPDIRECTPLAY2A iface, DPID idPlayer )
658 ICOM_THIS(IDirectPlay2Impl,iface);
659 FIXME("(%p)->(0x%08lx): stub\n", This, idPlayer );
663 static HRESULT WINAPI DirectPlay2WImpl_DestroyPlayer
664 ( LPDIRECTPLAY2 iface, DPID idPlayer )
666 ICOM_THIS(IDirectPlay2Impl,iface);
667 FIXME("(%p)->(0x%08lx): stub\n", This, idPlayer );
671 static HRESULT WINAPI DirectPlay2AImpl_EnumGroupPlayers
672 ( LPDIRECTPLAY2A iface, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
673 LPVOID lpContext, DWORD dwFlags )
675 ICOM_THIS(IDirectPlay2Impl,iface);
676 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub\n", This, idGroup, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
680 static HRESULT WINAPI DirectPlay2WImpl_EnumGroupPlayers
681 ( LPDIRECTPLAY2 iface, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2,
682 LPVOID lpContext, DWORD dwFlags )
684 ICOM_THIS(IDirectPlay2Impl,iface);
685 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub\n", This, idGroup, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
689 static HRESULT WINAPI DirectPlay2AImpl_EnumGroups
690 ( LPDIRECTPLAY2A iface, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags )
692 ICOM_THIS(IDirectPlay2Impl,iface);
693 FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
697 static HRESULT WINAPI DirectPlay2WImpl_EnumGroups
698 ( LPDIRECTPLAY2 iface, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags )
700 ICOM_THIS(IDirectPlay2Impl,iface);
701 FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
705 static HRESULT WINAPI DirectPlay2AImpl_EnumPlayers
706 ( LPDIRECTPLAY2A iface, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags )
708 ICOM_THIS(IDirectPlay2Impl,iface);
709 FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
713 static HRESULT WINAPI DirectPlay2WImpl_EnumPlayers
714 ( LPDIRECTPLAY2 iface, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags )
716 ICOM_THIS(IDirectPlay2Impl,iface);
717 FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags );
721 static HRESULT WINAPI DirectPlay2AImpl_EnumSessions
722 ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
723 LPVOID lpContext, DWORD dwFlags )
725 ICOM_THIS(IDirectPlay2Impl,iface);
726 FIXME("(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags );
730 static HRESULT WINAPI DirectPlay2WImpl_EnumSessions
731 ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2,
732 LPVOID lpContext, DWORD dwFlags )
734 ICOM_THIS(IDirectPlay2Impl,iface);
735 FIXME("(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags );
739 static HRESULT WINAPI DirectPlay2AImpl_GetCaps
740 ( LPDIRECTPLAY2A iface, LPDPCAPS lpDPCaps, DWORD dwFlags )
742 ICOM_THIS(IDirectPlay2Impl,iface);
743 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpDPCaps, dwFlags );
747 static HRESULT WINAPI DirectPlay2WImpl_GetCaps
748 ( LPDIRECTPLAY2 iface, LPDPCAPS lpDPCaps, DWORD dwFlags )
750 ICOM_THIS(IDirectPlay2Impl,iface);
751 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpDPCaps, dwFlags );
755 static HRESULT WINAPI DirectPlay2AImpl_GetGroupData
756 ( LPDIRECTPLAY2 iface, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags )
758 ICOM_THIS(IDirectPlay2Impl,iface);
759 FIXME("(%p)->(0x%08lx,%p,%p,0x%08lx): stub\n", This, idGroup, lpData, lpdwDataSize, dwFlags );
763 static HRESULT WINAPI DirectPlay2WImpl_GetGroupData
764 ( LPDIRECTPLAY2 iface, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags )
766 ICOM_THIS(IDirectPlay2Impl,iface);
767 FIXME("(%p)->(0x%08lx,%p,%p,0x%08lx): stub\n", This, idGroup, lpData, lpdwDataSize, dwFlags );
771 static HRESULT WINAPI DirectPlay2AImpl_GetGroupName
772 ( LPDIRECTPLAY2A iface, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize )
774 ICOM_THIS(IDirectPlay2Impl,iface);
775 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idGroup, lpData, lpdwDataSize );
779 static HRESULT WINAPI DirectPlay2WImpl_GetGroupName
780 ( LPDIRECTPLAY2 iface, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize )
782 ICOM_THIS(IDirectPlay2Impl,iface);
783 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idGroup, lpData, lpdwDataSize );
787 static HRESULT WINAPI DirectPlay2AImpl_GetMessageCount
788 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPDWORD lpdwCount )
790 ICOM_THIS(IDirectPlay2Impl,iface);
791 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwCount );
795 static HRESULT WINAPI DirectPlay2WImpl_GetMessageCount
796 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPDWORD lpdwCount )
798 ICOM_THIS(IDirectPlay2Impl,iface);
799 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwCount );
803 static HRESULT WINAPI DirectPlay2AImpl_GetPlayerAddress
804 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize )
806 ICOM_THIS(IDirectPlay2Impl,iface);
807 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize );
811 static HRESULT WINAPI DirectPlay2WImpl_GetPlayerAddress
812 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize )
814 ICOM_THIS(IDirectPlay2Impl,iface);
815 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize );
819 static HRESULT WINAPI DirectPlay2AImpl_GetPlayerCaps
820 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPDPCAPS lpPlayerCaps, DWORD dwFlags )
822 ICOM_THIS(IDirectPlay2Impl,iface);
823 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idPlayer, lpPlayerCaps, dwFlags );
827 static HRESULT WINAPI DirectPlay2WImpl_GetPlayerCaps
828 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPDPCAPS lpPlayerCaps, DWORD dwFlags )
830 ICOM_THIS(IDirectPlay2Impl,iface);
831 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idPlayer, lpPlayerCaps, dwFlags );
835 static HRESULT WINAPI DirectPlay2AImpl_GetPlayerData
836 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags )
838 ICOM_THIS(IDirectPlay2Impl,iface);
839 FIXME("(%p)->(0x%08lx,%p,%p,0x%08lx): stub\n", This, idPlayer, lpData, lpdwDataSize, dwFlags );
843 static HRESULT WINAPI DirectPlay2WImpl_GetPlayerData
844 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags )
846 ICOM_THIS(IDirectPlay2Impl,iface);
847 FIXME("(%p)->(0x%08lx,%p,%p,0x%08lx): stub\n", This, idPlayer, lpData, lpdwDataSize, dwFlags );
851 static HRESULT WINAPI DirectPlay2AImpl_GetPlayerName
852 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize )
854 ICOM_THIS(IDirectPlay2Impl,iface);
855 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize );
859 static HRESULT WINAPI DirectPlay2WImpl_GetPlayerName
860 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize )
862 ICOM_THIS(IDirectPlay2Impl,iface);
863 FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize );
867 static HRESULT WINAPI DirectPlay2AImpl_GetSessionDesc
868 ( LPDIRECTPLAY2A iface, LPVOID lpData, LPDWORD lpdwDataSize )
870 ICOM_THIS(IDirectPlay2Impl,iface);
871 FIXME("(%p)->(%p,%p): stub\n", This, lpData, lpdwDataSize );
875 static HRESULT WINAPI DirectPlay2WImpl_GetSessionDesc
876 ( LPDIRECTPLAY2 iface, LPVOID lpData, LPDWORD lpdwDataSize )
878 ICOM_THIS(IDirectPlay2Impl,iface);
879 FIXME("(%p)->(%p,%p): stub\n", This, lpData, lpdwDataSize );
883 /* Intended only for COM compatibility. Always returns an error. */
884 static HRESULT WINAPI DirectPlay2AImpl_Initialize
885 ( LPDIRECTPLAY2A iface, LPGUID lpGUID )
887 ICOM_THIS(IDirectPlay2Impl,iface);
888 TRACE("(%p)->(%p): stub\n", This, lpGUID );
889 return DPERR_ALREADYINITIALIZED;
892 /* Intended only for COM compatibility. Always returns an error. */
893 static HRESULT WINAPI DirectPlay2WImpl_Initialize
894 ( LPDIRECTPLAY2 iface, LPGUID lpGUID )
896 ICOM_THIS(IDirectPlay2Impl,iface);
897 TRACE("(%p)->(%p): stub\n", This, lpGUID );
898 return DPERR_ALREADYINITIALIZED;
902 static HRESULT WINAPI DirectPlay2AImpl_Open
903 ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags )
905 ICOM_THIS(IDirectPlay2Impl,iface);
906 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpsd, dwFlags );
910 static HRESULT WINAPI DirectPlay2WImpl_Open
911 ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags )
913 ICOM_THIS(IDirectPlay2Impl,iface);
914 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpsd, dwFlags );
918 static HRESULT WINAPI DirectPlay2AImpl_Receive
919 ( LPDIRECTPLAY2A iface, LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize )
921 ICOM_THIS(IDirectPlay2Impl,iface);
922 FIXME("(%p)->(%p,%p,0x%08lx,%p,%p): stub\n", This, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize );
926 static HRESULT WINAPI DirectPlay2WImpl_Receive
927 ( LPDIRECTPLAY2 iface, LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize )
929 ICOM_THIS(IDirectPlay2Impl,iface);
930 FIXME("(%p)->(%p,%p,0x%08lx,%p,%p): stub\n", This, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize );
934 static HRESULT WINAPI DirectPlay2AImpl_Send
935 ( LPDIRECTPLAY2A iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize )
937 ICOM_THIS(IDirectPlay2Impl,iface);
938 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx): stub\n", This, idFrom, idTo, dwFlags, lpData, dwDataSize );
942 static HRESULT WINAPI DirectPlay2WImpl_Send
943 ( LPDIRECTPLAY2 iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize )
945 ICOM_THIS(IDirectPlay2Impl,iface);
946 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx): stub\n", This, idFrom, idTo, dwFlags, lpData, dwDataSize );
950 static HRESULT WINAPI DirectPlay2AImpl_SetGroupData
951 ( LPDIRECTPLAY2A iface, DPID idGroup, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
953 ICOM_THIS(IDirectPlay2Impl,iface);
954 FIXME("(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub\n", This, idGroup, lpData, dwDataSize, dwFlags );
958 static HRESULT WINAPI DirectPlay2WImpl_SetGroupData
959 ( LPDIRECTPLAY2 iface, DPID idGroup, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
961 ICOM_THIS(IDirectPlay2Impl,iface);
962 FIXME("(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub\n", This, idGroup, lpData, dwDataSize, dwFlags );
966 static HRESULT WINAPI DirectPlay2AImpl_SetGroupName
967 ( LPDIRECTPLAY2A iface, DPID idGroup, LPDPNAME lpGroupName, DWORD dwFlags )
969 ICOM_THIS(IDirectPlay2Impl,iface);
970 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idGroup, lpGroupName, dwFlags );
974 static HRESULT WINAPI DirectPlay2WImpl_SetGroupName
975 ( LPDIRECTPLAY2 iface, DPID idGroup, LPDPNAME lpGroupName, DWORD dwFlags )
977 ICOM_THIS(IDirectPlay2Impl,iface);
978 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idGroup, lpGroupName, dwFlags );
982 static HRESULT WINAPI DirectPlay2AImpl_SetPlayerData
983 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
985 ICOM_THIS(IDirectPlay2Impl,iface);
986 FIXME("(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub\n", This, idPlayer, lpData, dwDataSize, dwFlags );
990 static HRESULT WINAPI DirectPlay2WImpl_SetPlayerData
991 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
993 ICOM_THIS(IDirectPlay2Impl,iface);
994 FIXME("(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub\n", This, idPlayer, lpData, dwDataSize, dwFlags );
998 static HRESULT WINAPI DirectPlay2AImpl_SetPlayerName
999 ( LPDIRECTPLAY2A iface, DPID idPlayer, LPDPNAME lpPlayerName, DWORD dwFlags )
1001 ICOM_THIS(IDirectPlay2Impl,iface);
1002 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idPlayer, lpPlayerName, dwFlags );
1006 static HRESULT WINAPI DirectPlay2WImpl_SetPlayerName
1007 ( LPDIRECTPLAY2 iface, DPID idPlayer, LPDPNAME lpPlayerName, DWORD dwFlags )
1009 ICOM_THIS(IDirectPlay2Impl,iface);
1010 FIXME("(%p)->(0x%08lx,%p,0x%08lx): stub\n", This, idPlayer, lpPlayerName, dwFlags );
1014 static HRESULT WINAPI DirectPlay2AImpl_SetSessionDesc
1015 ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpSessDesc, DWORD dwFlags )
1017 ICOM_THIS(IDirectPlay2Impl,iface);
1018 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpSessDesc, dwFlags );
1022 static HRESULT WINAPI DirectPlay2WImpl_SetSessionDesc
1023 ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpSessDesc, DWORD dwFlags )
1025 ICOM_THIS(IDirectPlay2Impl,iface);
1026 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpSessDesc, dwFlags );
1030 static HRESULT WINAPI DirectPlay3AImpl_AddGroupToGroup
1031 ( LPDIRECTPLAY3A iface, DPID idParentGroup, DPID idGroup )
1033 ICOM_THIS(IDirectPlay3Impl,iface);
1034 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idParentGroup, idGroup );
1038 static HRESULT WINAPI DirectPlay3WImpl_AddGroupToGroup
1039 ( LPDIRECTPLAY3 iface, DPID idParentGroup, DPID idGroup )
1041 ICOM_THIS(IDirectPlay3Impl,iface);
1042 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idParentGroup, idGroup );
1046 static HRESULT WINAPI DirectPlay3AImpl_CreateGroupInGroup
1047 ( LPDIRECTPLAY3A iface, DPID idParentGroup, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
1049 ICOM_THIS(IDirectPlay3Impl,iface);
1050 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx,0x%08lx): stub\n", This, idParentGroup, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags );
1054 static HRESULT WINAPI DirectPlay3WImpl_CreateGroupInGroup
1055 ( LPDIRECTPLAY3 iface, DPID idParentGroup, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
1057 ICOM_THIS(IDirectPlay3Impl,iface);
1058 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx,0x%08lx): stub\n", This, idParentGroup, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags );
1062 static HRESULT WINAPI DirectPlay3AImpl_DeleteGroupFromGroup
1063 ( LPDIRECTPLAY3A iface, DPID idParentGroup, DPID idGroup )
1065 ICOM_THIS(IDirectPlay3Impl,iface);
1066 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idParentGroup, idGroup );
1070 static HRESULT WINAPI DirectPlay3WImpl_DeleteGroupFromGroup
1071 ( LPDIRECTPLAY3 iface, DPID idParentGroup, DPID idGroup )
1073 ICOM_THIS(IDirectPlay3Impl,iface);
1074 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idParentGroup, idGroup );
1078 static HRESULT WINAPI DirectPlay3AImpl_EnumConnections
1079 ( LPDIRECTPLAY3A iface, LPCGUID lpguidApplication, LPDPENUMCONNECTIONSCALLBACK lpEnumCallback, LPVOID lpContext, DWORD dwFlags )
1081 ICOM_THIS(IDirectPlay3Impl,iface);
1082 TRACE("(%p)->(%p,%p,%p,0x%08lx)\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags );
1084 /* A default dwFlags (0) is backwards compatible -- DPCONNECTION_DIRECTPLAY */
1087 dwFlags = DPCONNECTION_DIRECTPLAY;
1090 if( ! ( ( dwFlags & DPCONNECTION_DIRECTPLAY ) ||
1091 ( dwFlags & DPCONNECTION_DIRECTPLAYLOBBY ) )
1094 return DPERR_INVALIDFLAGS;
1097 if( !lpEnumCallback || !*lpEnumCallback )
1099 return DPERR_INVALIDPARAMS;
1102 /* Enumerate DirectPlay service providers */
1103 if( dwFlags & DPCONNECTION_DIRECTPLAY )
1106 LPCSTR searchSubKey = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers";
1107 LPSTR guidDataSubKey = "Guid";
1108 DWORD dwIndex, sizeOfSubKeyName=50;
1109 char subKeyName[51];
1111 /* Need to loop over the service providers in the registry */
1112 if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
1113 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
1115 /* Hmmm. Does this mean that there are no service providers? */
1116 ERR(": no service providers?\n");
1121 /* Traverse all the service providers we have available */
1123 RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
1127 HKEY hkServiceProvider;
1128 GUID serviceProviderGUID;
1129 DWORD returnTypeGUID, sizeOfReturnBuffer = 50;
1130 char returnBuffer[51];
1131 LPWSTR lpWGUIDString;
1135 DPCOMPOUNDADDRESSELEMENT dpCompoundAddress;
1136 LPVOID lpAddressBuffer = NULL;
1137 DWORD dwAddressBufferSize = 0;
1139 TRACE(" this time through: %s\n", subKeyName );
1141 /* Get a handle for this particular service provider */
1142 if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
1143 &hkServiceProvider ) != ERROR_SUCCESS )
1145 ERR(": what the heck is going on?\n" );
1149 if( RegQueryValueExA( hkServiceProvider, guidDataSubKey,
1150 NULL, &returnTypeGUID, returnBuffer,
1151 &sizeOfReturnBuffer ) != ERROR_SUCCESS )
1153 ERR(": missing GUID registry data members\n" );
1157 /* FIXME: Check return types to ensure we're interpreting data right */
1158 lpWGUIDString = HEAP_strdupAtoW( GetProcessHeap(), 0, returnBuffer );
1159 CLSIDFromString( (LPCOLESTR)lpWGUIDString, &serviceProviderGUID );
1160 HeapFree( GetProcessHeap(), 0, lpWGUIDString );
1161 /* FIXME: Have I got a memory leak on the serviceProviderGUID? */
1163 /* Fill in the DPNAME struct for the service provider */
1164 dpName.dwSize = sizeof( dpName );
1166 dpName.psn.lpszShortNameA = subKeyName;
1167 dpName.pln.lpszLongNameA = NULL;
1169 /* Create the compound address for the service provider.
1170 NOTE: This is a gruesome architectural scar right now. DP uses DPL and DPL uses DP
1171 nast stuff. This may be why the native dll just gets around this little bit by
1172 allocating an 80 byte buffer which isn't even a filled with a valid compound
1173 address. Oh well. Creating a proper compound address is the way to go anyways
1174 despite this method taking slightly more heap space and realtime :) */
1175 dpCompoundAddress.guidDataType = DPAID_ServiceProvider;
1176 dpCompoundAddress.dwDataSize = sizeof( GUID );
1177 dpCompoundAddress.lpData = &serviceProviderGUID;
1179 if( ( hr = DPL_CreateCompoundAddress( &dpCompoundAddress, 1, lpAddressBuffer,
1180 &dwAddressBufferSize, TRUE ) ) != DPERR_BUFFERTOOSMALL )
1182 ERR( "can't get buffer size: %s\n", DPLAYX_HresultToString( hr ) );
1186 /* Now allocate the buffer */
1187 lpAddressBuffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAddressBufferSize );
1189 if( ( hr = DPL_CreateCompoundAddress( &dpCompoundAddress, 1, lpAddressBuffer,
1190 &dwAddressBufferSize, TRUE ) ) != DP_OK )
1192 ERR( "can't create address: %s\n", DPLAYX_HresultToString( hr ) );
1196 /* The enumeration will return FALSE if we are not to continue */
1197 if( !lpEnumCallback( &serviceProviderGUID, lpAddressBuffer, dwAddressBufferSize,
1198 &dpName, DPCONNECTION_DIRECTPLAY, lpContext ) )
1200 WARN("lpEnumCallback returning FALSE\n" );
1207 /* Enumerate DirectPlayLobby service providers */
1208 if( dwFlags & DPCONNECTION_DIRECTPLAYLOBBY )
1210 FIXME( "DPCONNECTION_DIRECTPLAYLOBBY flag not handled\n" );
1216 static HRESULT WINAPI DirectPlay3WImpl_EnumConnections
1217 ( LPDIRECTPLAY3 iface, LPCGUID lpguidApplication, LPDPENUMCONNECTIONSCALLBACK lpEnumCallback, LPVOID lpContext, DWORD dwFlags )
1219 ICOM_THIS(IDirectPlay3Impl,iface);
1220 FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags );
1224 static HRESULT WINAPI DirectPlay3AImpl_EnumGroupsInGroup
1225 ( LPDIRECTPLAY3A iface, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, LPVOID lpContext, DWORD dwFlags )
1227 ICOM_THIS(IDirectPlay3Impl,iface);
1228 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub\n", This, idGroup, lpguidInstance, lpEnumCallback, lpContext, dwFlags );
1232 static HRESULT WINAPI DirectPlay3WImpl_EnumGroupsInGroup
1233 ( LPDIRECTPLAY3 iface, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, LPVOID lpContext, DWORD dwFlags )
1235 ICOM_THIS(IDirectPlay3Impl,iface);
1236 FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub\n", This, idGroup, lpguidInstance, lpEnumCallback, lpContext, dwFlags );
1240 static HRESULT WINAPI DirectPlay3AImpl_GetGroupConnectionSettings
1241 ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize )
1243 ICOM_THIS(IDirectPlay3Impl,iface);
1244 FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize );
1248 static HRESULT WINAPI DirectPlay3WImpl_GetGroupConnectionSettings
1249 ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize )
1251 ICOM_THIS(IDirectPlay3Impl,iface);
1252 FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize );
1256 static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection
1257 ( LPDIRECTPLAY3A iface, LPVOID lpConnection, DWORD dwFlags )
1259 HMODULE hServiceProvider;
1260 typedef DWORD (WINAPI *SP_SPInit)(LPVOID lpCompoundAddress, ...); /* FIXME: How many arguments? */
1263 ICOM_THIS(IDirectPlay3Impl,iface);
1265 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpConnection, dwFlags );
1269 return DPERR_INVALIDFLAGS;
1272 if( This->dp3->connectionInitialized == TRUE )
1274 return DPERR_ALREADYINITIALIZED;
1277 /* Parse lpConnection as a compound address for the service provider */
1278 /* Take service provider GUID and find the path to it */
1280 /* FIXME: Hard coded to only load the tcp/ip service provider for now... */
1281 hServiceProvider = LoadLibraryA( "dpwsockx.dll" );
1283 if( hServiceProvider == 0 )
1285 ERR( "Unable to load service provider\n" );
1286 return DPERR_UNAVAILABLE;
1289 /* Initialize the service provider by calling SPInit */
1290 SPInit = (SP_SPInit)GetProcAddress( hServiceProvider, "SPInit" );
1292 if( SPInit == NULL )
1294 ERR( "Service provider doesn't provide SPInit interface?\n" );
1298 /* NOTE: This will crash until I know what parameters/interface this has */
1299 /* FIXME: Take a guess that we just pass the compound address to the SP */
1300 /* Hmmm...how to say which parameters need to be gotten from the SP. They must
1301 come from the compound address, but how do we communicate what's required? */
1302 dwReturnValue = (*SPInit)( lpConnection );
1305 /* This interface is now initialized */
1306 This->dp3->connectionInitialized = TRUE;
1311 static HRESULT WINAPI DirectPlay3WImpl_InitializeConnection
1312 ( LPDIRECTPLAY3 iface, LPVOID lpConnection, DWORD dwFlags )
1314 ICOM_THIS(IDirectPlay3Impl,iface);
1315 FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpConnection, dwFlags );
1319 static HRESULT WINAPI DirectPlay3AImpl_SecureOpen
1320 ( LPDIRECTPLAY3A iface, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials )
1322 ICOM_THIS(IDirectPlay3Impl,iface);
1323 FIXME("(%p)->(%p,0x%08lx,%p,%p): stub\n", This, lpsd, dwFlags, lpSecurity, lpCredentials );
1327 static HRESULT WINAPI DirectPlay3WImpl_SecureOpen
1328 ( LPDIRECTPLAY3 iface, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials )
1330 ICOM_THIS(IDirectPlay3Impl,iface);
1331 FIXME("(%p)->(%p,0x%08lx,%p,%p): stub\n", This, lpsd, dwFlags, lpSecurity, lpCredentials );
1335 static HRESULT WINAPI DirectPlay3AImpl_SendChatMessage
1336 ( LPDIRECTPLAY3A iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDPCHAT lpChatMessage )
1338 ICOM_THIS(IDirectPlay3Impl,iface);
1339 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage );
1343 static HRESULT WINAPI DirectPlay3WImpl_SendChatMessage
1344 ( LPDIRECTPLAY3 iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDPCHAT lpChatMessage )
1346 ICOM_THIS(IDirectPlay3Impl,iface);
1347 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage );
1351 static HRESULT WINAPI DirectPlay3AImpl_SetGroupConnectionSettings
1352 ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup, LPDPLCONNECTION lpConnection )
1354 ICOM_THIS(IDirectPlay3Impl,iface);
1355 FIXME("(%p)->(0x%08lx,0x%08lx,%p): stub\n", This, dwFlags, idGroup, lpConnection );
1359 static HRESULT WINAPI DirectPlay3WImpl_SetGroupConnectionSettings
1360 ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup, LPDPLCONNECTION lpConnection )
1362 ICOM_THIS(IDirectPlay3Impl,iface);
1363 FIXME("(%p)->(0x%08lx,0x%08lx,%p): stub\n", This, dwFlags, idGroup, lpConnection );
1367 static HRESULT WINAPI DirectPlay3AImpl_StartSession
1368 ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup )
1370 ICOM_THIS(IDirectPlay3Impl,iface);
1371 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwFlags, idGroup );
1375 static HRESULT WINAPI DirectPlay3WImpl_StartSession
1376 ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup )
1378 ICOM_THIS(IDirectPlay3Impl,iface);
1379 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwFlags, idGroup );
1383 static HRESULT WINAPI DirectPlay3AImpl_GetGroupFlags
1384 ( LPDIRECTPLAY3A iface, DPID idGroup, LPDWORD lpdwFlags )
1386 ICOM_THIS(IDirectPlay3Impl,iface);
1387 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpdwFlags );
1391 static HRESULT WINAPI DirectPlay3WImpl_GetGroupFlags
1392 ( LPDIRECTPLAY3 iface, DPID idGroup, LPDWORD lpdwFlags )
1394 ICOM_THIS(IDirectPlay3Impl,iface);
1395 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpdwFlags );
1399 static HRESULT WINAPI DirectPlay3AImpl_GetGroupParent
1400 ( LPDIRECTPLAY3A iface, DPID idGroup, LPDPID lpidGroup )
1402 ICOM_THIS(IDirectPlay3Impl,iface);
1403 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroup );
1407 static HRESULT WINAPI DirectPlay3WImpl_GetGroupParent
1408 ( LPDIRECTPLAY3 iface, DPID idGroup, LPDPID lpidGroup )
1410 ICOM_THIS(IDirectPlay3Impl,iface);
1411 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroup );
1415 static HRESULT WINAPI DirectPlay3AImpl_GetPlayerAccount
1416 ( LPDIRECTPLAY3A iface, DPID idPlayer, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize )
1418 ICOM_THIS(IDirectPlay3Impl,iface);
1419 FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize );
1423 static HRESULT WINAPI DirectPlay3WImpl_GetPlayerAccount
1424 ( LPDIRECTPLAY3 iface, DPID idPlayer, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize )
1426 ICOM_THIS(IDirectPlay3Impl,iface);
1427 FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize );
1431 static HRESULT WINAPI DirectPlay3AImpl_GetPlayerFlags
1432 ( LPDIRECTPLAY3A iface, DPID idPlayer, LPDWORD lpdwFlags )
1434 ICOM_THIS(IDirectPlay3Impl,iface);
1435 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwFlags );
1439 static HRESULT WINAPI DirectPlay3WImpl_GetPlayerFlags
1440 ( LPDIRECTPLAY3 iface, DPID idPlayer, LPDWORD lpdwFlags )
1442 ICOM_THIS(IDirectPlay3Impl,iface);
1443 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwFlags );
1447 static HRESULT WINAPI DirectPlay4AImpl_GetGroupOwner
1448 ( LPDIRECTPLAY4A iface, DPID idGroup, LPDPID lpidGroupOwner )
1450 ICOM_THIS(IDirectPlay4Impl,iface);
1451 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroupOwner );
1455 static HRESULT WINAPI DirectPlay4WImpl_GetGroupOwner
1456 ( LPDIRECTPLAY4 iface, DPID idGroup, LPDPID lpidGroupOwner )
1458 ICOM_THIS(IDirectPlay4Impl,iface);
1459 FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroupOwner );
1463 static HRESULT WINAPI DirectPlay4AImpl_SetGroupOwner
1464 ( LPDIRECTPLAY4A iface, DPID idGroup , DPID idGroupOwner )
1466 ICOM_THIS(IDirectPlay4Impl,iface);
1467 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idGroupOwner );
1471 static HRESULT WINAPI DirectPlay4WImpl_SetGroupOwner
1472 ( LPDIRECTPLAY4 iface, DPID idGroup , DPID idGroupOwner )
1474 ICOM_THIS(IDirectPlay4Impl,iface);
1475 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idGroupOwner );
1479 static HRESULT WINAPI DirectPlay4AImpl_SendEx
1480 ( LPDIRECTPLAY4A iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID )
1482 ICOM_THIS(IDirectPlay4Impl,iface);
1483 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx,0x%08lx,0x%08lx,%p,%p): stub\n", This, idFrom, idTo, dwFlags, lpData, dwDataSize, dwPriority, dwTimeout, lpContext, lpdwMsgID );
1487 static HRESULT WINAPI DirectPlay4WImpl_SendEx
1488 ( LPDIRECTPLAY4 iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID )
1490 ICOM_THIS(IDirectPlay4Impl,iface);
1491 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx,0x%08lx,0x%08lx,%p,%p): stub\n", This, idFrom, idTo, dwFlags, lpData, dwDataSize, dwPriority, dwTimeout, lpContext, lpdwMsgID );
1495 static HRESULT WINAPI DirectPlay4AImpl_GetMessageQueue
1496 ( LPDIRECTPLAY4A iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDWORD lpdwNumMsgs, LPDWORD lpdwNumBytes )
1498 ICOM_THIS(IDirectPlay4Impl,iface);
1499 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,%p): stub\n", This, idFrom, idTo, dwFlags, lpdwNumMsgs, lpdwNumBytes );
1503 static HRESULT WINAPI DirectPlay4WImpl_GetMessageQueue
1504 ( LPDIRECTPLAY4 iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDWORD lpdwNumMsgs, LPDWORD lpdwNumBytes )
1506 ICOM_THIS(IDirectPlay4Impl,iface);
1507 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,%p): stub\n", This, idFrom, idTo, dwFlags, lpdwNumMsgs, lpdwNumBytes );
1511 static HRESULT WINAPI DirectPlay4AImpl_CancelMessage
1512 ( LPDIRECTPLAY4A iface, DWORD dwMsgID, DWORD dwFlags )
1514 ICOM_THIS(IDirectPlay4Impl,iface);
1515 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwMsgID, dwFlags );
1519 static HRESULT WINAPI DirectPlay4WImpl_CancelMessage
1520 ( LPDIRECTPLAY4 iface, DWORD dwMsgID, DWORD dwFlags )
1522 ICOM_THIS(IDirectPlay4Impl,iface);
1523 FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwMsgID, dwFlags );
1527 static HRESULT WINAPI DirectPlay4AImpl_CancelPriority
1528 ( LPDIRECTPLAY4A iface, DWORD dwMinPriority, DWORD dwMaxPriority, DWORD dwFlags )
1530 ICOM_THIS(IDirectPlay4Impl,iface);
1531 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx): stub\n", This, dwMinPriority, dwMaxPriority, dwFlags );
1535 static HRESULT WINAPI DirectPlay4WImpl_CancelPriority
1536 ( LPDIRECTPLAY4 iface, DWORD dwMinPriority, DWORD dwMaxPriority, DWORD dwFlags )
1538 ICOM_THIS(IDirectPlay4Impl,iface);
1539 FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx): stub\n", This, dwMinPriority, dwMaxPriority, dwFlags );
1543 /* Note: Hack so we can reuse the old functions without compiler warnings */
1544 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1545 # define XCAST(fun) (typeof(directPlay2WVT.fn##fun))
1547 # define XCAST(fun) (void*)
1550 static ICOM_VTABLE(IDirectPlay2) directPlay2WVT =
1552 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1553 DirectPlay2W_QueryInterface,
1554 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1555 XCAST(Release)DirectPlay2AImpl_Release,
1557 DirectPlay2WImpl_AddPlayerToGroup,
1558 DirectPlay2WImpl_Close,
1559 DirectPlay2WImpl_CreateGroup,
1560 DirectPlay2WImpl_CreatePlayer,
1561 DirectPlay2WImpl_DeletePlayerFromGroup,
1562 DirectPlay2WImpl_DestroyGroup,
1563 DirectPlay2WImpl_DestroyPlayer,
1564 DirectPlay2WImpl_EnumGroupPlayers,
1565 DirectPlay2WImpl_EnumGroups,
1566 DirectPlay2WImpl_EnumPlayers,
1567 DirectPlay2WImpl_EnumSessions,
1568 DirectPlay2WImpl_GetCaps,
1569 DirectPlay2WImpl_GetGroupData,
1570 DirectPlay2WImpl_GetGroupName,
1571 DirectPlay2WImpl_GetMessageCount,
1572 DirectPlay2WImpl_GetPlayerAddress,
1573 DirectPlay2WImpl_GetPlayerCaps,
1574 DirectPlay2WImpl_GetPlayerData,
1575 DirectPlay2WImpl_GetPlayerName,
1576 DirectPlay2WImpl_GetSessionDesc,
1577 DirectPlay2WImpl_Initialize,
1578 DirectPlay2WImpl_Open,
1579 DirectPlay2WImpl_Receive,
1580 DirectPlay2WImpl_Send,
1581 DirectPlay2WImpl_SetGroupData,
1582 DirectPlay2WImpl_SetGroupName,
1583 DirectPlay2WImpl_SetPlayerData,
1584 DirectPlay2WImpl_SetPlayerName,
1585 DirectPlay2WImpl_SetSessionDesc
1589 /* Note: Hack so we can reuse the old functions without compiler warnings */
1590 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1591 # define XCAST(fun) (typeof(directPlay2AVT.fn##fun))
1593 # define XCAST(fun) (void*)
1596 static ICOM_VTABLE(IDirectPlay2) directPlay2AVT =
1598 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1599 DirectPlay2A_QueryInterface,
1600 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1601 XCAST(Release)DirectPlay2AImpl_Release,
1603 DirectPlay2AImpl_AddPlayerToGroup,
1604 DirectPlay2AImpl_Close,
1605 DirectPlay2AImpl_CreateGroup,
1606 DirectPlay2AImpl_CreatePlayer,
1607 DirectPlay2AImpl_DeletePlayerFromGroup,
1608 DirectPlay2AImpl_DestroyGroup,
1609 DirectPlay2AImpl_DestroyPlayer,
1610 DirectPlay2AImpl_EnumGroupPlayers,
1611 DirectPlay2AImpl_EnumGroups,
1612 DirectPlay2AImpl_EnumPlayers,
1613 DirectPlay2AImpl_EnumSessions,
1614 DirectPlay2AImpl_GetCaps,
1615 DirectPlay2AImpl_GetGroupData,
1616 DirectPlay2AImpl_GetGroupName,
1617 DirectPlay2AImpl_GetMessageCount,
1618 DirectPlay2AImpl_GetPlayerAddress,
1619 DirectPlay2AImpl_GetPlayerCaps,
1620 DirectPlay2AImpl_GetPlayerData,
1621 DirectPlay2AImpl_GetPlayerName,
1622 DirectPlay2AImpl_GetSessionDesc,
1623 DirectPlay2AImpl_Initialize,
1624 DirectPlay2AImpl_Open,
1625 DirectPlay2AImpl_Receive,
1626 DirectPlay2AImpl_Send,
1627 DirectPlay2AImpl_SetGroupData,
1628 DirectPlay2AImpl_SetGroupName,
1629 DirectPlay2AImpl_SetPlayerData,
1630 DirectPlay2AImpl_SetPlayerName,
1631 DirectPlay2AImpl_SetSessionDesc
1636 /* Note: Hack so we can reuse the old functions without compiler warnings */
1637 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1638 # define XCAST(fun) (typeof(directPlay3AVT.fn##fun))
1640 # define XCAST(fun) (void*)
1643 static ICOM_VTABLE(IDirectPlay3) directPlay3AVT =
1645 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1646 DirectPlay3AImpl_QueryInterface,
1647 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1648 XCAST(Release)DirectPlay2AImpl_Release,
1650 XCAST(AddPlayerToGroup)DirectPlay2AImpl_AddPlayerToGroup,
1651 XCAST(Close)DirectPlay2AImpl_Close,
1652 XCAST(CreateGroup)DirectPlay2AImpl_CreateGroup,
1653 XCAST(CreatePlayer)DirectPlay2AImpl_CreatePlayer,
1654 XCAST(DeletePlayerFromGroup)DirectPlay2AImpl_DeletePlayerFromGroup,
1655 XCAST(DestroyGroup)DirectPlay2AImpl_DestroyGroup,
1656 XCAST(DestroyPlayer)DirectPlay2AImpl_DestroyPlayer,
1657 XCAST(EnumGroupPlayers)DirectPlay2AImpl_EnumGroupPlayers,
1658 XCAST(EnumGroups)DirectPlay2AImpl_EnumGroups,
1659 XCAST(EnumPlayers)DirectPlay2AImpl_EnumPlayers,
1660 XCAST(EnumSessions)DirectPlay2AImpl_EnumSessions,
1661 XCAST(GetCaps)DirectPlay2AImpl_GetCaps,
1662 XCAST(GetGroupData)DirectPlay2AImpl_GetGroupData,
1663 XCAST(GetGroupName)DirectPlay2AImpl_GetGroupName,
1664 XCAST(GetMessageCount)DirectPlay2AImpl_GetMessageCount,
1665 XCAST(GetPlayerAddress)DirectPlay2AImpl_GetPlayerAddress,
1666 XCAST(GetPlayerCaps)DirectPlay2AImpl_GetPlayerCaps,
1667 XCAST(GetPlayerData)DirectPlay2AImpl_GetPlayerData,
1668 XCAST(GetPlayerName)DirectPlay2AImpl_GetPlayerName,
1669 XCAST(GetSessionDesc)DirectPlay2AImpl_GetSessionDesc,
1670 XCAST(Initialize)DirectPlay2AImpl_Initialize,
1671 XCAST(Open)DirectPlay2AImpl_Open,
1672 XCAST(Receive)DirectPlay2AImpl_Receive,
1673 XCAST(Send)DirectPlay2AImpl_Send,
1674 XCAST(SetGroupData)DirectPlay2AImpl_SetGroupData,
1675 XCAST(SetGroupName)DirectPlay2AImpl_SetGroupName,
1676 XCAST(SetPlayerData)DirectPlay2AImpl_SetPlayerData,
1677 XCAST(SetPlayerName)DirectPlay2AImpl_SetPlayerName,
1678 XCAST(SetSessionDesc)DirectPlay2AImpl_SetSessionDesc,
1680 DirectPlay3AImpl_AddGroupToGroup,
1681 DirectPlay3AImpl_CreateGroupInGroup,
1682 DirectPlay3AImpl_DeleteGroupFromGroup,
1683 DirectPlay3AImpl_EnumConnections,
1684 DirectPlay3AImpl_EnumGroupsInGroup,
1685 DirectPlay3AImpl_GetGroupConnectionSettings,
1686 DirectPlay3AImpl_InitializeConnection,
1687 DirectPlay3AImpl_SecureOpen,
1688 DirectPlay3AImpl_SendChatMessage,
1689 DirectPlay3AImpl_SetGroupConnectionSettings,
1690 DirectPlay3AImpl_StartSession,
1691 DirectPlay3AImpl_GetGroupFlags,
1692 DirectPlay3AImpl_GetGroupParent,
1693 DirectPlay3AImpl_GetPlayerAccount,
1694 DirectPlay3AImpl_GetPlayerFlags
1698 /* Note: Hack so we can reuse the old functions without compiler warnings */
1699 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1700 # define XCAST(fun) (typeof(directPlay3WVT.fn##fun))
1702 # define XCAST(fun) (void*)
1704 static ICOM_VTABLE(IDirectPlay3) directPlay3WVT =
1706 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1707 DirectPlay3WImpl_QueryInterface,
1708 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1709 XCAST(Release)DirectPlay2AImpl_Release,
1711 XCAST(AddPlayerToGroup)DirectPlay2WImpl_AddPlayerToGroup,
1712 XCAST(Close)DirectPlay2WImpl_Close,
1713 XCAST(CreateGroup)DirectPlay2WImpl_CreateGroup,
1714 XCAST(CreatePlayer)DirectPlay2WImpl_CreatePlayer,
1715 XCAST(DeletePlayerFromGroup)DirectPlay2WImpl_DeletePlayerFromGroup,
1716 XCAST(DestroyGroup)DirectPlay2WImpl_DestroyGroup,
1717 XCAST(DestroyPlayer)DirectPlay2WImpl_DestroyPlayer,
1718 XCAST(EnumGroupPlayers)DirectPlay2WImpl_EnumGroupPlayers,
1719 XCAST(EnumGroups)DirectPlay2WImpl_EnumGroups,
1720 XCAST(EnumPlayers)DirectPlay2WImpl_EnumPlayers,
1721 XCAST(EnumSessions)DirectPlay2WImpl_EnumSessions,
1722 XCAST(GetCaps)DirectPlay2WImpl_GetCaps,
1723 XCAST(GetGroupData)DirectPlay2WImpl_GetGroupData,
1724 XCAST(GetGroupName)DirectPlay2WImpl_GetGroupName,
1725 XCAST(GetMessageCount)DirectPlay2WImpl_GetMessageCount,
1726 XCAST(GetPlayerAddress)DirectPlay2WImpl_GetPlayerAddress,
1727 XCAST(GetPlayerCaps)DirectPlay2WImpl_GetPlayerCaps,
1728 XCAST(GetPlayerData)DirectPlay2WImpl_GetPlayerData,
1729 XCAST(GetPlayerName)DirectPlay2WImpl_GetPlayerName,
1730 XCAST(GetSessionDesc)DirectPlay2WImpl_GetSessionDesc,
1731 XCAST(Initialize)DirectPlay2WImpl_Initialize,
1732 XCAST(Open)DirectPlay2WImpl_Open,
1733 XCAST(Receive)DirectPlay2WImpl_Receive,
1734 XCAST(Send)DirectPlay2WImpl_Send,
1735 XCAST(SetGroupData)DirectPlay2WImpl_SetGroupData,
1736 XCAST(SetGroupName)DirectPlay2WImpl_SetGroupName,
1737 XCAST(SetPlayerData)DirectPlay2WImpl_SetPlayerData,
1738 XCAST(SetPlayerName)DirectPlay2WImpl_SetPlayerName,
1739 XCAST(SetSessionDesc)DirectPlay2WImpl_SetSessionDesc,
1741 DirectPlay3WImpl_AddGroupToGroup,
1742 DirectPlay3WImpl_CreateGroupInGroup,
1743 DirectPlay3WImpl_DeleteGroupFromGroup,
1744 DirectPlay3WImpl_EnumConnections,
1745 DirectPlay3WImpl_EnumGroupsInGroup,
1746 DirectPlay3WImpl_GetGroupConnectionSettings,
1747 DirectPlay3WImpl_InitializeConnection,
1748 DirectPlay3WImpl_SecureOpen,
1749 DirectPlay3WImpl_SendChatMessage,
1750 DirectPlay3WImpl_SetGroupConnectionSettings,
1751 DirectPlay3WImpl_StartSession,
1752 DirectPlay3WImpl_GetGroupFlags,
1753 DirectPlay3WImpl_GetGroupParent,
1754 DirectPlay3WImpl_GetPlayerAccount,
1755 DirectPlay3WImpl_GetPlayerFlags
1759 /* Note: Hack so we can reuse the old functions without compiler warnings */
1760 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1761 # define XCAST(fun) (typeof(directPlay4WVT.fn##fun))
1763 # define XCAST(fun) (void*)
1765 static ICOM_VTABLE(IDirectPlay4) directPlay4WVT =
1767 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1768 DirectPlay4WImpl_QueryInterface,
1769 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1770 XCAST(Release)DirectPlay2AImpl_Release,
1772 XCAST(AddPlayerToGroup)DirectPlay2WImpl_AddPlayerToGroup,
1773 XCAST(Close)DirectPlay2WImpl_Close,
1774 XCAST(CreateGroup)DirectPlay2WImpl_CreateGroup,
1775 XCAST(CreatePlayer)DirectPlay2WImpl_CreatePlayer,
1776 XCAST(DeletePlayerFromGroup)DirectPlay2WImpl_DeletePlayerFromGroup,
1777 XCAST(DestroyGroup)DirectPlay2WImpl_DestroyGroup,
1778 XCAST(DestroyPlayer)DirectPlay2WImpl_DestroyPlayer,
1779 XCAST(EnumGroupPlayers)DirectPlay2WImpl_EnumGroupPlayers,
1780 XCAST(EnumGroups)DirectPlay2WImpl_EnumGroups,
1781 XCAST(EnumPlayers)DirectPlay2WImpl_EnumPlayers,
1782 XCAST(EnumSessions)DirectPlay2WImpl_EnumSessions,
1783 XCAST(GetCaps)DirectPlay2WImpl_GetCaps,
1784 XCAST(GetGroupData)DirectPlay2WImpl_GetGroupData,
1785 XCAST(GetGroupName)DirectPlay2WImpl_GetGroupName,
1786 XCAST(GetMessageCount)DirectPlay2WImpl_GetMessageCount,
1787 XCAST(GetPlayerAddress)DirectPlay2WImpl_GetPlayerAddress,
1788 XCAST(GetPlayerCaps)DirectPlay2WImpl_GetPlayerCaps,
1789 XCAST(GetPlayerData)DirectPlay2WImpl_GetPlayerData,
1790 XCAST(GetPlayerName)DirectPlay2WImpl_GetPlayerName,
1791 XCAST(GetSessionDesc)DirectPlay2WImpl_GetSessionDesc,
1792 XCAST(Initialize)DirectPlay2WImpl_Initialize,
1793 XCAST(Open)DirectPlay2WImpl_Open,
1794 XCAST(Receive)DirectPlay2WImpl_Receive,
1795 XCAST(Send)DirectPlay2WImpl_Send,
1796 XCAST(SetGroupData)DirectPlay2WImpl_SetGroupData,
1797 XCAST(SetGroupName)DirectPlay2WImpl_SetGroupName,
1798 XCAST(SetPlayerData)DirectPlay2WImpl_SetPlayerData,
1799 XCAST(SetPlayerName)DirectPlay2WImpl_SetPlayerName,
1800 XCAST(SetSessionDesc)DirectPlay2WImpl_SetSessionDesc,
1802 XCAST(AddGroupToGroup)DirectPlay3WImpl_AddGroupToGroup,
1803 XCAST(CreateGroupInGroup)DirectPlay3WImpl_CreateGroupInGroup,
1804 XCAST(DeleteGroupFromGroup)DirectPlay3WImpl_DeleteGroupFromGroup,
1805 XCAST(EnumConnections)DirectPlay3WImpl_EnumConnections,
1806 XCAST(EnumGroupsInGroup)DirectPlay3WImpl_EnumGroupsInGroup,
1807 XCAST(GetGroupConnectionSettings)DirectPlay3WImpl_GetGroupConnectionSettings,
1808 XCAST(InitializeConnection)DirectPlay3WImpl_InitializeConnection,
1809 XCAST(SecureOpen)DirectPlay3WImpl_SecureOpen,
1810 XCAST(SendChatMessage)DirectPlay3WImpl_SendChatMessage,
1811 XCAST(SetGroupConnectionSettings)DirectPlay3WImpl_SetGroupConnectionSettings,
1812 XCAST(StartSession)DirectPlay3WImpl_StartSession,
1813 XCAST(GetGroupFlags)DirectPlay3WImpl_GetGroupFlags,
1814 XCAST(GetGroupParent)DirectPlay3WImpl_GetGroupParent,
1815 XCAST(GetPlayerAccount)DirectPlay3WImpl_GetPlayerAccount,
1816 XCAST(GetPlayerFlags)DirectPlay3WImpl_GetPlayerFlags,
1818 DirectPlay4WImpl_GetGroupOwner,
1819 DirectPlay4WImpl_SetGroupOwner,
1820 DirectPlay4WImpl_SendEx,
1821 DirectPlay4WImpl_GetMessageQueue,
1822 DirectPlay4WImpl_CancelMessage,
1823 DirectPlay4WImpl_CancelPriority
1828 /* Note: Hack so we can reuse the old functions without compiler warnings */
1829 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
1830 # define XCAST(fun) (typeof(directPlay4AVT.fn##fun))
1832 # define XCAST(fun) (void*)
1834 static ICOM_VTABLE(IDirectPlay4) directPlay4AVT =
1836 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1837 DirectPlay4AImpl_QueryInterface,
1838 XCAST(AddRef)DirectPlay2AImpl_AddRef,
1839 XCAST(Release)DirectPlay2AImpl_Release,
1841 XCAST(AddPlayerToGroup)DirectPlay2AImpl_AddPlayerToGroup,
1842 XCAST(Close)DirectPlay2AImpl_Close,
1843 XCAST(CreateGroup)DirectPlay2AImpl_CreateGroup,
1844 XCAST(CreatePlayer)DirectPlay2AImpl_CreatePlayer,
1845 XCAST(DeletePlayerFromGroup)DirectPlay2AImpl_DeletePlayerFromGroup,
1846 XCAST(DestroyGroup)DirectPlay2AImpl_DestroyGroup,
1847 XCAST(DestroyPlayer)DirectPlay2AImpl_DestroyPlayer,
1848 XCAST(EnumGroupPlayers)DirectPlay2AImpl_EnumGroupPlayers,
1849 XCAST(EnumGroups)DirectPlay2AImpl_EnumGroups,
1850 XCAST(EnumPlayers)DirectPlay2AImpl_EnumPlayers,
1851 XCAST(EnumSessions)DirectPlay2AImpl_EnumSessions,
1852 XCAST(GetCaps)DirectPlay2AImpl_GetCaps,
1853 XCAST(GetGroupData)DirectPlay2AImpl_GetGroupData,
1854 XCAST(GetGroupName)DirectPlay2AImpl_GetGroupName,
1855 XCAST(GetMessageCount)DirectPlay2AImpl_GetMessageCount,
1856 XCAST(GetPlayerAddress)DirectPlay2AImpl_GetPlayerAddress,
1857 XCAST(GetPlayerCaps)DirectPlay2AImpl_GetPlayerCaps,
1858 XCAST(GetPlayerData)DirectPlay2AImpl_GetPlayerData,
1859 XCAST(GetPlayerName)DirectPlay2AImpl_GetPlayerName,
1860 XCAST(GetSessionDesc)DirectPlay2AImpl_GetSessionDesc,
1861 XCAST(Initialize)DirectPlay2AImpl_Initialize,
1862 XCAST(Open)DirectPlay2AImpl_Open,
1863 XCAST(Receive)DirectPlay2AImpl_Receive,
1864 XCAST(Send)DirectPlay2AImpl_Send,
1865 XCAST(SetGroupData)DirectPlay2AImpl_SetGroupData,
1866 XCAST(SetGroupName)DirectPlay2AImpl_SetGroupName,
1867 XCAST(SetPlayerData)DirectPlay2AImpl_SetPlayerData,
1868 XCAST(SetPlayerName)DirectPlay2AImpl_SetPlayerName,
1869 XCAST(SetSessionDesc)DirectPlay2AImpl_SetSessionDesc,
1871 XCAST(AddGroupToGroup)DirectPlay3AImpl_AddGroupToGroup,
1872 XCAST(CreateGroupInGroup)DirectPlay3AImpl_CreateGroupInGroup,
1873 XCAST(DeleteGroupFromGroup)DirectPlay3AImpl_DeleteGroupFromGroup,
1874 XCAST(EnumConnections)DirectPlay3AImpl_EnumConnections,
1875 XCAST(EnumGroupsInGroup)DirectPlay3AImpl_EnumGroupsInGroup,
1876 XCAST(GetGroupConnectionSettings)DirectPlay3AImpl_GetGroupConnectionSettings,
1877 XCAST(InitializeConnection)DirectPlay3AImpl_InitializeConnection,
1878 XCAST(SecureOpen)DirectPlay3AImpl_SecureOpen,
1879 XCAST(SendChatMessage)DirectPlay3AImpl_SendChatMessage,
1880 XCAST(SetGroupConnectionSettings)DirectPlay3AImpl_SetGroupConnectionSettings,
1881 XCAST(StartSession)DirectPlay3AImpl_StartSession,
1882 XCAST(GetGroupFlags)DirectPlay3AImpl_GetGroupFlags,
1883 XCAST(GetGroupParent)DirectPlay3AImpl_GetGroupParent,
1884 XCAST(GetPlayerAccount)DirectPlay3AImpl_GetPlayerAccount,
1885 XCAST(GetPlayerFlags)DirectPlay3AImpl_GetPlayerFlags,
1887 DirectPlay4AImpl_GetGroupOwner,
1888 DirectPlay4AImpl_SetGroupOwner,
1889 DirectPlay4AImpl_SendEx,
1890 DirectPlay4AImpl_GetMessageQueue,
1891 DirectPlay4AImpl_CancelMessage,
1892 DirectPlay4AImpl_CancelPriority
1897 /***************************************************************************
1898 * DirectPlayEnumerateA (DPLAYX.2)
1900 * The pointer to the structure lpContext will be filled with the
1901 * appropriate data for each service offered by the OS. These services are
1902 * not necessarily available on this particular machine but are defined
1903 * as simple service providers under the "Service Providers" registry key.
1904 * This structure is then passed to lpEnumCallback for each of the different
1907 * This API is useful only for applications written using DirectX3 or
1908 * worse. It is superceeded by IDirectPlay3::EnumConnections which also
1909 * gives information on the actual connections.
1911 * defn of a service provider:
1912 * A dynamic-link library used by DirectPlay to communicate over a network.
1913 * The service provider contains all the network-specific code required
1914 * to send and receive messages. Online services and network operators can
1915 * supply service providers to use specialized hardware, protocols, communications
1916 * media, and network resources.
1918 * TODO: Allocate string buffer space from the heap (length from reg)
1919 * Pass real device driver numbers...
1920 * Get the GUID properly...
1922 HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
1927 LPCSTR searchSubKey = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers";
1929 DWORD sizeOfSubKeyName=50;
1930 char subKeyName[51];
1932 TRACE(": lpEnumCallback=%p lpContext=%p\n", lpEnumCallback, lpContext );
1934 if( !lpEnumCallback || !*lpEnumCallback )
1936 return DPERR_INVALIDPARAMS;
1939 /* Need to loop over the service providers in the registry */
1940 if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey,
1941 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
1943 /* Hmmm. Does this mean that there are no service providers? */
1944 ERR(": no service providers?\n");
1948 /* Traverse all the service providers we have available */
1950 RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS;
1953 LPSTR majVerDataSubKey = "dwReserved1";
1954 LPSTR minVerDataSubKey = "dwReserved2";
1955 LPSTR guidDataSubKey = "Guid";
1956 HKEY hkServiceProvider;
1957 GUID serviceProviderGUID;
1958 DWORD returnTypeGUID, returnTypeReserved, sizeOfReturnBuffer = 50;
1959 char returnBuffer[51];
1960 DWORD majVersionNum , minVersionNum = 0;
1961 LPWSTR lpWGUIDString;
1963 TRACE(" this time through: %s\n", subKeyName );
1965 /* Get a handle for this particular service provider */
1966 if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
1967 &hkServiceProvider ) != ERROR_SUCCESS )
1969 ERR(": what the heck is going on?\n" );
1973 /* Get the GUID, Device major number and device minor number
1974 * from the registry.
1976 if( RegQueryValueExA( hkServiceProvider, guidDataSubKey,
1977 NULL, &returnTypeGUID, returnBuffer,
1978 &sizeOfReturnBuffer ) != ERROR_SUCCESS )
1980 ERR(": missing GUID registry data members\n" );
1984 /* FIXME: Check return types to ensure we're interpreting data right */
1985 lpWGUIDString = HEAP_strdupAtoW( GetProcessHeap(), 0, returnBuffer );
1986 CLSIDFromString( (LPCOLESTR)lpWGUIDString, &serviceProviderGUID );
1987 HeapFree( GetProcessHeap(), 0, lpWGUIDString );
1989 /* FIXME: Need to know which of dwReserved1 and dwReserved2 are maj and min */
1991 sizeOfReturnBuffer = 50;
1992 if( RegQueryValueExA( hkServiceProvider, majVerDataSubKey,
1993 NULL, &returnTypeReserved, returnBuffer,
1994 &sizeOfReturnBuffer ) != ERROR_SUCCESS )
1996 ERR(": missing dwReserved1 registry data members\n") ;
2000 majVersionNum = GET_DWORD( returnBuffer );
2002 sizeOfReturnBuffer = 50;
2003 if( RegQueryValueExA( hkServiceProvider, minVerDataSubKey,
2004 NULL, &returnTypeReserved, returnBuffer,
2005 &sizeOfReturnBuffer ) != ERROR_SUCCESS )
2007 ERR(": missing dwReserved2 registry data members\n") ;
2011 minVersionNum = GET_DWORD( returnBuffer );
2014 /* The enumeration will return FALSE if we are not to continue */
2015 if( !lpEnumCallback( &serviceProviderGUID , subKeyName,
2016 majVersionNum, minVersionNum, lpContext ) )
2018 WARN("lpEnumCallback returning FALSE\n" );
2027 /***************************************************************************
2028 * DirectPlayEnumerateW (DPLAYX.3)
2031 HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW lpEnumCallback, LPVOID lpContext )
2036 return DPERR_OUTOFMEMORY;
2040 /***************************************************************************
2041 * DirectPlayCreate (DPLAYX.1) (DPLAY.1)
2044 HRESULT WINAPI DirectPlayCreate
2045 ( LPGUID lpGUID, LPDIRECTPLAY2 *lplpDP, IUnknown *pUnk)
2047 TRACE( "lpGUID=%s lplpDP=%p pUnk=%p\n", debugstr_guid(lpGUID), lplpDP, pUnk );
2051 return CLASS_E_NOAGGREGATION;
2055 /* Create an IDirectPlay object. We don't support that so we'll cheat and
2056 give them an IDirectPlay2A object and hope that doesn't cause problems */
2057 if( directPlay_QueryInterface( &IID_IDirectPlay2A, (LPVOID*)lplpDP ) != DP_OK )
2059 return DPERR_UNAVAILABLE;
2062 if( IsEqualGUID( &GUID_NULL, lpGUID ) )
2064 /* The GUID_NULL means don't bind a service provider. Just return the
2070 /* Bind the desired service provider */
2071 if( ( IsEqualGUID( lpGUID, &DPSPGUID_MODEM ) ) ||
2072 ( IsEqualGUID( lpGUID, &DPSPGUID_SERIAL ) ) ||
2073 ( IsEqualGUID( lpGUID, &DPSPGUID_TCPIP ) ) ||
2074 ( IsEqualGUID( lpGUID, &DPSPGUID_IPX ) )
2077 FIXME( "Service provider binding not supported yet\n" );
2078 IDirectPlayX_Release( *lplpDP );
2080 return DPERR_INVALIDPARAMS;
2083 ERR( "unknown Service Provider %s\n", debugstr_guid(lpGUID) );
2085 IDirectPlayX_Release( *lplpDP );
2088 return DPERR_INVALIDPARAMS;