/* Direct Play 3 and Direct Play Lobby 2 Implementation * * Copyright 1998,1999 - Peter Hunnisett * * * */ #include #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 };