diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 73aa7d4..3f69569 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -36,6 +36,10 @@ ok( (expected) == (result), \ "expected=%s got=%s\n", \ dpResult2str(expected), dpResult2str(result) ); +#define checkStr(expected, result) \ + ok( (result != NULL) && (!strcmp(expected, result)), \ + "expected=%s got=%s\n", \ + expected, result ); #define checkFlags(expected, result, flags) \ ok( (expected) == (result), \ "expected=0x%08x(%s) got=0x%08x(%s)\n", \ @@ -534,6 +538,85 @@ static LPCSTR dwFlags2str(DWORD dwFlags, DWORD flagType) return flags; } +static char dpid2char(DPID* dpid, DWORD dpidSize, DPID idPlayer) +{ + UINT i; + if ( idPlayer == DPID_SYSMSG ) + return 'S'; + for (i=0; idwCounter1: Number of messages received. + * callbackData->szTrace1: Traces for sender and receiver. + * We store the position a dpid holds in the dpid array. + * Example: + * + * trace string: "01,02,03,14" + * expanded: [ '01', '02', '03', '14' ] + * \ \ \ \ + * \ \ \ ) message 3: from 1 to 4 + * \ \ ) message 2: from 0 to 3 + * \ ) message 1: from 0 to 2 + * ) message 0: from 0 to 1 + * + * In general terms: + * sender of message i = character in place 3*i of the array + * receiver of message i = character in place 3*i+1 of the array + * + * A sender value of 'S' means DPID_SYSMSG, this is, a system message. + * + * callbackData->szTrace2: Traces for message sizes. + */ + + DPID idFrom, idTo; + UINT i; + DWORD dwDataSize = 1024; + LPVOID lpData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwDataSize ); + HRESULT hr; + char temp[5]; + + callbackData->szTrace2[0] = '\0'; + + i = 0; + while ( DP_OK == (hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0, + lpData, &dwDataSize )) ) + { + + callbackData->szTrace1[ 3*i ] = dpid2char( dpid, dpidSize, idFrom ); + callbackData->szTrace1[ 3*i+1 ] = dpid2char( dpid, dpidSize, idTo ); + callbackData->szTrace1[ 3*i+2 ] = ','; + + sprintf( temp, "%d,", dwDataSize ); + strcat( callbackData->szTrace2, temp ); + + dwDataSize = 1024; + ++i; + } + + checkHR( DPERR_NOMESSAGES, hr ); + + callbackData->szTrace1[ 3*i ] = '\0'; + callbackData->dwCounter1 = i; + + + HeapFree( GetProcessHeap(), 0, lpData ); +} + static void init_TCPIP_provider( LPDIRECTPLAY4 pDP, LPCSTR strIPAddressString, WORD port ) @@ -584,6 +667,31 @@ static void init_TCPIP_provider( LPDIRECTPLAY4 pDP, } +static BOOL FAR PASCAL EnumSessions_cb_join( LPCDPSESSIONDESC2 lpThisSD, + LPDWORD lpdwTimeOut, + DWORD dwFlags, + LPVOID lpContext ) +{ + LPDIRECTPLAY4 pDP = (LPDIRECTPLAY4) lpContext; + DPSESSIONDESC2 dpsd; + HRESULT hr; + + if (dwFlags & DPESC_TIMEDOUT) + { + return FALSE; + } + + ZeroMemory( &dpsd, sizeof(DPSESSIONDESC2) ); + dpsd.dwSize = sizeof(DPSESSIONDESC2); + dpsd.guidApplication = appGuid; + dpsd.guidInstance = lpThisSD->guidInstance; + + hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN ); + checkHR( DP_OK, hr ); + + return TRUE; +} + /* DirectPlayCreate */ @@ -1475,6 +1583,182 @@ static void test_EnumSessions() } +/* SetSessionDesc + GetSessionDesc */ + +static void test_SessionDesc() +{ + + LPDIRECTPLAY4 pDP[2]; + DPSESSIONDESC2 dpsd; + LPDPSESSIONDESC2 lpData[2]; + LPVOID lpDataMsg; + DPID dpid[2]; + DWORD dwDataSize; + HRESULT hr; + UINT i; + CallbackData callbackData; + + + for (i=0; i<2; i++) + { + CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_ALL, + &IID_IDirectPlay4A, (LPVOID*) &pDP[i] ); + } + ZeroMemory( &dpsd, sizeof(DPSESSIONDESC2) ); + + /* Service provider not initialized */ + hr = IDirectPlayX_SetSessionDesc( pDP[0], NULL, 0 ); + checkHR( DPERR_UNINITIALIZED, hr ); + + hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, NULL ); + checkHR( DPERR_UNINITIALIZED, hr ); + + + init_TCPIP_provider( pDP[0], "127.0.0.1", 0 ); + init_TCPIP_provider( pDP[1], "127.0.0.1", 0 ); + + + /* No sessions open */ + hr = IDirectPlayX_SetSessionDesc( pDP[0], NULL, 0 ); + todo_wine checkHR( DPERR_NOSESSIONS, hr ); + + if ( hr == DPERR_UNINITIALIZED ) + { + skip("Get/SetSessionDesc not implemented\n"); + return; + } + + hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, NULL ); + checkHR( DPERR_NOSESSIONS, hr ); + + + dpsd.dwSize = sizeof(DPSESSIONDESC2); + dpsd.guidApplication = appGuid; + dpsd.dwMaxPlayers = 10; + + + /* Host */ + IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE ); + /* Peer */ + IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join, + (LPVOID)pDP[1], 0 ); + + for (i=0; i<2; i++) + { + /* Players, only to receive messages */ + IDirectPlayX_CreatePlayer( pDP[i], &dpid[i], NULL, NULL, NULL, 0, 0 ); + + lpData[i] = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 1024 ); + } + lpDataMsg = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 1024 ); + + + /* Incorrect parameters */ + hr = IDirectPlayX_SetSessionDesc( pDP[0], NULL, 0 ); + checkHR( DPERR_INVALIDPARAMS, hr ); + hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, NULL ); + checkHR( DPERR_INVALIDPARAM, hr ); + hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], NULL ); + checkHR( DPERR_INVALIDPARAM, hr ); + dwDataSize=-1; + hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], &dwDataSize ); + checkHR( DPERR_INVALIDPARAMS, hr ); + check( -1, dwDataSize ); + + /* Get: Insufficient buffer size */ + dwDataSize=0; + hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], &dwDataSize ); + checkHR( DPERR_BUFFERTOOSMALL, hr ); + check( dpsd.dwSize, dwDataSize ); + dwDataSize=4; + hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], &dwDataSize ); + checkHR( DPERR_BUFFERTOOSMALL, hr ); + check( dpsd.dwSize, dwDataSize ); + dwDataSize=1024; + hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, &dwDataSize ); + checkHR( DPERR_BUFFERTOOSMALL, hr ); + check( dpsd.dwSize, dwDataSize ); + + /* Get: Regular operation + * i=0: Local session + * i=1: Remote session */ + for (i=0; i<2; i++) + { + hr = IDirectPlayX_GetSessionDesc( pDP[i], lpData[i], &dwDataSize ); + checkHR( DP_OK, hr ); + check( sizeof(DPSESSIONDESC2), dwDataSize ); + check( sizeof(DPSESSIONDESC2), lpData[i]->dwSize ); + checkGuid( &appGuid, &lpData[i]->guidApplication ); + check( dpsd.dwMaxPlayers, lpData[i]->dwMaxPlayers ); + } + + checkGuid( &lpData[0]->guidInstance, &lpData[1]->guidInstance ); + + /* Set: Regular operation */ + dpsd.lpszSessionNameA = (LPSTR) "Wahaa"; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + + dwDataSize = 1024; + hr = IDirectPlayX_GetSessionDesc( pDP[1], lpData[1], &dwDataSize ); + checkHR( DP_OK, hr ); + checkStr( dpsd.lpszSessionNameA, lpData[1]->lpszSessionNameA ); + + + /* Set: Failing to modify a remote session */ + hr = IDirectPlayX_SetSessionDesc( pDP[1], &dpsd, 0 ); + checkHR( DPERR_ACCESSDENIED, hr ); + + /* Trying to change inmutable properties */ + /* Flags */ + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + dpsd.dwFlags = DPSESSION_SECURESERVER; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DPERR_INVALIDPARAMS, hr ); + dpsd.dwFlags = 0; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + /* Size */ + dpsd.dwSize = 2048; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DPERR_INVALIDPARAMS, hr ); + dpsd.dwSize = sizeof(DPSESSIONDESC2); + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + + /* Changing the GUIDs and size is ignored */ + dpsd.guidApplication = appGuid2; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + dpsd.guidInstance = appGuid2; + hr = IDirectPlayX_SetSessionDesc( pDP[0], &dpsd, 0 ); + checkHR( DP_OK, hr ); + + hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], &dwDataSize ); + checkHR( DP_OK, hr ); + checkGuid( &appGuid, &lpData[0]->guidApplication ); + checkGuid( &lpData[1]->guidInstance, &lpData[0]->guidInstance ); + check( sizeof(DPSESSIONDESC2), lpData[0]->dwSize ); + + + /* Checking system messages */ + check_messages( pDP[0], dpid, 2, &callbackData ); + checkStr( "S0,S0,S0,S0,S0,S0,S0,", callbackData.szTrace1 ); + checkStr( "48,90,90,90,90,90,90,", callbackData.szTrace2 ); + check_messages( pDP[1], dpid, 2, &callbackData ); + checkStr( "S1,S1,S1,S1,S1,S1,", callbackData.szTrace1 ); + checkStr( "90,90,90,90,90,90,", callbackData.szTrace2 ); + + for (i=0; i<2; i++) + { + HeapFree( GetProcessHeap(), 0, lpData[i] ); + IDirectPlayX_Release( pDP[i] ); + } + +} + START_TEST(dplayx) { @@ -1487,6 +1771,7 @@ START_TEST(dplayx) test_GetCaps(); test_Open(); test_EnumSessions(); + test_SessionDesc(); CoUninitialize(); }