diff --git a/xwords4/android/XWords4/jni/xwjni.c b/xwords4/android/XWords4/jni/xwjni.c index 5ed0c3d72..eb395e8cc 100644 --- a/xwords4/android/XWords4/jni/xwjni.c +++ b/xwords4/android/XWords4/jni/xwjni.c @@ -1805,19 +1805,24 @@ Java_org_eehouse_android_xw4_jni_XwJNI_game_1changeDict JNIEXPORT jint JNICALL 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; XWJNI_START(); CommsCtxt* comms = state->game.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 ) { #ifdef XWFEATURE_COMMSACK comms_ackAny( comms ); #endif } XWJNI_END(); + LOG_RETURNF( "%d", result ); return result; } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java index 6ac73d38e..6f3aba876 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -1218,7 +1218,7 @@ public class GameUtils { m_sink = new MultiMsgSink( m_context, rowid ); GamePtr gamePtr = loadMakeGame( m_context, gi, m_sink, lock ); if ( null != gamePtr ) { - XwJNI.comms_resendAll( gamePtr.ptr(), true, false ); + XwJNI.comms_resendAll( gamePtr.ptr(), true, m_filter, false ); gamePtr.release(); } lock.unlock(); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java index fb683c6be..e2af314b8 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java @@ -362,7 +362,12 @@ public class XwJNI { public static native CommsAddrRec[] comms_getAddrs( int gamePtr ); public static native void comms_setAddr( int gamePtr, CommsAddrRec addr ); public static native int comms_resendAll( int gamePtr, boolean force, + CommsConnType filter, 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_transportFailed( int gamePtr, CommsConnType failed ); diff --git a/xwords4/common/comms.c b/xwords4/common/comms.c index 7f5755d44..60103de30 100644 --- a/xwords4/common/comms.c +++ b/xwords4/common/comms.c @@ -193,7 +193,7 @@ static XP_Bool channelToAddress( CommsCtxt* comms, XP_PlayerAddr channelNo, const CommsAddrRec** addr ); static AddressRecord* getRecordFor( CommsCtxt* comms, const CommsAddrRec* addr, 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 XP_Bool elems_same( const MsgQueueElem* e1, const MsgQueueElem* e2 ) ; static void freeElem( const CommsCtxt* comms, MsgQueueElem* elem ); @@ -778,7 +778,7 @@ sendConnect( CommsCtxt* comms, XP_Bool breakExisting ) case COMMS_CONN_IP_DIRECT: /* 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)comms_resendAll( comms, XP_FALSE ); + (void)comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE ); break; #endif default: @@ -1181,7 +1181,7 @@ comms_send( CommsCtxt* comms, XWStreamCtxt* stream ) if ( NULL != elem ) { elem = addToQueue( comms, elem ); printQueue( comms ); - result = sendMsg( comms, elem ); + result = sendMsg( comms, elem, COMMS_CONN_NONE ); } } return result; @@ -1362,7 +1362,7 @@ gameID( const CommsCtxt* comms ) } static XP_S16 -sendMsg( CommsCtxt* comms, MsgQueueElem* elem ) +sendMsg( CommsCtxt* comms, MsgQueueElem* elem, const CommsConnType filter ) { XP_S16 result = -1; XP_PlayerAddr channelNo = elem->channelNo; @@ -1379,6 +1379,9 @@ sendMsg( CommsCtxt* comms, MsgQueueElem* elem ) if ( comms_getAddrDisabled( comms, typ, XP_TRUE ) ) { XP_LOGF( "%s: dropping message because %s disabled", __func__, ConnType2Str( typ ) ); + } else if ( COMMS_CONN_NONE != filter && filter != typ ) { + XP_LOGF( "%s: dropping message because not of type %s", __func__, + ConnType2Str( filter ) ); } else { XP_LOGF( TAGFMT() "sending msg with sum %s using typ %s", TAGPRMS, elem->checksum, ConnType2Str(typ) ); @@ -1468,7 +1471,7 @@ send_ack( CommsCtxt* comms ) } XP_S16 -comms_resendAll( CommsCtxt* comms, XP_Bool force ) +comms_resendAll( CommsCtxt* comms, CommsConnType filter, XP_Bool force ) { XP_S16 count = 0; XP_Bool success = XP_TRUE; @@ -1484,7 +1487,7 @@ comms_resendAll( CommsCtxt* comms, XP_Bool force ) MsgQueueElem* msg; for ( msg = comms->msgQueueHead; !!msg; msg = msg->next ) { - XP_S16 len = sendMsg( comms, msg ); + XP_S16 len = sendMsg( comms, msg, filter ); if ( 0 > len ) { success = XP_FALSE; break; @@ -1664,7 +1667,7 @@ relayPreProcess( CommsCtxt* comms, XWStreamCtxt* stream, XWHostID* senderID ) break; case XWRELAY_RECONNECT_RESP: got_connect_cmd( comms, stream, XP_TRUE ); - comms_resendAll( comms, XP_FALSE ); + comms_resendAll( comms, COMMS_CONN_NONE, XP_FALSE ); break; 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 problems on android. */ /* 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? */ (*comms->procs.rconnd)( comms->procs.closure, @@ -2341,7 +2344,7 @@ sendEmptyMsg( CommsCtxt* comms, AddressRecord* rec ) 0 /*rec? rec->lastMsgRcd : 0*/, rec, rec? rec->channelNo : 0, NULL ); - (void)sendMsg( comms, elem ); + (void)sendMsg( comms, elem, COMMS_CONN_NONE ); freeElem( comms, elem ); } /* sendEmptyMsg */ #endif diff --git a/xwords4/common/comms.h b/xwords4/common/comms.h index f63f0c70d..2c57fc27d 100644 --- a/xwords4/common/comms.h +++ b/xwords4/common/comms.h @@ -219,7 +219,7 @@ void addrFromStream( CommsAddrRec* addr, XWStreamCtxt* stream ); void addrToStream( XWStreamCtxt* stream, const CommsAddrRec* addr ); 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 ); #ifdef XWFEATURE_COMMSACK diff --git a/xwords4/linux/cursesmain.c b/xwords4/linux/cursesmain.c index df723ab42..ffa11f161 100644 --- a/xwords4/linux/cursesmain.c +++ b/xwords4/linux/cursesmain.c @@ -585,7 +585,8 @@ static XP_Bool handleResend( CursesAppGlobals* globals ) { 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; } diff --git a/xwords4/linux/gtkboard.c b/xwords4/linux/gtkboard.c index f168c72cf..740a5d304 100644 --- a/xwords4/linux/gtkboard.c +++ b/xwords4/linux/gtkboard.c @@ -1182,7 +1182,7 @@ handle_resend( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals ) { CommsCtxt* comms = globals->cGlobals.game.comms; if ( comms != NULL ) { - comms_resendAll( comms, XP_TRUE ); + comms_resendAll( comms, COMMS_CONN_NONE, XP_TRUE ); } } /* handle_resend */ @@ -2518,7 +2518,7 @@ gtk_socket_added( void* closure, int newSock, GIOFunc proc ) CommsAddrRec addr; comms_getAddr( comms, &addr ); 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(); } /* gtk_socket_changed */ @@ -2807,7 +2807,8 @@ loadGameNoDraw( GtkGameGlobals* globals, LaunchParams* params, XP_LOGF( "%s: game loaded", __func__ ); #ifndef XWFEATURE_STANDALONE_ONLY 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 }