From: Anton Baskanov <baskanov(a)gmail.com> --- dlls/dplayx/dplay.c | 39 +++++++++++++++----------- dlls/dplayx/name_server.c | 18 ++++++++++-- dlls/dplayx/name_server.h | 2 +- dlls/dplayx/tests/dplayx.c | 57 +++++++++++++++++--------------------- 4 files changed, 65 insertions(+), 51 deletions(-) diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index acfadd7463a..13beb86ea3e 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -2801,7 +2801,8 @@ static BOOL DP_InvokeEnumSessionCallbacks ( LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, LPVOID lpNSInfo, DWORD *timeout, - LPVOID lpContext ) + LPVOID lpContext, + BOOL ansi ) { LPDPSESSIONDESC2 lpSessionDesc; @@ -2809,7 +2810,7 @@ static BOOL DP_InvokeEnumSessionCallbacks /* Enumerate all sessions */ /* FIXME: Need to indicate ANSI */ - while( (lpSessionDesc = NS_WalkSessions( lpNSInfo, NULL ) ) != NULL ) + while( (lpSessionDesc = NS_WalkSessions( lpNSInfo, NULL, ansi ) ) != NULL ) { TRACE( "EnumSessionsCallback2 invoked\n" ); if( !lpEnumSessionsCallback2( lpSessionDesc, timeout, 0, lpContext ) ) @@ -2921,18 +2922,10 @@ static HRESULT WINAPI IDirectPlay3Impl_EnumSessions( IDirectPlay3 *iface, DPSESS context, flags ); } -static HRESULT WINAPI IDirectPlay4AImpl_EnumSessions( IDirectPlay4A *iface, DPSESSIONDESC2 *sdesc, - DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags ) -{ - IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); - return IDirectPlayX_EnumSessions( &This->IDirectPlay4_iface, sdesc, timeout, enumsessioncb, - context, flags ); -} - -static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESSIONDESC2 *sdesc, - DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags ) +static HRESULT DP_IF_EnumSessions( IDirectPlayImpl *This, DPSESSIONDESC2 *sdesc, + DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags, + BOOL ansi ) { - IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); EnumSessionAsyncCallbackData *data; WCHAR *password = NULL; DWORD defaultTimeout; @@ -2999,7 +2992,7 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESS return DP_OK; } - password = DP_DuplicateString( sdesc->lpszPassword, FALSE, TRUE ); + password = DP_DuplicateString( sdesc->lpszPassword, FALSE, ansi ); if ( !password && sdesc->lpszPassword ) return DPERR_OUTOFMEMORY; @@ -3033,7 +3026,7 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESS LeaveCriticalSection( &This->lock ); if ( !DP_InvokeEnumSessionCallbacks( enumsessioncb, This->dp2->lpNameServerData, &timeout, - context ) ) + context, ansi ) ) break; } @@ -3097,6 +3090,20 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESS return DP_OK; } +static HRESULT WINAPI IDirectPlay4AImpl_EnumSessions( IDirectPlay4A *iface, DPSESSIONDESC2 *sdesc, + DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); + return DP_IF_EnumSessions( This, sdesc, timeout, enumsessioncb, context, flags, TRUE ); +} + +static HRESULT WINAPI IDirectPlay4Impl_EnumSessions( IDirectPlay4 *iface, DPSESSIONDESC2 *sdesc, + DWORD timeout, LPDPENUMSESSIONSCALLBACK2 enumsessioncb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); + return DP_IF_EnumSessions( This, sdesc, timeout, enumsessioncb, context, flags, FALSE ); +} + static HRESULT WINAPI IDirectPlay2AImpl_GetCaps( IDirectPlay2A *iface, DPCAPS *caps, DWORD flags ) { IDirectPlayImpl *This = impl_from_IDirectPlay2A( iface ); @@ -3775,7 +3782,7 @@ static HRESULT DP_SecureOpen( IDirectPlayImpl *This, const DPSESSIONDESC2 *lpsd, for ( ;; ) { - sessionDesc = NS_WalkSessions( This->dp2->lpNameServerData, &spMessageHeader ); + sessionDesc = NS_WalkSessions( This->dp2->lpNameServerData, &spMessageHeader, bAnsi ); if ( !sessionDesc ) return DPERR_NOSESSIONS; if ( IsEqualGUID( &sessionDesc->guidInstance, &lpsd->guidInstance ) ) diff --git a/dlls/dplayx/name_server.c b/dlls/dplayx/name_server.c index 755288a4e57..113b8f0377b 100644 --- a/dlls/dplayx/name_server.c +++ b/dlls/dplayx/name_server.c @@ -48,6 +48,7 @@ struct NSCacheData DWORD dwTime; /* Time at which data was last known valid */ LPDPSESSIONDESC2 data; + LPDPSESSIONDESC2 dataA; LPVOID lpNSAddrHdr; @@ -135,7 +136,7 @@ void NS_AddRemoteComputerAsNameServer( LPCVOID lpcNSAddrHdr dpsd.lpszSessionName = (WCHAR *) (lpcMsg + 1); dpsd.lpszPassword = NULL; - lpCacheNode->data = DP_DuplicateSessionDesc( &dpsd, TRUE, FALSE ); + lpCacheNode->data = DP_DuplicateSessionDesc( &dpsd, FALSE, FALSE ); if( lpCacheNode->data == NULL ) { @@ -144,6 +145,16 @@ void NS_AddRemoteComputerAsNameServer( LPCVOID lpcNSAddrHdr return; } + lpCacheNode->dataA = DP_DuplicateSessionDesc( &dpsd, TRUE, FALSE ); + + if( lpCacheNode->dataA == NULL ) + { + ERR( "no memory for SESSIONDESC2\n" ); + free( lpCacheNode->data ); + free( lpCacheNode ); + return; + } + lpCacheNode->ref = 1; lpCacheNode->dwTime = timeGetTime(); @@ -213,6 +224,7 @@ static DPQ_DECL_DELETECB( cbReleaseNSNode, lpNSCacheData ) if ( ref ) return; + free( elem->dataA ); free( elem->data ); free( elem->lpNSAddrHdr ); free( elem ); @@ -280,7 +292,7 @@ void NS_ResetSessionEnumeration( LPVOID lpNSInfo ) ((lpNSCache)lpNSInfo)->present = ((lpNSCache)lpNSInfo)->walkFirst.lpQHFirst; } -LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo, void **spMessageHeader ) +LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo, void **spMessageHeader, BOOL ansi ) { LPDPSESSIONDESC2 lpSessionDesc; lpNSCache lpCache = (lpNSCache)lpNSInfo; @@ -291,7 +303,7 @@ LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo, void **spMessageHeader ) return NULL; } - lpSessionDesc = lpCache->present->data; + lpSessionDesc = ansi ? lpCache->present->dataA : lpCache->present->data; if( spMessageHeader ) *spMessageHeader = lpCache->present->lpNSAddrHdr; diff --git a/dlls/dplayx/name_server.h b/dlls/dplayx/name_server.h index ad51a550b9c..2dbbad1b971 100644 --- a/dlls/dplayx/name_server.h +++ b/dlls/dplayx/name_server.h @@ -53,7 +53,7 @@ void NS_InvalidateSessionCache( LPVOID lpNSInfo ); void NS_ResetSessionEnumeration( LPVOID lpNSInfo ); -LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo, void **spMessageHeader ); +LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo, void **spMessageHeader, BOOL ansi ); void NS_PruneSessionCache( LPVOID lpNSInfo ); #endif /* __WINE_DPLAYX_NAMESERVER */ diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 93f0dea9d66..3efae753408 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -1176,11 +1176,10 @@ static void checkNoMoreMessages_( int line, SOCKET sock ) ok_( __FILE__, line )( !wsResult || wsResult == SOCKET_ERROR, "recv() returned %d.\n", wsResult ); } -#define checkSpHeader( header, expectedSize, sizeTodo ) checkSpHeader_( __LINE__, header, expectedSize, sizeTodo ) -static unsigned short checkSpHeader_( int line, SpHeader *header, DWORD expectedSize, BOOL sizeTodo ) +#define checkSpHeader( header, expectedSize ) checkSpHeader_( __LINE__, header, expectedSize ) +static unsigned short checkSpHeader_( int line, SpHeader *header, DWORD expectedSize ) { - todo_wine_if( sizeTodo ) - ok_( __FILE__, line )( header->mixed == 0xfab00000 + expectedSize, "got mixed %#lx.\n", header->mixed ); + ok_( __FILE__, line )( header->mixed == 0xfab00000 + expectedSize, "got mixed %#lx.\n", header->mixed ); ok_( __FILE__, line )( header->addr.sin_family == AF_INET, "got family %d.\n", header->addr.sin_family ); ok_( __FILE__, line )( 2300 <= ntohs( header->addr.sin_port ) && ntohs( header->addr.sin_port ) < 2350, "got port %d.\n", ntohs( header->addr.sin_port ) ); @@ -1250,11 +1249,10 @@ static void checkGameMessage_( int line, GameMessage *message, DPID expectedFrom ok_( __FILE__, line )( message->toId == expectedToId, "got destination id %#lx.\n", message->toId ); } -#define receiveEnumSessionsRequest( sock, expectedAppGuid, expectedPassword, expectedFlags, passwordTodo ) \ - receiveEnumSessionsRequest_( __LINE__, sock, expectedAppGuid, expectedPassword, expectedFlags, passwordTodo ) +#define receiveEnumSessionsRequest( sock, expectedAppGuid, expectedPassword, expectedFlags ) \ + receiveEnumSessionsRequest_( __LINE__, sock, expectedAppGuid, expectedPassword, expectedFlags ) static unsigned short receiveEnumSessionsRequest_( int line, SOCKET sock, const GUID *expectedAppGuid, - const WCHAR *expectedPassword, DWORD expectedFlags, - BOOL passwordTodo ) + const WCHAR *expectedPassword, DWORD expectedFlags ) { #include "pshpack1.h" struct @@ -1273,11 +1271,11 @@ static unsigned short receiveEnumSessionsRequest_( int line, SOCKET sock, const expectedSize = sizeof( request.spHeader ) + sizeof( request.request ) + expectedPasswordSize; wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); - todo_wine_if( passwordTodo ) ok_( __FILE__, line )( wsResult == expectedSize, "recv() returned %d.\n", wsResult ); + ok_( __FILE__, line )( wsResult == expectedSize, "recv() returned %d.\n", wsResult ); if ( wsResult == SOCKET_ERROR ) return 0; - port = checkSpHeader_( line, &request.spHeader, expectedSize, passwordTodo ); + port = checkSpHeader_( line, &request.spHeader, expectedSize ); checkMessageHeader_( line, &request.request.header, 2 ); ok_( __FILE__, line )( IsEqualGUID( &request.request.appGuid, expectedAppGuid ), "got app guid %s.\n", wine_dbgstr_guid( &request.request.appGuid ) ); @@ -1285,9 +1283,8 @@ static unsigned short receiveEnumSessionsRequest_( int line, SOCKET sock, const { ok_( __FILE__, line )( request.request.passwordOffset == 32, "got password offset %lu.\n", request.request.passwordOffset ); - todo_wine_if( passwordTodo ) - ok_( __FILE__, line )( !lstrcmpW( request.password, expectedPassword ), "got password %s.\n", - wine_dbgstr_w( request.password ) ); + ok_( __FILE__, line )( !lstrcmpW( request.password, expectedPassword ), "got password %s.\n", + wine_dbgstr_w( request.password ) ); } else { @@ -1364,7 +1361,7 @@ static unsigned short receiveRequestPlayerId_( int line, SOCKET sock, DWORD expe wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, sizeof( request ), FALSE ); + port = checkSpHeader_( line, &request.spHeader, sizeof( request ) ); checkMessageHeader_( line, &request.request.header, 5 ); ok_( __FILE__, line )( request.request.flags == expectedFlags, "got flags %#lx.\n", request.request.flags ); @@ -1437,7 +1434,7 @@ static unsigned short receiveAddForwardRequest_( int line, SOCKET sock, DPID exp if ( wsResult == SOCKET_ERROR ) return 0; - port = checkSpHeader_( line, &request.spHeader, expectedSize, FALSE ); + port = checkSpHeader_( line, &request.spHeader, expectedSize ); checkMessageHeader_( line, &request.request.header, 19 ); ok_( __FILE__, line )( !request.request.toId, "got destination id %#lx.\n", request.request.toId ); ok_( __FILE__, line )( request.request.playerId == expectedPlayerId, "got player id %#lx.\n", @@ -1817,7 +1814,7 @@ static unsigned short receiveAddForwardAck_( int line, SOCKET sock, DPID expecte wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, sizeof( request ), FALSE ); + port = checkSpHeader_( line, &request.spHeader, sizeof( request ) ); checkMessageHeader_( line, &request.request.header, 47 ); return port; @@ -1858,7 +1855,7 @@ static unsigned short receiveCreatePlayer_( int line, SOCKET sock, DPID expected wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, expectedSize, FALSE ); + port = checkSpHeader_( line, &request.spHeader, expectedSize ); checkMessageHeader_( line, &request.request.header, 8 ); ok_( __FILE__, line )( !request.request.toId, "got destination id %#lx.\n", request.request.toId ); ok_( __FILE__, line )( request.request.playerId == expectedPlayerId, "got player id %#lx.\n", @@ -2040,7 +2037,7 @@ static unsigned short receiveGuaranteedGameMessage_( int line, SOCKET sock, DPID wsResult = receiveMessage_( line, sock, &request, expectedSize ); ok_( __FILE__, line )( wsResult == expectedSize, "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, expectedSize, FALSE ); + port = checkSpHeader_( line, &request.spHeader, expectedSize ); checkGameMessage_( line, &request.request, expectedFromId, expectedToId ); ok_( __FILE__, line )( !memcmp( &request.data, expectedData, expectedDataSize ), "message data didn't match.\n" ); @@ -2192,7 +2189,7 @@ static unsigned short receivePingReply_( int line, SOCKET sock, DPID expectedFro wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, sizeof( request ), FALSE ); + port = checkSpHeader_( line, &request.spHeader, sizeof( request ) ); checkMessageHeader_( line, &request.request.header, 23 ); ok_( __FILE__, line )( request.request.fromId == expectedFromId, "got source id %#lx.\n", request.request.fromId ); ok_( __FILE__, line )( request.request.tickCount == expectedTickCount, "got tick count %#lx.\n", @@ -2218,7 +2215,7 @@ static unsigned short receiveAddPlayerToGroup_( int line, SOCKET sock, DPID expe wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); - port = checkSpHeader_( line, &request.spHeader, sizeof( request ), FALSE ); + port = checkSpHeader_( line, &request.spHeader, sizeof( request ) ); checkMessageHeader_( line, &request.request.header, 13 ); ok_( __FILE__, line )( !request.request.toId, "got destination id %#lx.\n", request.request.toId ); @@ -3356,7 +3353,7 @@ static void test_Open(void) enumSessionsParam = enumSessionsAsync( dp, &dpsdAppGuid, 100, countSessionsCallback, &count, 0 ); - port = receiveEnumSessionsRequest( enumSock, &appGuid, NULL, 0, FALSE ); + port = receiveEnumSessionsRequest( enumSock, &appGuid, NULL, 0 ); sock = connectTcp( port ); @@ -3398,7 +3395,7 @@ static void test_Open(void) enumSessionsParam = enumSessionsAsync( dp, &dpsdAppGuid, 100, countSessionsCallback, &count, DPENUMSESSIONS_PASSWORDREQUIRED ); - port = receiveEnumSessionsRequest( enumSock, &appGuid, NULL, DPENUMSESSIONS_PASSWORDREQUIRED, FALSE ); + port = receiveEnumSessionsRequest( enumSock, &appGuid, NULL, DPENUMSESSIONS_PASSWORDREQUIRED ); sock = connectTcp( port ); @@ -3583,7 +3580,7 @@ static void joinSession_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dpsd, DPSE enumSessionsParam = enumSessionsAsync( dp, dpsd, 100, countSessionsCallback, &count, 0 ); - port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, 0, FALSE ); + port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, 0 ); *sendSock = connectTcp_( line, port ); @@ -3775,9 +3772,8 @@ static BOOL CALLBACK checkSessionListCallback( const DPSESSIONDESC2 *thisSd, DWO "got current player count %lu.\n", thisSd->dwMaxPlayers ); ok_( __FILE__, data->line )( thisSd->dwCurrentPlayers == expectedSession->dpsd.dwCurrentPlayers, "got max player count %lu.\n", thisSd->dwCurrentPlayers ); - todo_wine_if( !data->ansi ) - ok_( __FILE__, data->line )( !strcmpAW( thisSd->lpszSessionNameA, expectedSession->dpsd.lpszSessionNameA, data->ansi ), - "got session name %s.\n", dbgStrAW( thisSd->lpszSessionNameA, data->ansi ) ); + ok_( __FILE__, data->line )( !strcmpAW( thisSd->lpszSessionNameA, expectedSession->dpsd.lpszSessionNameA, data->ansi ), + "got session name %s.\n", dbgStrAW( thisSd->lpszSessionNameA, data->ansi ) ); ok_( __FILE__, data->line )( !thisSd->lpszPasswordA, "got password %s.\n", dbgStrAW( thisSd->lpszPasswordA, data->ansi ) ); ok_( __FILE__, data->line )( thisSd->dwReserved1 == expectedSession->dpsd.dwReserved1, "got reserved1 %#lx.\n", @@ -3878,8 +3874,7 @@ static void check_EnumSessions_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dps param = enumSessionsAsync( dp, dpsd, 100, checkSessionListCallback, &callbackData, flags ); if ( requestExpected ) - port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, expectedPassword, flags, - !ansi && expectedPassword ); + port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, expectedPassword, flags ); for ( i = 0; i < replyCount; ++i ) { @@ -3975,7 +3970,7 @@ static void check_EnumSessions_async_( int line, DPSESSIONDESC2 *dpsd, IDirectPl /* Do a sync enumeration first to fill the cache */ param = enumSessionsAsync( dp, dpsd, 100, checkSessionListCallback, &callbackData, 0 ); - port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, 0, FALSE ); + port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, 0 ); sock = connectTcp_( line, port ); @@ -4014,7 +4009,7 @@ static void check_EnumSessions_async_( int line, DPSESSIONDESC2 *dpsd, IDirectPl /* Read cache of last sync enumeration */ param = enumSessionsAsync( dp, dpsd, 100, checkSessionListCallback, &callbackData, DPENUMSESSIONS_ASYNC ); - receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, DPENUMSESSIONS_ASYNC, FALSE ); + receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, DPENUMSESSIONS_ASYNC ); hr = enumSessionsAsyncWait( param, 2000 ); ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); @@ -4025,7 +4020,7 @@ static void check_EnumSessions_async_( int line, DPSESSIONDESC2 *dpsd, IDirectPl /* Check that requests are sent periodically */ for ( i = 0; i < 2; ++i ) - port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, DPENUMSESSIONS_ASYNC, FALSE ); + port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, DPENUMSESSIONS_ASYNC ); for ( i = 0; i < ARRAYSIZE( replyDpsds ); ++i ) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6860