From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 12 +---- dlls/dplayx/tests/dplayx.c | 92 +++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 60 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 99d50f53d6c..d66369afa6d 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1891,7 +1891,7 @@ static HRESULT DP_IF_CreatePlayer( IDirectPlayImpl *This, DPID *lpidPlayer, { struct PlayerData *player; HRESULT hr = DP_OK; - DWORD dwCreateFlags = 0; + DWORD dwCreateFlags;
TRACE( "(%p)->(%p,%p,%p,%p,0x%08lx,0x%08lx,%u)\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, @@ -1906,11 +1906,6 @@ static HRESULT DP_IF_CreatePlayer( IDirectPlayImpl *This, DPID *lpidPlayer, return DPERR_INVALIDPARAM; }
- if( dwFlags == 0 ) - { - dwFlags = DPPLAYER_SPECTATOR; - } - if( lpidPlayer == NULL ) { return DPERR_INVALIDPARAMS; @@ -1921,10 +1916,7 @@ static HRESULT DP_IF_CreatePlayer( IDirectPlayImpl *This, DPID *lpidPlayer, * to the name server if requesting a player id and to the SP when * informing it of the player creation */ - if( dwFlags & DPPLAYER_SERVERPLAYER ) - dwCreateFlags |= DPLAYI_PLAYER_APPSERVER; - - dwCreateFlags |= DPLAYI_PLAYER_PLAYERLOCAL; + dwCreateFlags = dwFlags | DPLAYI_PLAYER_PLAYERLOCAL;
/* Verify we know how to handle all the flags */ if( !( ( dwFlags & DPPLAYER_SERVERPLAYER ) || diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index c3d4dac7bc6..6cb6dc379e9 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -1149,19 +1149,18 @@ static void checkSpData_( int line, SpData *spData ) }
#define checkPackedPlayer( player, expectedFlags, expectedId, expectedShortNameLength, expectedLongNameLength, \ - expectedPlayerDataSize, expectedSystemPlayerId, flagsTodo ) \ + expectedPlayerDataSize, expectedSystemPlayerId ) \ checkPackedPlayer_( __LINE__, player, expectedFlags, expectedId, expectedShortNameLength, expectedLongNameLength, \ - expectedPlayerDataSize, expectedSystemPlayerId, flagsTodo ) + expectedPlayerDataSize, expectedSystemPlayerId ) static void checkPackedPlayer_( int line, PackedPlayer *player, DWORD expectedFlags, DPID expectedId, DWORD expectedShortNameLength, DWORD expectedLongNameLength, - DWORD expectedPlayerDataSize, DPID expectedSystemPlayerId, BOOL flagsTodo ) + DWORD expectedPlayerDataSize, DPID expectedSystemPlayerId ) { DWORD expectedSize = sizeof( PackedPlayer ) + expectedShortNameLength + expectedLongNameLength + sizeof( SpData ) + expectedPlayerDataSize;
ok_( __FILE__, line )( player->size == expectedSize, "got player info size %lu.\n", player->size ); - todo_wine_if( flagsTodo ) ok_( __FILE__, line )( player->flags == expectedFlags, "got flags %#lx.\n", - player->flags ); + ok_( __FILE__, line )( player->flags == expectedFlags, "got flags %#lx.\n", player->flags ); ok_( __FILE__, line )( player->id == expectedId, "got player info player id %#lx.\n", player->id ); ok_( __FILE__, line )( player->shortNameLength == expectedShortNameLength, "got short name length %lu.\n", player->shortNameLength ); @@ -1270,7 +1269,7 @@ static void sendEnumSessionsReply_( int line, SOCKET sock, unsigned short port, }
#define receiveRequestPlayerId( sock, expectedFlags, flagsTodo ) receiveRequestPlayerId_( __LINE__, sock, expectedFlags, flagsTodo ) -static unsigned short receiveRequestPlayerId_( int line, SOCKET sock, DWORD expectedFlags, BOOL flagsTodo ) +static unsigned short receiveRequestPlayerId_( int line, SOCKET sock, DWORD expectedFlags ) { struct { @@ -1285,8 +1284,7 @@ static unsigned short receiveRequestPlayerId_( int line, SOCKET sock, DWORD expe
port = checkSpHeader_( line, &request.spHeader, sizeof( request ) ); checkMessageHeader_( line, &request.request.header, 5 ); - todo_wine_if( flagsTodo ) ok_( __FILE__, line )( request.request.flags == expectedFlags, "got flags %#lx.\n", - request.request.flags ); + ok_( __FILE__, line )( request.request.flags == expectedFlags, "got flags %#lx.\n", request.request.flags );
return port; } @@ -1362,7 +1360,7 @@ static unsigned short receiveAddForwardRequest_( int line, SOCKET sock, DPID exp request.request.createOffset ); ok_( __FILE__, line )( request.request.passwordOffset == 108, "got password offset %lu.\n", request.request.passwordOffset ); - checkPackedPlayer_( line, &request.request.playerInfo, 0x9, expectedPlayerId, 0, 0, 0, expectedPlayerId, FALSE ); + checkPackedPlayer_( line, &request.request.playerInfo, 0x9, expectedPlayerId, 0, 0, 0, expectedPlayerId ); checkSpData_( line, &request.request.spData );
wsResult = receiveMessage_( line, sock, password, expectedPasswordSize ); @@ -1639,12 +1637,12 @@ static unsigned short receiveAddForwardAck_( int line, SOCKET sock, DPID expecte }
#define receiveCreatePlayer( sock, expectedPlayerId, expectedFlags, expectedShortName, expectedLongName, \ - expectedPlayerData, expectedPlayerDataSize, flagsTodo ) \ + expectedPlayerData, expectedPlayerDataSize ) \ receiveCreatePlayer_( __LINE__, sock, expectedPlayerId, expectedFlags, expectedShortName, expectedLongName, \ - expectedPlayerData, expectedPlayerDataSize, flagsTodo ) + expectedPlayerData, expectedPlayerDataSize ) static unsigned short receiveCreatePlayer_( int line, SOCKET sock, DPID expectedPlayerId, DWORD expectedFlags, const WCHAR *expectedShortName, const WCHAR *expectedLongName, - void *expectedPlayerData, DWORD expectedPlayerDataSize, BOOL flagsTodo ) + void *expectedPlayerData, DWORD expectedPlayerDataSize ) { struct { @@ -1682,7 +1680,7 @@ static unsigned short receiveCreatePlayer_( int line, SOCKET sock, DPID expected ok_( __FILE__, line )( !request.request.passwordOffset, "got password offset %lu.\n", request.request.passwordOffset ); checkPackedPlayer_( line, &request.request.playerInfo, expectedFlags, expectedPlayerId, expectedShortNameSize, - expectedLongNameSize, expectedPlayerDataSize, 0x12345678, flagsTodo ); + expectedLongNameSize, expectedPlayerDataSize, 0x12345678 );
if ( expectedShortName ) { @@ -2357,7 +2355,6 @@ typedef struct DWORD expectedFlags; BYTE *expectedPlayerData; DWORD expectedPlayerDataSize; - BOOL flagsTodo; int actualCount; } ExpectedPlayer;
@@ -2414,8 +2411,7 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const ok_( __FILE__, data->line )( !name->lpszLongNameA, "got long name %s.\n", wine_dbgstr_a( name->lpszLongNameA ) ); } - todo_wine_if( player->flagsTodo ) ok_( __FILE__, data->line )( flags == player->expectedFlags, - "got flags %#lx.\n", flags ); + ok_( __FILE__, data->line )( flags == player->expectedFlags, "got flags %#lx.\n", flags );
memset( &playerData, 0xcc, sizeof( playerData ) ); playerDataSize = sizeof( playerData ); @@ -2506,12 +2502,12 @@ static void checkPlayerList_( int line, IDirectPlay4 *dp, ExpectedPlayer *expect }
#define checkPlayerExists( dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, expectedFlags, \ - expectedPlayerData, expectedPlayerDataSize, flagsTodo ) \ + expectedPlayerData, expectedPlayerDataSize ) \ checkPlayerExists_( __LINE__, dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, \ - expectedFlags, expectedPlayerData, expectedPlayerDataSize, flagsTodo ) + expectedFlags, expectedPlayerData, expectedPlayerDataSize ) static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, DWORD expectedPlayerType, const char *expectedShortName, const char *expectedLongName, DWORD expectedFlags, - BYTE *expectedPlayerData, DWORD expectedPlayerDataSize, BOOL flagsTodo ) + BYTE *expectedPlayerData, DWORD expectedPlayerDataSize ) { ExpectedPlayer expectedPlayer = { @@ -2522,7 +2518,6 @@ static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, D .expectedFlags = expectedFlags, .expectedPlayerData = expectedPlayerData, .expectedPlayerDataSize = expectedPlayerDataSize, - .flagsTodo = flagsTodo, }; CheckPlayerListCallbackData data = { @@ -2574,7 +2569,7 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons recvSock = acceptTcp_( line, listenSock ); ok_( __FILE__, line )( recvSock != INVALID_SOCKET, "accept() returned %#Ix.\n", recvSock );
- port = receiveRequestPlayerId_( line, recvSock, 0x9, FALSE ); + port = receiveRequestPlayerId_( line, recvSock, 0x9 );
sendSock = connectTcp_( line, port );
@@ -2979,7 +2974,7 @@ static void joinSession_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dpsd, DPSE *recvSock = acceptTcp_( line, listenSock ); ok_( __FILE__, line )( *recvSock != INVALID_SOCKET, "accept() returned %#Ix.\n", *recvSock );
- receiveRequestPlayerId_( line, *recvSock, 0x9, FALSE ); + receiveRequestPlayerId_( line, *recvSock, 0x9 ); sendRequestPlayerReply_( line, *sendSock, 2349, 0x12345678, DP_OK ); receiveAddForwardRequest_( line, *recvSock, 0x12345678, L"", serverDpsd->dwReserved1 ); sendSuperEnumPlayersReply_( line, *sendSock, 2349, 2399, serverDpsd, L"normal" ); @@ -4053,15 +4048,14 @@ if(0)
#define checkCreatePlayerOrGroupMessage( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags, flagsTodo ) \ + expectedFlags ) \ checkCreatePlayerOrGroupMessage_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags, flagsTodo ) + expectedLongName, expectedParent, expectedFlags ) static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, - BOOL flagsTodo ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) { DPMSG_CREATEPLAYERORGROUP *msg; DWORD expectedShortNameSize; @@ -4119,7 +4113,7 @@ static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD wine_dbgstr_a( msg->dpnName.lpszLongNameA ) ); } ok_( __FILE__, line )( msg->dpIdParent == expectedParent, "got parent id %#lx.\n", msg->dpIdParent ); - todo_wine_if( flagsTodo ) ok_( __FILE__, line )( msg->dwFlags == expectedFlags, "got flags %#lx.\n", msg->dwFlags ); + ok_( __FILE__, line )( msg->dwFlags == expectedFlags, "got flags %#lx.\n", msg->dwFlags );
expectedShortNameSize = expectedShortName ? strlen( expectedShortName ) + 1 : 0; expectedLongNameSize = expectedLongName ? strlen( expectedLongName ) + 1 : 0; @@ -4166,15 +4160,14 @@ static BOOL CALLBACK getPlayerIdsCallback( DPID dpid, DWORD playerType, const DP
#define checkCreatePlayerOrGroupMessages( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags, flagsTodo ) \ + expectedFlags ) \ checkCreatePlayerOrGroupMessages_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags, flagsTodo ) + expectedLongName, expectedParent, expectedFlags ) static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, - BOOL flagsTodo ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) { GetPlayerIdsCallbackData data = { 0 }; HRESULT hr; @@ -4189,7 +4182,7 @@ static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD { dpid = checkCreatePlayerOrGroupMessage_( line, dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, expectedPlayerDataSize, expectedShortName, - expectedLongName, expectedParent, expectedFlags, flagsTodo ); + expectedLongName, expectedParent, expectedFlags ); for ( j = 0; j < data.idCount; ++j ) { if ( data.ids[ j ] == dpid ) @@ -4204,15 +4197,15 @@ static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD
#define check_CreatePlayer( dp, dpid, name, flags, expectedHr, expectedDpid, recvSock, requestExpected, \ expectedFlags, expectedShortName, expectedShortNameA, expectedLongName, expectedLongNameA, \ - expectedCurrentPlayers, flagsTodo ) \ + expectedCurrentPlayers ) \ check_CreatePlayer_( __LINE__, dp, dpid, name, flags, expectedHr, expectedDpid, recvSock, requestExpected, \ expectedFlags, expectedShortName, expectedShortNameA, expectedLongName, expectedLongNameA, \ - expectedCurrentPlayers, flagsTodo ) + expectedCurrentPlayers ) static void check_CreatePlayer_( int line, IDirectPlay4 *dp, DPID *dpid, DPNAME *name, DWORD flags, HRESULT expectedHr, DPID expectedDpid, SOCKET recvSock, BOOL requestExpected, DWORD expectedFlags, const WCHAR *expectedShortName, const char *expectedShortNameA, const WCHAR *expectedLongName, const char *expectedLongNameA, - DWORD expectedCurrentPlayers, BOOL flagsTodo ) + DWORD expectedCurrentPlayers ) { BYTE playerData[] = { 1, 2, 3, 4, 5, 6, 7, 8, }; CreatePlayerParam *param; @@ -4225,13 +4218,13 @@ static void check_CreatePlayer_( int line, IDirectPlay4 *dp, DPID *dpid, DPNAME { unsigned short port;
- port = receiveRequestPlayerId_( line, recvSock, expectedFlags, flagsTodo ); + port = receiveRequestPlayerId_( line, recvSock, expectedFlags );
sendSock = connectTcp_( line, port );
sendRequestPlayerReply_( line, sendSock, 2349, expectedDpid, DP_OK ); receiveCreatePlayer_( line, recvSock, expectedDpid, expectedFlags, expectedShortName, expectedLongName, - playerData, sizeof( playerData ), flagsTodo ); + playerData, sizeof( playerData ) );
hr = createPlayerAsyncWait( param, 2000 ); ok_( __FILE__, line )( hr == expectedHr, "CreatePlayer() returned %#lx.\n", hr ); @@ -4239,12 +4232,12 @@ static void check_CreatePlayer_( int line, IDirectPlay4 *dp, DPID *dpid, DPNAME ok_( __FILE__, line )( *dpid == expectedDpid, "got dpid %#lx.\n", *dpid );
checkPlayerExists_( line, dp, expectedDpid, DPPLAYERTYPE_PLAYER, expectedShortNameA, expectedLongNameA, - expectedFlags, playerData, sizeof( playerData ), flagsTodo ); + expectedFlags, playerData, sizeof( playerData ) );
if ( hr == DP_OK ) checkCreatePlayerOrGroupMessages_( line, dp, DPPLAYERTYPE_PLAYER, expectedDpid, expectedCurrentPlayers, playerData, sizeof( playerData ), expectedShortNameA, expectedLongNameA, - 0, expectedFlags, flagsTodo ); + 0, expectedFlags );
checkNoMorePlayerMessages_( line, dp );
@@ -4301,47 +4294,46 @@ static void test_CreatePlayer(void) /* Connection not initialized */ dpid = 0xdeadbeef; check_CreatePlayer( dp, &dpid, NULL, 0, DPERR_UNINITIALIZED, 0xdeadbeef, INVALID_SOCKET, FALSE, 0, NULL, NULL, - NULL, NULL, 0, FALSE ); + NULL, NULL, 0 );
init_TCPIP_provider( dp, "127.0.0.1", 0 );
/* Session not open */ dpid = 0xdeadbeef; check_CreatePlayer( dp, &dpid, NULL, 0, DPERR_INVALIDPARAMS, 0xdeadbeef, INVALID_SOCKET, FALSE, 0, NULL, NULL, - NULL, NULL, 0, FALSE ); + NULL, NULL, 0 );
/* Join to normal session */ joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock );
/* Player name */ dpid = 0xdeadbeef; - check_CreatePlayer( dp, &dpid, NULL, 0, DP_OK, 2, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 1, FALSE ); + check_CreatePlayer( dp, &dpid, NULL, 0, DP_OK, 2, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 1 );
dpid = 0xdeadbeef; check_CreatePlayer( dp, &dpid, &fullName, 0, DP_OK, 3, recvSock, TRUE, 0x8, L"short player name", - "short player name", L"long player name", "long player name", 2, FALSE ); + "short player name", L"long player name", "long player name", 2 );
name = fullName; name.dwSize = 1; dpid = 0xdeadbeef; check_CreatePlayer( dp, &dpid, &name, 0, DP_OK, 4, recvSock, TRUE, 0x8, L"short player name", "short player name", - L"long player name", "long player name", 3, FALSE ); + L"long player name", "long player name", 3 );
dpid = 0xdeadbeef; - check_CreatePlayer( dp, &dpid, &nullName, 0, DP_OK, 5, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 4, FALSE ); + check_CreatePlayer( dp, &dpid, &nullName, 0, DP_OK, 5, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 4 );
/* Null dpid */ dpid = 0xdeadbeef; - check_CreatePlayer( dp, NULL, NULL, 0, DPERR_INVALIDPARAMS, 0, recvSock, FALSE, 0, NULL, NULL, NULL, NULL, 0, - FALSE ); + check_CreatePlayer( dp, NULL, NULL, 0, DPERR_INVALIDPARAMS, 0, recvSock, FALSE, 0, NULL, NULL, NULL, NULL, 0 );
/* Flags */ dpid = 0xdeadbeef; - check_CreatePlayer( dp, &dpid, NULL, 0, DP_OK, 6, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 5, FALSE ); + check_CreatePlayer( dp, &dpid, NULL, 0, DP_OK, 6, recvSock, TRUE, 0x8, NULL, NULL, NULL, NULL, 5 );
dpid = 0xdeadbeef; - check_CreatePlayer( dp, &dpid, NULL, DPPLAYER_SPECTATOR, DP_OK, 7, recvSock, TRUE, 0x208, NULL, NULL, NULL, NULL, 6, - TRUE ); + check_CreatePlayer( dp, &dpid, NULL, DPPLAYER_SPECTATOR, DP_OK, 7, recvSock, TRUE, 0x208, NULL, NULL, NULL, NULL, + 6 );
closesocket( recvSock ); closesocket( sendSock );
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 3 ++- dlls/dplayx/tests/dplayx.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index d66369afa6d..00ec6ae3147 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -3266,10 +3266,11 @@ static HRESULT WINAPI IDirectPlay4Impl_GetPlayerData( IDirectPlay4 *iface, DPID src = plist->lpPData->lpRemoteData; }
+ *size = bufsize; + /* Is the user requesting to know how big a buffer is required? */ if ( !data || *size < bufsize ) { - *size = bufsize; LeaveCriticalSection( &This->lock ); return DPERR_BUFFERTOOSMALL; } diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 6cb6dc379e9..32e28402862 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2417,8 +2417,8 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const playerDataSize = sizeof( playerData ); hr = IDirectPlayX_GetPlayerData( data->dp, dpid, playerData, &playerDataSize, DPGET_REMOTE ); ok_( __FILE__, data->line )( hr == DP_OK, "GetPlayerData() returned %#lx.\n", hr ); - todo_wine ok_( __FILE__, data->line )( playerDataSize == player->expectedPlayerDataSize, - "got player data size %lu.\n", playerDataSize ); + ok_( __FILE__, data->line )( playerDataSize == player->expectedPlayerDataSize, + "got player data size %lu.\n", playerDataSize ); ok_( __FILE__, data->line )( !memcmp( playerData, player->expectedPlayerData, player->expectedPlayerDataSize ), "player data doesn't match.\n" );
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 218 ++++++++++++++++++++++++++++++++++--- 1 file changed, 204 insertions(+), 14 deletions(-)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 32e28402862..968384317f0 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -1726,6 +1726,108 @@ static unsigned short receiveCreatePlayer_( int line, SOCKET sock, DPID expected return port; }
+#define sendCreatePlayer( sock, tcpPort, udpPort, shortName, longName, playerData, playerDataSize ) \ + sendCreatePlayer_( __LINE__, sock, tcpPort, udpPort, shortName, longName, playerData, playerDataSize ) +static void sendCreatePlayer_( int line, SOCKET sock, unsigned short tcpPort, unsigned short udpPort, + const WCHAR *shortName, const WCHAR *longName, void *playerData, DWORD playerDataSize ) +{ + struct + { + SpHeader spHeader; + CreatePlayer request; + } request = + { + .spHeader = + { + .mixed = 0xfab00000, + .addr = + { + .sin_family = AF_INET, + .sin_port = htons( tcpPort ), + }, + }, + .request = + { + .header = + { + .magic = 0x79616c70, + .command = 8, + .version = 14, + }, + .toId = 0, + .playerId = 0x07734, + .groupId = 0, + .createOffset = 28, + .passwordOffset = 0, + .playerInfo = + { + .size = sizeof( request.request.playerInfo ) + sizeof( SpData ), + .flags = 0x8, + .id = 0x07734, + .shortNameLength = 0, + .longNameLength = 0, + .spDataSize = sizeof( SpData ), + .playerDataSize = 0, + .playerCount = 0, + .systemPlayerId = 0x51573, + .fixedSize = 48, + .playerVersion = 14, + .parentId = 0, + }, + }, + }; + SpData spData = { + .tcpAddr.sin_family = AF_INET, + .tcpAddr.sin_port = htons( tcpPort ), + .udpAddr.sin_family = AF_INET, + .udpAddr.sin_port = htons( udpPort ), + }; + char reserved[ 6 ] = { 0 }; + DWORD shortNameSize = 0; + DWORD longNameSize = 0; + int wsResult; + + if ( shortName ) + shortNameSize = (wcslen( shortName ) + 1) * sizeof( WCHAR ); + + if ( longName ) + longNameSize = (wcslen( longName ) + 1) * sizeof( WCHAR ); + + request.spHeader.mixed += sizeof( request ) + shortNameSize + longNameSize + sizeof( spData ) + + playerDataSize + sizeof( reserved ); + request.request.playerInfo.size += shortNameSize + longNameSize + playerDataSize; + request.request.playerInfo.shortNameLength = shortNameSize; + request.request.playerInfo.longNameLength = longNameSize; + request.request.playerInfo.playerDataSize = playerDataSize; + + wsResult = send( sock, (char *) &request, sizeof( request ), 0 ); + ok_( __FILE__, line )( wsResult == sizeof( request ), "send() returned %d.\n", wsResult ); + + if ( shortName ) + { + wsResult = send( sock, (char *) shortName, shortNameSize, 0 ); + ok_( __FILE__, line )( wsResult == shortNameSize, "send() returned %d.\n", wsResult ); + } + + if ( longName ) + { + wsResult = send( sock, (char *) longName, longNameSize, 0 ); + ok_( __FILE__, line )( wsResult == longNameSize, "send() returned %d.\n", wsResult ); + } + + wsResult = send( sock, (char *) &spData, sizeof( spData ), 0 ); + ok_( __FILE__, line )( wsResult == sizeof( spData ), "send() returned %d.\n", wsResult ); + + if ( playerData ) + { + wsResult = send( sock, playerData, playerDataSize, 0 ); + ok_( __FILE__, line )( wsResult == playerDataSize, "send() returned %d.\n", wsResult ); + } + + wsResult = send( sock, reserved, sizeof( reserved ), 0 ); + ok_( __FILE__, line )( wsResult == sizeof( reserved ), "send() returned %d.\n", wsResult ); +} + static void init_TCPIP_provider( IDirectPlay4 *pDP, LPCSTR strIPAddressString, WORD port ) {
@@ -2502,12 +2604,12 @@ static void checkPlayerList_( int line, IDirectPlay4 *dp, ExpectedPlayer *expect }
#define checkPlayerExists( dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, expectedFlags, \ - expectedPlayerData, expectedPlayerDataSize ) \ + expectedPlayerData, expectedPlayerDataSize, playerCountTodo ) \ checkPlayerExists_( __LINE__, dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, \ - expectedFlags, expectedPlayerData, expectedPlayerDataSize ) + expectedFlags, expectedPlayerData, expectedPlayerDataSize, playerCountTodo ) static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, DWORD expectedPlayerType, const char *expectedShortName, const char *expectedLongName, DWORD expectedFlags, - BYTE *expectedPlayerData, DWORD expectedPlayerDataSize ) + BYTE *expectedPlayerData, DWORD expectedPlayerDataSize, BOOL playerCountTodo ) { ExpectedPlayer expectedPlayer = { @@ -2535,7 +2637,8 @@ static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, D hr = IDirectPlayX_EnumPlayers( dp, NULL, checkPlayerListCallback, &data, DPENUMPLAYERS_REMOTE ); ok_( __FILE__, line )( hr == DP_OK, "EnumPlayers() returned %#lx.\n", hr );
- ok_( __FILE__, line )( expectedPlayer.actualCount == 1, "got player count %d.\n", expectedPlayer.actualCount ); + todo_wine_if( playerCountTodo ) ok_( __FILE__, line )( expectedPlayer.actualCount == 1, "got player count %d.\n", + expectedPlayer.actualCount ); }
#define check_Open( dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, listenPort, expectedPassword, \ @@ -4048,14 +4151,15 @@ if(0)
#define checkCreatePlayerOrGroupMessage( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags ) \ + expectedFlags, hrTodo ) \ checkCreatePlayerOrGroupMessage_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags ) + expectedLongName, expectedParent, expectedFlags, hrTodo ) static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, + BOOL hrTodo ) { DPMSG_CREATEPLAYERORGROUP *msg; DWORD expectedShortNameSize; @@ -4071,7 +4175,9 @@ static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD fromId = 0xdeadbeef; toId = 0xdeadbeef; hr = IDirectPlayX_Receive( dp, &fromId, &toId, 0, msgData, &msgDataSize ); - ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); + todo_wine_if( hrTodo ) ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); + if ( FAILED( hr ) ) + return TRUE; ok_( __FILE__, line )( fromId == DPID_SYSMSG, "got source id %#lx.\n", fromId );
msg = (DPMSG_CREATEPLAYERORGROUP *) msgData; @@ -4160,14 +4266,15 @@ static BOOL CALLBACK getPlayerIdsCallback( DPID dpid, DWORD playerType, const DP
#define checkCreatePlayerOrGroupMessages( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags ) \ + expectedFlags, hrTodo ) \ checkCreatePlayerOrGroupMessages_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags ) + expectedLongName, expectedParent, expectedFlags, hrTodo ) static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, + BOOL hrTodo ) { GetPlayerIdsCallbackData data = { 0 }; HRESULT hr; @@ -4182,7 +4289,7 @@ static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD { dpid = checkCreatePlayerOrGroupMessage_( line, dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, expectedPlayerDataSize, expectedShortName, - expectedLongName, expectedParent, expectedFlags ); + expectedLongName, expectedParent, expectedFlags, hrTodo ); for ( j = 0; j < data.idCount; ++j ) { if ( data.ids[ j ] == dpid ) @@ -4232,12 +4339,12 @@ static void check_CreatePlayer_( int line, IDirectPlay4 *dp, DPID *dpid, DPNAME ok_( __FILE__, line )( *dpid == expectedDpid, "got dpid %#lx.\n", *dpid );
checkPlayerExists_( line, dp, expectedDpid, DPPLAYERTYPE_PLAYER, expectedShortNameA, expectedLongNameA, - expectedFlags, playerData, sizeof( playerData ) ); + expectedFlags, playerData, sizeof( playerData ), FALSE );
if ( hr == DP_OK ) checkCreatePlayerOrGroupMessages_( line, dp, DPPLAYERTYPE_PLAYER, expectedDpid, expectedCurrentPlayers, playerData, sizeof( playerData ), expectedShortNameA, expectedLongNameA, - 0, expectedFlags ); + 0, expectedFlags, FALSE );
checkNoMorePlayerMessages_( line, dp );
@@ -4512,6 +4619,88 @@ static void test_interactive_CreatePlayer(void)
}
+#define createPlayer( dp, inDpid, event, data, dataSize, flags, sendSock, recvSock ) \ + createPlayer_( __LINE__, dp, inDpid, event, data, dataSize, flags, sendSock, recvSock ) +static void createPlayer_( int line, IDirectPlay4 *dp, DPID inDpid, HANDLE event, void *data, + DWORD dataSize, DWORD flags, SOCKET sendSock, SOCKET recvSock ) +{ + CreatePlayerParam *param; + HRESULT hr; + DPID dpid; + + dpid = 0xdeadbeef; + param = createPlayerAsync( dp, &dpid, NULL, event, data, dataSize, flags ); + + receiveRequestPlayerId_( line, recvSock, flags | DPPLAYER_LOCAL ); + + sendRequestPlayerReply_( line, sendSock, 2349, inDpid, DP_OK ); + + receiveCreatePlayer_( line, recvSock, inDpid, flags | DPPLAYER_LOCAL, NULL, NULL, data, dataSize ); + + hr = createPlayerAsyncWait( param, 2000 ); + ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); + ok_( __FILE__, line )( dpid == inDpid, "got dpid %#lx.\n", dpid ); +} + +static void test_CREATEPLAYER(void) +{ + BYTE playerData[] = { 4, 3, 2, 1, }; + DPSESSIONDESC2 appGuidDpsd = + { + .dwSize = sizeof( DPSESSIONDESC2 ), + .guidInstance = appGuid, + .guidApplication = appGuid, + }; + DPSESSIONDESC2 serverDpsd = + { + .dwSize = sizeof( DPSESSIONDESC2 ), + .guidApplication = appGuid, + .guidInstance = appGuid, + .lpszSessionName = (WCHAR *) L"normal", + .dwReserved1 = 0xaabbccdd, + }; + IDirectPlay4A *dp; + DWORD waitResult; + SOCKET sendSock; + SOCKET recvSock; + HANDLE event; + HRESULT hr; + DPID dpid; + + event = CreateEventA( NULL, FALSE, FALSE, NULL ); + + hr = CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectPlay4A, (void **) &dp ); + ok( hr == DP_OK, "got hr %#lx.\n", hr ); + + init_TCPIP_provider( dp, "127.0.0.1", 0 ); + + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + + createPlayer( dp, 0x11223344, event, NULL, 0, 0, sendSock, recvSock ); + + sendCreatePlayer( sendSock, 2349, 2399, L"new player short name", L"new player long name", playerData, + sizeof( playerData ) ); + + waitResult = WaitForSingleObject( event, 2000 ); + todo_wine ok( waitResult == WAIT_OBJECT_0, "message wait returned %lu\n", waitResult ); + + checkPlayerExists( dp, 0x07734, DPPLAYERTYPE_PLAYER, "new player short name", "new player long name", + DPENUMPLAYERS_REMOTE, playerData, sizeof( playerData ), TRUE ); + + dpid = checkCreatePlayerOrGroupMessage( dp, DPPLAYERTYPE_PLAYER, 0x07734, 3, playerData, sizeof( playerData ), + "new player short name", "new player long name", 0, 0, TRUE ); + todo_wine ok( dpid == 0x11223344, "got destination id %#lx.\n", dpid ); + + checkNoMorePlayerMessages( dp ); + + closesocket( recvSock ); + closesocket( sendSock ); + + IDirectPlayX_Release( dp ); + + CloseHandle( event ); +} + /* GetPlayerCaps */
static void test_GetPlayerCaps(void) @@ -9285,6 +9474,7 @@ START_TEST(dplayx) test_Open(); test_ADDFORWARD(); test_CreatePlayer(); + test_CREATEPLAYER();
if (!winetest_interactive) {
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 42 ++++++++++++++++++++++++++++++++++++++ dlls/dplayx/tests/dplayx.c | 41 ++++++++++++++++--------------------- 2 files changed, 60 insertions(+), 23 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 00ec6ae3147..999bb37ee0f 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -474,6 +474,48 @@ HRESULT DP_HandleMessage( IDirectPlayImpl *This, void *messageBody, break; }
+ case DPMSGCMD_CREATESESSION: { + DPMSG_CREATESESSION *msg; + DPPLAYERINFO playerInfo; + DWORD offset = 0; + HRESULT hr; + + if( dwMessageBodySize < sizeof( DPMSG_CREATESESSION ) ) + return DPERR_GENERIC; + msg = (DPMSG_CREATESESSION *)messageBody; + offset += sizeof( DPMSG_CREATESESSION ); + + hr = DP_MSG_ReadPackedPlayer( (char *)messageBody, &offset, dwMessageBodySize, &playerInfo ); + if ( FAILED( hr ) ) + return hr; + + if ( dwMessageBodySize - offset < 6 ) + return DPERR_GENERIC; + + EnterCriticalSection( &This->lock ); + + if ( !This->dp2->bConnectionOpen ) + { + LeaveCriticalSection( &This->lock ); + return DP_OK; + } + + hr = DP_CreatePlayer( This, messageHeader, &msg->playerId, &playerInfo.name, + playerInfo.playerData, playerInfo.playerDataLength, playerInfo.spData, + playerInfo.spDataLength, playerInfo.flags & ~DPLAYI_PLAYER_PLAYERLOCAL, + NULL, NULL, FALSE ); + + if ( FAILED( hr ) ) + { + LeaveCriticalSection( &This->lock ); + return hr; + } + + LeaveCriticalSection( &This->lock ); + + break; + } + case DPMSGCMD_GETNAMETABLEREPLY: case DPMSGCMD_NEWPLAYERIDREPLY: case DPMSGCMD_FORWARDADDPLAYERNACK: diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 968384317f0..b26ddaaeb01 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2604,12 +2604,12 @@ static void checkPlayerList_( int line, IDirectPlay4 *dp, ExpectedPlayer *expect }
#define checkPlayerExists( dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, expectedFlags, \ - expectedPlayerData, expectedPlayerDataSize, playerCountTodo ) \ + expectedPlayerData, expectedPlayerDataSize ) \ checkPlayerExists_( __LINE__, dp, expectedDpid, expectedPlayerType, expectedShortName, expectedLongName, \ - expectedFlags, expectedPlayerData, expectedPlayerDataSize, playerCountTodo ) + expectedFlags, expectedPlayerData, expectedPlayerDataSize ) static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, DWORD expectedPlayerType, const char *expectedShortName, const char *expectedLongName, DWORD expectedFlags, - BYTE *expectedPlayerData, DWORD expectedPlayerDataSize, BOOL playerCountTodo ) + BYTE *expectedPlayerData, DWORD expectedPlayerDataSize ) { ExpectedPlayer expectedPlayer = { @@ -2637,8 +2637,7 @@ static void checkPlayerExists_( int line, IDirectPlay4 *dp, DPID expectedDpid, D hr = IDirectPlayX_EnumPlayers( dp, NULL, checkPlayerListCallback, &data, DPENUMPLAYERS_REMOTE ); ok_( __FILE__, line )( hr == DP_OK, "EnumPlayers() returned %#lx.\n", hr );
- todo_wine_if( playerCountTodo ) ok_( __FILE__, line )( expectedPlayer.actualCount == 1, "got player count %d.\n", - expectedPlayer.actualCount ); + ok_( __FILE__, line )( expectedPlayer.actualCount == 1, "got player count %d.\n", expectedPlayer.actualCount ); }
#define check_Open( dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, listenPort, expectedPassword, \ @@ -4151,15 +4150,14 @@ if(0)
#define checkCreatePlayerOrGroupMessage( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags, hrTodo ) \ + expectedFlags ) \ checkCreatePlayerOrGroupMessage_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags, hrTodo ) + expectedLongName, expectedParent, expectedFlags ) static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, - BOOL hrTodo ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) { DPMSG_CREATEPLAYERORGROUP *msg; DWORD expectedShortNameSize; @@ -4175,9 +4173,7 @@ static DPID checkCreatePlayerOrGroupMessage_( int line, IDirectPlay4 *dp, DWORD fromId = 0xdeadbeef; toId = 0xdeadbeef; hr = IDirectPlayX_Receive( dp, &fromId, &toId, 0, msgData, &msgDataSize ); - todo_wine_if( hrTodo ) ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); - if ( FAILED( hr ) ) - return TRUE; + ok_( __FILE__, line )( hr == DP_OK, "got hr %#lx.\n", hr ); ok_( __FILE__, line )( fromId == DPID_SYSMSG, "got source id %#lx.\n", fromId );
msg = (DPMSG_CREATEPLAYERORGROUP *) msgData; @@ -4266,15 +4262,14 @@ static BOOL CALLBACK getPlayerIdsCallback( DPID dpid, DWORD playerType, const DP
#define checkCreatePlayerOrGroupMessages( dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, \ expectedPlayerDataSize, expectedShortName, expectedLongName, expectedParent, \ - expectedFlags, hrTodo ) \ + expectedFlags ) \ checkCreatePlayerOrGroupMessages_( __LINE__, dp, expectedType, expectedDpid, expectedCurrentPlayers, \ expectedPlayerData, expectedPlayerDataSize, expectedShortName, \ - expectedLongName, expectedParent, expectedFlags, hrTodo ) + expectedLongName, expectedParent, expectedFlags ) static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD expectedType, DPID expectedDpid, DWORD expectedCurrentPlayers, void *expectedPlayerData, DWORD expectedPlayerDataSize, const char *expectedShortName, - const char *expectedLongName, DPID expectedParent, DWORD expectedFlags, - BOOL hrTodo ) + const char *expectedLongName, DPID expectedParent, DWORD expectedFlags ) { GetPlayerIdsCallbackData data = { 0 }; HRESULT hr; @@ -4289,7 +4284,7 @@ static void checkCreatePlayerOrGroupMessages_( int line, IDirectPlay4 *dp, DWORD { dpid = checkCreatePlayerOrGroupMessage_( line, dp, expectedType, expectedDpid, expectedCurrentPlayers, expectedPlayerData, expectedPlayerDataSize, expectedShortName, - expectedLongName, expectedParent, expectedFlags, hrTodo ); + expectedLongName, expectedParent, expectedFlags ); for ( j = 0; j < data.idCount; ++j ) { if ( data.ids[ j ] == dpid ) @@ -4339,12 +4334,12 @@ static void check_CreatePlayer_( int line, IDirectPlay4 *dp, DPID *dpid, DPNAME ok_( __FILE__, line )( *dpid == expectedDpid, "got dpid %#lx.\n", *dpid );
checkPlayerExists_( line, dp, expectedDpid, DPPLAYERTYPE_PLAYER, expectedShortNameA, expectedLongNameA, - expectedFlags, playerData, sizeof( playerData ), FALSE ); + expectedFlags, playerData, sizeof( playerData ) );
if ( hr == DP_OK ) checkCreatePlayerOrGroupMessages_( line, dp, DPPLAYERTYPE_PLAYER, expectedDpid, expectedCurrentPlayers, playerData, sizeof( playerData ), expectedShortNameA, expectedLongNameA, - 0, expectedFlags, FALSE ); + 0, expectedFlags );
checkNoMorePlayerMessages_( line, dp );
@@ -4682,14 +4677,14 @@ static void test_CREATEPLAYER(void) sizeof( playerData ) );
waitResult = WaitForSingleObject( event, 2000 ); - todo_wine ok( waitResult == WAIT_OBJECT_0, "message wait returned %lu\n", waitResult ); + ok( waitResult == WAIT_OBJECT_0, "message wait returned %lu\n", waitResult );
checkPlayerExists( dp, 0x07734, DPPLAYERTYPE_PLAYER, "new player short name", "new player long name", - DPENUMPLAYERS_REMOTE, playerData, sizeof( playerData ), TRUE ); + DPENUMPLAYERS_REMOTE, playerData, sizeof( playerData ) );
dpid = checkCreatePlayerOrGroupMessage( dp, DPPLAYERTYPE_PLAYER, 0x07734, 3, playerData, sizeof( playerData ), - "new player short name", "new player long name", 0, 0, TRUE ); - todo_wine ok( dpid == 0x11223344, "got destination id %#lx.\n", dpid ); + "new player short name", "new player long name", 0, 0 ); + ok( dpid == 0x11223344, "got destination id %#lx.\n", dpid );
checkNoMorePlayerMessages( dp );
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=149386
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
dplayx: dplayx.c:2872: Test failed: got flags 0.
=== w7u_el (32 bit report) ===
dplayx: dplayx.c:3587: Test failed: got flags 0.
This merge request was approved by Alistair Leslie-Hughes.