mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-29 08:34:37 +01:00
make an addr's conType a bitfield rather than holding a single value.
Works for large numbers of relay games in test, but will not yet actually hold more than one value. Should be safe to merge to main branch once stream upgrade is verified.
This commit is contained in:
parent
75981f52ca
commit
43bd3c018a
9 changed files with 179 additions and 103 deletions
|
@ -181,6 +181,8 @@ static void freeElem( const CommsCtxt* comms, MsgQueueElem* elem );
|
|||
|
||||
static XP_U16 countAddrRecs( const CommsCtxt* comms );
|
||||
static void sendConnect( CommsCtxt* comms, XP_Bool breakExisting );
|
||||
static XP_Bool addr_iter( const CommsAddrRec* addr, CommsConnType* typp,
|
||||
XP_U32* state );
|
||||
|
||||
#ifdef XWFEATURE_RELAY
|
||||
static XP_Bool relayConnect( CommsCtxt* comms );
|
||||
|
@ -455,7 +457,7 @@ comms_transportFailed( CommsCtxt* comms )
|
|||
{
|
||||
LOG_FUNC();
|
||||
XP_ASSERT( !!comms );
|
||||
if ( COMMS_CONN_RELAY == comms->addr.conType
|
||||
if ( COMMS_CONN_RELAY == addr_getType(&comms->addr)
|
||||
&& comms->rr.relayState != COMMS_RELAYSTATE_DENIED ) {
|
||||
relayDisconnect( comms );
|
||||
|
||||
|
@ -469,10 +471,10 @@ void
|
|||
comms_destroy( CommsCtxt* comms )
|
||||
{
|
||||
/* did I call comms_stop()? */
|
||||
XP_ASSERT( COMMS_CONN_RELAY != comms->addr.conType
|
||||
XP_ASSERT( COMMS_CONN_RELAY != addr_getType(&comms->addr)
|
||||
|| COMMS_RELAYSTATE_UNCONNECTED == comms->rr.relayState );
|
||||
|
||||
CommsAddrRec aNew = { .conType = COMMS_CONN_NONE };
|
||||
CommsAddrRec aNew = {0};
|
||||
util_addrChange( comms->util, &comms->addr, &aNew );
|
||||
|
||||
cleanupInternal( comms );
|
||||
|
@ -493,54 +495,68 @@ comms_setConnID( CommsCtxt* comms, XP_U32 connID )
|
|||
} /* comms_setConnID */
|
||||
|
||||
static void
|
||||
addrFromStream( CommsAddrRec* addrP, XWStreamCtxt* stream )
|
||||
addrFromStreamOne( CommsAddrRec* addrP, XWStreamCtxt* stream, CommsConnType typ )
|
||||
{
|
||||
CommsAddrRec addr;
|
||||
|
||||
addr.conType = stream_getU8( stream );
|
||||
|
||||
switch( addr.conType ) {
|
||||
switch( typ ) {
|
||||
case COMMS_CONN_NONE:
|
||||
break;
|
||||
case COMMS_CONN_BT:
|
||||
stringFromStreamHere( stream, addr.u.bt.hostName,
|
||||
sizeof(addr.u.bt.hostName) );
|
||||
stringFromStreamHere( stream, addr.u.bt.btAddr.chars,
|
||||
sizeof(addr.u.bt.btAddr.chars) );
|
||||
stringFromStreamHere( stream, addrP->u.bt.hostName,
|
||||
sizeof(addrP->u.bt.hostName) );
|
||||
stringFromStreamHere( stream, addrP->u.bt.btAddr.chars,
|
||||
sizeof(addrP->u.bt.btAddr.chars) );
|
||||
break;
|
||||
case COMMS_CONN_IR:
|
||||
/* nothing to save */
|
||||
break;
|
||||
case COMMS_CONN_IP_DIRECT:
|
||||
stringFromStreamHere( stream, addr.u.ip.hostName_ip,
|
||||
sizeof(addr.u.ip.hostName_ip) );
|
||||
addr.u.ip.ipAddr_ip = stream_getU32( stream );
|
||||
addr.u.ip.port_ip = stream_getU16( stream );
|
||||
stringFromStreamHere( stream, addrP->u.ip.hostName_ip,
|
||||
sizeof(addrP->u.ip.hostName_ip) );
|
||||
addrP->u.ip.ipAddr_ip = stream_getU32( stream );
|
||||
addrP->u.ip.port_ip = stream_getU16( stream );
|
||||
break;
|
||||
case COMMS_CONN_RELAY:
|
||||
stringFromStreamHere( stream, addr.u.ip_relay.invite,
|
||||
sizeof(addr.u.ip_relay.invite) );
|
||||
stringFromStreamHere( stream, addr.u.ip_relay.hostName,
|
||||
sizeof(addr.u.ip_relay.hostName) );
|
||||
addr.u.ip_relay.ipAddr = stream_getU32( stream );
|
||||
addr.u.ip_relay.port = stream_getU16( stream );
|
||||
stringFromStreamHere( stream, addrP->u.ip_relay.invite,
|
||||
sizeof(addrP->u.ip_relay.invite) );
|
||||
stringFromStreamHere( stream, addrP->u.ip_relay.hostName,
|
||||
sizeof(addrP->u.ip_relay.hostName) );
|
||||
addrP->u.ip_relay.ipAddr = stream_getU32( stream );
|
||||
addrP->u.ip_relay.port = stream_getU16( stream );
|
||||
if ( stream_getVersion( stream ) >= STREAM_VERS_DICTLANG ) {
|
||||
addr.u.ip_relay.seeksPublicRoom = stream_getBits( stream, 1 );
|
||||
addr.u.ip_relay.advertiseRoom = stream_getBits( stream, 1 );
|
||||
addrP->u.ip_relay.seeksPublicRoom = stream_getBits( stream, 1 );
|
||||
addrP->u.ip_relay.advertiseRoom = stream_getBits( stream, 1 );
|
||||
}
|
||||
break;
|
||||
case COMMS_CONN_SMS:
|
||||
stringFromStreamHere( stream, addr.u.sms.phone,
|
||||
sizeof(addr.u.sms.phone) );
|
||||
addr.u.sms.port = stream_getU16( stream );
|
||||
stringFromStreamHere( stream, addrP->u.sms.phone,
|
||||
sizeof(addrP->u.sms.phone) );
|
||||
addrP->u.sms.port = stream_getU16( stream );
|
||||
break;
|
||||
default:
|
||||
/* shut up, compiler */
|
||||
break;
|
||||
}
|
||||
} /* addrFromStreamOne */
|
||||
|
||||
XP_MEMCPY( addrP, &addr, sizeof(*addrP) );
|
||||
} /* addrFromStream */
|
||||
static void
|
||||
addrFromStream( CommsAddrRec* addrP, XWStreamCtxt* stream )
|
||||
{
|
||||
XP_U8 tmp = stream_getU8( stream );
|
||||
if ( STREAM_VERS_MULTIADDR <= stream_getVersion( stream ) ) {
|
||||
/* do nothing */
|
||||
} else {
|
||||
if ( COMMS_CONN_NONE != tmp ) {
|
||||
tmp = 1 << (tmp - 1);
|
||||
}
|
||||
}
|
||||
addrP->_conTypes = tmp;
|
||||
|
||||
CommsConnType typ;
|
||||
XP_U32 state = 0;
|
||||
while ( addr_iter( addrP, &typ, &state ) ) {
|
||||
addrFromStreamOne( addrP, stream, typ );
|
||||
}
|
||||
}
|
||||
|
||||
CommsCtxt*
|
||||
comms_makeFromStream( MPFORMAL XWStreamCtxt* stream, XW_UtilCtxt* util,
|
||||
|
@ -556,14 +572,9 @@ comms_makeFromStream( MPFORMAL XWStreamCtxt* stream, XW_UtilCtxt* util,
|
|||
short ii;
|
||||
|
||||
isServer = stream_getU8( stream );
|
||||
if ( version < STREAM_VERS_RELAY ) {
|
||||
XP_MEMSET( &addr, 0, sizeof(addr) );
|
||||
addr.conType = COMMS_CONN_IR; /* all there was back then */
|
||||
} else {
|
||||
addrFromStream( &addr, stream );
|
||||
}
|
||||
addrFromStream( &addr, stream );
|
||||
|
||||
if ( addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( addr_getType( &addr ) == COMMS_CONN_RELAY ) {
|
||||
nPlayersHere = (XP_U16)stream_getBits( stream, 4 );
|
||||
nPlayersTotal = (XP_U16)stream_getBits( stream, 4 );
|
||||
} else {
|
||||
|
@ -590,7 +601,7 @@ comms_makeFromStream( MPFORMAL XWStreamCtxt* stream, XW_UtilCtxt* util,
|
|||
comms->resendBackoff = stream_getU16( stream );
|
||||
comms->nextResend = stream_getU32( stream );
|
||||
}
|
||||
if ( addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( addr_getType(&addr) == COMMS_CONN_RELAY ) {
|
||||
comms->rr.myHostID = stream_getU8( stream );
|
||||
stringFromStreamHere( stream, comms->rr.connName,
|
||||
sizeof(comms->rr.connName) );
|
||||
|
@ -611,7 +622,7 @@ comms_makeFromStream( MPFORMAL XWStreamCtxt* stream, XW_UtilCtxt* util,
|
|||
rec->lastMsgAckd = stream_getU16( stream );
|
||||
}
|
||||
rec->channelNo = stream_getU16( stream );
|
||||
if ( rec->addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( addr_getType( &rec->addr ) == COMMS_CONN_RELAY ) {
|
||||
rec->rr.hostID = stream_getU8( stream );
|
||||
}
|
||||
|
||||
|
@ -671,7 +682,7 @@ comms_start( CommsCtxt* comms )
|
|||
void
|
||||
comms_stop( CommsCtxt* comms )
|
||||
{
|
||||
if ( COMMS_CONN_RELAY == comms->addr.conType ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( &comms->addr ) ) {
|
||||
relayDisconnect( comms );
|
||||
}
|
||||
}
|
||||
|
@ -679,7 +690,7 @@ comms_stop( CommsCtxt* comms )
|
|||
static void
|
||||
sendConnect( CommsCtxt* comms, XP_Bool breakExisting )
|
||||
{
|
||||
switch( comms->addr.conType ) {
|
||||
switch( addr_getType( &comms->addr ) ) {
|
||||
#ifdef XWFEATURE_RELAY
|
||||
case COMMS_CONN_RELAY:
|
||||
if ( breakExisting
|
||||
|
@ -708,47 +719,54 @@ sendConnect( CommsCtxt* comms, XP_Bool breakExisting )
|
|||
} /* comms_start */
|
||||
|
||||
static void
|
||||
addrToStream( XWStreamCtxt* stream, const CommsAddrRec* addrP )
|
||||
addrToStreamOne( XWStreamCtxt* stream, CommsConnType typ, const CommsAddrRec* addrP )
|
||||
{
|
||||
CommsAddrRec addr;
|
||||
XP_MEMCPY( &addr, addrP, sizeof(addr) ); /* does this really speed things
|
||||
or reduce code size? */
|
||||
stream_putU8( stream, addr.conType );
|
||||
|
||||
switch( addr.conType ) {
|
||||
switch( typ ) {
|
||||
case COMMS_CONN_NONE:
|
||||
/* nothing to write */
|
||||
break;
|
||||
case COMMS_CONN_BT:
|
||||
stringToStream( stream, addr.u.bt.hostName );
|
||||
stringToStream( stream, addrP->u.bt.hostName );
|
||||
/* sizeof(.bits) below defeats ARM's padding. */
|
||||
stringToStream( stream, addr.u.bt.btAddr.chars );
|
||||
stringToStream( stream, addrP->u.bt.btAddr.chars );
|
||||
break;
|
||||
case COMMS_CONN_IR:
|
||||
/* nothing to save */
|
||||
break;
|
||||
case COMMS_CONN_IP_DIRECT:
|
||||
stringToStream( stream, addr.u.ip.hostName_ip );
|
||||
stream_putU32( stream, addr.u.ip.ipAddr_ip );
|
||||
stream_putU16( stream, addr.u.ip.port_ip );
|
||||
stringToStream( stream, addrP->u.ip.hostName_ip );
|
||||
stream_putU32( stream, addrP->u.ip.ipAddr_ip );
|
||||
stream_putU16( stream, addrP->u.ip.port_ip );
|
||||
break;
|
||||
case COMMS_CONN_RELAY:
|
||||
stringToStream( stream, addr.u.ip_relay.invite );
|
||||
stringToStream( stream, addr.u.ip_relay.hostName );
|
||||
stream_putU32( stream, addr.u.ip_relay.ipAddr );
|
||||
stream_putU16( stream, addr.u.ip_relay.port );
|
||||
stream_putBits( stream, 1, addr.u.ip_relay.seeksPublicRoom );
|
||||
stream_putBits( stream, 1, addr.u.ip_relay.advertiseRoom );
|
||||
stringToStream( stream, addrP->u.ip_relay.invite );
|
||||
stringToStream( stream, addrP->u.ip_relay.hostName );
|
||||
stream_putU32( stream, addrP->u.ip_relay.ipAddr );
|
||||
stream_putU16( stream, addrP->u.ip_relay.port );
|
||||
stream_putBits( stream, 1, addrP->u.ip_relay.seeksPublicRoom );
|
||||
stream_putBits( stream, 1, addrP->u.ip_relay.advertiseRoom );
|
||||
break;
|
||||
case COMMS_CONN_SMS:
|
||||
stringToStream( stream, addr.u.sms.phone );
|
||||
stream_putU16( stream, addr.u.sms.port );
|
||||
stringToStream( stream, addrP->u.sms.phone );
|
||||
stream_putU16( stream, addrP->u.sms.port );
|
||||
break;
|
||||
default:
|
||||
XP_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
} /* addrToStream */
|
||||
} /* addrToStreamOne */
|
||||
|
||||
static void
|
||||
addrToStream( XWStreamCtxt* stream, const CommsAddrRec* addrP )
|
||||
{
|
||||
stream_putU8( stream, addrP->_conTypes );
|
||||
|
||||
CommsConnType typ;
|
||||
XP_U32 state = 0;
|
||||
while ( addr_iter( addrP, &typ, &state ) ) {
|
||||
addrToStreamOne( stream, typ, addrP );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
comms_writeToStream( CommsCtxt* comms, XWStreamCtxt* stream,
|
||||
|
@ -760,7 +778,7 @@ comms_writeToStream( CommsCtxt* comms, XWStreamCtxt* stream,
|
|||
|
||||
stream_putU8( stream, (XP_U8)comms->isServer );
|
||||
addrToStream( stream, &comms->addr );
|
||||
if ( comms->addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( &comms->addr ) ) {
|
||||
stream_putBits( stream, 4, comms->rr.nPlayersHere );
|
||||
stream_putBits( stream, 4, comms->rr.nPlayersTotal );
|
||||
}
|
||||
|
@ -770,7 +788,7 @@ comms_writeToStream( CommsCtxt* comms, XWStreamCtxt* stream,
|
|||
stream_putU16( stream, comms->channelSeed );
|
||||
stream_putU16( stream, comms->resendBackoff );
|
||||
stream_putU32( stream, comms->nextResend );
|
||||
if ( comms->addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( &comms->addr ) ) {
|
||||
stream_putU8( stream, comms->rr.myHostID );
|
||||
stringToStream( stream, comms->rr.connName );
|
||||
}
|
||||
|
@ -790,7 +808,7 @@ comms_writeToStream( CommsCtxt* comms, XWStreamCtxt* stream,
|
|||
stream_putU16( stream, (XP_U16)rec->lastMsgRcd );
|
||||
stream_putU16( stream, (XP_U16)rec->lastMsgAckd );
|
||||
stream_putU16( stream, rec->channelNo );
|
||||
if ( rec->addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( &rec->addr ) ) {
|
||||
stream_putU8( stream, rec->rr.hostID ); /* unneeded unless RELAY */
|
||||
}
|
||||
}
|
||||
|
@ -913,7 +931,7 @@ comms_getInitialAddr( CommsAddrRec* addr
|
|||
)
|
||||
{
|
||||
#if defined XWFEATURE_RELAY
|
||||
addr->conType = COMMS_CONN_RELAY; /* for temporary ease in debugging */
|
||||
addr_setType( addr, COMMS_CONN_RELAY ); /* for temporary ease in debugging */
|
||||
addr->u.ip_relay.ipAddr = 0L; /* force 'em to set it */
|
||||
addr->u.ip_relay.port = relayPort;
|
||||
{
|
||||
|
@ -939,7 +957,7 @@ comms_checkAddr( DeviceRole role, const CommsAddrRec* addr, XW_UtilCtxt* util )
|
|||
XP_Bool ok = XP_TRUE;
|
||||
/* make sure the user's given us enough information to make a connection */
|
||||
if ( role == SERVER_ISCLIENT ) {
|
||||
if ( addr->conType == COMMS_CONN_BT ) {
|
||||
if ( COMMS_CONN_BT == addr_getType( addr ) ) {
|
||||
XP_U32 empty = 0L; /* check four bytes to save some code */
|
||||
if ( !XP_MEMCMP( &empty, &addr->u.bt.btAddr, sizeof(empty) ) ) {
|
||||
ok = XP_FALSE;
|
||||
|
@ -957,7 +975,7 @@ comms_getConType( const CommsCtxt* comms )
|
|||
{
|
||||
CommsConnType typ;
|
||||
if ( !!comms ) {
|
||||
typ = comms->addr.conType;
|
||||
typ = addr_getType( &comms->addr );
|
||||
} else {
|
||||
typ = COMMS_CONN_NONE;
|
||||
XP_LOGF( "%s: returning COMMS_CONN_NONE for null comms", __func__ );
|
||||
|
@ -1664,14 +1682,14 @@ preProcess( CommsCtxt* comms, XWStreamCtxt* stream,
|
|||
XWHostID* XP_UNUSED_RELAY(senderID) )
|
||||
{
|
||||
XP_Bool consumed = XP_FALSE;
|
||||
switch ( comms->addr.conType ) {
|
||||
switch ( addr_getType( &comms->addr ) ) {
|
||||
#ifdef XWFEATURE_RELAY
|
||||
/* relayPreProcess returns true if consumes the message. May just eat the
|
||||
header and leave a regular message to be processed below. */
|
||||
case COMMS_CONN_RELAY:
|
||||
consumed = relayPreProcess( comms, stream, senderID );
|
||||
if ( !consumed ) {
|
||||
*usingRelay = comms->addr.conType == COMMS_CONN_RELAY;
|
||||
*usingRelay = COMMS_CONN_RELAY == addr_getType( &comms->addr );
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
@ -1698,10 +1716,10 @@ getRecordFor( CommsCtxt* comms, const CommsAddrRec* addr,
|
|||
XP_U16 mask = maskChannel? ~CHANNEL_MASK : ~0;
|
||||
|
||||
/* Use addr if we have it. Otherwise use channelNo if non-0 */
|
||||
conType = !!addr? addr->conType : COMMS_CONN_NONE;
|
||||
conType = !!addr? addr_getType( addr ) : COMMS_CONN_NONE;
|
||||
|
||||
for ( rec = comms->recs; !!rec; rec = rec->next ) {
|
||||
XP_ASSERT( !addr || (conType == rec->addr.conType) );
|
||||
XP_ASSERT( !addr || (conType == addr_getType( &rec->addr ) ) );
|
||||
switch( conType ) {
|
||||
case COMMS_CONN_RELAY:
|
||||
XP_ASSERT(0); /* is this being used? */
|
||||
|
@ -1881,7 +1899,7 @@ comms_checkIncomingStream( CommsCtxt* comms, XWStreamCtxt* stream,
|
|||
XWHostID senderID = 0; /* unset; default for non-relay cases */
|
||||
XP_Bool usingRelay = XP_FALSE;
|
||||
|
||||
XP_ASSERT( retAddr == NULL || comms->addr.conType == retAddr->conType );
|
||||
XP_ASSERT( retAddr == NULL || addr_getType( &comms->addr ) == addr_getType( retAddr ) );
|
||||
#ifdef COMMS_CHECKSUM
|
||||
XP_U16 initialLen = stream_getSize( stream );
|
||||
#endif
|
||||
|
@ -1960,7 +1978,7 @@ comms_checkComplete( const CommsAddrRec* addr )
|
|||
{
|
||||
XP_Bool result;
|
||||
|
||||
switch ( addr->conType ) {
|
||||
switch ( addr_getType( addr ) ) {
|
||||
case COMMS_CONN_RELAY:
|
||||
result = !!addr->u.ip_relay.invite[0]
|
||||
&& !!addr->u.ip_relay.hostName[0]
|
||||
|
@ -1986,7 +2004,7 @@ XP_Bool
|
|||
comms_isConnected( const CommsCtxt* const comms )
|
||||
{
|
||||
XP_Bool result = XP_FALSE;
|
||||
switch ( comms->addr.conType ) {
|
||||
switch ( addr_getType( &comms->addr ) ) {
|
||||
case COMMS_CONN_RELAY:
|
||||
result = 0 != comms->rr.connName[0];
|
||||
break;
|
||||
|
@ -2131,6 +2149,7 @@ ConnType2Str( CommsConnType typ )
|
|||
CASESTR( COMMS_CONN_RELAY );
|
||||
CASESTR( COMMS_CONN_BT );
|
||||
CASESTR( COMMS_CONN_SMS );
|
||||
CASESTR( COMMS_CONN_NTYPES );
|
||||
default:
|
||||
XP_ASSERT(0);
|
||||
}
|
||||
|
@ -2199,7 +2218,7 @@ rememberChannelAddress( CommsCtxt* comms, XP_PlayerAddr channelNo,
|
|||
XP_ASSERT( recs->rr.hostID == hostID );
|
||||
} else {
|
||||
XP_MEMSET( &recs->addr, 0, sizeof(recs->addr) );
|
||||
recs->addr.conType = comms->addr.conType;
|
||||
addr_setType( &recs->addr, addr_getType( &comms->addr ) );
|
||||
}
|
||||
}
|
||||
return recs;
|
||||
|
@ -2235,6 +2254,58 @@ countAddrRecs( const CommsCtxt* comms )
|
|||
return count;
|
||||
} /* countAddrRecs */
|
||||
|
||||
static XP_Bool
|
||||
addr_iter( const CommsAddrRec* addr, CommsConnType* typp, XP_U32* state )
|
||||
{
|
||||
CommsConnType typ = *state;
|
||||
XP_U16 flags = addr->_conTypes;
|
||||
while ( ++typ < COMMS_CONN_NTYPES ) {
|
||||
*state = typ;
|
||||
XP_U16 mask = 1 << (typ - 1);
|
||||
if ( mask == (flags & mask) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
XP_Bool result = typ < COMMS_CONN_NTYPES;
|
||||
if ( result ) {
|
||||
*typp = typ;
|
||||
}
|
||||
XP_LOGF( "%s(flag=%x)=>%d (typ=%s)", __func__, flags, result, ConnType2Str( typ ) );
|
||||
return result;
|
||||
}
|
||||
|
||||
CommsConnType
|
||||
addr_getType( const CommsAddrRec* addr )
|
||||
{
|
||||
CommsConnType typ;
|
||||
XP_U16 flags = addr->_conTypes;
|
||||
if ( 0 == flags ) {
|
||||
typ = COMMS_CONN_NONE;
|
||||
} else {
|
||||
for ( typ = COMMS_CONN_NONE + 1; typ < COMMS_CONN_NTYPES; ++typ ) {
|
||||
XP_U16 mask = (1 << (typ - 1));
|
||||
if ( 0 != (flags & mask) ) {
|
||||
XP_ASSERT( 0 == (flags & ~mask )); /* confirm only bit set */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
XP_ASSERT( COMMS_CONN_NTYPES != typ );
|
||||
// LOG_RETURNF( "%s", ConnType2Str( typ ) );
|
||||
return typ;
|
||||
}
|
||||
|
||||
void
|
||||
addr_setType( CommsAddrRec* addr, CommsConnType type )
|
||||
{
|
||||
XP_U16 flags = 0;
|
||||
if ( COMMS_CONN_NONE != type ) {
|
||||
flags = 1 << (type - 1);
|
||||
}
|
||||
addr->_conTypes = flags;
|
||||
XP_ASSERT( type == addr_getType( addr ) );
|
||||
}
|
||||
|
||||
#ifdef XWFEATURE_RELAY
|
||||
static XWHostID
|
||||
getDestID( CommsCtxt* comms, XP_PlayerAddr channelNo )
|
||||
|
@ -2421,7 +2492,7 @@ relayConnect( CommsCtxt* comms )
|
|||
{
|
||||
XP_Bool success = XP_TRUE;
|
||||
LOG_FUNC();
|
||||
if ( comms->addr.conType == COMMS_CONN_RELAY && !comms->rr.connecting ) {
|
||||
if ( addr_getType( &comms->addr ) == COMMS_CONN_RELAY && !comms->rr.connecting ) {
|
||||
comms->rr.connecting = XP_TRUE;
|
||||
success = send_via_relay( comms, comms->rr.connName[0]?
|
||||
XWRELAY_GAME_RECONNECT : XWRELAY_GAME_CONNECT,
|
||||
|
@ -2468,7 +2539,7 @@ static void
|
|||
relayDisconnect( CommsCtxt* comms )
|
||||
{
|
||||
LOG_FUNC();
|
||||
if ( comms->addr.conType == COMMS_CONN_RELAY ) {
|
||||
if ( addr_getType( &comms->addr ) == COMMS_CONN_RELAY ) {
|
||||
if ( comms->rr.relayState > COMMS_RELAYSTATE_CONNECT_PENDING ) {
|
||||
(void)send_via_relay( comms, XWRELAY_GAME_DISCONNECT, HOST_ID_NONE,
|
||||
NULL, 0 );
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
|
||||
/*
|
||||
* Copyright 2001-2009 by Eric House (xwords@eehouse.org). All rights
|
||||
* Copyright 2001 - 2014 by Eric House (xwords@eehouse.org). All rights
|
||||
* reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@ -76,9 +76,9 @@ typedef struct XP_BtAddrStr { XP_UCHAR chars[18]; } XP_BtAddrStr;
|
|||
#define MAX_PHONE_LEN 31
|
||||
|
||||
typedef struct _CommsAddrRec {
|
||||
CommsConnType conType;
|
||||
XP_U16 _conTypes;
|
||||
|
||||
union {
|
||||
struct {
|
||||
struct {
|
||||
XP_UCHAR hostName_ip[MAX_HOSTNAME_LEN + 1];
|
||||
XP_U32 ipAddr_ip; /* looked up from above */
|
||||
|
@ -221,6 +221,10 @@ XP_Bool comms_checkComplete( const CommsAddrRec* const addr );
|
|||
XP_Bool comms_canChat( const CommsCtxt* comms );
|
||||
XP_Bool comms_isConnected( const CommsCtxt* const comms );
|
||||
|
||||
CommsConnType addr_getType( const CommsAddrRec* addr );
|
||||
void addr_setType( CommsAddrRec* addr, CommsConnType type );
|
||||
|
||||
|
||||
# ifdef DEBUG
|
||||
void comms_getStats( CommsCtxt* comms, XWStreamCtxt* stream );
|
||||
const char* ConnType2Str( CommsConnType typ );
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#endif
|
||||
#define MAX_COLS MAX_ROWS
|
||||
|
||||
#define STREAM_VERS_MULTIADDR 0x17
|
||||
#define STREAM_VERS_COMMSBACKOFF 0x16
|
||||
#define STREAM_VERS_DICTNAME 0x15
|
||||
#ifdef HASH_STREAM
|
||||
|
@ -84,7 +85,7 @@
|
|||
#define STREAM_VERS_405 0x01
|
||||
|
||||
/* search for FIX_NEXT_VERSION_CHANGE next time this is changed */
|
||||
#define CUR_STREAM_VERS STREAM_VERS_COMMSBACKOFF
|
||||
#define CUR_STREAM_VERS STREAM_VERS_MULTIADDR
|
||||
|
||||
typedef struct XP_Rect {
|
||||
XP_S16 left;
|
||||
|
|
|
@ -2131,7 +2131,7 @@ cursesmain( XP_Bool isServer, LaunchParams* params )
|
|||
if ( 0 ) {
|
||||
# ifdef XWFEATURE_RELAY
|
||||
} else if ( params->conType == COMMS_CONN_RELAY ) {
|
||||
addr.conType = COMMS_CONN_RELAY;
|
||||
addr_setType( &addr, COMMS_CONN_RELAY );
|
||||
addr.u.ip_relay.ipAddr = 0; /* ??? */
|
||||
addr.u.ip_relay.port = params->connInfo.relay.defaultSendPort;
|
||||
addr.u.ip_relay.seeksPublicRoom = params->connInfo.relay.seeksPublicRoom;
|
||||
|
@ -2143,14 +2143,14 @@ cursesmain( XP_Bool isServer, LaunchParams* params )
|
|||
# endif
|
||||
# ifdef XWFEATURE_SMS
|
||||
} else if ( params->conType == COMMS_CONN_SMS ) {
|
||||
addr.conType = COMMS_CONN_SMS;
|
||||
addr_setType( &addr, COMMS_CONN_SMS );
|
||||
XP_STRNCPY( addr.u.sms.phone, params->connInfo.sms.phone,
|
||||
sizeof(addr.u.sms.phone) - 1 );
|
||||
addr.u.sms.port = params->connInfo.sms.port;
|
||||
# endif
|
||||
# ifdef XWFEATURE_BLUETOOTH
|
||||
} else if ( params->conType == COMMS_CONN_BT ) {
|
||||
addr.conType = COMMS_CONN_BT;
|
||||
addr_setType( &addr, COMMS_CONN_BT );
|
||||
XP_ASSERT( sizeof(addr.u.bt.btAddr)
|
||||
>= sizeof(params->connInfo.bt.hostAddr));
|
||||
XP_MEMCPY( &addr.u.bt.btAddr, ¶ms->connInfo.bt.hostAddr,
|
||||
|
|
|
@ -135,7 +135,7 @@ summarize( CommonGlobals* cGlobals )
|
|||
if ( !!cGlobals->game.comms ) {
|
||||
nMissing = server_getMissingPlayers( cGlobals->game.server );
|
||||
comms_getAddr( cGlobals->game.comms, &addr );
|
||||
switch( addr.conType ) {
|
||||
switch( addr_getType( &addr ) ) {
|
||||
case COMMS_CONN_RELAY:
|
||||
room = addr.u.ip_relay.invite;
|
||||
connvia = "Relay";
|
||||
|
|
|
@ -510,7 +510,7 @@ createOrLoadObjects( GtkGameGlobals* globals )
|
|||
&cGlobals->cp, &procs, params->gameSeed );
|
||||
|
||||
// addr.conType = params->conType;
|
||||
switch( addr.conType ) {
|
||||
switch( addr_getType( &addr ) ) {
|
||||
#ifdef XWFEATURE_RELAY
|
||||
case COMMS_CONN_RELAY:
|
||||
/* addr.u.ip_relay.ipAddr = 0; */
|
||||
|
|
|
@ -123,7 +123,7 @@ handle_ok( GtkWidget* XP_UNUSED(widget), gpointer closure )
|
|||
break;
|
||||
}
|
||||
|
||||
state->addr->conType = conType;
|
||||
addr_setType( state->addr, conType );
|
||||
}
|
||||
|
||||
state->cancelled = XP_FALSE;
|
||||
|
@ -184,7 +184,7 @@ makeRelayPage( GtkConnsState* state )
|
|||
gtk_box_pack_start( GTK_BOX(vbox), gtk_label_new( hint ), FALSE, TRUE, 0 );
|
||||
|
||||
GtkWidget* hbox = makeLabeledField( "Room", &state->invite, NULL );
|
||||
if ( COMMS_CONN_RELAY == state->addr->conType ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( state->addr ) ) {
|
||||
gtk_entry_set_text( GTK_ENTRY(state->invite),
|
||||
state->addr->u.ip_relay.invite );
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ makeRelayPage( GtkConnsState* state )
|
|||
gtk_widget_set_sensitive( state->invite, !state->readOnly );
|
||||
|
||||
hbox = makeLabeledField( "Relay address", &state->hostName, NULL );
|
||||
if ( COMMS_CONN_RELAY == state->addr->conType ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( state->addr ) ) {
|
||||
gtk_entry_set_text( GTK_ENTRY(state->hostName),
|
||||
state->addr->u.ip_relay.hostName );
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ makeRelayPage( GtkConnsState* state )
|
|||
gtk_widget_set_sensitive( state->hostName, !state->readOnly );
|
||||
|
||||
hbox = makeLabeledField( "Relay port", &state->port, NULL );
|
||||
if ( COMMS_CONN_RELAY == state->addr->conType ) {
|
||||
if ( COMMS_CONN_RELAY == addr_getType( state->addr ) ) {
|
||||
char buf[16];
|
||||
snprintf( buf, sizeof(buf), "%d", state->addr->u.ip_relay.port );
|
||||
gtk_entry_set_text( GTK_ENTRY(state->port), buf );
|
||||
|
@ -219,7 +219,7 @@ makeBTPage( GtkConnsState* state )
|
|||
GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
|
||||
|
||||
GtkWidget* hbox = makeLabeledField( "Host device", &state->bthost, NULL );
|
||||
if ( COMMS_CONN_BT == state->addr->conType ) {
|
||||
if ( COMMS_CONN_BT == addr_getType( state->addr ) ) {
|
||||
gtk_entry_set_text( GTK_ENTRY(state->bthost), state->addr->u.bt.hostName );
|
||||
}
|
||||
gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, TRUE, 0 );
|
||||
|
@ -243,13 +243,13 @@ makeIPDirPage( GtkConnsState* state )
|
|||
/* XP_UCHAR hostName_ip[MAX_HOSTNAME_LEN + 1]; */
|
||||
/* XP_U16 port_ip; */
|
||||
|
||||
const gchar* name = COMMS_CONN_IP_DIRECT == state->addr->conType ?
|
||||
const gchar* name = COMMS_CONN_IP_DIRECT == addr_getType( state->addr ) ?
|
||||
state->addr->u.ip.hostName_ip : state->globals->cGlobals.params->connInfo.ip.hostName;
|
||||
GtkWidget* hbox = makeLabeledField( "Hostname", &state->iphost, name );
|
||||
gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, TRUE, 0 );
|
||||
|
||||
hbox = makeLabeledField( "Relay port", &state->ipport, NULL );
|
||||
if ( COMMS_CONN_IP_DIRECT == state->addr->conType ) {
|
||||
if ( COMMS_CONN_IP_DIRECT == addr_getType( state->addr ) ) {
|
||||
char buf[16];
|
||||
snprintf( buf, sizeof(buf), "%d", state->addr->u.ip.port_ip );
|
||||
gtk_entry_set_text( GTK_ENTRY(state->ipport), buf );
|
||||
|
@ -265,13 +265,13 @@ makeSMSPage( GtkConnsState* state )
|
|||
{
|
||||
GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
|
||||
|
||||
const gchar* phone = COMMS_CONN_SMS == state->addr->conType ?
|
||||
const gchar* phone = COMMS_CONN_SMS == addr_getType( state->addr ) ?
|
||||
state->addr->u.sms.phone : state->globals->cGlobals.params->connInfo.sms.phone;
|
||||
GtkWidget* hbox = makeLabeledField( "Host phone", &state->smsphone, phone );
|
||||
gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, TRUE, 0 );
|
||||
gtk_widget_set_sensitive( state->smsphone, !state->readOnly );
|
||||
|
||||
int portVal = COMMS_CONN_SMS == state->addr->conType
|
||||
int portVal = COMMS_CONN_SMS == addr_getType( state->addr )
|
||||
? state->addr->u.sms.port
|
||||
: state->globals->cGlobals.params->connInfo.sms.port;
|
||||
gchar port[32];
|
||||
|
@ -331,7 +331,7 @@ gtkConnsDlg( GtkGameGlobals* globals, CommsAddrRec* addr, DeviceRole role,
|
|||
gtk_box_pack_start( GTK_BOX(vbox), state.notebook, FALSE, TRUE, 0 );
|
||||
state.pageTypes[nTypes++] = COMMS_CONN_NONE; /* mark end of list */
|
||||
|
||||
gint pageNo = conTypeToPageNum( &state, addr->conType );
|
||||
gint pageNo = conTypeToPageNum( &state, addr_getType( addr ) );
|
||||
gtk_notebook_set_current_page( GTK_NOTEBOOK(state.notebook), pageNo );
|
||||
|
||||
gtk_widget_show( state.notebook );
|
||||
|
|
|
@ -1144,7 +1144,7 @@ linux_send( const XP_U8* buf, XP_U16 buflen, const CommsAddrRec* addrRec,
|
|||
CommsConnType conType;
|
||||
|
||||
if ( !!addrRec ) {
|
||||
conType = addrRec->conType;
|
||||
conType = addr_getType( addrRec );
|
||||
} else {
|
||||
conType = cGlobals->params->conType;
|
||||
}
|
||||
|
@ -1395,7 +1395,7 @@ linux_util_addrChange( XW_UtilCtxt* uc,
|
|||
const CommsAddrRec* newAddr )
|
||||
{
|
||||
CommonGlobals* cGlobals = (CommonGlobals*)uc->closure;
|
||||
switch ( newAddr->conType ) {
|
||||
switch ( addr_getType( newAddr ) ) {
|
||||
#ifdef XWFEATURE_BLUETOOTH
|
||||
case COMMS_CONN_BT: {
|
||||
XP_Bool isServer = comms_getIsServer( cGlobals->game.comms );
|
||||
|
@ -1814,7 +1814,7 @@ initFromParams( CommonGlobals* cGlobals, LaunchParams* params )
|
|||
if ( 0 ) {
|
||||
#ifdef XWFEATURE_RELAY
|
||||
} else if ( params->conType == COMMS_CONN_RELAY ) {
|
||||
addr->conType = COMMS_CONN_RELAY;
|
||||
addr_setType( addr, COMMS_CONN_RELAY );
|
||||
addr->u.ip_relay.ipAddr = 0; /* ??? */
|
||||
addr->u.ip_relay.port = params->connInfo.relay.defaultSendPort;
|
||||
addr->u.ip_relay.seeksPublicRoom =
|
||||
|
@ -1828,14 +1828,14 @@ initFromParams( CommonGlobals* cGlobals, LaunchParams* params )
|
|||
#endif
|
||||
#ifdef XWFEATURE_SMS
|
||||
} else if ( params->conType == COMMS_CONN_SMS ) {
|
||||
addr->conType = COMMS_CONN_SMS;
|
||||
addr_setType( addr, COMMS_CONN_SMS );
|
||||
XP_STRNCPY( addr->u.sms.phone, params->connInfo.sms.phone,
|
||||
sizeof(addr->u.sms.phone) - 1 );
|
||||
addr->u.sms.port = params->connInfo.sms.port;
|
||||
#endif
|
||||
#ifdef XWFEATURE_BLUETOOTH
|
||||
} else if ( params->conType == COMMS_CONN_BT ) {
|
||||
addr->conType = COMMS_CONN_BT;
|
||||
addr_setType( addr, COMMS_CONN_BT );
|
||||
XP_ASSERT( sizeof(addr->u.bt.btAddr)
|
||||
>= sizeof(params->connInfo.bt.hostAddr));
|
||||
XP_MEMCPY( &addr->u.bt.btAddr, ¶ms->connInfo.bt.hostAddr,
|
||||
|
|
|
@ -188,7 +188,7 @@ decodeAndDelete( LinSMSData* storage, const gchar* name,
|
|||
if ( valid && outlen <= buflen ) {
|
||||
XP_MEMCPY( buf, out, outlen );
|
||||
nRead = outlen;
|
||||
addr->conType = COMMS_CONN_SMS;
|
||||
addr_setType( addr, COMMS_CONN_SMS );
|
||||
XP_STRNCPY( addr->u.sms.phone, phone, sizeof(addr->u.sms.phone) );
|
||||
XP_LOGF( "%s: message came from phone: %s", __func__, phone );
|
||||
addr->u.sms.port = 1; /* for now */
|
||||
|
|
Loading…
Add table
Reference in a new issue