snapshot: reg works from Android and Linux

This commit is contained in:
Eric House 2024-02-14 10:43:51 -08:00
parent 7200833d27
commit 47f06d4cb3
7 changed files with 140 additions and 70 deletions

View file

@ -388,72 +388,72 @@ public class MQTTUtils extends Thread
clearInstance(); clearInstance();
} }
registerOnce(); // registerOnce();
} }
private void registerOnce() // private void registerOnce()
{ // {
if ( 0 == sNextReg ) { // if ( 0 == sNextReg ) {
sNextReg = DBUtils.getLongFor( mContext, KEY_NEXT_REG, 1 ); // sNextReg = DBUtils.getLongFor( mContext, KEY_NEXT_REG, 1 );
sLastRev = DBUtils.getStringFor( mContext, KEY_LAST_WRITE, "" ); // sLastRev = DBUtils.getStringFor( mContext, KEY_LAST_WRITE, "" );
} // }
long now = Utils.getCurSeconds(); // long now = Utils.getCurSeconds();
Log.d( TAG, "registerOnce(): now: %d; nextReg: %d", now, sNextReg ); // Log.d( TAG, "registerOnce(): now: %d; nextReg: %d", now, sNextReg );
String revString = BuildConfig.GIT_REV + ':' + BuildConfig.VARIANT_NAME; // String revString = BuildConfig.GIT_REV + ':' + BuildConfig.VARIANT_NAME;
if ( now > sNextReg || ! revString.equals(sLastRev) ) { // if ( now > sNextReg || ! revString.equals(sLastRev) ) {
try { // try {
JSONObject params = new JSONObject(); // JSONObject params = new JSONObject();
params.put( "devid", mDevID ); // params.put( "devid", mDevID );
params.put( "gitrev", BuildConfig.GIT_REV ); // params.put( "gitrev", BuildConfig.GIT_REV );
params.put( "os", Build.MODEL ); // params.put( "os", Build.MODEL );
// PENDING remove me in favor of SDK_INT // // PENDING remove me in favor of SDK_INT
params.put( "vers", Build.VERSION.RELEASE ); // params.put( "vers", Build.VERSION.RELEASE );
params.put( "versI", Build.VERSION.SDK_INT ); // params.put( "versI", Build.VERSION.SDK_INT );
params.put( "vrntCode", BuildConfig.VARIANT_CODE ); // params.put( "vrntCode", BuildConfig.VARIANT_CODE );
params.put( "vrntName", BuildConfig.VARIANT_NAME ); // params.put( "vrntName", BuildConfig.VARIANT_NAME );
if ( BuildConfig.DEBUG ) { // if ( BuildConfig.DEBUG ) {
params.put( "dbg", true ); // params.put( "dbg", true );
} // }
params.put( "myNow", now ); // params.put( "myNow", now );
params.put( "loc", LocUtils.getCurLocale( mContext ) ); // params.put( "loc", LocUtils.getCurLocale( mContext ) );
params.put( "tmpKey", getTmpKey(mContext) ); // params.put( "tmpKey", getTmpKey(mContext) );
params.put( "frstV", Utils.getFirstVersion( mContext ) ); // params.put( "frstV", Utils.getFirstVersion( mContext ) );
Log.d( TAG, "registerOnce(): sending %s", params ); // Log.d( TAG, "registerOnce(): sending %s", params );
HttpURLConnection conn // HttpURLConnection conn
= NetUtils.makeHttpMQTTConn( mContext, "register" ); // = NetUtils.makeHttpMQTTConn( mContext, "register" );
String resStr = NetUtils.runConn( conn, params, true ); // String resStr = NetUtils.runConn( conn, params, true );
if ( null != resStr ) { // if ( null != resStr ) {
JSONObject response = new JSONObject( resStr ); // JSONObject response = new JSONObject( resStr );
Log.d( TAG, "registerOnce(): got %s", response ); // Log.d( TAG, "registerOnce(): got %s", response );
if ( response.optBoolean( "success", true ) ) { // if ( response.optBoolean( "success", true ) ) {
long atNext = response.optLong( "atNext", 0 ); // long atNext = response.optLong( "atNext", 0 );
if ( 0 < atNext ) { // if ( 0 < atNext ) {
DBUtils.setLongFor( mContext, KEY_NEXT_REG, atNext ); // DBUtils.setLongFor( mContext, KEY_NEXT_REG, atNext );
sNextReg = atNext; // sNextReg = atNext;
DBUtils.setStringFor( mContext, KEY_LAST_WRITE, revString ); // DBUtils.setStringFor( mContext, KEY_LAST_WRITE, revString );
sLastRev = revString; // sLastRev = revString;
} // }
String dupID = response.optString( "dupID", "" ); // String dupID = response.optString( "dupID", "" );
if ( dupID.equals( mDevID ) ) { // if ( dupID.equals( mDevID ) ) {
Log.e( TAG, "********** %s bad; need new devID!!! **********", dupID ); // Log.e( TAG, "********** %s bad; need new devID!!! **********", dupID );
XwJNI.dvc_resetMQTTDevID(); // XwJNI.dvc_resetMQTTDevID();
// Force a reconnect asap // // Force a reconnect asap
DBUtils.setLongFor( mContext, KEY_NEXT_REG, 0 ); // DBUtils.setLongFor( mContext, KEY_NEXT_REG, 0 );
sNextReg = 0; // sNextReg = 0;
clearInstance(); // clearInstance();
} // }
} // }
} else { // } else {
Log.e( TAG, "registerOnce(): null back from runConn()" ); // Log.e( TAG, "registerOnce(): null back from runConn()" );
} // }
} catch ( JSONException je ) { // } catch ( JSONException je ) {
Log.e( TAG, "registerOnce() ex: %s", je ); // Log.e( TAG, "registerOnce() ex: %s", je );
} // }
} // }
} // }
private static int sTmpKey; private static int sTmpKey;
private static int getTmpKey( Context context ) private static int getTmpKey( Context context )

View file

@ -22,10 +22,14 @@ package org.eehouse.android.xw4.jni;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils;
import java.util.Arrays; import java.util.Arrays;
import org.json.JSONException;
import org.json.JSONObject;
import org.eehouse.android.xw4.Assert; import org.eehouse.android.xw4.Assert;
import org.eehouse.android.xw4.BuildConfig; import org.eehouse.android.xw4.BuildConfig;
import org.eehouse.android.xw4.Channels; import org.eehouse.android.xw4.Channels;
@ -339,6 +343,25 @@ public class DUtilCtxt {
NetUtils.sendViaWeb( m_context, api, jsonParams ); NetUtils.sendViaWeb( m_context, api, jsonParams );
} }
public String getRegValues()
{
String result;
try {
JSONObject params = new JSONObject();
params.put( "os", Build.MODEL );
params.put( "vers", Build.VERSION.RELEASE );
params.put( "versI", Build.VERSION.SDK_INT );
params.put( "vrntCode", BuildConfig.VARIANT_CODE );
params.put( "vrntName", BuildConfig.VARIANT_NAME );
params.put( "loc", LocUtils.getCurLocale( m_context ) );
result = params.toString();
} catch ( JSONException je ) {
Log.e( TAG, "getRegValues() ex: %s", je );
result = "{}";
}
return result;
}
public void onInviteReceived( NetLaunchInfo nli ) public void onInviteReceived( NetLaunchInfo nli )
{ {
// Log.d( TAG, "onInviteReceived(%s)", nli ); // Log.d( TAG, "onInviteReceived(%s)", nli );

View file

@ -50,6 +50,7 @@ LOCAL_DEFINES += \
-D__LITTLE_ENDIAN \ -D__LITTLE_ENDIAN \
-DMQTT_DEV_TOPICS \ -DMQTT_DEV_TOPICS \
-DMQTT_GAMEID_TOPICS \ -DMQTT_GAMEID_TOPICS \
-DGITREV_SHORT="\"$(shell git rev-parse --short HEAD)\"" \
# XWFEATURE_RAISETILE: first, fix to not use timer # XWFEATURE_RAISETILE: first, fix to not use timer
# -DXWFEATURE_RAISETILE \ # -DXWFEATURE_RAISETILE \

View file

@ -22,6 +22,7 @@
#include <jni.h> #include <jni.h>
#include "comtypes.h" #include "comtypes.h"
#include "device.h"
#include "utilwrapper.h" #include "utilwrapper.h"
#include "anddict.h" #include "anddict.h"
#include "andutils.h" #include "andutils.h"
@ -983,6 +984,20 @@ and_dutil_sendViaWeb( XW_DUtilCtxt* duc, XWEnv xwe, const XP_UCHAR* api,
DUTIL_CBK_TAIL(); DUTIL_CBK_TAIL();
} }
static cJSON*
and_dutil_getRegValues( XW_DUtilCtxt* duc, XWEnv xwe )
{
cJSON* result = NULL;
DUTIL_CBK_HEADER( "getRegValues", "()Ljava/lang/String;" );
jstring jresult = (*env)->CallObjectMethod( env, dutil->jdutil, mid );
const char* jchars = (*env)->GetStringUTFChars( env, jresult, NULL );
result = cJSON_Parse( jchars );
(*env)->ReleaseStringUTFChars( env, jresult, jchars );
deleteLocalRef( env, jresult );
DUTIL_CBK_TAIL();
return result;
}
XW_UtilCtxt* XW_UtilCtxt*
makeUtil( MPFORMAL JNIEnv* env, makeUtil( MPFORMAL JNIEnv* env,
#ifdef MAP_THREAD_TO_ENV #ifdef MAP_THREAD_TO_ENV
@ -1094,7 +1109,8 @@ makeDUtil( MPFORMAL JNIEnv* env,
void* closure ) void* closure )
{ {
AndDUtil* dutil = (AndDUtil*)XP_CALLOC( mpool, sizeof(*dutil) ); AndDUtil* dutil = (AndDUtil*)XP_CALLOC( mpool, sizeof(*dutil) );
dutil_super_init( MPPARM(mpool) &dutil->dutil ); XW_DUtilCtxt* super = &dutil->dutil;
dutil_super_init( MPPARM(mpool) super );
#ifdef MAP_THREAD_TO_ENV #ifdef MAP_THREAD_TO_ENV
dutil->ti = ti; dutil->ti = ti;
#endif #endif
@ -1140,11 +1156,15 @@ makeDUtil( MPFORMAL JNIEnv* env,
SET_DPROC(onGameGoneReceived); SET_DPROC(onGameGoneReceived);
SET_DPROC(sendViaWeb); SET_DPROC(sendViaWeb);
SET_DPROC(getRegValues);
#undef SET_DPROC #undef SET_DPROC
assertTableFull( vtable, sizeof(*vtable), "dutil" ); assertTableFull( vtable, sizeof(*vtable), "dutil" );
return &dutil->dutil;
dvc_init( super, env );
return super;
} }
void void

View file

@ -55,6 +55,7 @@ typedef struct _DevCtxt {
static DevCtxt* static DevCtxt*
load( XW_DUtilCtxt* dutil, XWEnv xwe ) load( XW_DUtilCtxt* dutil, XWEnv xwe )
{ {
ASSERT_MAGIC();
DevCtxt* state = (DevCtxt*)dutil->devCtxt; DevCtxt* state = (DevCtxt*)dutil->devCtxt;
if ( NULL == state ) { if ( NULL == state ) {
XWStreamCtxt* stream = mkStream( dutil ); XWStreamCtxt* stream = mkStream( dutil );
@ -80,6 +81,7 @@ load( XW_DUtilCtxt* dutil, XWEnv xwe )
void void
dvc_store( XW_DUtilCtxt* dutil, XWEnv xwe ) dvc_store( XW_DUtilCtxt* dutil, XWEnv xwe )
{ {
ASSERT_MAGIC();
DevCtxt* state = load( dutil, xwe ); DevCtxt* state = load( dutil, xwe );
XWStreamCtxt* stream = mkStream( dutil ); XWStreamCtxt* stream = mkStream( dutil );
stream_putU16( stream, state->devCount ); stream_putU16( stream, state->devCount );
@ -162,6 +164,7 @@ getMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, XP_Bool forceNew, MQTTDevID* devID
void void
dvc_getMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, MQTTDevID* devID ) dvc_getMQTTDevID( XW_DUtilCtxt* dutil, XWEnv xwe, MQTTDevID* devID )
{ {
ASSERT_MAGIC();
getMQTTDevID( dutil, xwe, XP_FALSE, devID ); getMQTTDevID( dutil, xwe, XP_FALSE, devID );
} }
@ -213,6 +216,7 @@ dvc_getMQTTSubTopics( XW_DUtilCtxt* dutil, XWEnv xwe,
XP_UCHAR* storage, XP_U16 XP_UNUSED_DBG(storageLen), XP_UCHAR* storage, XP_U16 XP_UNUSED_DBG(storageLen),
XP_U16* nTopics, XP_UCHAR* topics[] ) XP_U16* nTopics, XP_UCHAR* topics[] )
{ {
ASSERT_MAGIC();
LOG_FUNC(); LOG_FUNC();
int offset = 0; int offset = 0;
XP_U16 count = 0; XP_U16 count = 0;
@ -311,6 +315,7 @@ dvc_makeMQTTInvites( XW_DUtilCtxt* dutil, XWEnv xwe,
const MQTTDevID* addressee, const MQTTDevID* addressee,
const NetLaunchInfo* nli ) const NetLaunchInfo* nli )
{ {
ASSERT_MAGIC();
XP_UCHAR devTopic[64]; /* used by two below */ XP_UCHAR devTopic[64]; /* used by two below */
formatMQTTDevTopic( addressee, devTopic, VSIZE(devTopic) ); formatMQTTDevTopic( addressee, devTopic, VSIZE(devTopic) );
/* Stream format is identical for both topics */ /* Stream format is identical for both topics */
@ -339,7 +344,7 @@ dvc_makeMQTTNukeInvite( XW_DUtilCtxt* dutil, XWEnv xwe,
MsgAndTopicProc proc, void* closure, MsgAndTopicProc proc, void* closure,
const NetLaunchInfo* nli ) const NetLaunchInfo* nli )
{ {
LOG_FUNC(); ASSERT_MAGIC();
#ifdef MQTT_GAMEID_TOPICS #ifdef MQTT_GAMEID_TOPICS
MQTTDevID myID; MQTTDevID myID;
dvc_getMQTTDevID( dutil, xwe, &myID ); dvc_getMQTTDevID( dutil, xwe, &myID );
@ -361,6 +366,7 @@ dvc_makeMQTTMessages( XW_DUtilCtxt* dutil, XWEnv xwe,
const MQTTDevID* addressee, const MQTTDevID* addressee,
XP_U32 gameID, XP_U16 streamVersion ) XP_U32 gameID, XP_U16 streamVersion )
{ {
ASSERT_MAGIC();
XP_S16 nSent0 = 0; XP_S16 nSent0 = 0;
XP_S16 nSent1 = 0; XP_S16 nSent1 = 0;
XP_U8 nBufs = 0; XP_U8 nBufs = 0;
@ -429,6 +435,7 @@ dvc_makeMQTTNoSuchGames( XW_DUtilCtxt* dutil, XWEnv xwe,
const MQTTDevID* addressee, const MQTTDevID* addressee,
XP_U32 gameID ) XP_U32 gameID )
{ {
ASSERT_MAGIC();
XP_LOGFF( "(gameID: %X)", gameID ); XP_LOGFF( "(gameID: %X)", gameID );
XP_UCHAR devTopic[64]; /* used by two below */ XP_UCHAR devTopic[64]; /* used by two below */
formatMQTTDevTopic( addressee, devTopic, VSIZE(devTopic) ); formatMQTTDevTopic( addressee, devTopic, VSIZE(devTopic) );
@ -528,6 +535,7 @@ dvc_parseMQTTPacket( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* topic,
const XP_U8* buf, XP_U16 len ) const XP_U8* buf, XP_U16 len )
{ {
XP_LOGFF( "(topic=%s, len=%d)", topic, len ); XP_LOGFF( "(topic=%s, len=%d)", topic, len );
ASSERT_MAGIC();
MQTTDevID myID; MQTTDevID myID;
dvc_getMQTTDevID( dutil, xwe, &myID ); dvc_getMQTTDevID( dutil, xwe, &myID );
@ -558,7 +566,6 @@ dvc_parseMQTTPacket( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* topic,
MQTTCmd cmd = stream_getU8( stream ); MQTTCmd cmd = stream_getU8( stream );
/* Need to ack even if discarded/malformed */ /* Need to ack even if discarded/malformed */
// dutil_ackMQTTMsg( dutil, xwe, topic, gameID, &senderID, buf, len );
ackMQTTMsg( dutil, xwe, topic, gameID, buf, len ); ackMQTTMsg( dutil, xwe, topic, gameID, buf, len );
switch ( cmd ) { switch ( cmd ) {
@ -605,8 +612,9 @@ registerIf( XW_DUtilCtxt* dutil, XWEnv xwe )
XP_U32 now = dutil_getCurSeconds( dutil, xwe ); XP_U32 now = dutil_getCurSeconds( dutil, xwe );
if ( prevNow + REG_INTERVAL_SECS < now ) { if ( prevNow + REG_INTERVAL_SECS < now ) {
XP_LOGFF( "been long enough; trying to register" );
cJSON* params = cJSON_CreateObject(); /* Start with the platform's values */
cJSON* params = dutil_getRegValues( dutil, xwe );
MQTTDevID myID; MQTTDevID myID;
dvc_getMQTTDevID( dutil, xwe, &myID ); dvc_getMQTTDevID( dutil, xwe, &myID );
@ -615,9 +623,7 @@ registerIf( XW_DUtilCtxt* dutil, XWEnv xwe )
cJSON_AddStringToObject( params, "devid", tmp ); cJSON_AddStringToObject( params, "devid", tmp );
cJSON_AddStringToObject( params, "gitrev", GITREV_SHORT ); cJSON_AddStringToObject( params, "gitrev", GITREV_SHORT );
cJSON_AddStringToObject( params, "os", "Linux" );
/* // PENDING remove me in favor of SDK_INT */ /* // PENDING remove me in favor of SDK_INT */
cJSON_AddStringToObject( params, "vers", "DEBUG" );
/* params.put( "versI", Build.VERSION.SDK_INT ); */ /* params.put( "versI", Build.VERSION.SDK_INT ); */
/* params.put( "vrntCode", BuildConfig.VARIANT_CODE ); */ /* params.put( "vrntCode", BuildConfig.VARIANT_CODE ); */
/* params.put( "vrntName", BuildConfig.VARIANT_NAME ); */ /* params.put( "vrntName", BuildConfig.VARIANT_NAME ); */
@ -642,7 +648,7 @@ void
dvc_init( XW_DUtilCtxt* dutil, XWEnv xwe ) dvc_init( XW_DUtilCtxt* dutil, XWEnv xwe )
{ {
LOG_FUNC(); LOG_FUNC();
XP_ASSERT( 00 == dutil->magic ); XP_ASSERT( 0 == dutil->magic );
dutil->magic = MAGIC_INITED; dutil->magic = MAGIC_INITED;
registerIf( dutil, xwe ); registerIf( dutil, xwe );
} }

View file

@ -102,6 +102,8 @@ typedef struct _DUtilVtable {
void (*m_dutil_onCtrlReceived)( XW_DUtilCtxt* duc, XWEnv xwe, const XP_U8* buf, XP_U16 len ); void (*m_dutil_onCtrlReceived)( XW_DUtilCtxt* duc, XWEnv xwe, const XP_U8* buf, XP_U16 len );
void (*m_dutil_onGameGoneReceived)( XW_DUtilCtxt* duc, XWEnv xwe, XP_U32 gameID, void (*m_dutil_onGameGoneReceived)( XW_DUtilCtxt* duc, XWEnv xwe, XP_U32 gameID,
const CommsAddrRec* from ); const CommsAddrRec* from );
/* Return platform-specific registration keys->values */
cJSON* (*m_dutil_getRegValues)( XW_DUtilCtxt* duc, XWEnv xwe );
void (*m_dutil_sendViaWeb)( XW_DUtilCtxt* duc, XWEnv xwe, const XP_UCHAR* api, void (*m_dutil_sendViaWeb)( XW_DUtilCtxt* duc, XWEnv xwe, const XP_UCHAR* api,
const cJSON* params ); const cJSON* params );
} DUtilVtable; } DUtilVtable;
@ -186,4 +188,8 @@ void dutil_super_init( MPFORMAL XW_DUtilCtxt* dutil );
(duc)->vtable.m_dutil_onGameGoneReceived((duc),(xwe),(gameID),(from)) (duc)->vtable.m_dutil_onGameGoneReceived((duc),(xwe),(gameID),(from))
#define dutil_sendViaWeb( duc, xwe, api, params ) \ #define dutil_sendViaWeb( duc, xwe, api, params ) \
(duc)->vtable.m_dutil_sendViaWeb((duc), (xwe), (api), (params)) (duc)->vtable.m_dutil_sendViaWeb((duc), (xwe), (api), (params))
#define dutil_getRegValues( duc, xwe ) \
(duc)->vtable.m_dutil_getRegValues( (duc), (xwe) )
#endif #endif

View file

@ -289,6 +289,19 @@ linux_dutil_sendViaWeb( XW_DUtilCtxt* duc, XWEnv XP_UNUSED(xwe),
pthread_detach( thrd ); pthread_detach( thrd );
} }
static cJSON*
linux_dutil_getRegValues( XW_DUtilCtxt* duc, XWEnv xwe )
{
XP_USE(duc);
XP_USE(xwe);
cJSON* results = cJSON_CreateObject();
cJSON_AddStringToObject( results, "os", "Linux" );
cJSON_AddStringToObject( results, "vers", "DEBUG" );
return results;
}
XW_DUtilCtxt* XW_DUtilCtxt*
linux_dutils_init( MPFORMAL VTableMgr* vtMgr, void* closure ) linux_dutils_init( MPFORMAL VTableMgr* vtMgr, void* closure )
{ {
@ -339,6 +352,7 @@ linux_dutils_init( MPFORMAL VTableMgr* vtMgr, void* closure )
SET_PROC(onCtrlReceived); SET_PROC(onCtrlReceived);
SET_PROC(onGameGoneReceived); SET_PROC(onGameGoneReceived);
SET_PROC(sendViaWeb); SET_PROC(sendViaWeb);
SET_PROC(getRegValues);
# undef SET_PROC # undef SET_PROC