From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 47 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index dcf0e4f2c4d..acb46b13718 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2021,6 +2021,10 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const { BYTE playerData[ 256 ]; DWORD playerDataSize; + BYTE nameData[ 256 ]; + DWORD nameDataSize; + char *shortName; + char *longName; HRESULT hr;
if ( player->actualCount ) @@ -2058,6 +2062,49 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const ok_( __FILE__, data->line )( !memcmp( playerData, player->expectedPlayerData, player->expectedPlayerDataSize ), "player data doesn't match.\n" );
+ memset( &nameData, 0xcc, sizeof( nameData ) ); + nameDataSize = sizeof( nameData ); + hr = IDirectPlayX_GetPlayerName( data->dp, dpid, &nameData, &nameDataSize ); + ok_( __FILE__, data->line )( hr == DP_OK, "GetPlayerName() returned %#lx.\n", hr ); + todo_wine ok_( __FILE__, data->line )( ((DPNAME *) nameData)->dwSize == sizeof( DPNAME ), + "got name size %lu.\n", ((DPNAME *) nameData)->dwSize ); + todo_wine ok_( __FILE__, data->line )( !((DPNAME *) nameData)->dwFlags, "got name flags %#lx.\n", + ((DPNAME *) nameData)->dwFlags ); + shortName = ((DPNAME *) nameData)->lpszShortNameA; + if ( player->expectedShortName ) + { + if ( (char *) nameData <= shortName && shortName < (char *) nameData + nameDataSize ) + { + ok_( __FILE__, data->line )( shortName && !strcmp( shortName, player->expectedShortName ), + "got short name %s.\n", wine_dbgstr_a( shortName ) ); + } + else + { + todo_wine ok_( __FILE__, data->line)( 0, "got short name %p.\n", shortName ); + } + } + else + { + ok_( __FILE__, data->line )( !shortName, "got short name %s.\n", wine_dbgstr_a( shortName ) ); + } + longName = ((DPNAME *) nameData)->lpszLongNameA; + if ( player->expectedLongName ) + { + if ( (char *) nameData <= longName && longName < (char *) nameData + nameDataSize ) + { + ok_( __FILE__, data->line )( longName && !strcmp( longName, player->expectedLongName ), + "got long name %s.\n", wine_dbgstr_a( longName ) ); + } + else + { + todo_wine ok_( __FILE__, data->line)( 0, "got long name %p.\n", longName ); + } + } + else + { + ok_( __FILE__, data->line )( !longName, "got long name %s.\n", wine_dbgstr_a( longName ) ); + } + ++player->actualCount; ++data->actualPlayerCount;
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 5f0ba3bdcb3..2e5bf93281c 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1569,11 +1569,6 @@ static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi return TRUE; }
- if( lpSrc->dwSize != sizeof( *lpSrc) ) - { - return FALSE; - } - /* Delete any existing pointers */ free( lpDst->lpszShortNameA ); free( lpDst->lpszLongNameA );
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 100 ++++++++++++------------------------- dlls/dplayx/tests/dplayx.c | 20 ++++---- 2 files changed, 42 insertions(+), 78 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 2e5bf93281c..69c12633311 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1590,6 +1590,34 @@ static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi return TRUE; }
+static DWORD DP_CopyName( DPNAME *dst, const DPNAME *src, BOOL dstAnsi, BOOL srcAnsi ) +{ + DWORD offset = sizeof( DPNAME ); + + if ( !src ) + { + if ( dst ) + { + memset( dst, 0, sizeof( DPNAME ) ); + dst->dwSize = sizeof( DPNAME ); + } + return offset; + } + + if ( dst ) + { + *dst = *src; + dst->dwSize = sizeof( DPNAME ); + } + + offset += DP_CopyString( &dst->lpszShortNameA, src->lpszShortNameA, dstAnsi, srcAnsi, dst, + offset ); + offset += DP_CopyString( &dst->lpszLongNameA, src->lpszLongNameA, dstAnsi, srcAnsi, dst, + offset ); + + return offset; +} + static void DP_SetPlayerData( lpPlayerData lpPData, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize ) @@ -2779,7 +2807,6 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp DWORD *lpdwDataSize, BOOL bAnsi ) { lpGroupData lpGData; - LPDPNAME lpName = lpData; DWORD dwRequiredDataSize;
FIXME("(%p)->(0x%08lx,%p,%p,%u) ANSI ignored\n", @@ -2790,17 +2817,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_INVALIDGROUP; }
- dwRequiredDataSize = lpGData->name.dwSize; - - if( lpGData->name.lpszShortNameA ) - { - dwRequiredDataSize += strlen( lpGData->name.lpszShortNameA ) + 1; - } - - if( lpGData->name.lpszLongNameA ) - { - dwRequiredDataSize += strlen( lpGData->name.lpszLongNameA ) + 1; - } + dwRequiredDataSize = DP_CopyName( NULL, &lpGData->name, bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -2810,28 +2827,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_BUFFERTOOSMALL; }
- /* Copy the structure */ - CopyMemory( lpName, &lpGData->name, lpGData->name.dwSize ); - - if( lpGData->name.lpszShortNameA ) - { - strcpy( ((char*)lpName)+lpGData->name.dwSize, - lpGData->name.lpszShortNameA ); - } - else - { - lpName->lpszShortNameA = NULL; - } - - if( lpGData->name.lpszShortNameA ) - { - strcpy( ((char*)lpName)+lpGData->name.dwSize, - lpGData->name.lpszShortNameA ); - } - else - { - lpName->lpszLongNameA = NULL; - } + DP_CopyName( lpData, &lpGData->name, bAnsi, bAnsi );
return DP_OK; } @@ -3101,7 +3097,6 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * DWORD *lpdwDataSize, BOOL bAnsi ) { lpPlayerList lpPList; - LPDPNAME lpName = lpData; DWORD dwRequiredDataSize;
FIXME( "(%p)->(0x%08lx,%p,%p,%u): ANSI\n", @@ -3117,17 +3112,7 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_INVALIDPLAYER; }
- dwRequiredDataSize = lpPList->lpPData->name.dwSize; - - if( lpPList->lpPData->name.lpszShortNameA ) - { - dwRequiredDataSize += strlen( lpPList->lpPData->name.lpszShortNameA ) + 1; - } - - if( lpPList->lpPData->name.lpszLongNameA ) - { - dwRequiredDataSize += strlen( lpPList->lpPData->name.lpszLongNameA ) + 1; - } + dwRequiredDataSize = DP_CopyName( NULL, &lpPList->lpPData->name, bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -3137,28 +3122,7 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_BUFFERTOOSMALL; }
- /* Copy the structure */ - CopyMemory( lpName, &lpPList->lpPData->name, lpPList->lpPData->name.dwSize ); - - if( lpPList->lpPData->name.lpszShortNameA ) - { - strcpy( ((char*)lpName)+lpPList->lpPData->name.dwSize, - lpPList->lpPData->name.lpszShortNameA ); - } - else - { - lpName->lpszShortNameA = NULL; - } - - if( lpPList->lpPData->name.lpszLongNameA ) - { - strcpy( ((char*)lpName)+lpPList->lpPData->name.dwSize, - lpPList->lpPData->name.lpszLongNameA ); - } - else - { - lpName->lpszLongNameA = NULL; - } + DP_CopyName( lpData, &lpPList->lpPData->name, bAnsi, bAnsi );
return DP_OK; } diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index acb46b13718..3f3ff59b677 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2066,21 +2066,21 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const nameDataSize = sizeof( nameData ); hr = IDirectPlayX_GetPlayerName( data->dp, dpid, &nameData, &nameDataSize ); ok_( __FILE__, data->line )( hr == DP_OK, "GetPlayerName() returned %#lx.\n", hr ); - todo_wine ok_( __FILE__, data->line )( ((DPNAME *) nameData)->dwSize == sizeof( DPNAME ), - "got name size %lu.\n", ((DPNAME *) nameData)->dwSize ); - todo_wine ok_( __FILE__, data->line )( !((DPNAME *) nameData)->dwFlags, "got name flags %#lx.\n", - ((DPNAME *) nameData)->dwFlags ); + ok_( __FILE__, data->line )( ((DPNAME *) nameData)->dwSize == sizeof( DPNAME ), + "got name size %lu.\n", ((DPNAME *) nameData)->dwSize ); + ok_( __FILE__, data->line )( !((DPNAME *) nameData)->dwFlags, "got name flags %#lx.\n", + ((DPNAME *) nameData)->dwFlags ); shortName = ((DPNAME *) nameData)->lpszShortNameA; if ( player->expectedShortName ) { if ( (char *) nameData <= shortName && shortName < (char *) nameData + nameDataSize ) { - ok_( __FILE__, data->line )( shortName && !strcmp( shortName, player->expectedShortName ), - "got short name %s.\n", wine_dbgstr_a( shortName ) ); + todo_wine ok_( __FILE__, data->line )( shortName && !strcmp( shortName, player->expectedShortName ), + "got short name %s.\n", wine_dbgstr_a( shortName ) ); } else { - todo_wine ok_( __FILE__, data->line)( 0, "got short name %p.\n", shortName ); + ok_( __FILE__, data->line)( 0, "got short name %p.\n", shortName ); } } else @@ -2092,12 +2092,12 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const { if ( (char *) nameData <= longName && longName < (char *) nameData + nameDataSize ) { - ok_( __FILE__, data->line )( longName && !strcmp( longName, player->expectedLongName ), - "got long name %s.\n", wine_dbgstr_a( longName ) ); + todo_wine ok_( __FILE__, data->line )( longName && !strcmp( longName, player->expectedLongName ), + "got long name %s.\n", wine_dbgstr_a( longName ) ); } else { - todo_wine ok_( __FILE__, data->line)( 0, "got long name %p.\n", longName ); + ok_( __FILE__, data->line)( 0, "got long name %p.\n", longName ); } } else
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 108 ++++++++++++++++++------------------- dlls/dplayx/dplay_global.h | 4 +- 2 files changed, 54 insertions(+), 58 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 69c12633311..751d902a77d 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -47,10 +47,9 @@ extern HRESULT DPL_CreateCompoundAddress
/* Local function prototypes */ static lpPlayerList DP_FindPlayer( IDirectPlayImpl *This, DPID dpid ); -static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi ); +static DPNAME *DP_DuplicateName( const DPNAME *src, BOOL dstAnsi, BOOL srcAnsi ); static void DP_SetGroupData( lpGroupData lpGData, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize ); -static void DP_DeleteDPNameStruct( LPDPNAME lpDPName ); static BOOL CALLBACK cbDeletePlayerFromAllGroups( DPID dpId, DWORD dwPlayerType, LPCDPNAME lpName, @@ -1078,7 +1077,12 @@ static lpGroupData DP_CreateGroup( IDirectPlayImpl *This, const DPID *lpid, cons /* Set the desired player ID - no sanity checking to see if it exists */ lpGData->dpid = *lpid;
- DP_CopyDPNAMEStruct( &lpGData->name, lpName, bAnsi ); + lpGData->name = DP_DuplicateName( lpName, bAnsi, bAnsi ); + if ( !lpGData->name ) + { + free( lpGData ); + return NULL; + }
/* FIXME: Should we check that the parent exists? */ lpGData->parent = idParent; @@ -1113,7 +1117,7 @@ static void DP_DeleteGroup( IDirectPlayImpl *This, DPID dpid ) }
/* Delete player */ - DP_DeleteDPNameStruct( &lpGList->lpGData->name ); + free( lpGList->lpGData->name ); free( lpGList->lpGData );
/* Remove and Delete Player List object */ @@ -1431,7 +1435,12 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN /* Set the desired player ID */ lpPData->dpid = *lpid;
- DP_CopyDPNAMEStruct( &lpPData->name, lpName, bAnsi ); + lpPData->name = DP_DuplicateName( lpName, bAnsi, bAnsi ); + if ( !lpPData->name ) + { + free( lpPData ); + return DPERR_OUTOFMEMORY; + }
lpPData->dwFlags = dwFlags;
@@ -1457,7 +1466,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN { free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); - DP_DeleteDPNameStruct( &lpPData->name ); + free( lpPData->name ); free( lpPData ); return DPERR_OUTOFMEMORY; } @@ -1479,7 +1488,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN free( lpPList ); free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); - DP_DeleteDPNameStruct( &lpPData->name ); + free( lpPData->name ); free( lpPData ); return hr; } @@ -1492,7 +1501,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN free( lpPList ); free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); - DP_DeleteDPNameStruct( &lpPData->name ); + free( lpPData->name ); free( lpPData ); return hr; } @@ -1505,14 +1514,6 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN return DP_OK; }
-/* Delete the contents of the DPNAME struct */ -static void -DP_DeleteDPNameStruct( LPDPNAME lpDPName ) -{ - free( lpDPName->lpszShortNameA ); - free( lpDPName->lpszLongNameA ); -} - /* This method assumes that all links to it are already deleted */ static void DP_DeletePlayer( IDirectPlayImpl *This, DPID dpid ) { @@ -1536,7 +1537,7 @@ static void DP_DeletePlayer( IDirectPlayImpl *This, DPID dpid ) }
/* Delete player */ - DP_DeleteDPNameStruct( &lpPList->lpPData->name ); + free( lpPList->lpPData->name );
CloseHandle( lpPList->lpPData->hEvent ); free( lpPList->lpPData ); @@ -1559,37 +1560,6 @@ static lpPlayerList DP_FindPlayer( IDirectPlayImpl *This, DPID dpid ) return lpPlayers; }
-/* Basic area for Dst must already be allocated */ -static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi ) -{ - if( lpSrc == NULL ) - { - ZeroMemory( lpDst, sizeof( *lpDst ) ); - lpDst->dwSize = sizeof( *lpDst ); - return TRUE; - } - - /* Delete any existing pointers */ - free( lpDst->lpszShortNameA ); - free( lpDst->lpszLongNameA ); - - /* Copy as required */ - CopyMemory( lpDst, lpSrc, lpSrc->dwSize ); - - if( bAnsi ) - { - lpDst->lpszShortNameA = strdup( lpSrc->lpszShortNameA ); - lpDst->lpszLongNameA = strdup( lpSrc->lpszLongNameA ); - } - else - { - lpDst->lpszShortName = wcsdup( lpSrc->lpszShortName ); - lpDst->lpszLongName = wcsdup( lpSrc->lpszLongName ); - } - - return TRUE; -} - static DWORD DP_CopyName( DPNAME *dst, const DPNAME *src, BOOL dstAnsi, BOOL srcAnsi ) { DWORD offset = sizeof( DPNAME ); @@ -1618,6 +1588,22 @@ static DWORD DP_CopyName( DPNAME *dst, const DPNAME *src, BOOL dstAnsi, BOOL src return offset; }
+static DPNAME *DP_DuplicateName( const DPNAME *src, BOOL dstAnsi, BOOL srcAnsi ) +{ + DPNAME *dst; + DWORD size; + + size = DP_CopyName( NULL, src, dstAnsi, srcAnsi ); + + dst = malloc( size ); + if ( !dst ) + return NULL; + + DP_CopyName( dst, src, dstAnsi, srcAnsi ); + + return dst; +} + static void DP_SetPlayerData( lpPlayerData lpPData, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize ) @@ -2290,7 +2276,7 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupPlayers( IDirectPlay4 *iface, DP { /* FIXME: Need to add stuff for flags checking */ if ( !enumplayercb( plist->lpPData->dpid, DPPLAYERTYPE_PLAYER, - &plist->lpPData->name, plist->lpPData->dwFlags, context ) ) + plist->lpPData->name, plist->lpPData->dwFlags, context ) ) /* User requested break */ return DP_OK; } @@ -2817,7 +2803,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_INVALIDGROUP; }
- dwRequiredDataSize = DP_CopyName( NULL, &lpGData->name, bAnsi, bAnsi ); + dwRequiredDataSize = DP_CopyName( NULL, lpGData->name, bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -2827,7 +2813,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_BUFFERTOOSMALL; }
- DP_CopyName( lpData, &lpGData->name, bAnsi, bAnsi ); + DP_CopyName( lpData, lpGData->name, bAnsi, bAnsi );
return DP_OK; } @@ -3112,7 +3098,7 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_INVALIDPLAYER; }
- dwRequiredDataSize = DP_CopyName( NULL, &lpPList->lpPData->name, bAnsi, bAnsi ); + dwRequiredDataSize = DP_CopyName( NULL, lpPList->lpPData->name, bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -3122,7 +3108,7 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_BUFFERTOOSMALL; }
- DP_CopyName( lpData, &lpPList->lpPData->name, bAnsi, bAnsi ); + DP_CopyName( lpData, lpPList->lpPData->name, bAnsi, bAnsi );
return DP_OK; } @@ -3669,6 +3655,7 @@ static HRESULT DP_IF_SetGroupName( IDirectPlayImpl *This, DPID idGroup, DPNAME * DWORD dwFlags, BOOL bAnsi ) { lpGroupData lpGData; + DPNAME *name;
TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", This, idGroup, lpGroupName, dwFlags, bAnsi ); @@ -3678,7 +3665,11 @@ static HRESULT DP_IF_SetGroupName( IDirectPlayImpl *This, DPID idGroup, DPNAME * return DPERR_INVALIDGROUP; }
- DP_CopyDPNAMEStruct( &lpGData->name, lpGroupName, bAnsi ); + name = DP_DuplicateName( lpGroupName, bAnsi, bAnsi ); + if ( !name ) + return DPERR_OUTOFMEMORY; + + lpGData->name = name;
/* Should send a DPMSG_SETPLAYERORGROUPNAME message */ FIXME( "Message not sent and dwFlags ignored\n" ); @@ -3802,6 +3793,7 @@ static HRESULT DP_IF_SetPlayerName( IDirectPlayImpl *This, DPID idPlayer, DPNAME DWORD dwFlags, BOOL bAnsi ) { lpPlayerList lpPList; + DPNAME *name;
TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", This, idPlayer, lpPlayerName, dwFlags, bAnsi ); @@ -3816,7 +3808,11 @@ static HRESULT DP_IF_SetPlayerName( IDirectPlayImpl *This, DPID idPlayer, DPNAME return DPERR_INVALIDGROUP; }
- DP_CopyDPNAMEStruct( &lpPList->lpPData->name, lpPlayerName, bAnsi ); + name = DP_DuplicateName( lpPlayerName, bAnsi, bAnsi ); + if ( !name ) + return DPERR_OUTOFMEMORY; + + lpPList->lpPData->name = name;
/* Should send a DPMSG_SETPLAYERORGROUPNAME message */ FIXME( "Message not sent and dwFlags ignored\n" ); @@ -4566,7 +4562,7 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupsInGroup( IDirectPlay4 *iface, D for( glist = DPQ_FIRST( gdata->groups ); ; glist = DPQ_NEXT( glist->groups ) ) { /* FIXME: Should check flags for match here */ - if ( !(*enumplayercb)( glist->lpGData->dpid, DPPLAYERTYPE_GROUP, &glist->lpGData->name, + if ( !(*enumplayercb)( glist->lpGData->dpid, DPPLAYERTYPE_GROUP, glist->lpGData->name, flags, context ) ) return DP_OK; /* User requested break */
diff --git a/dlls/dplayx/dplay_global.h b/dlls/dplayx/dplay_global.h index b946c078ec6..58fc9de0a52 100644 --- a/dlls/dplayx/dplay_global.h +++ b/dlls/dplayx/dplay_global.h @@ -62,7 +62,7 @@ struct PlayerData /* Individual player information */ DPID dpid;
- DPNAME name; + DPNAME *name; HANDLE hEvent;
ULONG uRef; /* What is the reference count on this data? */ @@ -105,7 +105,7 @@ struct GroupData DWORD dwFlags; /* Flags describing anything special about the group */
DPID dpid; - DPNAME name; + DPNAME *name;
/* View of local data */ LPVOID lpLocalData;
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 56 ++++++++++++++++++++++++++++++++------ dlls/dplayx/dplay_global.h | 2 ++ dlls/dplayx/tests/dplayx.c | 8 +++--- 3 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 751d902a77d..c1b09627f55 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1077,13 +1077,21 @@ static lpGroupData DP_CreateGroup( IDirectPlayImpl *This, const DPID *lpid, cons /* Set the desired player ID - no sanity checking to see if it exists */ lpGData->dpid = *lpid;
- lpGData->name = DP_DuplicateName( lpName, bAnsi, bAnsi ); + lpGData->name = DP_DuplicateName( lpName, FALSE, bAnsi ); if ( !lpGData->name ) { free( lpGData ); return NULL; }
+ lpGData->nameA = DP_DuplicateName( lpName, TRUE, bAnsi ); + if ( !lpGData->nameA ) + { + free( lpGData->name ); + free( lpGData ); + return NULL; + } + /* FIXME: Should we check that the parent exists? */ lpGData->parent = idParent;
@@ -1117,6 +1125,7 @@ static void DP_DeleteGroup( IDirectPlayImpl *This, DPID dpid ) }
/* Delete player */ + free( lpGList->lpGData->nameA ); free( lpGList->lpGData->name ); free( lpGList->lpGData );
@@ -1435,13 +1444,21 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN /* Set the desired player ID */ lpPData->dpid = *lpid;
- lpPData->name = DP_DuplicateName( lpName, bAnsi, bAnsi ); + lpPData->name = DP_DuplicateName( lpName, FALSE, bAnsi ); if ( !lpPData->name ) { free( lpPData ); return DPERR_OUTOFMEMORY; }
+ lpPData->nameA = DP_DuplicateName( lpName, TRUE, bAnsi ); + if ( !lpPData->nameA ) + { + free( lpPData->name ); + free( lpPData ); + return DPERR_OUTOFMEMORY; + } + lpPData->dwFlags = dwFlags;
/* If we were given an event handle, duplicate it */ @@ -1466,6 +1483,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN { free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); + free( lpPData->nameA ); free( lpPData->name ); free( lpPData ); return DPERR_OUTOFMEMORY; @@ -1488,6 +1506,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN free( lpPList ); free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); + free( lpPData->nameA ); free( lpPData->name ); free( lpPData ); return hr; @@ -1501,6 +1520,7 @@ HRESULT DP_CreatePlayer( IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPN free( lpPList ); free( lpPData->lpSPPlayerData ); CloseHandle( lpPData->hEvent ); + free( lpPData->nameA ); free( lpPData->name ); free( lpPData ); return hr; @@ -1537,6 +1557,7 @@ static void DP_DeletePlayer( IDirectPlayImpl *This, DPID dpid ) }
/* Delete player */ + free( lpPList->lpPData->nameA ); free( lpPList->lpPData->name );
CloseHandle( lpPList->lpPData->hEvent ); @@ -2803,7 +2824,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_INVALIDGROUP; }
- dwRequiredDataSize = DP_CopyName( NULL, lpGData->name, bAnsi, bAnsi ); + dwRequiredDataSize = DP_CopyName( NULL, bAnsi ? lpGData->nameA : lpGData->name, bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -2813,7 +2834,7 @@ static HRESULT DP_IF_GetGroupName( IDirectPlayImpl *This, DPID idGroup, void *lp return DPERR_BUFFERTOOSMALL; }
- DP_CopyName( lpData, lpGData->name, bAnsi, bAnsi ); + DP_CopyName( lpData, bAnsi ? lpGData->nameA : lpGData->name, bAnsi, bAnsi );
return DP_OK; } @@ -3098,7 +3119,8 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_INVALIDPLAYER; }
- dwRequiredDataSize = DP_CopyName( NULL, lpPList->lpPData->name, bAnsi, bAnsi ); + dwRequiredDataSize = DP_CopyName( NULL, bAnsi ? lpPList->lpPData->nameA : lpPList->lpPData->name, + bAnsi, bAnsi );
if( ( lpData == NULL ) || ( *lpdwDataSize < dwRequiredDataSize ) @@ -3108,7 +3130,7 @@ static HRESULT DP_IF_GetPlayerName( IDirectPlayImpl *This, DPID idPlayer, void * return DPERR_BUFFERTOOSMALL; }
- DP_CopyName( lpData, lpPList->lpPData->name, bAnsi, bAnsi ); + DP_CopyName( lpData, bAnsi ? lpPList->lpPData->nameA : lpPList->lpPData->name, bAnsi, bAnsi );
return DP_OK; } @@ -3655,6 +3677,7 @@ static HRESULT DP_IF_SetGroupName( IDirectPlayImpl *This, DPID idGroup, DPNAME * DWORD dwFlags, BOOL bAnsi ) { lpGroupData lpGData; + DPNAME *nameA; DPNAME *name;
TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", This, idGroup, @@ -3665,11 +3688,19 @@ static HRESULT DP_IF_SetGroupName( IDirectPlayImpl *This, DPID idGroup, DPNAME * return DPERR_INVALIDGROUP; }
- name = DP_DuplicateName( lpGroupName, bAnsi, bAnsi ); + name = DP_DuplicateName( lpGroupName, FALSE, bAnsi ); if ( !name ) return DPERR_OUTOFMEMORY;
+ nameA = DP_DuplicateName( lpGroupName, TRUE, bAnsi ); + if ( !nameA ) + { + free( name ); + return DPERR_OUTOFMEMORY; + } + lpGData->name = name; + lpGData->nameA = nameA;
/* Should send a DPMSG_SETPLAYERORGROUPNAME message */ FIXME( "Message not sent and dwFlags ignored\n" ); @@ -3793,6 +3824,7 @@ static HRESULT DP_IF_SetPlayerName( IDirectPlayImpl *This, DPID idPlayer, DPNAME DWORD dwFlags, BOOL bAnsi ) { lpPlayerList lpPList; + DPNAME *nameA; DPNAME *name;
TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", @@ -3808,11 +3840,19 @@ static HRESULT DP_IF_SetPlayerName( IDirectPlayImpl *This, DPID idPlayer, DPNAME return DPERR_INVALIDGROUP; }
- name = DP_DuplicateName( lpPlayerName, bAnsi, bAnsi ); + name = DP_DuplicateName( lpPlayerName, FALSE, bAnsi ); if ( !name ) return DPERR_OUTOFMEMORY;
+ nameA = DP_DuplicateName( lpPlayerName, TRUE, bAnsi ); + if ( !nameA ) + { + free( name ); + return DPERR_OUTOFMEMORY; + } + lpPList->lpPData->name = name; + lpPList->lpPData->nameA = nameA;
/* Should send a DPMSG_SETPLAYERORGROUPNAME message */ FIXME( "Message not sent and dwFlags ignored\n" ); diff --git a/dlls/dplayx/dplay_global.h b/dlls/dplayx/dplay_global.h index 58fc9de0a52..1bd9908f2dc 100644 --- a/dlls/dplayx/dplay_global.h +++ b/dlls/dplayx/dplay_global.h @@ -63,6 +63,7 @@ struct PlayerData DPID dpid;
DPNAME *name; + DPNAME *nameA; HANDLE hEvent;
ULONG uRef; /* What is the reference count on this data? */ @@ -106,6 +107,7 @@ struct GroupData
DPID dpid; DPNAME *name; + DPNAME *nameA;
/* View of local data */ LPVOID lpLocalData; diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 3f3ff59b677..3897cc8e52c 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2075,8 +2075,8 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const { if ( (char *) nameData <= shortName && shortName < (char *) nameData + nameDataSize ) { - todo_wine ok_( __FILE__, data->line )( shortName && !strcmp( shortName, player->expectedShortName ), - "got short name %s.\n", wine_dbgstr_a( shortName ) ); + ok_( __FILE__, data->line )( shortName && !strcmp( shortName, player->expectedShortName ), + "got short name %s.\n", wine_dbgstr_a( shortName ) ); } else { @@ -2092,8 +2092,8 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const { if ( (char *) nameData <= longName && longName < (char *) nameData + nameDataSize ) { - todo_wine ok_( __FILE__, data->line )( longName && !strcmp( longName, player->expectedLongName ), - "got long name %s.\n", wine_dbgstr_a( longName ) ); + ok_( __FILE__, data->line )( longName && !strcmp( longName, player->expectedLongName ), + "got long name %s.\n", wine_dbgstr_a( longName ) ); } else {
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 61 ++++++++++++++++++++++---------------- dlls/dplayx/tests/dplayx.c | 8 ++--- 2 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index c1b09627f55..6b9001360ca 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -2259,18 +2259,9 @@ static HRESULT WINAPI IDirectPlay3Impl_EnumGroupPlayers( IDirectPlay3 *iface, DP enumplayercb, context, flags ); }
-static HRESULT WINAPI IDirectPlay4AImpl_EnumGroupPlayers( IDirectPlay4A *iface, DPID group, - GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) -{ - IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); - return IDirectPlayX_EnumGroupPlayers( &This->IDirectPlay4_iface, group, instance, enumplayercb, - context, flags ); -} - -static HRESULT WINAPI IDirectPlay4Impl_EnumGroupPlayers( IDirectPlay4 *iface, DPID group, - GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +static HRESULT DP_IF_EnumGroupPlayers( IDirectPlayImpl *This, DPID group, GUID *instance, + LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags, BOOL ansi ) { - IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); lpGroupData gdata; lpPlayerList plist;
@@ -2297,7 +2288,8 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupPlayers( IDirectPlay4 *iface, DP { /* FIXME: Need to add stuff for flags checking */ if ( !enumplayercb( plist->lpPData->dpid, DPPLAYERTYPE_PLAYER, - plist->lpPData->name, plist->lpPData->dwFlags, context ) ) + ansi ? plist->lpPData->nameA : plist->lpPData->name, + plist->lpPData->dwFlags, context ) ) /* User requested break */ return DP_OK; } @@ -2308,6 +2300,20 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupPlayers( IDirectPlay4 *iface, DP return DP_OK; }
+static HRESULT WINAPI IDirectPlay4AImpl_EnumGroupPlayers( IDirectPlay4A *iface, DPID group, + GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); + return DP_IF_EnumGroupPlayers( This, group, instance, enumplayercb, context, flags, TRUE ); +} + +static HRESULT WINAPI IDirectPlay4Impl_EnumGroupPlayers( IDirectPlay4 *iface, DPID group, + GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); + return DP_IF_EnumGroupPlayers( This, group, instance, enumplayercb, context, flags, FALSE ); +} + /* NOTE: This only enumerates top level groups (created with CreateGroup) */ static HRESULT WINAPI IDirectPlay2AImpl_EnumGroups( IDirectPlay2A *iface, GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) @@ -4571,18 +4577,9 @@ static HRESULT WINAPI IDirectPlay3Impl_EnumGroupsInGroup( IDirectPlay3 *iface, D enumplayercb, context, flags ); }
-static HRESULT WINAPI IDirectPlay4AImpl_EnumGroupsInGroup( IDirectPlay4A *iface, DPID group, - GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +static HRESULT DP_IF_EnumGroupsInGroup( IDirectPlayImpl *This, DPID group, GUID *instance, + LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags, BOOL ansi ) { - IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); - return IDirectPlayX_EnumGroupsInGroup( &This->IDirectPlay4_iface, group, instance, - enumplayercb, context, flags ); -} - -static HRESULT WINAPI IDirectPlay4Impl_EnumGroupsInGroup( IDirectPlay4 *iface, DPID group, - GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) -{ - IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); lpGroupList glist; lpGroupData gdata;
@@ -4602,8 +4599,8 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupsInGroup( IDirectPlay4 *iface, D for( glist = DPQ_FIRST( gdata->groups ); ; glist = DPQ_NEXT( glist->groups ) ) { /* FIXME: Should check flags for match here */ - if ( !(*enumplayercb)( glist->lpGData->dpid, DPPLAYERTYPE_GROUP, glist->lpGData->name, - flags, context ) ) + if ( !(*enumplayercb)( glist->lpGData->dpid, DPPLAYERTYPE_GROUP, + ansi ? glist->lpGData->nameA : glist->lpGData->name, flags, context ) ) return DP_OK; /* User requested break */
if ( DPQ_IS_ENDOFLIST( glist->groups ) ) @@ -4613,6 +4610,20 @@ static HRESULT WINAPI IDirectPlay4Impl_EnumGroupsInGroup( IDirectPlay4 *iface, D return DP_OK; }
+static HRESULT WINAPI IDirectPlay4AImpl_EnumGroupsInGroup( IDirectPlay4A *iface, DPID group, + GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4A( iface ); + return DP_IF_EnumGroupsInGroup( This, group, instance, enumplayercb, context, flags, TRUE ); +} + +static HRESULT WINAPI IDirectPlay4Impl_EnumGroupsInGroup( IDirectPlay4 *iface, DPID group, + GUID *instance, LPDPENUMPLAYERSCALLBACK2 enumplayercb, void *context, DWORD flags ) +{ + IDirectPlayImpl *This = impl_from_IDirectPlay4( iface ); + return DP_IF_EnumGroupsInGroup( This, group, instance, enumplayercb, context, flags, FALSE ); +} + static HRESULT WINAPI IDirectPlay3AImpl_GetGroupConnectionSettings( IDirectPlay3A *iface, DWORD flags, DPID group, void *data, DWORD *size ) { diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 3897cc8e52c..a780f93de4c 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2033,8 +2033,8 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const playerType ); if ( player->expectedShortName ) { - todo_wine ok_( __FILE__, data->line )( name->lpszShortNameA && !strcmp( name->lpszShortNameA, player->expectedShortName ), - "got short name %s.\n", wine_dbgstr_a( name->lpszShortNameA ) ); + ok_( __FILE__, data->line )( name->lpszShortNameA && !strcmp( name->lpszShortNameA, player->expectedShortName ), + "got short name %s.\n", wine_dbgstr_a( name->lpszShortNameA ) ); } else { @@ -2043,8 +2043,8 @@ static BOOL CALLBACK checkPlayerListCallback( DPID dpid, DWORD playerType, const } if ( player->expectedLongName ) { - todo_wine ok_( __FILE__, data->line )( name->lpszLongNameA && !strcmp( name->lpszLongNameA, player->expectedLongName ), - "got long name %s.\n", wine_dbgstr_a( name->lpszLongNameA ) ); + ok_( __FILE__, data->line )( name->lpszLongNameA && !strcmp( name->lpszLongNameA, player->expectedLongName ), + "got long name %s.\n", wine_dbgstr_a( name->lpszLongNameA ) ); } else {
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=148849
Your paranoid android.
=== w7u_el (32 bit report) ===
dplayx: dplayx.c:2349: Test failed: got flags 0x10.
This merge request was approved by Alistair Leslie-Hughes.