| /* Direct Play 3 and Direct Play Lobby 2 Implementation | |
| * | |
| * Copyright 1998,1999 - Peter Hunnisett | |
| * | |
| * <presently under construction - contact hunnise@nortelnetworks.com> | |
| * | |
| */ | |
| #include <string.h> | |
| #include "winerror.h" | |
| #include "winnt.h" | |
| #include "winreg.h" | |
| #include "dplay.h" | |
| #include "dplobby.h" | |
| #include "heap.h" | |
| #include "debug.h" | |
| DEFAULT_DEBUG_CHANNEL(dplay) | |
| /***************************************************************************** | |
| * Predeclare the interface implementation structures | |
| */ | |
| typedef struct IDirectPlayLobbyImpl IDirectPlayLobbyImpl; | |
| typedef struct IDirectPlayLobbyImpl IDirectPlayLobbyAImpl; | |
| typedef struct IDirectPlayLobbyImpl IDirectPlayLobbyWImpl; | |
| typedef struct IDirectPlayLobby2Impl IDirectPlayLobby2Impl; | |
| typedef struct IDirectPlayLobby2Impl IDirectPlayLobby2AImpl; | |
| typedef struct IDirectPlay2Impl IDirectPlay2Impl; | |
| typedef struct IDirectPlay2Impl IDirectPlay2AImpl; | |
| typedef struct IDirectPlay3Impl IDirectPlay3Impl; | |
| typedef struct IDirectPlay3Impl IDirectPlay3AImpl; | |
| /***************************************************************************** | |
| * IDirectPlayLobby implementation structure | |
| */ | |
| struct IDirectPlayLobbyImpl | |
| { | |
| /* IUnknown fields */ | |
| ICOM_VTABLE(IDirectPlayLobby)* lpvtbl; | |
| DWORD ref; | |
| /* IDirectPlayLobbyImpl fields */ | |
| DWORD dwConnFlags; | |
| DPSESSIONDESC2 sessionDesc; | |
| DPNAME playerName; | |
| GUID guidSP; | |
| LPVOID lpAddress; | |
| DWORD dwAddressSize; | |
| }; | |
| /***************************************************************************** | |
| * IDirectPlayLobby2 implementation structure | |
| */ | |
| struct IDirectPlayLobby2Impl | |
| { | |
| /* IUnknown fields */ | |
| ICOM_VTABLE(IDirectPlayLobby2)* lpvtbl; | |
| DWORD ref; | |
| /* IDirectPlayLobby2Impl fields */ | |
| DWORD dwConnFlags; | |
| DPSESSIONDESC2 lpSessionDesc; | |
| DPNAME lpPlayerName; | |
| GUID guidSP; | |
| LPVOID lpAddress; | |
| DWORD dwAddressSize; | |
| }; | |
| /***************************************************************************** | |
| * IDirectPlay2 implementation structure | |
| */ | |
| struct IDirectPlay2Impl | |
| { | |
| /* IUnknown fields */ | |
| ICOM_VTABLE(IDirectPlay2)* lpvtbl; | |
| DWORD ref; | |
| /* IDirectPlay2Impl fields */ | |
| /* none */ | |
| }; | |
| /***************************************************************************** | |
| * IDirectPlay3 implementation structure | |
| */ | |
| struct IDirectPlay3Impl | |
| { | |
| /* IUnknown fields */ | |
| ICOM_VTABLE(IDirectPlay3)* lpvtbl; | |
| DWORD ref; | |
| /* IDirectPlay3Impl fields */ | |
| /* none */ | |
| }; | |
| /* Forward declarations of virtual tables */ | |
| static ICOM_VTABLE(IDirectPlayLobby) directPlayLobbyAVT; | |
| static ICOM_VTABLE(IDirectPlayLobby) directPlayLobbyWVT; | |
| static ICOM_VTABLE(IDirectPlayLobby2) directPlayLobby2AVT; | |
| static ICOM_VTABLE(IDirectPlayLobby2) directPlayLobby2WVT; | |
| static ICOM_VTABLE(IDirectPlay2) directPlay2WVT; | |
| static ICOM_VTABLE(IDirectPlay2) directPlay2AVT; | |
| static ICOM_VTABLE(IDirectPlay3) directPlay3WVT; | |
| static ICOM_VTABLE(IDirectPlay3) directPlay3AVT; | |
| /* Routine called when starting up the server thread */ | |
| DWORD DPLobby_Spawn_Server( LPVOID startData ) | |
| { | |
| DPSESSIONDESC2* lpSession = (DPSESSIONDESC2*) startData; | |
| DWORD sessionDwFlags = lpSession->dwFlags; | |
| TRACE( dplay, "spawing thread for lpConn=%p dwFlags=%08lx\n", lpSession, sessionDwFlags ); | |
| FIXME( dplay, "thread needs something to do\n" ); | |
| /*for(;;)*/ | |
| { | |
| /* Check out the connection flags to determine what to do. Ensure we have | |
| no leftover bits in this structure */ | |
| if( sessionDwFlags & DPSESSION_CLIENTSERVER ) | |
| { | |
| /* This indicates that the application which is requesting the creation | |
| * of this session is going to be the server (application/player) | |
| */ | |
| if( sessionDwFlags & DPSESSION_SECURESERVER ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_SECURESERVER; | |
| } | |
| sessionDwFlags &= ~DPSESSION_CLIENTSERVER; | |
| } | |
| if( sessionDwFlags & DPSESSION_JOINDISABLED ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_JOINDISABLED; | |
| } | |
| if( sessionDwFlags & DPSESSION_KEEPALIVE ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_KEEPALIVE; | |
| } | |
| if( sessionDwFlags & DPSESSION_MIGRATEHOST ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_MIGRATEHOST; | |
| } | |
| if( sessionDwFlags & DPSESSION_MULTICASTSERVER ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_MULTICASTSERVER; | |
| } | |
| if( sessionDwFlags & DPSESSION_NEWPLAYERSDISABLED ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_NEWPLAYERSDISABLED; | |
| } | |
| if( sessionDwFlags & DPSESSION_NODATAMESSAGES ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_NODATAMESSAGES; | |
| } | |
| if( sessionDwFlags & DPSESSION_NOMESSAGEID ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_NOMESSAGEID; | |
| } | |
| if( sessionDwFlags & DPSESSION_PASSWORDREQUIRED ) | |
| { | |
| sessionDwFlags &= ~DPSESSION_PASSWORDREQUIRED; | |
| } | |
| } | |
| ExitThread(0); | |
| return 0; | |
| } | |
| /********************************************************* | |
| * | |
| * Direct Play and Direct Play Lobby Interface Implementation | |
| * | |
| *********************************************************/ | |
| /* The COM interface for upversioning an interface | |
| * We've been given a GUID (riid) and we need to replace the present | |
| * interface with that of the requested interface. | |
| * | |
| * Snip from some Microsoft document: | |
| * There are four requirements for implementations of QueryInterface (In these | |
| * cases, "must succeed" means "must succeed barring catastrophic failure."): | |
| * | |
| * * The set of interfaces accessible on an object through | |
| * IUnknown::QueryInterface must be static, not dynamic. This means that | |
| * if a call to QueryInterface for a pointer to a specified interface | |
| * succeeds the first time, it must succeed again, and if it fails the | |
| * first time, it must fail on all subsequent queries. | |
| * * It must be symmetric ~W if a client holds a pointer to an interface on | |
| * an object, and queries for that interface, the call must succeed. | |
| * * It must be reflexive ~W if a client holding a pointer to one interface | |
| * queries successfully for another, a query through the obtained pointer | |
| * for the first interface must succeed. | |
| * * It must be transitive ~W if a client holding a pointer to one interface | |
| * queries successfully for a second, and through that pointer queries | |
| * successfully for a third interface, a query for the first interface | |
| * through the pointer for the third interface must succeed. | |
| * | |
| * As you can see, this interface doesn't qualify but will most likely | |
| * be good enough for the time being. | |
| */ | |
| /* Helper function for DirectPlayLobby QueryInterface */ | |
| static HRESULT directPlayLobby_QueryInterface | |
| ( REFIID riid, LPVOID* ppvObj ) | |
| { | |
| if( IsEqualGUID( &IID_IDirectPlayLobby, riid ) ) | |
| { | |
| IDirectPlayLobbyImpl* lpDpL = (IDirectPlayLobbyImpl*)(*ppvObj); | |
| lpDpL = (IDirectPlayLobbyImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDpL ) ); | |
| if( !lpDpL ) | |
| { | |
| return E_NOINTERFACE; | |
| } | |
| lpDpL->lpvtbl = &directPlayLobbyWVT; | |
| lpDpL->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) ) | |
| { | |
| IDirectPlayLobbyAImpl* lpDpL = (IDirectPlayLobbyAImpl*)(*ppvObj); | |
| lpDpL = (IDirectPlayLobbyAImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDpL ) ); | |
| if( !lpDpL ) | |
| { | |
| return E_NOINTERFACE; | |
| } | |
| lpDpL->lpvtbl = &directPlayLobbyAVT; | |
| lpDpL->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlayLobby2, riid ) ) | |
| { | |
| IDirectPlayLobby2Impl* lpDpL = (IDirectPlayLobby2Impl*)(*ppvObj); | |
| lpDpL = (IDirectPlayLobby2Impl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDpL ) ); | |
| if( !lpDpL ) | |
| { | |
| return E_NOINTERFACE; | |
| } | |
| lpDpL->lpvtbl = &directPlayLobby2WVT; | |
| lpDpL->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) ) | |
| { | |
| IDirectPlayLobby2AImpl* lpDpL = (IDirectPlayLobby2AImpl*)(*ppvObj); | |
| lpDpL = (IDirectPlayLobby2AImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDpL ) ); | |
| if( !lpDpL ) | |
| { | |
| return E_NOINTERFACE; | |
| } | |
| lpDpL->lpvtbl = &directPlayLobby2AVT; | |
| lpDpL->ref = 1; | |
| return S_OK; | |
| } | |
| /* Unknown interface */ | |
| *ppvObj = NULL; | |
| return E_NOINTERFACE; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_QueryInterface | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| REFIID riid, | |
| LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) | |
| ) | |
| { | |
| IDirectPlayLobby_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlayLobby_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyW_QueryInterface | |
| ( LPDIRECTPLAYLOBBY iface, | |
| REFIID riid, | |
| LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlayLobby, riid ) | |
| ) | |
| { | |
| IDirectPlayLobby_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlayLobby_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_QueryInterface | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| REFIID riid, | |
| LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| /* Compare riids. We know this object is a direct play lobby 2A object. | |
| If we are asking about the same type of interface we're fine. | |
| */ | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) | |
| ) | |
| { | |
| IDirectPlayLobby2_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlayLobby_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_QueryInterface | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| REFIID riid, | |
| LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| /* Compare riids. We know this object is a direct play lobby 2 object. | |
| If we are asking about the same type of interface we're fine. | |
| */ | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlayLobby2, riid ) | |
| ) | |
| { | |
| IDirectPlayLobby2_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlayLobby_QueryInterface( riid, ppvObj ); | |
| } | |
| /* | |
| * Simple procedure. Just increment the reference count to this | |
| * structure and return the new reference count. | |
| */ | |
| static ULONG WINAPI IDirectPlayLobby2AImpl_AddRef | |
| ( LPDIRECTPLAYLOBBY2A iface ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| ++(This->ref); | |
| TRACE( dplay,"ref count now %lu\n", This->ref ); | |
| return (This->ref); | |
| } | |
| static ULONG WINAPI IDirectPlayLobby2WImpl_AddRef | |
| ( LPDIRECTPLAYLOBBY2 iface ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobby2AImpl_AddRef( (LPDIRECTPLAYLOBBY2) This ); | |
| } | |
| /* | |
| * Simple COM procedure. Decrease the reference count to this object. | |
| * If the object no longer has any reference counts, free up the associated | |
| * memory. | |
| */ | |
| static ULONG WINAPI IDirectPlayLobby2AImpl_Release | |
| ( LPDIRECTPLAYLOBBY2A iface ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| TRACE( dplay, "ref count decremeneted from %lu\n", This->ref ); | |
| This->ref--; | |
| /* Deallocate if this is the last reference to the object */ | |
| if( !(This->ref) ) | |
| { | |
| FIXME( dplay, "memory leak\n" ); | |
| /* Implement memory deallocation */ | |
| HeapFree( GetProcessHeap(), 0, This ); | |
| return 0; | |
| } | |
| return This->ref; | |
| } | |
| static ULONG WINAPI IDirectPlayLobby2WImpl_Release | |
| ( LPDIRECTPLAYLOBBY2 iface ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobby2AImpl_Release( (LPDIRECTPLAYLOBBY2A) This ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Connects an application to the session specified by the DPLCONNECTION | |
| * structure currently stored with the DirectPlayLobby object. | |
| * | |
| * Returns a IDirectPlay interface. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_Connect | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| LPDIRECTPLAY2* lplpDP, | |
| IUnknown* pUnk) | |
| { | |
| FIXME( dplay, ": dwFlags=%08lx %p %p stub\n", dwFlags, lplpDP, pUnk ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_Connect | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| LPDIRECTPLAY2* lplpDP, | |
| IUnknown* pUnk) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| LPDIRECTPLAY2* directPlay2W; | |
| HRESULT createRC; | |
| FIXME( dplay, "(%p)->(%08lx,%p,%p): stub\n", This, dwFlags, lplpDP, pUnk ); | |
| if( dwFlags ) | |
| { | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| if( ( createRC = DirectPlayCreate( (LPGUID)&IID_IDirectPlayLobby2, lplpDP, pUnk ) ) != DP_OK ) | |
| { | |
| ERR( dplay, "error creating Direct Play 2W interface. Return Code = %ld.\n", createRC ); | |
| return createRC; | |
| } | |
| /* This should invoke IDirectPlay3::InitializeConnection IDirectPlay3::Open */ | |
| directPlay2W = lplpDP; | |
| #if 0 | |
| /* All the stuff below this is WRONG! */ | |
| if( This->lpSession->dwFlags == DPLCONNECTION_CREATESESSION ) | |
| { | |
| DWORD threadIdSink; | |
| /* Spawn a thread to deal with all of this and to handle the incomming requests */ | |
| threadIdSink = CreateThread( NULL, 0, &DPLobby_Spawn_Server, | |
| (LPVOID)This->lpSession->lpConn->lpSessionDesc, 0, &threadIdSink ); | |
| } | |
| else if ( This->lpSession->dwFlags == DPLCONNECTION_JOINSESSION ) | |
| { | |
| /* Let's search for a matching session */ | |
| FIXME( dplay, "joining session not yet supported.\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| else /* Unknown type of connection request */ | |
| { | |
| ERR( dplay, ": Unknown connection request lpConn->dwFlags=%08lx\n", | |
| lpConn->dwFlags ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /* This does the work of the following methods... | |
| IDirectPlay3::InitializeConnection, | |
| IDirectPlay3::EnumSessions, | |
| IDirectPlay3::Open | |
| */ | |
| #endif | |
| return DP_OK; | |
| } | |
| /******************************************************************** | |
| * | |
| * Creates a DirectPlay Address, given a service provider-specific network | |
| * address. | |
| * Returns an address contains the globally unique identifier | |
| * (GUID) of the service provider and data that the service provider can | |
| * interpret as a network address. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_CreateAddress | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| REFGUID guidSP, | |
| REFGUID guidDataType, | |
| LPCVOID lpData, | |
| DWORD dwDataSize, | |
| LPVOID lpAddress, | |
| LPDWORD lpdwAddressSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_CreateAddress | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| REFGUID guidSP, | |
| REFGUID guidDataType, | |
| LPCVOID lpData, | |
| DWORD dwDataSize, | |
| LPVOID lpAddress, | |
| LPDWORD lpdwAddressSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /******************************************************************** | |
| * | |
| * Parses out chunks from the DirectPlay Address buffer by calling the | |
| * given callback function, with lpContext, for each of the chunks. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_EnumAddress | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, | |
| LPCVOID lpAddress, | |
| DWORD dwAddressSize, | |
| LPVOID lpContext ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_EnumAddress | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, | |
| LPCVOID lpAddress, | |
| DWORD dwAddressSize, | |
| LPVOID lpContext ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /******************************************************************** | |
| * | |
| * Enumerates all the address types that a given service provider needs to | |
| * build the DirectPlay Address. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| LPDPLENUMADDRESSTYPESCALLBACK lpEnumAddressTypeCallback, | |
| REFGUID guidSP, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_EnumAddressTypes | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| LPDPLENUMADDRESSTYPESCALLBACK lpEnumAddressTypeCallback, | |
| REFGUID guidSP, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_EnumAddressTypes( (LPDIRECTPLAYLOBBYA)This, lpEnumAddressTypeCallback, | |
| guidSP, lpContext, dwFlags ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_EnumAddressTypes | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| LPDPLENUMADDRESSTYPESCALLBACK lpEnumAddressTypeCallback, | |
| REFGUID guidSP, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /******************************************************************** | |
| * | |
| * Enumerates what applications are registered with DirectPlay by | |
| * invoking the callback function with lpContext. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyW_EnumLocalApplications | |
| ( LPDIRECTPLAYLOBBY iface, | |
| LPDPLENUMLOCALAPPLICATIONSCALLBACK a, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_EnumLocalApplications | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| LPDPLENUMLOCALAPPLICATIONSCALLBACK a, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_EnumLocalApplications( (LPDIRECTPLAYLOBBY)This, a, | |
| lpContext, dwFlags ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| LPDPLENUMLOCALAPPLICATIONSCALLBACK a, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_EnumLocalApplications | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| LPDPLENUMLOCALAPPLICATIONSCALLBACK a, | |
| LPVOID lpContext, | |
| DWORD dwFlags ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_EnumLocalApplications( (LPDIRECTPLAYLOBBYA)This, a, | |
| lpContext, dwFlags ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Retrieves the DPLCONNECTION structure that contains all the information | |
| * needed to start and connect an application. This was generated using | |
| * either the RunApplication or SetConnectionSettings methods. | |
| * | |
| * NOTES: If lpData is NULL then just return lpdwDataSize. This allows | |
| * the data structure to be allocated by our caller which can then | |
| * call this procedure/method again with a valid data pointer. | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_GetConnectionSettings | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| LPDPLCONNECTION lpDplConnection; | |
| FIXME( dplay, ": semi stub (%p)->(0x%08lx,%p,%p)\n", This, dwAppID, lpData, lpdwDataSize ); | |
| /* Application is requesting us to give the required size */ | |
| if ( !lpData ) | |
| { | |
| /* Let's check the size of the buffer that the application has allocated */ | |
| if( *lpdwDataSize >= sizeof( DPLCONNECTION ) ) | |
| { | |
| return DP_OK; | |
| } | |
| else | |
| { | |
| *lpdwDataSize = sizeof( DPLCONNECTION ); | |
| return DPERR_BUFFERTOOSMALL; | |
| } | |
| } | |
| /* Fill in the fields - let them just use the ptrs */ | |
| lpDplConnection = (LPDPLCONNECTION)lpData; | |
| /* Make sure we were given the right size */ | |
| if( lpDplConnection->dwSize < sizeof( DPLCONNECTION ) ) | |
| { | |
| ERR( dplay, "bad passed size 0x%08lx.\n", lpDplConnection->dwSize ); | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Copy everything we've got into here */ | |
| /* Need to actually store the stuff here. Check if we've already allocated each field first. */ | |
| lpDplConnection->dwFlags = This->dwConnFlags; | |
| /* Copy LPDPSESSIONDESC2 struct */ | |
| lpDplConnection->lpSessionDesc = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( This->sessionDesc ) ); | |
| memcpy( lpDplConnection->lpSessionDesc, &(This->sessionDesc), sizeof( This->sessionDesc ) ); | |
| if( This->sessionDesc.sess.lpszSessionName ) | |
| { | |
| lpDplConnection->lpSessionDesc->sess.lpszSessionName = | |
| HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, This->sessionDesc.sess.lpszSessionName ); | |
| } | |
| if( This->sessionDesc.pass.lpszPassword ) | |
| { | |
| lpDplConnection->lpSessionDesc->pass.lpszPassword = | |
| HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, This->sessionDesc.pass.lpszPassword ); | |
| } | |
| /* I don't know what to use the reserved for. We'll set it to 0 just for fun */ | |
| This->sessionDesc.dwReserved1 = This->sessionDesc.dwReserved2 = 0; | |
| /* Copy DPNAME struct - seems to be optional - check for existance first */ | |
| lpDplConnection->lpPlayerName = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( This->playerName ) ); | |
| memcpy( lpDplConnection->lpPlayerName, &(This->playerName), sizeof( This->playerName ) ); | |
| if( This->playerName.psn.lpszShortName ) | |
| { | |
| lpDplConnection->lpPlayerName->psn.lpszShortName = | |
| HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, This->playerName.psn.lpszShortName ); | |
| } | |
| if( This->playerName.pln.lpszLongName ) | |
| { | |
| lpDplConnection->lpPlayerName->pln.lpszLongName = | |
| HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, This->playerName.pln.lpszLongName ); | |
| } | |
| memcpy( &(lpDplConnection->guidSP), &(This->guidSP), sizeof( This->guidSP ) ); | |
| lpDplConnection->lpAddress = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, This->dwAddressSize ); | |
| memcpy( lpDplConnection->lpAddress, This->lpAddress, This->dwAddressSize ); | |
| lpDplConnection->dwAddressSize = This->dwAddressSize; | |
| return DP_OK; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_GetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_GetConnectionSettings( (LPDIRECTPLAYLOBBYA)This, | |
| dwAppID, lpData, lpdwDataSize ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyWImpl_GetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| FIXME( dplay, ":semi stub %p %08lx %p %p \n", This, dwAppID, lpData, lpdwDataSize ); | |
| /* Application is requesting us to give the required size */ | |
| if ( !lpData ) | |
| { | |
| /* Let's check the size of the buffer that the application has allocated */ | |
| if( *lpdwDataSize >= sizeof( DPLCONNECTION ) ) | |
| { | |
| return DP_OK; | |
| } | |
| else | |
| { | |
| *lpdwDataSize = sizeof( DPLCONNECTION ); | |
| return DPERR_BUFFERTOOSMALL; | |
| } | |
| } | |
| /* Fill in the fields - let them just use the ptrs */ | |
| FIXME( dplay, "stub\n" ); | |
| return DP_OK; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_GetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyWImpl_GetConnectionSettings( (LPDIRECTPLAYLOBBY)This, | |
| dwAppID, lpData, lpdwDataSize ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Retrieves the message sent between a lobby client and a DirectPlay | |
| * application. All messages are queued until received. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_ReceiveLobbyMessage | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDWORD lpdwMessageFlags, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| FIXME( dplay, ":stub %p %08lx %08lx %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, | |
| lpdwDataSize ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_ReceiveLobbyMessage | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDWORD lpdwMessageFlags, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_ReceiveLobbyMessage( (LPDIRECTPLAYLOBBYA)This, dwFlags, dwAppID, | |
| lpdwMessageFlags, lpData, lpdwDataSize ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyW_ReceiveLobbyMessage | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDWORD lpdwMessageFlags, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| FIXME( dplay, ":stub %p %08lx %08lx %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, | |
| lpdwDataSize ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_ReceiveLobbyMessage | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDWORD lpdwMessageFlags, | |
| LPVOID lpData, | |
| LPDWORD lpdwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_ReceiveLobbyMessage( (LPDIRECTPLAYLOBBY)This, dwFlags, dwAppID, | |
| lpdwMessageFlags, lpData, lpdwDataSize ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Starts an application and passes to it all the information to | |
| * connect to a session. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_RunApplication | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwFlags, | |
| LPDWORD lpdwAppID, | |
| LPDPLCONNECTION lpConn, | |
| HANDLE hReceiveEvent ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_RunApplication | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| LPDWORD lpdwAppID, | |
| LPDPLCONNECTION lpConn, | |
| HANDLE hReceiveEvent ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_RunApplication( (LPDIRECTPLAYLOBBYA)This, dwFlags, | |
| lpdwAppID, lpConn, hReceiveEvent ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyW_RunApplication | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwFlags, | |
| LPDWORD lpdwAppID, | |
| LPDPLCONNECTION lpConn, | |
| HANDLE hReceiveEvent ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_RunApplication | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| LPDWORD lpdwAppID, | |
| LPDPLCONNECTION lpConn, | |
| HANDLE hReceiveEvent ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_RunApplication( (LPDIRECTPLAYLOBBY)This, dwFlags, | |
| lpdwAppID, lpConn, hReceiveEvent ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Sends a message between the application and the lobby client. | |
| * All messages are queued until received. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_SendLobbyMessage | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_SendLobbyMessage | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_SendLobbyMessage( (LPDIRECTPLAYLOBBYA)This, dwFlags, | |
| dwAppID, lpData, dwDataSize ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyW_SendLobbyMessage | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_SendLobbyMessage | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_SendLobbyMessage( (LPDIRECTPLAYLOBBY)This, dwFlags, | |
| dwAppID, lpData, dwDataSize ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Modifies the DPLCONNECTION structure to contain all information | |
| * needed to start and connect an application. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyW_SetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDPLCONNECTION lpConn ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| TRACE( dplay, ": This=%p, dwFlags=%08lx, dwAppId=%08lx, lpConn=%p\n", | |
| This, dwFlags, dwAppID, lpConn ); | |
| /* Paramater check */ | |
| if( dwFlags || !This || !lpConn ) | |
| { | |
| ERR( dplay, "invalid parameters.\n"); | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* See if there is a connection associated with this request. | |
| * dwAppID == 0 indicates that this request isn't associated with a connection. | |
| */ | |
| if( dwAppID ) | |
| { | |
| FIXME( dplay, ": Connection dwAppID=%08lx given. Not implemented yet.\n", | |
| dwAppID ); | |
| /* Need to add a check for this application Id...*/ | |
| return DPERR_NOTLOBBIED; | |
| } | |
| if( lpConn->dwSize != sizeof(DPLCONNECTION) ) | |
| { | |
| ERR( dplay, ": old/new DPLCONNECTION type? Size=%08lx vs. expected=%ul bytes\n", | |
| lpConn->dwSize, sizeof( DPLCONNECTION ) ); | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Need to investigate the lpConn->lpSessionDesc to figure out | |
| * what type of session we need to join/create. | |
| */ | |
| if( (!lpConn->lpSessionDesc ) || | |
| ( lpConn->lpSessionDesc->dwSize != sizeof( DPSESSIONDESC2 ) ) | |
| ) | |
| { | |
| ERR( dplay, "DPSESSIONDESC passed in? Size=%08lx vs. expected=%ul bytes\n", | |
| lpConn->lpSessionDesc->dwSize, sizeof( DPSESSIONDESC2 ) ); | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Need to actually store the stuff here. Check if we've already allocated each field first. */ | |
| This->dwConnFlags = lpConn->dwFlags; | |
| /* Copy LPDPSESSIONDESC2 struct - this is required */ | |
| memcpy( &(This->sessionDesc), lpConn->lpSessionDesc, sizeof( *(lpConn->lpSessionDesc) ) ); | |
| if( lpConn->lpSessionDesc->sess.lpszSessionName ) | |
| This->sessionDesc.sess.lpszSessionName = HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, lpConn->lpSessionDesc->sess.lpszSessionName ); | |
| else | |
| This->sessionDesc.sess.lpszSessionName = NULL; | |
| if( lpConn->lpSessionDesc->pass.lpszPassword ) | |
| This->sessionDesc.pass.lpszPassword = HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, lpConn->lpSessionDesc->pass.lpszPassword ); | |
| else | |
| This->sessionDesc.pass.lpszPassword = NULL; | |
| /* I don't know what to use the reserved for ... */ | |
| This->sessionDesc.dwReserved1 = This->sessionDesc.dwReserved2 = 0; | |
| /* Copy DPNAME struct - seems to be optional - check for existance first */ | |
| if( lpConn->lpPlayerName ) | |
| { | |
| memcpy( &(This->playerName), lpConn->lpPlayerName, sizeof( *lpConn->lpPlayerName ) ); | |
| if( lpConn->lpPlayerName->psn.lpszShortName ) | |
| This->playerName.psn.lpszShortName = HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, lpConn->lpPlayerName->psn.lpszShortName ); | |
| if( lpConn->lpPlayerName->pln.lpszLongName ) | |
| This->playerName.pln.lpszLongName = HEAP_strdupW( GetProcessHeap(), HEAP_ZERO_MEMORY, lpConn->lpPlayerName->pln.lpszLongName ); | |
| } | |
| memcpy( &(This->guidSP), &(lpConn->guidSP), sizeof( lpConn->guidSP ) ); | |
| This->lpAddress = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, lpConn->dwAddressSize ); | |
| memcpy( This->lpAddress, lpConn->lpAddress, lpConn->dwAddressSize ); | |
| This->dwAddressSize = lpConn->dwAddressSize; | |
| return DP_OK; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_SetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDPLCONNECTION lpConn ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_SetConnectionSettings( (LPDIRECTPLAYLOBBY)This, | |
| dwFlags, dwAppID, lpConn ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_SetConnectionSettings | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDPLCONNECTION lpConn ) | |
| { | |
| ICOM_THIS(IDirectPlayLobbyImpl,iface); | |
| FIXME( dplay, ": This=%p, dwFlags=%08lx, dwAppId=%08lx, lpConn=%p: stub\n", | |
| This, dwFlags, dwAppID, lpConn ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_SetConnectionSettings | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| LPDPLCONNECTION lpConn ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_SetConnectionSettings( (LPDIRECTPLAYLOBBYA)This, | |
| dwFlags, dwAppID, lpConn ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Registers an event that will be set when a lobby message is received. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobbyAImpl_SetLobbyMessageEvent | |
| ( LPDIRECTPLAYLOBBYA iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| HANDLE hReceiveEvent ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_SetLobbyMessageEvent | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| HANDLE hReceiveEvent ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyAImpl_SetLobbyMessageEvent( (LPDIRECTPLAYLOBBYA)This, dwFlags, | |
| dwAppID, hReceiveEvent ); | |
| } | |
| static HRESULT WINAPI IDirectPlayLobbyW_SetLobbyMessageEvent | |
| ( LPDIRECTPLAYLOBBY iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| HANDLE hReceiveEvent ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_SetLobbyMessageEvent | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| DWORD dwFlags, | |
| DWORD dwAppID, | |
| HANDLE hReceiveEvent ) | |
| { | |
| ICOM_THIS(IDirectPlayLobby2Impl,iface); | |
| return IDirectPlayLobbyW_SetLobbyMessageEvent( (LPDIRECTPLAYLOBBY)This, dwFlags, | |
| dwAppID, hReceiveEvent ); | |
| } | |
| /******************************************************************** | |
| * | |
| * Registers an event that will be set when a lobby message is received. | |
| * | |
| */ | |
| static HRESULT WINAPI IDirectPlayLobby2WImpl_CreateCompoundAddress | |
| ( LPDIRECTPLAYLOBBY2 iface, | |
| LPCDPCOMPOUNDADDRESSELEMENT lpElements, | |
| DWORD dwElementCount, | |
| LPVOID lpAddress, | |
| LPDWORD lpdwAddressSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| static HRESULT WINAPI IDirectPlayLobby2AImpl_CreateCompoundAddress | |
| ( LPDIRECTPLAYLOBBY2A iface, | |
| LPCDPCOMPOUNDADDRESSELEMENT lpElements, | |
| DWORD dwElementCount, | |
| LPVOID lpAddress, | |
| LPDWORD lpdwAddressSize ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /* Note: Hack so we can reuse the old functions without compiler warnings */ | |
| #if !defined(__STRICT_ANSI__) && defined(__GNUC__) | |
| # define XCAST(fun) (typeof(directPlayLobbyAVT.fn##fun)) | |
| #else | |
| # define XCAST(fun) (void*) | |
| #endif | |
| /* Direct Play Lobby 1 (ascii) Virtual Table for methods */ | |
| /* All lobby 1 methods are exactly the same except QueryInterface */ | |
| static struct ICOM_VTABLE(IDirectPlayLobby) directPlayLobbyAVT = { | |
| IDirectPlayLobbyAImpl_QueryInterface, | |
| XCAST(AddRef)IDirectPlayLobby2AImpl_AddRef, | |
| XCAST(Release)IDirectPlayLobby2AImpl_Release, | |
| XCAST(Connect)IDirectPlayLobby2AImpl_Connect, | |
| XCAST(CreateAddress)IDirectPlayLobby2AImpl_CreateAddress, | |
| XCAST(EnumAddress)IDirectPlayLobby2AImpl_EnumAddress, | |
| XCAST(EnumAddressTypes)IDirectPlayLobby2AImpl_EnumAddressTypes, | |
| XCAST(EnumLocalApplications)IDirectPlayLobby2AImpl_EnumLocalApplications, | |
| XCAST(GetConnectionSettings)IDirectPlayLobby2AImpl_GetConnectionSettings, | |
| XCAST(ReceiveLobbyMessage)IDirectPlayLobby2AImpl_ReceiveLobbyMessage, | |
| XCAST(RunApplication)IDirectPlayLobby2AImpl_RunApplication, | |
| XCAST(SendLobbyMessage)IDirectPlayLobby2AImpl_SendLobbyMessage, | |
| XCAST(SetConnectionSettings)IDirectPlayLobby2AImpl_SetConnectionSettings, | |
| XCAST(SetLobbyMessageEvent)IDirectPlayLobby2AImpl_SetLobbyMessageEvent | |
| }; | |
| #undef XCAST | |
| /* Note: Hack so we can reuse the old functions without compiler warnings */ | |
| #if !defined(__STRICT_ANSI__) && defined(__GNUC__) | |
| # define XCAST(fun) (typeof(directPlayLobbyWVT.fn##fun)) | |
| #else | |
| # define XCAST(fun) (void*) | |
| #endif | |
| /* Direct Play Lobby 1 (unicode) Virtual Table for methods */ | |
| static ICOM_VTABLE(IDirectPlayLobby) directPlayLobbyWVT = { | |
| IDirectPlayLobbyW_QueryInterface, | |
| XCAST(AddRef)IDirectPlayLobby2WImpl_AddRef, | |
| XCAST(Release)IDirectPlayLobby2WImpl_Release, | |
| XCAST(Connect)IDirectPlayLobby2WImpl_Connect, | |
| XCAST(CreateAddress)IDirectPlayLobby2WImpl_CreateAddress, | |
| XCAST(EnumAddress)IDirectPlayLobby2WImpl_EnumAddress, | |
| XCAST(EnumAddressTypes)IDirectPlayLobby2WImpl_EnumAddressTypes, | |
| XCAST(EnumLocalApplications)IDirectPlayLobby2WImpl_EnumLocalApplications, | |
| XCAST(GetConnectionSettings)IDirectPlayLobby2WImpl_GetConnectionSettings, | |
| XCAST(ReceiveLobbyMessage)IDirectPlayLobby2WImpl_ReceiveLobbyMessage, | |
| XCAST(RunApplication)IDirectPlayLobby2WImpl_RunApplication, | |
| XCAST(SendLobbyMessage)IDirectPlayLobby2WImpl_SendLobbyMessage, | |
| XCAST(SetConnectionSettings)IDirectPlayLobby2WImpl_SetConnectionSettings, | |
| XCAST(SetLobbyMessageEvent)IDirectPlayLobby2WImpl_SetLobbyMessageEvent | |
| }; | |
| #undef XCAST | |
| /* Direct Play Lobby 2 (ascii) Virtual Table for methods */ | |
| static ICOM_VTABLE(IDirectPlayLobby2) directPlayLobby2AVT = { | |
| IDirectPlayLobby2AImpl_QueryInterface, | |
| IDirectPlayLobby2AImpl_AddRef, | |
| IDirectPlayLobby2AImpl_Release, | |
| IDirectPlayLobby2AImpl_Connect, | |
| IDirectPlayLobby2AImpl_CreateAddress, | |
| IDirectPlayLobby2AImpl_EnumAddress, | |
| IDirectPlayLobby2AImpl_EnumAddressTypes, | |
| IDirectPlayLobby2AImpl_EnumLocalApplications, | |
| IDirectPlayLobby2AImpl_GetConnectionSettings, | |
| IDirectPlayLobby2AImpl_ReceiveLobbyMessage, | |
| IDirectPlayLobby2AImpl_RunApplication, | |
| IDirectPlayLobby2AImpl_SendLobbyMessage, | |
| IDirectPlayLobby2AImpl_SetConnectionSettings, | |
| IDirectPlayLobby2AImpl_SetLobbyMessageEvent, | |
| IDirectPlayLobby2AImpl_CreateCompoundAddress | |
| }; | |
| /* Direct Play Lobby 2 (unicode) Virtual Table for methods */ | |
| static ICOM_VTABLE(IDirectPlayLobby2) directPlayLobby2WVT = { | |
| IDirectPlayLobby2WImpl_QueryInterface, | |
| IDirectPlayLobby2WImpl_AddRef, | |
| IDirectPlayLobby2WImpl_Release, | |
| IDirectPlayLobby2WImpl_Connect, | |
| IDirectPlayLobby2WImpl_CreateAddress, | |
| IDirectPlayLobby2WImpl_EnumAddress, | |
| IDirectPlayLobby2WImpl_EnumAddressTypes, | |
| IDirectPlayLobby2WImpl_EnumLocalApplications, | |
| IDirectPlayLobby2WImpl_GetConnectionSettings, | |
| IDirectPlayLobby2WImpl_ReceiveLobbyMessage, | |
| IDirectPlayLobby2WImpl_RunApplication, | |
| IDirectPlayLobby2WImpl_SendLobbyMessage, | |
| IDirectPlayLobby2WImpl_SetConnectionSettings, | |
| IDirectPlayLobby2WImpl_SetLobbyMessageEvent, | |
| IDirectPlayLobby2WImpl_CreateCompoundAddress | |
| }; | |
| /*************************************************************************** | |
| * DirectPlayLobbyCreateA (DPLAYX.4) | |
| * | |
| */ | |
| HRESULT WINAPI DirectPlayLobbyCreateA( LPGUID lpGUIDDSP, | |
| LPDIRECTPLAYLOBBYA *lplpDPL, | |
| IUnknown *lpUnk, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| IDirectPlayLobbyAImpl** ilplpDPL=(IDirectPlayLobbyAImpl**)lplpDPL; | |
| TRACE(dplay,"lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n", | |
| lpGUIDDSP,ilplpDPL,lpUnk,lpData,dwDataSize); | |
| /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must | |
| * equal 0. These fields are mostly for future expansion. | |
| */ | |
| if ( lpGUIDDSP || lpUnk || lpData || dwDataSize ) | |
| { | |
| *ilplpDPL = NULL; | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Yes...really we should be returning a lobby 1 object */ | |
| *ilplpDPL = (IDirectPlayLobbyAImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( IDirectPlayLobbyAImpl ) ); | |
| if( ! (*ilplpDPL) ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| (*ilplpDPL)->lpvtbl = &directPlayLobbyAVT; | |
| (*ilplpDPL)->ref = 1; | |
| /* All fields were nulled out by the allocation */ | |
| return DP_OK; | |
| } | |
| /*************************************************************************** | |
| * DirectPlayLobbyCreateW (DPLAYX.5) | |
| * | |
| */ | |
| HRESULT WINAPI DirectPlayLobbyCreateW( LPGUID lpGUIDDSP, | |
| LPDIRECTPLAYLOBBY *lplpDPL, | |
| IUnknown *lpUnk, | |
| LPVOID lpData, | |
| DWORD dwDataSize ) | |
| { | |
| IDirectPlayLobbyImpl** ilplpDPL=(IDirectPlayLobbyImpl**)lplpDPL; | |
| TRACE(dplay,"lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n", | |
| lpGUIDDSP,ilplpDPL,lpUnk,lpData,dwDataSize); | |
| /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must | |
| * equal 0. These fields are mostly for future expansion. | |
| */ | |
| if ( lpGUIDDSP || lpUnk || lpData || dwDataSize ) | |
| { | |
| *ilplpDPL = NULL; | |
| ERR( dplay, "Bad parameters!\n" ); | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Yes...really we should bre returning a lobby 1 object */ | |
| *ilplpDPL = (IDirectPlayLobbyImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( IDirectPlayLobbyImpl ) ); | |
| if( !*ilplpDPL) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| (*ilplpDPL)->lpvtbl = &directPlayLobbyWVT; | |
| (*ilplpDPL)->ref = 1; | |
| /* All fields were nulled out by the allocation */ | |
| return DP_OK; | |
| } | |
| /*************************************************************************** | |
| * DirectPlayEnumerateA (DPLAYX.2) | |
| * | |
| * The pointer to the structure lpContext will be filled with the | |
| * appropriate data for each service offered by the OS. These services are | |
| * not necessarily available on this particular machine but are defined | |
| * as simple service providers under the "Service Providers" registry key. | |
| * This structure is then passed to lpEnumCallback for each of the different | |
| * services. | |
| * | |
| * This API is useful only for applications written using DirectX3 or | |
| * worse. It is superceeded by IDirectPlay3::EnumConnections which also | |
| * gives information on the actual connections. | |
| * | |
| * defn of a service provider: | |
| * A dynamic-link library used by DirectPlay to communicate over a network. | |
| * The service provider contains all the network-specific code required | |
| * to send and receive messages. Online services and network operators can | |
| * supply service providers to use specialized hardware, protocols, communications | |
| * media, and network resources. | |
| * | |
| * TODO: Allocate string buffer space from the heap (length from reg) | |
| * Pass real device driver numbers... | |
| * Get the GUID properly... | |
| */ | |
| HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback, | |
| LPVOID lpContext ) | |
| { | |
| HKEY hkResult; | |
| LPCSTR searchSubKey = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers"; | |
| LPSTR guidDataSubKey = "Guid"; | |
| LPSTR majVerDataSubKey = "dwReserved1"; | |
| DWORD dwIndex, sizeOfSubKeyName=50; | |
| char subKeyName[51]; | |
| TRACE( dplay, ": lpEnumCallback=%p lpContext=%p\n", lpEnumCallback, lpContext ); | |
| if( !lpEnumCallback || !*lpEnumCallback ) | |
| { | |
| return DPERR_INVALIDPARAMS; | |
| } | |
| /* Need to loop over the service providers in the registry */ | |
| if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey, | |
| 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS ) | |
| { | |
| /* Hmmm. Does this mean that there are no service providers? */ | |
| ERR(dplay, ": no service providers?\n"); | |
| return DP_OK; | |
| } | |
| /* Traverse all the service providers we have available */ | |
| for( dwIndex=0; | |
| RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != | |
| ERROR_NO_MORE_ITEMS; | |
| ++dwIndex ) | |
| { | |
| HKEY hkServiceProvider; | |
| GUID serviceProviderGUID; | |
| DWORD returnTypeGUID, returnTypeReserved1, sizeOfReturnBuffer=50; | |
| char returnBuffer[51]; | |
| DWORD majVersionNum /*, minVersionNum */; | |
| LPWSTR lpWGUIDString; | |
| TRACE( dplay, " this time through: %s\n", subKeyName ); | |
| /* Get a handle for this particular service provider */ | |
| if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE, | |
| &hkServiceProvider ) != ERROR_SUCCESS ) | |
| { | |
| ERR( dplay, ": what the heck is going on?\n" ); | |
| continue; | |
| } | |
| /* Get the GUID, Device major number and device minor number | |
| * from the registry. | |
| */ | |
| if( RegQueryValueExA( hkServiceProvider, guidDataSubKey, | |
| NULL, &returnTypeGUID, returnBuffer, | |
| &sizeOfReturnBuffer ) != ERROR_SUCCESS ) | |
| { | |
| ERR( dplay, ": missing GUID registry data members\n" ); | |
| continue; | |
| } | |
| /* FIXME: Check return types to ensure we're interpreting data right */ | |
| lpWGUIDString = HEAP_strdupAtoW( GetProcessHeap(), 0, returnBuffer ); | |
| CLSIDFromString( (LPCOLESTR)lpWGUIDString, &serviceProviderGUID ); | |
| HeapFree( GetProcessHeap(), 0, lpWGUIDString ); | |
| sizeOfReturnBuffer = 50; | |
| if( RegQueryValueExA( hkServiceProvider, majVerDataSubKey, | |
| NULL, &returnTypeReserved1, returnBuffer, | |
| &sizeOfReturnBuffer ) != ERROR_SUCCESS ) | |
| { | |
| ERR( dplay, ": missing dwReserved1 registry data members\n") ; | |
| continue; | |
| } | |
| /* FIXME: This couldn't possibly be right...*/ | |
| majVersionNum = GET_DWORD( returnBuffer ); | |
| /* The enumeration will return FALSE if we are not to continue */ | |
| if( !lpEnumCallback( &serviceProviderGUID , subKeyName, | |
| majVersionNum, (DWORD)0, lpContext ) ) | |
| { | |
| WARN( dplay, "lpEnumCallback returning FALSE\n" ); | |
| break; | |
| } | |
| } | |
| return DP_OK; | |
| } | |
| /*************************************************************************** | |
| * DirectPlayEnumerateW (DPLAYX.3) | |
| * | |
| */ | |
| HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW lpEnumCallback, LPVOID lpContext ) | |
| { | |
| FIXME( dplay, ":stub\n"); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| /*************************************************************************** | |
| * DirectPlayCreate (DPLAYX.1) (DPLAY.1) | |
| * | |
| */ | |
| HRESULT WINAPI DirectPlayCreate | |
| ( LPGUID lpGUID, LPDIRECTPLAY2 *lplpDP, IUnknown *pUnk) | |
| { | |
| TRACE(dplay,"lpGUID=%p lplpDP=%p pUnk=%p\n", lpGUID,lplpDP,pUnk); | |
| if( pUnk != NULL ) | |
| { | |
| /* Hmmm...wonder what this means! */ | |
| ERR(dplay, "What does a NULL here mean?\n" ); | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| if( IsEqualGUID( &IID_IDirectPlay2A, lpGUID ) ) | |
| { | |
| IDirectPlay2AImpl** ilplpDP=(IDirectPlay2AImpl**)lplpDP; | |
| *ilplpDP = (IDirectPlay2AImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( **ilplpDP ) ); | |
| if( !*ilplpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| (*ilplpDP)->lpvtbl = &directPlay2AVT; | |
| (*ilplpDP)->ref = 1; | |
| return DP_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlay2, lpGUID ) ) | |
| { | |
| IDirectPlay2Impl** ilplpDP=(IDirectPlay2Impl**)lplpDP; | |
| *ilplpDP = (IDirectPlay2Impl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( **ilplpDP ) ); | |
| if( !*ilplpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| (*ilplpDP)->lpvtbl = &directPlay2WVT; | |
| (*ilplpDP)->ref = 1; | |
| return DP_OK; | |
| } | |
| /* Unknown interface type */ | |
| return DPERR_NOINTERFACE; | |
| } | |
| /* Direct Play helper methods */ | |
| /* Get a new interface. To be used by QueryInterface. */ | |
| static HRESULT directPlay_QueryInterface | |
| ( REFIID riid, LPVOID* ppvObj ) | |
| { | |
| if( IsEqualGUID( &IID_IDirectPlay2, riid ) ) | |
| { | |
| IDirectPlay2Impl* lpDP = (IDirectPlay2Impl*)*ppvObj; | |
| lpDP = (IDirectPlay2Impl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDP ) ); | |
| if( !lpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| lpDP->lpvtbl = &directPlay2WVT; | |
| lpDP->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlay2A, riid ) ) | |
| { | |
| IDirectPlay2AImpl* lpDP = (IDirectPlay2AImpl*)*ppvObj; | |
| lpDP = (IDirectPlay2AImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDP ) ); | |
| if( !lpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| lpDP->lpvtbl = &directPlay2AVT; | |
| lpDP->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlay3, riid ) ) | |
| { | |
| IDirectPlay3Impl* lpDP = (IDirectPlay3Impl*)*ppvObj; | |
| lpDP = (IDirectPlay3Impl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDP ) ); | |
| if( !lpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| lpDP->lpvtbl = &directPlay3WVT; | |
| lpDP->ref = 1; | |
| return S_OK; | |
| } | |
| else if( IsEqualGUID( &IID_IDirectPlay3A, riid ) ) | |
| { | |
| IDirectPlay3AImpl* lpDP = (IDirectPlay3AImpl*)*ppvObj; | |
| lpDP = (IDirectPlay3AImpl*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof( *lpDP ) ); | |
| if( !lpDP ) | |
| { | |
| return DPERR_OUTOFMEMORY; | |
| } | |
| lpDP->lpvtbl = &directPlay3AVT; | |
| lpDP->ref = 1; | |
| return S_OK; | |
| } | |
| *ppvObj = NULL; | |
| return E_NOINTERFACE; | |
| } | |
| /* Direct Play methods */ | |
| static HRESULT WINAPI DirectPlay2W_QueryInterface | |
| ( LPDIRECTPLAY2 iface, REFIID riid, LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlay2Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlay2, riid ) | |
| ) | |
| { | |
| IDirectPlay2_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlay_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI DirectPlay2A_QueryInterface | |
| ( LPDIRECTPLAY2A iface, REFIID riid, LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlay2Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlay2A, riid ) | |
| ) | |
| { | |
| IDirectPlay2_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlay_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI DirectPlay3WImpl_QueryInterface | |
| ( LPDIRECTPLAY3 iface, REFIID riid, LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlay3, riid ) | |
| ) | |
| { | |
| IDirectPlay3_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlay_QueryInterface( riid, ppvObj ); | |
| } | |
| static HRESULT WINAPI DirectPlay3A_QueryInterface | |
| ( LPDIRECTPLAY3A iface, REFIID riid, LPVOID* ppvObj ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| TRACE( dplay, "(%p)->(%p,%p)\n", This, riid, ppvObj ); | |
| if( IsEqualGUID( &IID_IUnknown, riid ) || | |
| IsEqualGUID( &IID_IDirectPlay3A, riid ) | |
| ) | |
| { | |
| IDirectPlay3_AddRef( iface ); | |
| *ppvObj = This; | |
| return S_OK; | |
| } | |
| return directPlay_QueryInterface( riid, ppvObj ); | |
| } | |
| /* Shared between all dplay types */ | |
| static ULONG WINAPI DirectPlay3WImpl_AddRef | |
| ( LPDIRECTPLAY3 iface ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| ++(This->ref); | |
| TRACE( dplay,"ref count now %lu\n", This->ref ); | |
| return (This->ref); | |
| } | |
| static ULONG WINAPI DirectPlay3WImpl_Release | |
| ( LPDIRECTPLAY3 iface ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| TRACE( dplay, "ref count decremeneted from %lu\n", This->ref ); | |
| This->ref--; | |
| /* Deallocate if this is the last reference to the object */ | |
| if( !(This->ref) ) | |
| { | |
| FIXME( dplay, "memory leak\n" ); | |
| /* Implement memory deallocation */ | |
| HeapFree( GetProcessHeap(), 0, This ); | |
| return 0; | |
| } | |
| return This->ref; | |
| } | |
| static ULONG WINAPI DirectPlay3A_Release | |
| ( LPDIRECTPLAY3A iface ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| TRACE( dplay, "ref count decremeneted from %lu\n", This->ref ); | |
| This->ref--; | |
| /* Deallocate if this is the last reference to the object */ | |
| if( !(This->ref) ) | |
| { | |
| FIXME( dplay, "memory leak\n" ); | |
| /* Implement memory deallocation */ | |
| HeapFree( GetProcessHeap(), 0, This ); | |
| return 0; | |
| } | |
| return This->ref; | |
| } | |
| HRESULT WINAPI DirectPlay3A_AddPlayerToGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_AddPlayerToGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_Close | |
| ( LPDIRECTPLAY3A iface ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(): stub", This ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_Close | |
| ( LPDIRECTPLAY3 iface ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(): stub", This ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_CreateGroup | |
| ( LPDIRECTPLAY3A iface, LPDPID a, LPDPNAME b, LPVOID c, DWORD d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_CreateGroup | |
| ( LPDIRECTPLAY3 iface, LPDPID a, LPDPNAME b, LPVOID c, DWORD d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_CreatePlayer | |
| ( LPDIRECTPLAY3A iface, LPDPID a, LPDPNAME b, HANDLE c, LPVOID d, DWORD e, DWORD f ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e, f ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_CreatePlayer | |
| ( LPDIRECTPLAY3 iface, LPDPID a, LPDPNAME b, HANDLE c, LPVOID d, DWORD e, DWORD f ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e, f ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_DeletePlayerFromGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_DeletePlayerFromGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_DestroyGroup | |
| ( LPDIRECTPLAY3A iface, DPID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_DestroyGroup | |
| ( LPDIRECTPLAY3 iface, DPID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_DestroyPlayer | |
| ( LPDIRECTPLAY3A iface, DPID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_DestroyPlayer | |
| ( LPDIRECTPLAY3 iface, DPID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumGroupPlayers | |
| ( LPDIRECTPLAY3A iface, DPID a, LPGUID b, LPDPENUMPLAYERSCALLBACK2 c, | |
| LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumGroupPlayers | |
| ( LPDIRECTPLAY3 iface, DPID a, LPGUID b, LPDPENUMPLAYERSCALLBACK2 c, | |
| LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumGroups | |
| ( LPDIRECTPLAY3A iface, LPGUID a, LPDPENUMPLAYERSCALLBACK2 b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumGroups | |
| ( LPDIRECTPLAY3 iface, LPGUID a, LPDPENUMPLAYERSCALLBACK2 b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumPlayers | |
| ( LPDIRECTPLAY3A iface, LPGUID a, LPDPENUMPLAYERSCALLBACK2 b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumPlayers | |
| ( LPDIRECTPLAY3 iface, LPGUID a, LPDPENUMPLAYERSCALLBACK2 b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumSessions | |
| ( LPDIRECTPLAY3A iface, LPDPSESSIONDESC2 a, DWORD b, LPDPENUMSESSIONSCALLBACK2 c, | |
| LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumSessions | |
| ( LPDIRECTPLAY3 iface, LPDPSESSIONDESC2 a, DWORD b, LPDPENUMSESSIONSCALLBACK2 c, | |
| LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetCaps | |
| ( LPDIRECTPLAY3A iface, LPDPCAPS a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetCaps | |
| ( LPDIRECTPLAY3 iface, LPDPCAPS a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetGroupData | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetGroupData | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetGroupName | |
| ( LPDIRECTPLAY3A iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetGroupName | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetMessageCount | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetMessageCount | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerAddress | |
| ( LPDIRECTPLAY3A iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerAddress | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerCaps | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDPCAPS b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerCaps | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDPCAPS b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerData | |
| ( LPDIRECTPLAY3A iface, DPID a, LPVOID b, LPDWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerData | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerName | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerName | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, LPDWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetSessionDesc | |
| ( LPDIRECTPLAY3A iface, LPVOID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetSessionDesc | |
| ( LPDIRECTPLAY3 iface, LPVOID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_Initialize | |
| ( LPDIRECTPLAY3A iface, LPGUID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_Initialize | |
| ( LPDIRECTPLAY3 iface, LPGUID a ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p): stub", This, a ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_Open | |
| ( LPDIRECTPLAY3A iface, LPDPSESSIONDESC2 a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_Open | |
| ( LPDIRECTPLAY3 iface, LPDPSESSIONDESC2 a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_Receive | |
| ( LPDIRECTPLAY3A iface, LPDPID a, LPDPID b, DWORD c, LPVOID d, LPDWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,0x%08lx,%p,%p): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_Receive | |
| ( LPDIRECTPLAY3 iface, LPDPID a, LPDPID b, DWORD c, LPVOID d, LPDWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,0x%08lx,%p,%p): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_Send | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b, DWORD c, LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_Send | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b, DWORD c, LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetGroupData | |
| ( LPDIRECTPLAY3A iface, DPID a, LPVOID b, DWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetGroupData | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, DWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetGroupName | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDPNAME b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetGroupName | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDPNAME b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetPlayerData | |
| ( LPDIRECTPLAY3A iface, DPID a, LPVOID b, DWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetPlayerData | |
| ( LPDIRECTPLAY3 iface, DPID a, LPVOID b, DWORD c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetPlayerName | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDPNAME b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetPlayerName | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDPNAME b, DWORD c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,0x%08lx): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetSessionDesc | |
| ( LPDIRECTPLAY3A iface, LPDPSESSIONDESC2 a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetSessionDesc | |
| ( LPDIRECTPLAY3 iface, LPDPSESSIONDESC2 a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_AddGroupToGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_AddGroupToGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_CreateGroupInGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDPID b, LPDPNAME c, LPVOID d, DWORD e, DWORD f ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e, f ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_CreateGroupInGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDPID b, LPDPNAME c, LPVOID d, DWORD e, DWORD f ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx,0x%08lx): stub", This, a, b, c, d, e, f ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_DeleteGroupFromGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_DeleteGroupFromGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumConnections | |
| ( LPDIRECTPLAY3A iface, LPCGUID a, LPDPENUMCONNECTIONSCALLBACK b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumConnections | |
| ( LPDIRECTPLAY3 iface, LPCGUID a, LPDPENUMCONNECTIONSCALLBACK b, LPVOID c, DWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,%p,%p,0x%08lx): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_EnumGroupsInGroup | |
| ( LPDIRECTPLAY3A iface, DPID a, LPGUID b, LPDPENUMPLAYERSCALLBACK2 c, LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_EnumGroupsInGroup | |
| ( LPDIRECTPLAY3 iface, DPID a, LPGUID b, LPDPENUMPLAYERSCALLBACK2 c, LPVOID d, DWORD e ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p,%p,%p,0x%08lx): stub", This, a, b, c, d, e ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetGroupConnectionSettings | |
| ( LPDIRECTPLAY3A iface, DWORD a, DPID b, LPVOID c, LPDWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetGroupConnectionSettings | |
| ( LPDIRECTPLAY3 iface, DWORD a, DPID b, LPVOID c, LPDWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_InitializeConnection | |
| ( LPDIRECTPLAY3A iface, LPVOID a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_InitializeConnection | |
| ( LPDIRECTPLAY3 iface, LPVOID a, DWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SecureOpen | |
| ( LPDIRECTPLAY3A iface, LPCDPSESSIONDESC2 a, DWORD b, LPCDPSECURITYDESC c, LPCDPCREDENTIALS d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SecureOpen | |
| ( LPDIRECTPLAY3 iface, LPCDPSESSIONDESC2 a, DWORD b, LPCDPSECURITYDESC c, LPCDPCREDENTIALS d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(%p,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SendChatMessage | |
| ( LPDIRECTPLAY3A iface, DPID a, DPID b, DWORD c, LPDPCHAT d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SendChatMessage | |
| ( LPDIRECTPLAY3 iface, DPID a, DPID b, DWORD c, LPDPCHAT d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_SetGroupConnectionSettings | |
| ( LPDIRECTPLAY3A iface, DWORD a, DPID b, LPDPLCONNECTION c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_SetGroupConnectionSettings | |
| ( LPDIRECTPLAY3 iface, DWORD a, DPID b, LPDPLCONNECTION c ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p): stub", This, a, b, c ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_StartSession | |
| ( LPDIRECTPLAY3A iface, DWORD a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_StartSession | |
| ( LPDIRECTPLAY3 iface, DWORD a, DPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetGroupFlags | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetGroupFlags | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetGroupParent | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetGroupParent | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDPID b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerAccount | |
| ( LPDIRECTPLAY3A iface, DPID a, DWORD b, LPVOID c, LPDWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerAccount | |
| ( LPDIRECTPLAY3 iface, DPID a, DWORD b, LPVOID c, LPDWORD d ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,0x%08lx,%p,%p): stub", This, a, b, c, d ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3A_GetPlayerFlags | |
| ( LPDIRECTPLAY3A iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| HRESULT WINAPI DirectPlay3WImpl_GetPlayerFlags | |
| ( LPDIRECTPLAY3 iface, DPID a, LPDWORD b ) | |
| { | |
| ICOM_THIS(IDirectPlay3Impl,iface); | |
| FIXME( dplay,"(%p)->(0x%08lx,%p): stub", This, a, b ); | |
| return DP_OK; | |
| } | |
| /* Note: Hack so we can reuse the old functions without compiler warnings */ | |
| #if !defined(__STRICT_ANSI__) && defined(__GNUC__) | |
| # define XCAST(fun) (typeof(directPlay2WVT.fn##fun)) | |
| #else | |
| # define XCAST(fun) (void*) | |
| #endif | |
| static ICOM_VTABLE(IDirectPlay2) directPlay2WVT = { | |
| DirectPlay2W_QueryInterface, | |
| XCAST(AddRef)DirectPlay3WImpl_AddRef, | |
| XCAST(Release)DirectPlay3WImpl_Release, | |
| XCAST(AddPlayerToGroup)DirectPlay3WImpl_AddPlayerToGroup, | |
| XCAST(Close)DirectPlay3WImpl_Close, | |
| XCAST(CreateGroup)DirectPlay3WImpl_CreateGroup, | |
| XCAST(CreatePlayer)DirectPlay3WImpl_CreatePlayer, | |
| XCAST(DeletePlayerFromGroup)DirectPlay3WImpl_DeletePlayerFromGroup, | |
| XCAST(DestroyGroup)DirectPlay3WImpl_DestroyGroup, | |
| XCAST(DestroyPlayer)DirectPlay3WImpl_DestroyPlayer, | |
| XCAST(EnumGroupPlayers)DirectPlay3WImpl_EnumGroupPlayers, | |
| XCAST(EnumGroups)DirectPlay3WImpl_EnumGroups, | |
| XCAST(EnumPlayers)DirectPlay3WImpl_EnumPlayers, | |
| XCAST(EnumSessions)DirectPlay3WImpl_EnumSessions, | |
| XCAST(GetCaps)DirectPlay3WImpl_GetCaps, | |
| XCAST(GetGroupData)DirectPlay3WImpl_GetGroupData, | |
| XCAST(GetGroupName)DirectPlay3WImpl_GetGroupName, | |
| XCAST(GetMessageCount)DirectPlay3WImpl_GetMessageCount, | |
| XCAST(GetPlayerAddress)DirectPlay3WImpl_GetPlayerAddress, | |
| XCAST(GetPlayerCaps)DirectPlay3WImpl_GetPlayerCaps, | |
| XCAST(GetPlayerData)DirectPlay3WImpl_GetPlayerData, | |
| XCAST(GetPlayerName)DirectPlay3WImpl_GetPlayerName, | |
| XCAST(GetSessionDesc)DirectPlay3WImpl_GetSessionDesc, | |
| XCAST(Initialize)DirectPlay3WImpl_Initialize, | |
| XCAST(Open)DirectPlay3WImpl_Open, | |
| XCAST(Receive)DirectPlay3WImpl_Receive, | |
| XCAST(Send)DirectPlay3WImpl_Send, | |
| XCAST(SetGroupData)DirectPlay3WImpl_SetGroupData, | |
| XCAST(SetGroupName)DirectPlay3WImpl_SetGroupName, | |
| XCAST(SetPlayerData)DirectPlay3WImpl_SetPlayerData, | |
| XCAST(SetPlayerName)DirectPlay3WImpl_SetPlayerName, | |
| XCAST(SetSessionDesc)DirectPlay3WImpl_SetSessionDesc | |
| }; | |
| #undef XCAST | |
| /* Note: Hack so we can reuse the old functions without compiler warnings */ | |
| #if !defined(__STRICT_ANSI__) && defined(__GNUC__) | |
| # define XCAST(fun) (typeof(directPlay2AVT.fn##fun)) | |
| #else | |
| # define XCAST(fun) (void*) | |
| #endif | |
| static ICOM_VTABLE(IDirectPlay2) directPlay2AVT = { | |
| DirectPlay2A_QueryInterface, | |
| XCAST(AddRef)DirectPlay3WImpl_AddRef, | |
| XCAST(Release)DirectPlay3A_Release, | |
| XCAST(AddPlayerToGroup)DirectPlay3A_AddPlayerToGroup, | |
| XCAST(Close)DirectPlay3A_Close, | |
| XCAST(CreateGroup)DirectPlay3A_CreateGroup, | |
| XCAST(CreatePlayer)DirectPlay3A_CreatePlayer, | |
| XCAST(DeletePlayerFromGroup)DirectPlay3A_DeletePlayerFromGroup, | |
| XCAST(DestroyGroup)DirectPlay3A_DestroyGroup, | |
| XCAST(DestroyPlayer)DirectPlay3A_DestroyPlayer, | |
| XCAST(EnumGroupPlayers)DirectPlay3A_EnumGroupPlayers, | |
| XCAST(EnumGroups)DirectPlay3A_EnumGroups, | |
| XCAST(EnumPlayers)DirectPlay3A_EnumPlayers, | |
| XCAST(EnumSessions)DirectPlay3A_EnumSessions, | |
| XCAST(GetCaps)DirectPlay3A_GetCaps, | |
| XCAST(GetGroupData)DirectPlay3A_GetGroupData, | |
| XCAST(GetGroupName)DirectPlay3A_GetGroupName, | |
| XCAST(GetMessageCount)DirectPlay3A_GetMessageCount, | |
| XCAST(GetPlayerAddress)DirectPlay3A_GetPlayerAddress, | |
| XCAST(GetPlayerCaps)DirectPlay3A_GetPlayerCaps, | |
| XCAST(GetPlayerData)DirectPlay3A_GetPlayerData, | |
| XCAST(GetPlayerName)DirectPlay3A_GetPlayerName, | |
| XCAST(GetSessionDesc)DirectPlay3A_GetSessionDesc, | |
| XCAST(Initialize)DirectPlay3A_Initialize, | |
| XCAST(Open)DirectPlay3A_Open, | |
| XCAST(Receive)DirectPlay3A_Receive, | |
| XCAST(Send)DirectPlay3A_Send, | |
| XCAST(SetGroupData)DirectPlay3A_SetGroupData, | |
| XCAST(SetGroupName)DirectPlay3A_SetGroupName, | |
| XCAST(SetPlayerData)DirectPlay3A_SetPlayerData, | |
| XCAST(SetPlayerName)DirectPlay3A_SetPlayerName, | |
| XCAST(SetSessionDesc)DirectPlay3A_SetSessionDesc | |
| }; | |
| #undef XCAST | |
| static ICOM_VTABLE(IDirectPlay3) directPlay3AVT = { | |
| DirectPlay3A_QueryInterface, | |
| DirectPlay3WImpl_AddRef, | |
| DirectPlay3A_Release, | |
| DirectPlay3A_AddPlayerToGroup, | |
| DirectPlay3A_Close, | |
| DirectPlay3A_CreateGroup, | |
| DirectPlay3A_CreatePlayer, | |
| DirectPlay3A_DeletePlayerFromGroup, | |
| DirectPlay3A_DestroyGroup, | |
| DirectPlay3A_DestroyPlayer, | |
| DirectPlay3A_EnumGroupPlayers, | |
| DirectPlay3A_EnumGroups, | |
| DirectPlay3A_EnumPlayers, | |
| DirectPlay3A_EnumSessions, | |
| DirectPlay3A_GetCaps, | |
| DirectPlay3A_GetGroupData, | |
| DirectPlay3A_GetGroupName, | |
| DirectPlay3A_GetMessageCount, | |
| DirectPlay3A_GetPlayerAddress, | |
| DirectPlay3A_GetPlayerCaps, | |
| DirectPlay3A_GetPlayerData, | |
| DirectPlay3A_GetPlayerName, | |
| DirectPlay3A_GetSessionDesc, | |
| DirectPlay3A_Initialize, | |
| DirectPlay3A_Open, | |
| DirectPlay3A_Receive, | |
| DirectPlay3A_Send, | |
| DirectPlay3A_SetGroupData, | |
| DirectPlay3A_SetGroupName, | |
| DirectPlay3A_SetPlayerData, | |
| DirectPlay3A_SetPlayerName, | |
| DirectPlay3A_SetSessionDesc, | |
| DirectPlay3A_AddGroupToGroup, | |
| DirectPlay3A_CreateGroupInGroup, | |
| DirectPlay3A_DeleteGroupFromGroup, | |
| DirectPlay3A_EnumConnections, | |
| DirectPlay3A_EnumGroupsInGroup, | |
| DirectPlay3A_GetGroupConnectionSettings, | |
| DirectPlay3A_InitializeConnection, | |
| DirectPlay3A_SecureOpen, | |
| DirectPlay3A_SendChatMessage, | |
| DirectPlay3A_SetGroupConnectionSettings, | |
| DirectPlay3A_StartSession, | |
| DirectPlay3A_GetGroupFlags, | |
| DirectPlay3A_GetGroupParent, | |
| DirectPlay3A_GetPlayerAccount, | |
| DirectPlay3A_GetPlayerFlags | |
| }; | |
| static ICOM_VTABLE(IDirectPlay3) directPlay3WVT = { | |
| DirectPlay3WImpl_QueryInterface, | |
| DirectPlay3WImpl_AddRef, | |
| DirectPlay3WImpl_Release, | |
| DirectPlay3WImpl_AddPlayerToGroup, | |
| DirectPlay3WImpl_Close, | |
| DirectPlay3WImpl_CreateGroup, | |
| DirectPlay3WImpl_CreatePlayer, | |
| DirectPlay3WImpl_DeletePlayerFromGroup, | |
| DirectPlay3WImpl_DestroyGroup, | |
| DirectPlay3WImpl_DestroyPlayer, | |
| DirectPlay3WImpl_EnumGroupPlayers, | |
| DirectPlay3WImpl_EnumGroups, | |
| DirectPlay3WImpl_EnumPlayers, | |
| DirectPlay3WImpl_EnumSessions, | |
| DirectPlay3WImpl_GetCaps, | |
| DirectPlay3WImpl_GetGroupData, | |
| DirectPlay3WImpl_GetGroupName, | |
| DirectPlay3WImpl_GetMessageCount, | |
| DirectPlay3WImpl_GetPlayerAddress, | |
| DirectPlay3WImpl_GetPlayerCaps, | |
| DirectPlay3WImpl_GetPlayerData, | |
| DirectPlay3WImpl_GetPlayerName, | |
| DirectPlay3WImpl_GetSessionDesc, | |
| DirectPlay3WImpl_Initialize, | |
| DirectPlay3WImpl_Open, | |
| DirectPlay3WImpl_Receive, | |
| DirectPlay3WImpl_Send, | |
| DirectPlay3WImpl_SetGroupData, | |
| DirectPlay3WImpl_SetGroupName, | |
| DirectPlay3WImpl_SetPlayerData, | |
| DirectPlay3WImpl_SetPlayerName, | |
| DirectPlay3WImpl_SetSessionDesc, | |
| DirectPlay3WImpl_AddGroupToGroup, | |
| DirectPlay3WImpl_CreateGroupInGroup, | |
| DirectPlay3WImpl_DeleteGroupFromGroup, | |
| DirectPlay3WImpl_EnumConnections, | |
| DirectPlay3WImpl_EnumGroupsInGroup, | |
| DirectPlay3WImpl_GetGroupConnectionSettings, | |
| DirectPlay3WImpl_InitializeConnection, | |
| DirectPlay3WImpl_SecureOpen, | |
| DirectPlay3WImpl_SendChatMessage, | |
| DirectPlay3WImpl_SetGroupConnectionSettings, | |
| DirectPlay3WImpl_StartSession, | |
| DirectPlay3WImpl_GetGroupFlags, | |
| DirectPlay3WImpl_GetGroupParent, | |
| DirectPlay3WImpl_GetPlayerAccount, | |
| DirectPlay3WImpl_GetPlayerFlags | |
| }; |