add param to comms_resendAll to limit type of message sent

(e.g. BT). Meant to be used when a single type has become available.
This commit is contained in:
Eric House 2016-02-02 07:01:48 -08:00
parent 9c6908d14a
commit 19713a40ad
7 changed files with 32 additions and 17 deletions

View file

@ -1805,19 +1805,24 @@ Java_org_eehouse_android_xw4_jni_XwJNI_game_1changeDict
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eehouse_android_xw4_jni_XwJNI_comms_1resendAll Java_org_eehouse_android_xw4_jni_XwJNI_comms_1resendAll
( JNIEnv* env, jclass C, GamePtrType gamePtr, jboolean force, jboolean thenAck ) ( JNIEnv* env, jclass C, GamePtrType gamePtr, jboolean force, jobject jFilter,
jboolean thenAck )
{ {
LOG_FUNC();
jint result; jint result;
XWJNI_START(); XWJNI_START();
CommsCtxt* comms = state->game.comms; CommsCtxt* comms = state->game.comms;
XP_ASSERT( !!comms ); XP_ASSERT( !!comms );
result = comms_resendAll( comms, force ); CommsConnType filter =
NULL == jFilter ? COMMS_CONN_NONE : jEnumToInt( env, jFilter );
result = comms_resendAll( comms, filter, force );
if ( thenAck ) { if ( thenAck ) {
#ifdef XWFEATURE_COMMSACK #ifdef XWFEATURE_COMMSACK
comms_ackAny( comms ); comms_ackAny( comms );
#endif #endif
} }
XWJNI_END(); XWJNI_END();
LOG_RETURNF( "%d", result );
return result; return result;
} }

View file

@ -1218,7 +1218,7 @@ public class GameUtils {
m_sink = new MultiMsgSink( m_context, rowid ); m_sink = new MultiMsgSink( m_context, rowid );
GamePtr gamePtr = loadMakeGame( m_context, gi, m_sink, lock ); GamePtr gamePtr = loadMakeGame( m_context, gi, m_sink, lock );
if ( null != gamePtr ) { if ( null != gamePtr ) {
XwJNI.comms_resendAll( gamePtr.ptr(), true, false ); XwJNI.comms_resendAll( gamePtr.ptr(), true, m_filter, false );
gamePtr.release(); gamePtr.release();
} }
lock.unlock(); lock.unlock();

View file

@ -362,7 +362,12 @@ public class XwJNI {
public static native CommsAddrRec[] comms_getAddrs( int gamePtr ); public static native CommsAddrRec[] comms_getAddrs( int gamePtr );
public static native void comms_setAddr( int gamePtr, CommsAddrRec addr ); public static native void comms_setAddr( int gamePtr, CommsAddrRec addr );
public static native int comms_resendAll( int gamePtr, boolean force, public static native int comms_resendAll( int gamePtr, boolean force,
CommsConnType filter,
boolean andAck ); boolean andAck );
public static int comms_resendAll( int gamePtr, boolean force,
boolean andAck ) {
return comms_resendAll( gamePtr, force, null, andAck );
}
public static native void comms_ackAny( int gamePtr ); public static native void comms_ackAny( int gamePtr );
public static native void comms_transportFailed( int gamePtr, public static native void comms_transportFailed( int gamePtr,
CommsConnType failed ); CommsConnType failed );

View file

@ -193,7 +193,7 @@ static XP_Bool channelToAddress( CommsCtxt* comms, XP_PlayerAddr channelNo,
const CommsAddrRec** addr ); const CommsAddrRec** addr );
static AddressRecord* getRecordFor( CommsCtxt* comms, const CommsAddrRec* addr, static AddressRecord* getRecordFor( CommsCtxt* comms, const CommsAddrRec* addr,
XP_PlayerAddr channelNo, XP_Bool maskChnl ); XP_PlayerAddr channelNo, XP_Bool maskChnl );
static XP_S16 sendMsg( CommsCtxt* comms, MsgQueueElem* elem ); static XP_S16 sendMsg( CommsCtxt* comms, MsgQueueElem* elem, CommsConnType filter );
static MsgQueueElem* addToQueue( CommsCtxt* comms, MsgQueueElem* newMsgElem ); static MsgQueueElem* addToQueue( CommsCtxt* comms, MsgQueueElem* newMsgElem );
static XP_Bool elems_same( const MsgQueueElem* e1, const MsgQueueElem* e2 ) ; static XP_Bool elems_same( const MsgQueueElem* e1, const MsgQueueElem* e2 ) ;
static void freeElem( const CommsCtxt* comms, MsgQueueElem* elem ); static void freeElem( const CommsCtxt* comms, MsgQueueElem* elem );
@ -778,7 +778,7 @@ sendConnect( CommsCtxt* comms, XP_Bool breakExisting )
case COMMS_CONN_IP_DIRECT: case COMMS_CONN_IP_DIRECT:
/* This will only work on host side when there's a single guest! */ /* This will only work on host side when there's a single guest! */
(void)send_via_bt_or_ip( comms, BTIPMSG_RESET, CHANNEL_NONE, typ, NULL, 0, NULL ); (void)send_via_bt_or_ip( comms, BTIPMSG_RESET, CHANNEL_NONE, typ, NULL, 0, NULL );
(void)comms_resendAll( comms, XP_FALSE ); (void)comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE );
break; break;
#endif #endif
default: default:
@ -1181,7 +1181,7 @@ comms_send( CommsCtxt* comms, XWStreamCtxt* stream )
if ( NULL != elem ) { if ( NULL != elem ) {
elem = addToQueue( comms, elem ); elem = addToQueue( comms, elem );
printQueue( comms ); printQueue( comms );
result = sendMsg( comms, elem ); result = sendMsg( comms, elem, COMMS_CONN_NONE );
} }
} }
return result; return result;
@ -1362,7 +1362,7 @@ gameID( const CommsCtxt* comms )
} }
static XP_S16 static XP_S16
sendMsg( CommsCtxt* comms, MsgQueueElem* elem ) sendMsg( CommsCtxt* comms, MsgQueueElem* elem, const CommsConnType filter )
{ {
XP_S16 result = -1; XP_S16 result = -1;
XP_PlayerAddr channelNo = elem->channelNo; XP_PlayerAddr channelNo = elem->channelNo;
@ -1379,6 +1379,9 @@ sendMsg( CommsCtxt* comms, MsgQueueElem* elem )
if ( comms_getAddrDisabled( comms, typ, XP_TRUE ) ) { if ( comms_getAddrDisabled( comms, typ, XP_TRUE ) ) {
XP_LOGF( "%s: dropping message because %s disabled", __func__, XP_LOGF( "%s: dropping message because %s disabled", __func__,
ConnType2Str( typ ) ); ConnType2Str( typ ) );
} else if ( COMMS_CONN_NONE != filter && filter != typ ) {
XP_LOGF( "%s: dropping message because not of type %s", __func__,
ConnType2Str( filter ) );
} else { } else {
XP_LOGF( TAGFMT() "sending msg with sum %s using typ %s", TAGPRMS, XP_LOGF( TAGFMT() "sending msg with sum %s using typ %s", TAGPRMS,
elem->checksum, ConnType2Str(typ) ); elem->checksum, ConnType2Str(typ) );
@ -1468,7 +1471,7 @@ send_ack( CommsCtxt* comms )
} }
XP_S16 XP_S16
comms_resendAll( CommsCtxt* comms, XP_Bool force ) comms_resendAll( CommsCtxt* comms, CommsConnType filter, XP_Bool force )
{ {
XP_S16 count = 0; XP_S16 count = 0;
XP_Bool success = XP_TRUE; XP_Bool success = XP_TRUE;
@ -1484,7 +1487,7 @@ comms_resendAll( CommsCtxt* comms, XP_Bool force )
MsgQueueElem* msg; MsgQueueElem* msg;
for ( msg = comms->msgQueueHead; !!msg; msg = msg->next ) { for ( msg = comms->msgQueueHead; !!msg; msg = msg->next ) {
XP_S16 len = sendMsg( comms, msg ); XP_S16 len = sendMsg( comms, msg, filter );
if ( 0 > len ) { if ( 0 > len ) {
success = XP_FALSE; success = XP_FALSE;
break; break;
@ -1664,7 +1667,7 @@ relayPreProcess( CommsCtxt* comms, XWStreamCtxt* stream, XWHostID* senderID )
break; break;
case XWRELAY_RECONNECT_RESP: case XWRELAY_RECONNECT_RESP:
got_connect_cmd( comms, stream, XP_TRUE ); got_connect_cmd( comms, stream, XP_TRUE );
comms_resendAll( comms, XP_FALSE ); comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE );
break; break;
case XWRELAY_ALLHERE: case XWRELAY_ALLHERE:
@ -1709,7 +1712,7 @@ relayPreProcess( CommsCtxt* comms, XWStreamCtxt* stream, XWHostID* senderID )
on RECONNECTED, so removing the test for now to fix recon on RECONNECTED, so removing the test for now to fix recon
problems on android. */ problems on android. */
/* if ( COMMS_RELAYSTATE_RECONNECTED != comms->rr.relayState ) { */ /* if ( COMMS_RELAYSTATE_RECONNECTED != comms->rr.relayState ) { */
comms_resendAll( comms, XP_FALSE ); comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE );
/* } */ /* } */
if ( XWRELAY_ALLHERE == cmd ) { /* initial connect? */ if ( XWRELAY_ALLHERE == cmd ) { /* initial connect? */
(*comms->procs.rconnd)( comms->procs.closure, (*comms->procs.rconnd)( comms->procs.closure,
@ -2341,7 +2344,7 @@ sendEmptyMsg( CommsCtxt* comms, AddressRecord* rec )
0 /*rec? rec->lastMsgRcd : 0*/, 0 /*rec? rec->lastMsgRcd : 0*/,
rec, rec,
rec? rec->channelNo : 0, NULL ); rec? rec->channelNo : 0, NULL );
(void)sendMsg( comms, elem ); (void)sendMsg( comms, elem, COMMS_CONN_NONE );
freeElem( comms, elem ); freeElem( comms, elem );
} /* sendEmptyMsg */ } /* sendEmptyMsg */
#endif #endif

View file

@ -219,7 +219,7 @@ void addrFromStream( CommsAddrRec* addr, XWStreamCtxt* stream );
void addrToStream( XWStreamCtxt* stream, const CommsAddrRec* addr ); void addrToStream( XWStreamCtxt* stream, const CommsAddrRec* addr );
XP_S16 comms_send( CommsCtxt* comms, XWStreamCtxt* stream ); XP_S16 comms_send( CommsCtxt* comms, XWStreamCtxt* stream );
XP_S16 comms_resendAll( CommsCtxt* comms, XP_Bool force ); XP_S16 comms_resendAll( CommsCtxt* comms, CommsConnType filter, XP_Bool force );
XP_U16 comms_getChannelSeed( CommsCtxt* comms ); XP_U16 comms_getChannelSeed( CommsCtxt* comms );
#ifdef XWFEATURE_COMMSACK #ifdef XWFEATURE_COMMSACK

View file

@ -585,7 +585,8 @@ static XP_Bool
handleResend( CursesAppGlobals* globals ) handleResend( CursesAppGlobals* globals )
{ {
if ( !!globals->cGlobals.game.comms ) { if ( !!globals->cGlobals.game.comms ) {
comms_resendAll( globals->cGlobals.game.comms, XP_TRUE ); comms_resendAll( globals->cGlobals.game.comms, COMMS_CONN_NONE,
XP_TRUE );
} }
return XP_TRUE; return XP_TRUE;
} }

View file

@ -1182,7 +1182,7 @@ handle_resend( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals )
{ {
CommsCtxt* comms = globals->cGlobals.game.comms; CommsCtxt* comms = globals->cGlobals.game.comms;
if ( comms != NULL ) { if ( comms != NULL ) {
comms_resendAll( comms, XP_TRUE ); comms_resendAll( comms, COMMS_CONN_NONE, XP_TRUE );
} }
} /* handle_resend */ } /* handle_resend */
@ -2518,7 +2518,7 @@ gtk_socket_added( void* closure, int newSock, GIOFunc proc )
CommsAddrRec addr; CommsAddrRec addr;
comms_getAddr( comms, &addr ); comms_getAddr( comms, &addr );
if ( (comms != NULL) && (addr_hasType( &addr, COMMS_CONN_BT) ) ) { if ( (comms != NULL) && (addr_hasType( &addr, COMMS_CONN_BT) ) ) {
comms_resendAll( comms, XP_FALSE ); comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE );
} }
LOG_RETURN_VOID(); LOG_RETURN_VOID();
} /* gtk_socket_changed */ } /* gtk_socket_changed */
@ -2807,7 +2807,8 @@ loadGameNoDraw( GtkGameGlobals* globals, LaunchParams* params,
XP_LOGF( "%s: game loaded", __func__ ); XP_LOGF( "%s: game loaded", __func__ );
#ifndef XWFEATURE_STANDALONE_ONLY #ifndef XWFEATURE_STANDALONE_ONLY
if ( !!globals->cGlobals.game.comms ) { if ( !!globals->cGlobals.game.comms ) {
comms_resendAll( globals->cGlobals.game.comms, XP_FALSE ); comms_resendAll( globals->cGlobals.game.comms, COMMS_CONN_NONE,
XP_FALSE );
} }
#endif #endif
} }