From: Anton Baskanov baskanov@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 ) {