toward the ability to send replies to messages received in background

without user having to open the game, which will e.g. allow a host to
assign tiles, or a robot to move, without the phone's owner noticing
there's a message.  This is on a branch because it may never work.
This commit is contained in:
Andy2 2011-08-10 18:28:34 -07:00
parent e2ef25ae90
commit e88af19e0a
4 changed files with 63 additions and 18 deletions

View file

@ -111,6 +111,18 @@ and_xport_relayConnd( void* closure, XP_UCHAR* const room, XP_Bool reconnect,
}
}
static XP_Bool
and_xport_sendNoConn( const XP_U8* buf, XP_U16 len,
const XP_UCHAR* relayID, void* closure )
{
LOG_FUNC();
AndTransportProcs* aprocs = (AndTransportProcs*)closure;
if ( NULL != aprocs && NULL != aprocs->jxport ) {
}
LOG_RETURNF( "%s", "false" );
return XP_FALSE;
}
static void
and_xport_relayError( void* closure, XWREASON relayErr )
{
@ -148,6 +160,7 @@ makeXportProcs( MPFORMAL JNIEnv** envp, jobject jxport )
aprocs->tp.rstatus = and_xport_relayStatus;
aprocs->tp.rconnd = and_xport_relayConnd;
aprocs->tp.rerror = and_xport_relayError;
aprocs->tp.sendNoConn = and_xport_sendNoConn;
aprocs->tp.closure = aprocs;
return (TransportProcs*)aprocs;

View file

@ -1013,6 +1013,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_game_1receiveMessage
ServerCtxt* server = state->game.server;
server_do( server ); /* in case work's pending */
(void)server_receiveMessage( server, stream );
server_do( server ); /* in case MORE work's pending */
}
stream_destroy( stream );

View file

@ -175,6 +175,8 @@ static XP_Bool relayConnect( CommsCtxt* comms );
static void relayDisconnect( CommsCtxt* comms );
static XP_Bool send_via_relay( CommsCtxt* comms, XWRELAY_Cmd cmd,
XWHostID destID, void* data, int dlen );
static XP_Bool sendNoConn( const CommsCtxt* comms,
const MsgQueueElem* elem, XWHostID destID );
static XWHostID getDestID( CommsCtxt* comms, XP_PlayerAddr channelNo );
static void set_reset_timer( CommsCtxt* comms );
# ifdef DEBUG
@ -797,25 +799,32 @@ comms_setAddr( CommsCtxt* comms, const CommsAddrRec* addr )
} /* comms_setAddr */
#ifdef XWFEATURE_RELAY
static XP_Bool
haveRelayID( const CommsCtxt* comms )
{
XP_Bool result = 0 != comms->r.connName[0]
&& comms->r.myHostID != HOST_ID_NONE;
return result;
}
static XP_Bool
formatRelayID( const CommsCtxt* comms, XWHostID hostID,
XP_UCHAR* buf, XP_U16* lenp )
{
XP_U16 strln = 1 + XP_SNPRINTF( buf, *lenp, "%s/%d",
comms->r.connName, hostID );
XP_ASSERT( *lenp >= strln );
*lenp = strln;
return XP_TRUE;
}
/* Get *my* "relayID", a combo of connname and host id */
XP_Bool
comms_getRelayID( const CommsCtxt* comms, XP_UCHAR* buf, XP_U16* lenp )
{
XP_Bool success = comms->r.connName[0] != 0;
if ( success ) {
XP_U16 len = sizeof( comms->r.connName ) + 16;
XP_UCHAR local[len];
XP_SNPRINTF( local, sizeof(local), "%s/%d",
comms->r.connName, comms->r.myHostID );
XP_U16 strln = XP_STRLEN(local);
success = *lenp >= strln;
if ( success ) {
*lenp = strln;
XP_MEMCPY( buf, local, strln );
XP_LOGF( "%s: keysize=%d", __func__, strln );
}
}
LOG_RETURNF( "%d", success );
return success;
XP_Bool result = haveRelayID( comms )
&& formatRelayID( comms, comms->r.myHostID, buf, lenp );
return result;
}
#endif
@ -1117,8 +1126,10 @@ sendMsg( CommsCtxt* comms, MsgQueueElem* elem )
if ( 0 ) {
#ifdef XWFEATURE_RELAY
} else if ( conType == COMMS_CONN_RELAY ) {
if ( comms->r.relayState >= COMMS_RELAYSTATE_CONNECTED ) {
XWHostID destID = getDestID( comms, channelNo );
if ( haveRelayID( comms ) && sendNoConn( comms, elem, destID ) ) {
/* do nothing */
} else if ( comms->r.relayState >= COMMS_RELAYSTATE_CONNECTED ) {
if ( send_via_relay( comms, XWRELAY_MSG_TORELAY, destID,
elem->msg, elem->len ) ){
result = elem->len;
@ -2121,6 +2132,23 @@ send_via_relay( CommsCtxt* comms, XWRELAY_Cmd cmd, XWHostID destID,
return success;
} /* send_via_relay */
static XP_Bool
sendNoConn( const CommsCtxt* comms, const MsgQueueElem* elem, XWHostID destID )
{
LOG_FUNC();
XP_Bool success = XP_FALSE;
XP_UCHAR relayID[64];
XP_U16 len = sizeof(relayID);
success = NULL != comms->procs.sendNoConn
&& formatRelayID( comms, destID, relayID, &len )
&& (*comms->procs.sendNoConn)( elem->msg, elem->len, relayID,
comms->procs.closure );
LOG_RETURNF( "%d", success );
return success;
}
/* Send a CONNECT message to the relay. This opens up a connection to the
* relay, and tells it our hostID and cookie so that it can associatate it
* with a socket. In the CONNECT_RESP we should get back what?

View file

@ -124,6 +124,8 @@ typedef void (*RelayConndProc)( void* closure, XP_UCHAR* const room,
XP_U16 devOrder, /* 1 means created room, etc. */
XP_Bool allHere, XP_U16 nMissing );
typedef void (*RelayErrorProc)( void* closure, XWREASON relayErr );
typedef XP_Bool (*RelayNoConnProc)( const XP_U8* buf, XP_U16 len,
const XP_UCHAR* relayID, void* closure );
#endif
typedef struct _TransportProcs {
@ -135,6 +137,7 @@ typedef struct _TransportProcs {
RelayStatusProc rstatus;
RelayConndProc rconnd;
RelayErrorProc rerror;
RelayNoConnProc sendNoConn;
#endif
void* closure;
} TransportProcs;