diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 9a85933..e90b5ca 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1409,6 +1409,10 @@ static HRESULT WINAPI DP_IF_CreatePlayer TRACE( "(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } if( dwFlags == 0 ) { diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 8077f5f..73aa7d4 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -28,6 +28,10 @@ ok( (expected) == (result), \ "expected=%d got=%d\n", \ expected, result ); +#define checkLP(expected, result) \ + ok( (expected) == (result), \ + "expected=%p got=%p\n", \ + expected, result ); #define checkHR(expected, result) \ ok( (expected) == (result), \ "expected=%s got=%s\n", \ @@ -44,6 +48,7 @@ DEFINE_GUID(appGuid, 0xbdcfe03e, 0xf0ec, 0x415b, 0x82, 0x11, 0x6f, 0x86, 0xd8, 0x19, 0x7f, 0xe1); +DEFINE_GUID(appGuid2, 0x93417d3f, 0x7d26, 0x46ba, 0xb5, 0x76, 0xfe, 0x4b, 0x20, 0xbb, 0xad, 0x70); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); @@ -1038,6 +1043,438 @@ static void test_Open() } +/* EnumSessions */ + +static BOOL FAR PASCAL EnumSessions_cb( LPCDPSESSIONDESC2 lpThisSD, + LPDWORD lpdwTimeOut, + DWORD dwFlags, + LPVOID lpContext ) +{ + lpCallbackData callbackData = (lpCallbackData) lpContext; + callbackData->dwCounter1++; + + if ( dwFlags & DPESC_TIMEDOUT ) + { + check( TRUE, lpThisSD == NULL ); + return FALSE; + } + check( FALSE, lpThisSD == NULL ); + + + if ( lpThisSD->lpszPasswordA != NULL ) + { + check( TRUE, (lpThisSD->dwFlags & DPSESSION_PASSWORDREQUIRED) != 0 ); + } + + if ( lpThisSD->dwFlags & DPSESSION_NEWPLAYERSDISABLED ) + { + check( 0, lpThisSD->dwCurrentPlayers ); + } + + check( sizeof(*lpThisSD), lpThisSD->dwSize ); + checkLP( NULL, lpThisSD->lpszPasswordA ); + + return TRUE; +} + +static LPDIRECTPLAY4 create_session(DPSESSIONDESC2 *lpdpsd) +{ + + LPDIRECTPLAY4 pDP; + DPNAME name; + DPID dpid; + HRESULT hr; + + CoInitialize(NULL); + + CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_ALL, + &IID_IDirectPlay4A, (LPVOID*) &pDP ); + + init_TCPIP_provider( pDP, "127.0.0.1", 0 ); + + hr = IDirectPlayX_Open( pDP, lpdpsd, DPOPEN_CREATE ); + todo_wine checkHR( DP_OK, hr ); + + if ( ! (lpdpsd->dwFlags & DPSESSION_NEWPLAYERSDISABLED) ) + { + ZeroMemory( &name, sizeof(DPNAME) ); + name.dwSize = sizeof(DPNAME); + name.lpszShortNameA = (LPSTR) "bofh"; + + hr = IDirectPlayX_CreatePlayer( pDP, &dpid, &name, NULL, NULL, + 0, DPPLAYER_SERVERPLAYER ); + todo_wine checkHR( DP_OK, hr ); + } + + return pDP; + +} + +static void test_EnumSessions() +{ + +#define N_SESSIONS 6 + + LPDIRECTPLAY4 pDP, pDPserver[N_SESSIONS]; + DPSESSIONDESC2 dpsd, dpsd_server[N_SESSIONS]; + CallbackData callbackData; + HRESULT hr; + UINT i; + + + CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_ALL, + &IID_IDirectPlay4A, (LPVOID*) &pDP ); + ZeroMemory( &dpsd, sizeof(DPSESSIONDESC2) ); + callbackData.dwCounter1 = -1; /* So that after a call to EnumSessions + we get the exact number of sessions */ + callbackData.dwFlags = 0; + + + /* Service provider not initialized */ + hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb, + (LPVOID) &callbackData, 0 ); + checkHR( DPERR_UNINITIALIZED, hr ); + + + init_TCPIP_provider( pDP, "127.0.0.1", 0 ); + + + /* Session with no size */ + hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb, + (LPVOID) &callbackData, 0 ); + todo_wine checkHR( DPERR_INVALIDPARAMS, hr ); + + if ( hr == DPERR_UNINITIALIZED ) + { + skip( "EnumSessions not implemented\n" ); + return; + } + + dpsd.dwSize = sizeof(DPSESSIONDESC2); + + + /* No sessions */ + callbackData.dwCounter1 = -1; + hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb, + (LPVOID) &callbackData, 0 ); + checkHR( DP_OK, hr ); + check( 0, callbackData.dwCounter1 ); + + + dpsd.guidApplication = appGuid; + + /* Set up sessions */ + for (i=0; i