mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-15 20:48:00 +01:00
fix assertion by implementing kplr_nameForAddress() fully
This commit is contained in:
parent
cc82d88fcc
commit
2993e82ec7
4 changed files with 36 additions and 50 deletions
|
@ -1318,8 +1318,8 @@ comms_getChannelAddr( const CommsCtxt* comms, XP_PlayerAddr channelNo,
|
|||
XP_ASSERT( found );
|
||||
}
|
||||
|
||||
static XP_Bool
|
||||
addrs_same( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
|
||||
XP_Bool
|
||||
addrsAreSame( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
|
||||
{
|
||||
/* Empty addresses are the same only if both are empty */
|
||||
XP_Bool same = addr1->_conTypes == 0 && addr2->_conTypes == 0;
|
||||
|
@ -1347,15 +1347,6 @@ addrs_same( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
|
|||
return same;
|
||||
}
|
||||
|
||||
XP_Bool
|
||||
comms_addrsAreSame( const CommsCtxt* XP_UNUSED(comms),
|
||||
const CommsAddrRec* addr1,
|
||||
const CommsAddrRec* addr2 )
|
||||
{
|
||||
XP_Bool result = addrs_same( addr1, addr2 );
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef struct _NonAcks {
|
||||
int count;
|
||||
} NonAcks;
|
||||
|
@ -1685,7 +1676,7 @@ pickChannel( const CommsCtxt* comms, const NetLaunchInfo* nli,
|
|||
if ( 0 == result ) {
|
||||
/* First, do we already have an invitation for this address */
|
||||
for ( AddressRecord* rec = comms->recs; !!rec; rec = rec->next ) {
|
||||
if ( addrs_same( destAddr, &rec->addr ) ) {
|
||||
if ( addrsAreSame( destAddr, &rec->addr ) ) {
|
||||
result = rec->channelNo;
|
||||
XP_LOGFF( "addrs match; reusing channel" );
|
||||
break;
|
||||
|
@ -2792,7 +2783,7 @@ getChannelFromInvite( const CommsCtxt* comms, const CommsAddrRec* retAddr,
|
|||
XP_Bool found = XP_FALSE;
|
||||
for ( const AddressRecord* rec = comms->recs; !!rec && !found;
|
||||
rec = rec->next ) {
|
||||
found = addrs_same( retAddr, &rec->addr );
|
||||
found = addrsAreSame( retAddr, &rec->addr );
|
||||
if ( found ) {
|
||||
COMMS_LOGFF( "channelNo before: %x", *channelNoP );
|
||||
*channelNoP |= rec->channelNo;
|
||||
|
|
|
@ -221,8 +221,7 @@ XP_S16 comms_resendAll( CommsCtxt* comms, XWEnv xwe, CommsConnType filter,
|
|||
XP_U16 comms_getChannelSeed( CommsCtxt* comms );
|
||||
void comms_getChannelAddr( const CommsCtxt* comms, XP_PlayerAddr channelNo,
|
||||
CommsAddrRec* addr );
|
||||
XP_Bool comms_addrsAreSame( const CommsCtxt* comms, const CommsAddrRec* addr1,
|
||||
const CommsAddrRec* addr2 );
|
||||
XP_Bool addrsAreSame( const CommsAddrRec* addr1, const CommsAddrRec* addr2 );
|
||||
|
||||
#ifdef XWFEATURE_COMMSACK
|
||||
void comms_ackAny( CommsCtxt* comms, XWEnv xwe );
|
||||
|
|
|
@ -365,21 +365,31 @@ kplr_getAddr( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* name,
|
|||
return found;
|
||||
}
|
||||
|
||||
const XP_UCHAR*
|
||||
kplr_nameForMqttDev( XW_DUtilCtxt* dutil, XWEnv xwe,
|
||||
const MQTTDevID* devID )
|
||||
{
|
||||
CommsAddrRec addr = {
|
||||
.u.mqtt.devID = *devID,
|
||||
};
|
||||
addr_setType( &addr, COMMS_CONN_MQTT );
|
||||
|
||||
return kplr_nameForAddress( dutil, xwe, &addr );
|
||||
}
|
||||
|
||||
typedef struct _MDevState {
|
||||
MQTTDevID devID;
|
||||
const CommsAddrRec* addr;
|
||||
const XP_UCHAR* name;
|
||||
} MDevState;
|
||||
|
||||
static ForEachAct
|
||||
mqttProc( const DLHead* dl, void* closure )
|
||||
addrProc( const DLHead* dl, void* closure )
|
||||
{
|
||||
ForEachAct result = FEA_OK;
|
||||
const KnownPlayer* kp = (KnownPlayer*)dl;
|
||||
MDevState* msp = (MDevState*)closure;
|
||||
const CommsAddrRec* addr = &kp->addr;
|
||||
if ( addr_hasType( addr, COMMS_CONN_MQTT )
|
||||
&& 0 == XP_MEMCMP( &addr->u.mqtt.devID, &msp->devID,
|
||||
sizeof(msp->devID) ) ) {
|
||||
|
||||
if ( addrsAreSame( &kp->addr, msp->addr ) ) {
|
||||
msp->name = kp->name;
|
||||
result = FEA_EXIT;
|
||||
}
|
||||
|
@ -387,32 +397,20 @@ mqttProc( const DLHead* dl, void* closure )
|
|||
}
|
||||
|
||||
const XP_UCHAR*
|
||||
kplr_nameForMqttDev( XW_DUtilCtxt* dutil, XWEnv xwe,
|
||||
const MQTTDevID* devID )
|
||||
kplr_nameForAddress( XW_DUtilCtxt* dutil, XWEnv xwe,
|
||||
const CommsAddrRec* addr )
|
||||
{
|
||||
MDevState ms = {.devID = *devID};
|
||||
MDevState ms = {.addr = addr};
|
||||
KPState* state = loadState( dutil, xwe );
|
||||
#ifdef DEBUG
|
||||
DLHead* head =
|
||||
#endif
|
||||
dll_map( &state->players->links, mqttProc, NULL, &ms );
|
||||
dll_map( &state->players->links, addrProc, NULL, &ms );
|
||||
XP_ASSERT( head == &state->players->links );
|
||||
releaseState( dutil, xwe, state );
|
||||
return ms.name;
|
||||
}
|
||||
|
||||
const XP_UCHAR*
|
||||
kplr_nameForAddress( XW_DUtilCtxt* dutil, XWEnv xwe,
|
||||
const CommsAddrRec* addr )
|
||||
{
|
||||
const XP_UCHAR* result = NULL;
|
||||
if ( addr_hasType( addr, COMMS_CONN_MQTT ) ) {
|
||||
result = kplr_nameForMqttDev( dutil, xwe,
|
||||
&addr->u.mqtt.devID );
|
||||
} else {
|
||||
XP_ASSERT(0); /* FIXME */
|
||||
}
|
||||
return result;
|
||||
XP_LOGFF( "=> %s", ms.name );
|
||||
return ms.name;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -298,8 +298,8 @@ static void ri_fromStream( RematchInfo* rip, XWStreamCtxt* stream,
|
|||
const ServerCtxt* server );
|
||||
static void ri_toStream( XWStreamCtxt* stream, const RematchInfo* rip,
|
||||
const ServerCtxt* server );
|
||||
static void ri_addAddrAt( RematchInfo* rip, const ServerCtxt* server,
|
||||
const CommsAddrRec* addr, XP_U16 playerIndex );
|
||||
static void ri_addAddrAt( RematchInfo* rip, const CommsAddrRec* addr,
|
||||
XP_U16 playerIndex );
|
||||
static void ri_addHostAddrs( RematchInfo* rip, const ServerCtxt* server );
|
||||
static void ri_addLocal( RematchInfo* rip );
|
||||
|
||||
|
@ -896,7 +896,7 @@ buildGuestRI( const ServerCtxt* server, XP_U16 guestIndex, RematchInfo* rip )
|
|||
const LocalPlayer* lp = &gi->players[ii];
|
||||
if ( lp->isLocal ) { /* that's me, the host */
|
||||
CommsAddrRec addr = {};
|
||||
ri_addAddrAt( rip, server, &addr, ii );
|
||||
ri_addAddrAt( rip, &addr, ii );
|
||||
} else {
|
||||
XP_S8 deviceIndex = server->srvPlyrs[ii].deviceIndex;
|
||||
if ( guestIndex == deviceIndex ) {
|
||||
|
@ -906,7 +906,7 @@ buildGuestRI( const ServerCtxt* server, XP_U16 guestIndex, RematchInfo* rip )
|
|||
= server->nv.addresses[deviceIndex].channelNo;
|
||||
CommsAddrRec addr;
|
||||
comms_getChannelAddr( server->vol.comms, channelNo, &addr );
|
||||
ri_addAddrAt( rip, server, &addr, ii );
|
||||
ri_addAddrAt( rip, &addr, ii );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2146,7 +2146,7 @@ findOrderedSlot( ServerCtxt* server, XWStreamCtxt* stream,
|
|||
ServerPlayer* sp = &server->srvPlyrs[ii];
|
||||
if ( UNKNOWN_DEVICE == sp->deviceIndex ) {
|
||||
int addrIndx = rip->addrIndices[ii];
|
||||
if ( comms_addrsAreSame( comms, &guestAddr, &rip->addrs[addrIndx] ) ) {
|
||||
if ( addrsAreSame( &guestAddr, &rip->addrs[addrIndx] ) ) {
|
||||
*spp = sp;
|
||||
*lpp = &gi->players[ii];
|
||||
XP_ASSERT( !(*lpp)->isLocal );
|
||||
|
@ -4321,7 +4321,7 @@ getRematchInfoImpl( const ServerCtxt* server, CurGameInfo* newGI,
|
|||
} else {
|
||||
comms_getHostAddr( comms, &addr );
|
||||
}
|
||||
ri_addAddrAt( &ri, server, &addr, ii );
|
||||
ri_addAddrAt( &ri, &addr, ii );
|
||||
}
|
||||
}
|
||||
} else if ( !!server->nv.rematch.addrs ) {
|
||||
|
@ -4359,7 +4359,7 @@ getRematchInfoImpl( const ServerCtxt* server, CurGameInfo* newGI,
|
|||
if ( newGI->players[ii].isLocal ) {
|
||||
ri_addLocal( &ri );
|
||||
} else if ( nextRemote < nAddrs ) {
|
||||
ri_addAddrAt( &ri, server, &addrs[nextRemote++], ii );
|
||||
ri_addAddrAt( &ri, &addrs[nextRemote++], ii );
|
||||
} else {
|
||||
SRVR_LOGFF( "ERROR: not enough addresses for all"
|
||||
" remote players" );
|
||||
|
@ -4599,15 +4599,13 @@ ri_fromStream( RematchInfo* rip, XWStreamCtxt* stream,
|
|||
/* Given an address, insert it if it's new, or point to an existing copy
|
||||
otherwise */
|
||||
static void
|
||||
ri_addAddrAt( RematchInfo* rip, const ServerCtxt* server,
|
||||
const CommsAddrRec* addr, const XP_U16 player )
|
||||
ri_addAddrAt( RematchInfo* rip, const CommsAddrRec* addr, const XP_U16 player )
|
||||
{
|
||||
const CommsCtxt* comms = server->vol.comms;
|
||||
XP_S8 newIndex = RIP_LOCAL_INDX;
|
||||
for ( int ii = 0; ii < player; ++ii ) {
|
||||
int index = rip->addrIndices[ii];
|
||||
if ( index != RIP_LOCAL_INDX &&
|
||||
comms_addrsAreSame( comms, addr, &rip->addrs[index] ) ) {
|
||||
addrsAreSame( addr, &rip->addrs[index] ) ) {
|
||||
newIndex = index;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue