From 11266ece5b1d08b480cf004a760b1fac84f4c449 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 21 Sep 2020 13:41:01 -0700 Subject: [PATCH] gtk known-player invitation works --- xwords4/common/knownplyr.c | 16 ++++++++ xwords4/common/knownplyr.h | 2 + xwords4/linux/gtkboard.c | 13 +++---- xwords4/linux/gtkinvit.c | 80 ++++++++++++++++++++------------------ xwords4/linux/gtkinvit.h | 3 +- 5 files changed, 67 insertions(+), 47 deletions(-) diff --git a/xwords4/common/knownplyr.c b/xwords4/common/knownplyr.c index 210aaf635..e1aa252c9 100644 --- a/xwords4/common/knownplyr.c +++ b/xwords4/common/knownplyr.c @@ -187,6 +187,22 @@ kplr_getPlayers( XW_DUtilCtxt* dutil, XWEnv xwe, *nFound = state->nPlayers; } +XP_Bool +kplr_getAddr( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* name, + CommsAddrRec* addr ) +{ + KPState* state = loadState( dutil, xwe ); + XP_Bool found = XP_FALSE; + for ( KnownPlayer* kp = state->players; !!kp && !found; kp = kp->next ) { + found = 0 == XP_STRCMP( kp->name, name ); + if ( found ) { + *addr = kp->addr; + } + } + LOG_RETURNF( "%s", boolToStr(found) ); + return found; +} + void kplr_cleanup( XW_DUtilCtxt* dutil ) { diff --git a/xwords4/common/knownplyr.h b/xwords4/common/knownplyr.h index 5401440db..ee7d6859a 100644 --- a/xwords4/common/knownplyr.h +++ b/xwords4/common/knownplyr.h @@ -33,6 +33,8 @@ XP_Bool kplr_havePlayers( XW_DUtilCtxt* dutil, XWEnv xwe ); void kplr_getPlayers( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR** players, XP_U16* nFound ); +XP_Bool kplr_getAddr( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* name, + CommsAddrRec* addr ); XP_Bool kplr_addAddrs( XW_DUtilCtxt* dutil, XWEnv xwe, const CurGameInfo* gi, CommsAddrRec addrs[], XP_U16 nAddrs ); diff --git a/xwords4/linux/gtkboard.c b/xwords4/linux/gtkboard.c index fdeb9e5eb..17e2b8673 100644 --- a/xwords4/linux/gtkboard.c +++ b/xwords4/linux/gtkboard.c @@ -87,7 +87,6 @@ static void gtkShowFinalScores( const GtkGameGlobals* globals, XP_Bool ignoreTimeout ); static void send_invites( CommonGlobals* cGlobals, XP_U16 nPlayers, XP_U32 relayDevID, const XP_UCHAR* relayID, - MQTTDevID* mqttInviteeID, const CommsAddrRec* addrs ); #define GTK_TRAY_HT_ROWS 3 @@ -679,7 +678,7 @@ on_board_window_shown( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals ) CommsAddrRec addr = {0}; addrFromStream( &addr, stream ); - send_invites( cGlobals, 1, 0, relayID, &addr.u.mqtt.devID, &addr ); + send_invites( cGlobals, 1, 0, relayID, &addr ); } } stream_destroy( stream, NULL_XWE ); @@ -1405,20 +1404,18 @@ handle_invite_button( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals ) CommsAddrRec inviteAddr = {0}; gint nPlayers = nMissing; XP_U32 relayDevID = 0; - MQTTDevID mqttInviteeID; XP_Bool confirmed = gtkInviteDlg( globals, &inviteAddr, &nPlayers, - &relayDevID, &mqttInviteeID ); - XP_LOGF( "%s: inviteDlg => %d", __func__, confirmed ); + &relayDevID ); + XP_LOGF( "%s: inviteDlg => %s", __func__, boolToStr(confirmed) ); if ( confirmed ) { - send_invites( cGlobals, nPlayers, relayDevID, NULL, &mqttInviteeID, &inviteAddr ); + send_invites( cGlobals, nPlayers, relayDevID, NULL, &inviteAddr ); } } /* handle_invite_button */ static void send_invites( CommonGlobals* cGlobals, XP_U16 nPlayers, XP_U32 relayDevID, const XP_UCHAR* relayID, - MQTTDevID* mqttInviteeID, const CommsAddrRec* addrs ) { CommsAddrRec addr = {0}; @@ -1468,7 +1465,7 @@ send_invites( CommonGlobals* cGlobals, XP_U16 nPlayers, } if ( addr_hasType( addrs, COMMS_CONN_MQTT ) ) { - mqttc_invite( cGlobals->params, &nli, mqttInviteeID ); + mqttc_invite( cGlobals->params, &nli, &addrs->u.mqtt.devID ); } /* while ( gtkaskm( "Invite how many and how?", infos, VSIZE(infos) ) ) { */ diff --git a/xwords4/linux/gtkinvit.c b/xwords4/linux/gtkinvit.c index d3dbfbb21..40f5b0b2a 100644 --- a/xwords4/linux/gtkinvit.c +++ b/xwords4/linux/gtkinvit.c @@ -39,10 +39,10 @@ static XP_UCHAR s_devIDBuf[32] = {0}; typedef struct _GtkInviteState { GtkGameGlobals* globals; + XW_DUtilCtxt* dutil; /* hang onto as optimization */ CommsAddrRec* addr; gint* nPlayersP; XP_U32* relayDevIDp; - MQTTDevID* mqttDevIDp; gint maxPlayers; GtkWidget* nPlayersCombo; @@ -56,6 +56,9 @@ typedef struct _GtkInviteState { GtkWidget* mqttDevID; + /* Known players */ + GtkWidget* knownsCombo; + GtkWidget* bgScanButton; GtkWidget* okButton; @@ -96,37 +99,41 @@ handle_ok( GtkWidget* XP_UNUSED(widget), gpointer closure ) PageData* data = &state->pageData[curPage]; CommsConnType conType = data->pageType; - addr_addType( state->addr, conType ); - switch ( conType ) { + if ( COMMS_CONN_NONE == conType ) { + gchar* name = + gtk_combo_box_text_get_active_text( GTK_COMBO_BOX_TEXT(state->knownsCombo) ); + kplr_getAddr( state->dutil, NULL_XWE, name, state->addr ); + } else { + addr_addType( state->addr, conType ); + switch ( conType ) { #ifdef XWFEATURE_RELAY - case COMMS_CONN_RELAY: - txt = gtk_entry_get_text( GTK_ENTRY(state->devID) ); - snprintf( s_devIDBuf, sizeof(s_devIDBuf), "%s", txt ); - *state->relayDevIDp = atoi( txt ); - break; + case COMMS_CONN_RELAY: + txt = gtk_entry_get_text( GTK_ENTRY(state->devID) ); + snprintf( s_devIDBuf, sizeof(s_devIDBuf), "%s", txt ); + *state->relayDevIDp = atoi( txt ); + break; #endif #ifdef XWFEATURE_BLUETOOTH - case COMMS_CONN_BT: - txt = gtk_entry_get_text( GTK_ENTRY(state->bthost) ); - XP_STRNCPY( state->addr->u.bt.hostName, txt, - sizeof(state->addr->u.bt.hostName) ); - break; + case COMMS_CONN_BT: + txt = gtk_entry_get_text( GTK_ENTRY(state->bthost) ); + XP_STRNCPY( state->addr->u.bt.hostName, txt, + sizeof(state->addr->u.bt.hostName) ); + break; #endif - case COMMS_CONN_SMS: - txt = gtk_entry_get_text( GTK_ENTRY(state->smsport) ); - state->addr->u.sms.port = atoi( txt ); - break; - case COMMS_CONN_MQTT: - txt = gtk_entry_get_text( GTK_ENTRY(state->mqttDevID) ); - if ( strToMQTTCDevID( txt, &state->addr->u.mqtt.devID ) ) { - *state->mqttDevIDp = state->addr->u.mqtt.devID; - } else { - XP_ASSERT(0); + case COMMS_CONN_SMS: + txt = gtk_entry_get_text( GTK_ENTRY(state->smsport) ); + state->addr->u.sms.port = atoi( txt ); + break; + case COMMS_CONN_MQTT: + txt = gtk_entry_get_text( GTK_ENTRY(state->mqttDevID) ); + if ( !strToMQTTCDevID( txt, &state->addr->u.mqtt.devID ) ) { + XP_ASSERT(0); + } + break; + default: + XP_ASSERT( 0 ); /* keep compiler happy */ + break; } - break; - default: - XP_ASSERT( 0 ); /* keep compiler happy */ - break; } /* get the number to invite */ @@ -266,7 +273,7 @@ makeSMSPage( GtkInviteState* state, PageData* data ) static GtkWidget* -makeKnownsPage( GtkInviteState* XP_UNUSED(state), XW_DUtilCtxt* dutil, PageData* data ) +makeKnownsPage( GtkInviteState* state, PageData* data ) { data->okButtonTxt = "Invite Known Player"; @@ -275,17 +282,18 @@ makeKnownsPage( GtkInviteState* XP_UNUSED(state), XW_DUtilCtxt* dutil, PageData* gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, TRUE, 0 ); XP_U16 nFound = 0; - kplr_getPlayers( dutil, NULL_XWE, NULL, &nFound ); + kplr_getPlayers( state->dutil, NULL_XWE, NULL, &nFound ); XP_ASSERT( nFound > 0 ); const XP_UCHAR* names[nFound]; - kplr_getPlayers( dutil, NULL_XWE, names, &nFound ); + kplr_getPlayers( state->dutil, NULL_XWE, names, &nFound ); - GtkWidget* combo = gtk_combo_box_text_new(); + GtkWidget* combo = state->knownsCombo = gtk_combo_box_text_new(); for ( int ii = 0; ii < nFound; ++ii ) { gtk_combo_box_text_append_text( GTK_COMBO_BOX_TEXT(combo), names[ii] ); } gtk_combo_box_set_active( GTK_COMBO_BOX(combo), 0 ); gtk_box_pack_start( GTK_BOX(hbox), combo, FALSE, TRUE, 0 ); + state->knownsCombo = combo; GtkWidget* vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 ); gtk_box_pack_start( GTK_BOX(vbox), hbox, FALSE, TRUE, 0 ); @@ -333,8 +341,7 @@ onPageChanged( GtkNotebook* XP_UNUSED(notebook), gpointer XP_UNUSED(arg1), XP_Bool gtkInviteDlg( GtkGameGlobals* globals, CommsAddrRec* addr, - gint* nPlayersP, XP_U32* relayDevIDp, - MQTTDevID* mqttDevIDp ) + gint* nPlayersP, XP_U32* relayDevIDp ) { GtkInviteState state = { .globals = globals, @@ -342,7 +349,7 @@ gtkInviteDlg( GtkGameGlobals* globals, CommsAddrRec* addr, .nPlayersP = nPlayersP, .relayDevIDp = relayDevIDp, .maxPlayers = *nPlayersP, - .mqttDevIDp = mqttDevIDp, + .dutil = globals->cGlobals.params->dutil, }; GtkWidget* dialog; @@ -370,11 +377,10 @@ gtkInviteDlg( GtkGameGlobals* globals, CommsAddrRec* addr, PageData* data; - XW_DUtilCtxt* dutil = globals->cGlobals.params->dutil; - if ( kplr_havePlayers( dutil, NULL_XWE ) ) { + if ( kplr_havePlayers( state.dutil, NULL_XWE ) ) { data = getNextData( &state, COMMS_CONN_NONE, "Knowns" ); (void)gtk_notebook_append_page( GTK_NOTEBOOK(state.notebook), - makeKnownsPage( &state, dutil, data ), + makeKnownsPage( &state, data ), data->label ); } diff --git a/xwords4/linux/gtkinvit.h b/xwords4/linux/gtkinvit.h index 2befaa644..3f5cb960d 100644 --- a/xwords4/linux/gtkinvit.h +++ b/xwords4/linux/gtkinvit.h @@ -24,8 +24,7 @@ /* return true if not cancelled */ XP_Bool gtkInviteDlg( GtkGameGlobals* globals, CommsAddrRec* addr, - /*inout*/ gint* nPlayers, /* out */ XP_U32* relayDevID, - MQTTDevID* mqttInviteeID ); + /*inout*/ gint* nPlayers, /* out */ XP_U32* relayDevID ); #endif