offer to rematch via relay too, but leave the server communication

part stubbed out. I'm disabling rematch for now because there are
several issues to be worked out, chief among them how to handle
simultaneous receipt of identical invitations (via different
channels.)
This commit is contained in:
Eric House 2015-03-02 06:28:42 -08:00
parent cdf7a88302
commit a003cf686f
3 changed files with 92 additions and 34 deletions

View file

@ -2391,7 +2391,8 @@ public class BoardDelegate extends DelegateBase
supported = m_gi.serverRole == DeviceRole.SERVER_STANDALONE;
if ( !supported && 2 == m_gi.nPlayers ) {
supported = m_connTypes.contains( CommsConnType.COMMS_CONN_BT )
|| m_connTypes.contains( CommsConnType.COMMS_CONN_SMS );
|| m_connTypes.contains( CommsConnType.COMMS_CONN_SMS )
|| m_connTypes.contains( CommsConnType.COMMS_CONN_RELAY );
}
}
return supported;
@ -2401,6 +2402,7 @@ public class BoardDelegate extends DelegateBase
{
String phone = null;
String btAddr = null;
String relayID = null;
if ( m_gi.serverRole != DeviceRole.SERVER_STANDALONE ) {
CommsAddrRec[] addrs = XwJNI.comms_getAddrs( m_jniGamePtr );
for ( CommsAddrRec addr : addrs ) {
@ -2412,12 +2414,16 @@ public class BoardDelegate extends DelegateBase
Assert.assertNull( phone );
phone = addr.sms_phone;
}
if ( addr.contains( CommsConnType.COMMS_CONN_RELAY ) ) {
Assert.assertNull( relayID );
relayID = m_summary.relayID;
}
}
}
Intent intent = GamesListDelegate
.makeRematchIntent( m_activity, m_rowid, m_connTypes, btAddr,
phone );
phone, relayID );
if ( null != intent ) {
startActivity( intent );
m_delegator.finish();
@ -2446,6 +2452,11 @@ public class BoardDelegate extends DelegateBase
if ( null != value ) {
BTService.inviteRemote( m_activity, value, nli );
}
value = m_summary.getStringExtra( GameSummary.EXTRA_REMATCH_RELAY );
if ( null != value ) {
RelayService.inviteRemote( m_activity, value, nli );
}
}
}

View file

@ -87,6 +87,7 @@ public class GamesListDelegate extends ListDelegateBase
private static final String REMATCH_ADDRS_EXTRA = "rm_addrs";
private static final String REMATCH_BTADDR_EXTRA = "rm_btaddr";
private static final String REMATCH_PHONE_EXTRA = "rm_phone";
private static final String REMATCH_RELAYID_EXTRA = "rm_relayid";
private static final String ALERT_MSG = "alert_msg";
@ -1140,6 +1141,7 @@ public class GamesListDelegate extends ListDelegateBase
if ( AlertDialog.BUTTON_POSITIVE == which ) {
switch( action ) {
case NEW_NET_GAME:
m_netLaunchInfo = (NetLaunchInfo)params[0];
if ( checkWarnNoDict( m_netLaunchInfo ) ) {
makeNewNetGameIf();
}
@ -1811,8 +1813,9 @@ public class GamesListDelegate extends ListDelegateBase
if ( -1 != rowid ) {
String btAddr = intent.getStringExtra( REMATCH_BTADDR_EXTRA );
String phone = intent.getStringExtra( REMATCH_PHONE_EXTRA );
String relayID = intent.getStringExtra( REMATCH_RELAYID_EXTRA );
long newid;
if ( null == btAddr && null == phone ) {
if ( null == btAddr && null == phone && null == relayID ) {
// this will juggle if the preference is set
newid = GameUtils.dupeGame( m_activity, rowid );
} else {
@ -1821,7 +1824,7 @@ public class GamesListDelegate extends ListDelegateBase
newid = GameUtils.makeNewMultiGame( m_activity, addrs );
DBUtils.addRematchInfo( m_activity, newid, btAddr, phone,
null );
relayID );
}
launchGame( newid );
}
@ -2169,7 +2172,8 @@ public class GamesListDelegate extends ListDelegateBase
public static Intent makeRematchIntent( Context context, long rowid,
CommsConnTypeSet addrTypes,
String btAddr, String phone )
String btAddr, String phone,
String relayID )
{
DbgUtils.logf( "makeRematchIntent(btAddr=%s; phone=%s)", btAddr, phone );
Intent intent = makeSelfIntent( context );
@ -2181,6 +2185,9 @@ public class GamesListDelegate extends ListDelegateBase
if ( null != phone ) {
intent.putExtra( REMATCH_PHONE_EXTRA, phone );
}
if ( null != relayID ) {
intent.putExtra( REMATCH_RELAYID_EXTRA, relayID );
}
return intent;
}

View file

@ -66,20 +66,22 @@ public class RelayService extends XWService
private static final String CMD_STR = "CMD";
private static enum MsgCmds { INVALID
, PROCESS_GAME_MSGS
, PROCESS_DEV_MSGS
, UDP_CHANGED
, SEND
, SENDNOCONN
, RECEIVE
, TIMER_FIRED
, RESET
, UPGRADE
private static enum MsgCmds { INVALID,
PROCESS_GAME_MSGS,
PROCESS_DEV_MSGS,
UDP_CHANGED,
SEND,
SENDNOCONN,
RECEIVE,
TIMER_FIRED,
RESET,
UPGRADE,
INVITE,
}
private static final String MSGS_ARR = "MSGS_ARR";
private static final String RELAY_ID = "RELAY_ID";
private static final String NLI_DATA = "NLI_DATA";
private static final String ROWID = "ROWID";
private static final String BINBUFFER = "BINBUFFER";
@ -111,23 +113,23 @@ public class RelayService extends XWService
// private static final int XWPDEV_NONE = 0;
// Must be kept in sync with eponymous enum in xwrelay.h
private enum XWRelayReg {
XWPDEV_NONE
,XWPDEV_UNAVAIL
,XWPDEV_REG
,XWPDEV_REGRSP
,XWPDEV_KEEPALIVE
,XWPDEV_HAVEMSGS
,XWPDEV_RQSTMSGS
,XWPDEV_MSG
,XWPDEV_MSGNOCONN
,XWPDEV_MSGRSP
,XWPDEV_BADREG
,XWPDEV_ACK
,XWPDEV_DELGAME
,XWPDEV_ALERT
,XWPDEV_UPGRADE
};
private enum XWRelayReg { XWPDEV_NONE,
XWPDEV_UNAVAIL,
XWPDEV_REG,
XWPDEV_REGRSP,
XWPDEV_KEEPALIVE,
XWPDEV_HAVEMSGS,
XWPDEV_RQSTMSGS,
XWPDEV_MSG,
XWPDEV_MSGNOCONN,
XWPDEV_MSGRSP,
XWPDEV_BADREG,
XWPDEV_ACK,
XWPDEV_DELGAME,
XWPDEV_ALERT,
XWPDEV_UPGRADE,
XWPDEV_MSGFWDOTHERS,
};
public static void gcmConfirmed( Context context, boolean confirmed )
{
@ -152,6 +154,14 @@ public class RelayService extends XWService
context.startService( intent );
}
public static void inviteRemote( Context context, String relayID,
NetLaunchInfo nli )
{
context.startService( getIntentTo( context, MsgCmds.INVITE )
.putExtra( RELAY_ID, relayID )
.putExtra( NLI_DATA, nli.toString() ) );
}
public static void reset( Context context )
{
Intent intent = getIntentTo( context, MsgCmds.RESET );
@ -315,15 +325,21 @@ public class RelayService extends XWService
startUDPThreadsIfNot();
long rowid = intent.getLongExtra( ROWID, -1 );
byte[] msg = intent.getByteArrayExtra( BINBUFFER );
if ( MsgCmds.SEND.equals( cmd ) ) {
if ( MsgCmds.SEND == cmd ) {
sendMessage( rowid, msg );
} else if ( MsgCmds.SENDNOCONN.equals( cmd ) ) {
} else if ( MsgCmds.SENDNOCONN == cmd ) {
String relayID = intent.getStringExtra( RELAY_ID );
sendNoConnMessage( rowid, relayID, msg );
} else {
feedMessage( rowid, msg );
}
break;
case INVITE:
startUDPThreadsIfNot();
String relayID = intent.getStringExtra( RELAY_ID );
String nliData = intent.getStringExtra( NLI_DATA );
sendForwardOthersMessage( relayID, nliData );
break;
case TIMER_FIRED:
if ( !NetStateCache.netAvail( this ) ) {
DbgUtils.logf( "not connecting: no network" );
@ -618,6 +634,11 @@ public class RelayService extends XWService
case XWPDEV_ACK:
noteAck( vli2un( dis ) );
break;
// case XWPDEV_MSGFWDOTHERS:
// Assert.assertTrue( 0 == dis.readByte() ); // protocol; means "invite", I guess.
// String nliData = dis.readUTF();
// DbgUtils.logf( "RelayService: got invite: %s", nliData );
// break;
default:
DbgUtils.logf( "RelayService.gotPacket(): Unhandled cmd" );
break;
@ -766,6 +787,23 @@ public class RelayService extends XWService
}
}
private void sendForwardOthersMessage( String relayID, String nliData )
{
DbgUtils.logf( "sendForwardOthersMessage(relayID=%s); NOT IMPLEMENTED",
relayID );
// ByteArrayOutputStream bas = new ByteArrayOutputStream();
// try {
// DataOutputStream out = new DataOutputStream( bas );
// out.writeBytes( relayID );
// out.write( '\n' ); // terminator
// out.writeByte( 0 ); // protocol; means "invite", I guess.
// out.writeUTF( nliData );
// postPacket( bas, XWRelayReg.XWPDEV_MSGFWDOTHERS );
// } catch ( java.io.IOException ioe ) {
// DbgUtils.loge( ioe );
// }
}
private void sendAckIf( PacketHeader header )
{
if ( 0 != header.m_packetID ) {
@ -958,6 +996,8 @@ public class RelayService extends XWService
if ( msgLen + thisLen > MAX_BUF ) {
// Need to deal with this case by sending multiple
// packets. It WILL happen.
DbgUtils.logf( "dropping send for lack of space; FIX ME!!" );
Assert.fail();
break;
}
// got space; now write it