mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-11 08:48:06 +01:00
another snapshot: invites are received but don't create game correctly yet
This commit is contained in:
parent
5f97f8197c
commit
78d8c0398f
5 changed files with 186 additions and 30 deletions
|
@ -1472,8 +1472,11 @@ handle_invite_button( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals )
|
||||||
int port = atoi( portstr );
|
int port = atoi( portstr );
|
||||||
XP_LOGF( "need to invite using number %s and port %d", phone, port );
|
XP_LOGF( "need to invite using number %s and port %d", phone, port );
|
||||||
XP_ASSERT( 0 != port );
|
XP_ASSERT( 0 != port );
|
||||||
linux_sms2_invite( globals->cGlobals.params,
|
const CurGameInfo* gi = globals->cGlobals.gi;
|
||||||
globals->cGlobals.gi, phone, port );
|
gchar gameName[64];
|
||||||
|
snprintf( gameName, VSIZE(gameName), "Game %ld", gi->gameID );
|
||||||
|
linux_sms2_invite( globals->cGlobals.params, gi, gameName, 1,
|
||||||
|
phone, port );
|
||||||
}
|
}
|
||||||
g_free( phone );
|
g_free( phone );
|
||||||
g_free( portstr );
|
g_free( portstr );
|
||||||
|
@ -2496,12 +2499,16 @@ drop_msg_toggle( GtkWidget* toggle, GtkGameGlobals* globals )
|
||||||
/* } */
|
/* } */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
initGlobalsNoDraw( GtkGameGlobals* globals, LaunchParams* params )
|
initGlobalsNoDraw( GtkGameGlobals* globals, LaunchParams* params,
|
||||||
|
CurGameInfo* gi )
|
||||||
{
|
{
|
||||||
memset( globals, 0, sizeof(*globals) );
|
memset( globals, 0, sizeof(*globals) );
|
||||||
|
|
||||||
globals->cGlobals.gi = &globals->gi;
|
globals->cGlobals.gi = &globals->gi;
|
||||||
gi_copy( MPPARM(params->mpool) globals->cGlobals.gi, ¶ms->pgi );
|
if ( !gi ) {
|
||||||
|
gi = ¶ms->pgi;
|
||||||
|
}
|
||||||
|
gi_copy( MPPARM(params->mpool) globals->cGlobals.gi, gi );
|
||||||
|
|
||||||
globals->cGlobals.params = params;
|
globals->cGlobals.params = params;
|
||||||
globals->cGlobals.lastNTilesToUse = MAX_TRAY_TILES;
|
globals->cGlobals.lastNTilesToUse = MAX_TRAY_TILES;
|
||||||
|
@ -2538,7 +2545,7 @@ initGlobalsNoDraw( GtkGameGlobals* globals, LaunchParams* params )
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
initGlobals( GtkGameGlobals* globals, LaunchParams* params )
|
initGlobals( GtkGameGlobals* globals, LaunchParams* params, CurGameInfo* gi )
|
||||||
{
|
{
|
||||||
short width, height;
|
short width, height;
|
||||||
GtkWidget* window;
|
GtkWidget* window;
|
||||||
|
@ -2551,7 +2558,7 @@ initGlobals( GtkGameGlobals* globals, LaunchParams* params )
|
||||||
GtkWidget* dropCheck;
|
GtkWidget* dropCheck;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
initGlobalsNoDraw( globals, params );
|
initGlobalsNoDraw( globals, params, gi );
|
||||||
|
|
||||||
globals->window = window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
globals->window = window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||||
if ( !!params->fileName ) {
|
if ( !!params->fileName ) {
|
||||||
|
@ -2666,7 +2673,7 @@ loadGameNoDraw( GtkGameGlobals* globals, LaunchParams* params,
|
||||||
{
|
{
|
||||||
LOG_FUNC();
|
LOG_FUNC();
|
||||||
sqlite3* pDb = params->pDb;
|
sqlite3* pDb = params->pDb;
|
||||||
initGlobalsNoDraw( globals, params );
|
initGlobalsNoDraw( globals, params, NULL );
|
||||||
|
|
||||||
TransportProcs procs;
|
TransportProcs procs;
|
||||||
setTransportProcs( &procs, globals );
|
setTransportProcs( &procs, globals );
|
||||||
|
|
|
@ -168,7 +168,8 @@ typedef struct GtkGameGlobals {
|
||||||
#define GTK_BOTTOM_MARGIN GTK_TOP_MARGIN
|
#define GTK_BOTTOM_MARGIN GTK_TOP_MARGIN
|
||||||
#define GTK_RIGHT_MARGIN GTK_BOARD_LEFT_MARGIN
|
#define GTK_RIGHT_MARGIN GTK_BOARD_LEFT_MARGIN
|
||||||
|
|
||||||
void initGlobals( GtkGameGlobals* globals, LaunchParams* params );
|
void initGlobals( GtkGameGlobals* globals, LaunchParams* params,
|
||||||
|
CurGameInfo* gi );
|
||||||
void freeGlobals( GtkGameGlobals* globals );
|
void freeGlobals( GtkGameGlobals* globals );
|
||||||
XP_Bool makeNewGame( GtkGameGlobals* globals );
|
XP_Bool makeNewGame( GtkGameGlobals* globals );
|
||||||
XP_Bool loadGameNoDraw( GtkGameGlobals* globals, LaunchParams* params,
|
XP_Bool loadGameNoDraw( GtkGameGlobals* globals, LaunchParams* params,
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#ifdef PLATFORM_GTK
|
#ifdef PLATFORM_GTK
|
||||||
|
|
||||||
|
#include "strutils.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "gtkmain.h"
|
#include "gtkmain.h"
|
||||||
#include "gamesdb.h"
|
#include "gamesdb.h"
|
||||||
|
@ -211,7 +212,7 @@ handle_newgame_button( GtkWidget* XP_UNUSED(widget), void* closure )
|
||||||
XP_LOGF( "%s called", __func__ );
|
XP_LOGF( "%s called", __func__ );
|
||||||
GtkGameGlobals* globals = malloc( sizeof(*globals) );
|
GtkGameGlobals* globals = malloc( sizeof(*globals) );
|
||||||
apg->params->needsNewGame = XP_FALSE;
|
apg->params->needsNewGame = XP_FALSE;
|
||||||
initGlobals( globals, apg->params );
|
initGlobals( globals, apg->params, NULL );
|
||||||
if ( !makeNewGame( globals ) ) {
|
if ( !makeNewGame( globals ) ) {
|
||||||
freeGlobals( globals );
|
freeGlobals( globals );
|
||||||
} else {
|
} else {
|
||||||
|
@ -231,7 +232,7 @@ handle_open_button( GtkWidget* XP_UNUSED(widget), void* closure )
|
||||||
if ( -1 != selRow && !gameIsOpen( apg, selRow ) ) {
|
if ( -1 != selRow && !gameIsOpen( apg, selRow ) ) {
|
||||||
apg->params->needsNewGame = XP_FALSE;
|
apg->params->needsNewGame = XP_FALSE;
|
||||||
GtkGameGlobals* globals = malloc( sizeof(*globals) );
|
GtkGameGlobals* globals = malloc( sizeof(*globals) );
|
||||||
initGlobals( globals, apg->params );
|
initGlobals( globals, apg->params, NULL );
|
||||||
globals->cGlobals.pDb = apg->params->pDb;
|
globals->cGlobals.pDb = apg->params->pDb;
|
||||||
globals->cGlobals.selRow = selRow;
|
globals->cGlobals.selRow = selRow;
|
||||||
recordOpened( apg, globals );
|
recordOpened( apg, globals );
|
||||||
|
@ -506,6 +507,38 @@ gtkNoticeRcvd( void* closure )
|
||||||
(void)g_idle_add( requestMsgs, apg );
|
(void)g_idle_add( requestMsgs, apg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtkInviteReceived( void* closure, const XP_UCHAR* gameName, XP_U32 gameID,
|
||||||
|
XP_U16 dictLang, const XP_UCHAR* dictName, XP_U16 nPlayers,
|
||||||
|
XP_U16 nHere )
|
||||||
|
{
|
||||||
|
GtkAppGlobals* apg = (GtkAppGlobals*)closure;
|
||||||
|
LaunchParams* params = apg->params;
|
||||||
|
XP_LOGF( "%s(gameName=%s, dictName=%s, nPlayers=%d, nHere=%d)", __func__,
|
||||||
|
gameName, dictName, nPlayers, nHere );
|
||||||
|
|
||||||
|
CurGameInfo gi = {0};
|
||||||
|
gi_copy( MPPARM(params->mpool) &gi, ¶ms->pgi );
|
||||||
|
|
||||||
|
gi.gameID = gameID;
|
||||||
|
gi.nPlayers = nPlayers;
|
||||||
|
gi.dictLang = dictLang;
|
||||||
|
replaceStringIfDifferent( params->mpool, &gi.dictName, dictName );
|
||||||
|
|
||||||
|
GtkGameGlobals* globals = malloc( sizeof(*globals) );
|
||||||
|
params->needsNewGame = XP_FALSE;
|
||||||
|
initGlobals( globals, params, &gi );
|
||||||
|
|
||||||
|
/* if ( !makeNewGame( globals ) ) { */
|
||||||
|
/* } */
|
||||||
|
|
||||||
|
GtkWidget* gameWindow = globals->window;
|
||||||
|
globals->cGlobals.pDb = apg->params->pDb;
|
||||||
|
globals->cGlobals.selRow = -1;
|
||||||
|
recordOpened( apg, globals );
|
||||||
|
gtk_widget_show( gameWindow );
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
keepalive_timer( gpointer data )
|
keepalive_timer( gpointer data )
|
||||||
{
|
{
|
||||||
|
@ -619,8 +652,9 @@ gtkmain( LaunchParams* params )
|
||||||
if ( !!phone ) {
|
if ( !!phone ) {
|
||||||
SMSProcs smsProcs = {
|
SMSProcs smsProcs = {
|
||||||
.socketChanged = gtkSocketChanged,
|
.socketChanged = gtkSocketChanged,
|
||||||
|
.inviteReceived = gtkInviteReceived,
|
||||||
};
|
};
|
||||||
linux_sms2_init( params, &smsProcs, &apg );
|
linux_sms2_init( params, phone, &smsProcs, &apg );
|
||||||
} else {
|
} else {
|
||||||
XP_LOGF( "not activating SMS: I don't have a phone" );
|
XP_LOGF( "not activating SMS: I don't have a phone" );
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,11 +269,17 @@ typedef struct _LinSMS2Data {
|
||||||
XP_UCHAR myQueue[256];
|
XP_UCHAR myQueue[256];
|
||||||
XP_U16 port;
|
XP_U16 port;
|
||||||
FILE* lock;
|
FILE* lock;
|
||||||
|
XP_U16 count;
|
||||||
|
|
||||||
|
const gchar* myPhone;
|
||||||
const SMSProcs* procs;
|
const SMSProcs* procs;
|
||||||
void* procClosure;
|
void* procClosure;
|
||||||
} LinSMS2Data;
|
} LinSMS2Data;
|
||||||
|
|
||||||
|
typedef enum { NONE, INVITE, DATA, DEATH, ACK, } SMS_CMD;
|
||||||
|
#define SMS_PROTO_VERSION 0
|
||||||
|
|
||||||
|
|
||||||
static LinSMS2Data* getStorage( LaunchParams* params );
|
static LinSMS2Data* getStorage( LaunchParams* params );
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -294,10 +300,62 @@ unlock_queue2( LinSMS2Data* data )
|
||||||
data->lock = NULL;
|
data->lock = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XP_S16
|
||||||
|
linux_sms_send2( LaunchParams* params, const XP_U8* buf, XP_U16 buflen,
|
||||||
|
const XP_UCHAR* phone, XP_U16 port )
|
||||||
|
{
|
||||||
|
XP_S16 nSent = -1;
|
||||||
|
LinSMS2Data* data = getStorage( params );
|
||||||
|
XP_ASSERT( !!data );
|
||||||
|
char path[256];
|
||||||
|
|
||||||
|
lock_queue2( data );
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
gchar* str64 = g_base64_encode( buf, buflen );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
makeQueuePath( phone, port, path, sizeof(path) );
|
||||||
|
g_mkdir_with_parents( path, 0777 ); /* just in case */
|
||||||
|
int len = strlen( path );
|
||||||
|
snprintf( &path[len], sizeof(path)-len, "/%d", ++data->count );
|
||||||
|
|
||||||
|
XP_UCHAR sms[buflen*2]; /* more like (buflen*4/3) */
|
||||||
|
XP_U16 smslen = sizeof(sms);
|
||||||
|
binToSms( sms, &smslen, buf, buflen );
|
||||||
|
XP_ASSERT( smslen == strlen(sms) );
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
XP_ASSERT( !strcmp( str64, sms ) );
|
||||||
|
g_free( str64 );
|
||||||
|
|
||||||
|
XP_U8 testout[buflen];
|
||||||
|
XP_U16 lenout = sizeof( testout );
|
||||||
|
XP_ASSERT( smsToBin( testout, &lenout, sms, smslen ) );
|
||||||
|
XP_ASSERT( lenout == buflen );
|
||||||
|
XP_ASSERT( XP_MEMCMP( testout, buf, smslen ) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FILE* fp = fopen( path, "w" );
|
||||||
|
XP_ASSERT( !!fp );
|
||||||
|
(void)fprintf( fp, "from: %s\n", data->myPhone );
|
||||||
|
(void)fprintf( fp, "%s\n", sms );
|
||||||
|
fclose( fp );
|
||||||
|
sync();
|
||||||
|
|
||||||
|
unlock_queue2( data );
|
||||||
|
|
||||||
|
nSent = buflen;
|
||||||
|
|
||||||
|
return nSent;
|
||||||
|
} /* linux_sms_send */
|
||||||
|
|
||||||
static XP_S16
|
static XP_S16
|
||||||
decodeAndDelete2( LinSMS2Data* data, const gchar* name,
|
decodeAndDelete2( LinSMS2Data* data, const gchar* name,
|
||||||
XP_U8* buf, XP_U16 buflen )
|
XP_U8* buf, XP_U16 buflen )
|
||||||
{
|
{
|
||||||
|
LOG_FUNC();
|
||||||
XP_S16 nRead = -1;
|
XP_S16 nRead = -1;
|
||||||
char path[256];
|
char path[256];
|
||||||
snprintf( path, sizeof(path), "%s/%s", data->myQueue, name );
|
snprintf( path, sizeof(path), "%s/%s", data->myQueue, name );
|
||||||
|
@ -335,15 +393,52 @@ decodeAndDelete2( LinSMS2Data* data, const gchar* name,
|
||||||
|
|
||||||
g_free( contents );
|
g_free( contents );
|
||||||
|
|
||||||
|
LOG_RETURNF( "%d", nRead );
|
||||||
return nRead;
|
return nRead;
|
||||||
} /* decodeAndDelete */
|
} /* decodeAndDelete2 */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parseAndDispatch( LinSMS2Data* data, uint8_t* buf, int len )
|
dispatch_invite( LinSMS2Data* data, XP_U16 XP_UNUSED(proto), XWStreamCtxt* stream )
|
||||||
{
|
{
|
||||||
XP_USE( data );
|
XP_UCHAR gameName[256];
|
||||||
XP_USE( buf );
|
XP_UCHAR dictName[256];
|
||||||
XP_USE( len );
|
|
||||||
|
XP_U32 gameID = stream_getU32( stream );
|
||||||
|
stringFromStreamHere( stream, gameName, VSIZE(gameName) );
|
||||||
|
XP_U32 dictLang = stream_getU32( stream );
|
||||||
|
stringFromStreamHere( stream, dictName, VSIZE(dictName) );
|
||||||
|
XP_U8 nMissing = stream_getU8( stream );
|
||||||
|
XP_U8 nPlayers = stream_getU8( stream );
|
||||||
|
|
||||||
|
(*data->procs->inviteReceived)( data->procClosure, gameName, gameID,
|
||||||
|
dictLang, dictName, nPlayers, nMissing );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parseAndDispatch( LaunchParams* params, uint8_t* buf, int len )
|
||||||
|
{
|
||||||
|
LinSMS2Data* data = getStorage( params );
|
||||||
|
XWStreamCtxt* stream = mem_stream_make( MPPARM(params->mpool)
|
||||||
|
params->vtMgr,
|
||||||
|
NULL, CHANNEL_NONE, NULL );
|
||||||
|
stream_putBytes( stream, buf, len );
|
||||||
|
|
||||||
|
XP_U8 proto = stream_getU8( stream );
|
||||||
|
XP_ASSERT( SMS_PROTO_VERSION == proto );
|
||||||
|
XP_U8 cmd = stream_getU8( stream );
|
||||||
|
switch( cmd ) {
|
||||||
|
case INVITE:
|
||||||
|
dispatch_invite( data, proto, stream );
|
||||||
|
break;
|
||||||
|
case DATA:
|
||||||
|
case DEATH:
|
||||||
|
case ACK:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
XP_ASSERT( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
stream_destroy( stream );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -388,21 +483,22 @@ sms2_receive( void* closure, int socket )
|
||||||
unlock_queue2( data );
|
unlock_queue2( data );
|
||||||
|
|
||||||
if ( 0 < nRead ) {
|
if ( 0 < nRead ) {
|
||||||
parseAndDispatch( data, buf, nRead );
|
parseAndDispatch( params, buf, nRead );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
linux_sms2_init( LaunchParams* params, const SMSProcs* procs,
|
linux_sms2_init( LaunchParams* params, const gchar* phone,
|
||||||
void* procClosure )
|
const SMSProcs* procs, void* procClosure )
|
||||||
{
|
{
|
||||||
XP_ASSERT( !!params->connInfo.sms.phone );
|
XP_ASSERT( !!phone );
|
||||||
LinSMS2Data* data = getStorage( params );
|
LinSMS2Data* data = getStorage( params );
|
||||||
XP_ASSERT( !!data );
|
XP_ASSERT( !!data );
|
||||||
|
data->myPhone = phone;
|
||||||
data->procs = procs;
|
data->procs = procs;
|
||||||
data->procClosure = procClosure;
|
data->procClosure = procClosure;
|
||||||
|
|
||||||
makeQueuePath( params->connInfo.sms.phone, params->connInfo.sms.port,
|
makeQueuePath( phone, params->connInfo.sms.port,
|
||||||
data->myQueue, sizeof(data->myQueue) );
|
data->myQueue, sizeof(data->myQueue) );
|
||||||
data->port = params->connInfo.sms.port;
|
data->port = params->connInfo.sms.port;
|
||||||
|
|
||||||
|
@ -416,14 +512,27 @@ linux_sms2_init( LaunchParams* params, const SMSProcs* procs,
|
||||||
} /* linux_sms2_init */
|
} /* linux_sms2_init */
|
||||||
|
|
||||||
void
|
void
|
||||||
linux_sms2_invite( LaunchParams* params, const CurGameInfo* info, const gchar* phone,
|
linux_sms2_invite( LaunchParams* params, const CurGameInfo* gi,
|
||||||
|
const gchar* gameName, XP_U16 nMissing, const gchar* phone,
|
||||||
int port )
|
int port )
|
||||||
{
|
{
|
||||||
LOG_FUNC();
|
LOG_FUNC();
|
||||||
XP_USE( params );
|
XWStreamCtxt* stream;
|
||||||
XP_USE( info );
|
stream = mem_stream_make( MPPARM(params->mpool) params->vtMgr,
|
||||||
XP_USE( phone );
|
NULL, CHANNEL_NONE, NULL );
|
||||||
XP_USE( port );
|
stream_putU8( stream, SMS_PROTO_VERSION );
|
||||||
|
stream_putU8( stream, INVITE );
|
||||||
|
stream_putU32( stream, gi->gameID );
|
||||||
|
stringToStream( stream, gameName );
|
||||||
|
stream_putU32( stream, gi->dictLang );
|
||||||
|
stringToStream( stream, gi->dictName );
|
||||||
|
stream_putU8( stream, nMissing );
|
||||||
|
stream_putU8( stream, gi->nPlayers );
|
||||||
|
|
||||||
|
linux_sms_send2( params, stream_getPtr( stream ),
|
||||||
|
stream_getSize( stream ), phone, port );
|
||||||
|
|
||||||
|
stream_destroy( stream );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -33,6 +33,10 @@ XP_S16 linux_sms_receive( CommonGlobals* globals, int sock,
|
||||||
XP_U8* buf, XP_U16 buflen, CommsAddrRec* addr );
|
XP_U8* buf, XP_U16 buflen, CommsAddrRec* addr );
|
||||||
|
|
||||||
typedef struct _SMSProcs {
|
typedef struct _SMSProcs {
|
||||||
|
void (*inviteReceived)( void* closure, const XP_UCHAR* gameName,
|
||||||
|
XP_U32 gameID, XP_U16 dictLang,
|
||||||
|
const XP_UCHAR* dictName, XP_U16 nPlayers,
|
||||||
|
XP_U16 nHere );
|
||||||
void (*msgReceived)( void* closure, const XP_U8* buf, XP_U16 len );
|
void (*msgReceived)( void* closure, const XP_U8* buf, XP_U16 len );
|
||||||
void (*msgNoticeReceived)( void* closure );
|
void (*msgNoticeReceived)( void* closure );
|
||||||
void (*devIDReceived)( void* closure, const XP_UCHAR* devID,
|
void (*devIDReceived)( void* closure, const XP_UCHAR* devID,
|
||||||
|
@ -44,10 +48,11 @@ typedef struct _SMSProcs {
|
||||||
} SMSProcs;
|
} SMSProcs;
|
||||||
|
|
||||||
|
|
||||||
void linux_sms2_init( LaunchParams* params, const SMSProcs* procs,
|
void linux_sms2_init( LaunchParams* params, const gchar* phone,
|
||||||
void* procClosure );
|
const SMSProcs* procs, void* procClosure );
|
||||||
void linux_sms2_invite( LaunchParams* params, const CurGameInfo* info, const gchar* phone,
|
void linux_sms2_invite( LaunchParams* params, const CurGameInfo* info,
|
||||||
int port );
|
const gchar* gameName, XP_U16 nMissing,
|
||||||
|
const gchar* phone, int port );
|
||||||
void linux_sms2_cleanup( LaunchParams* params );
|
void linux_sms2_cleanup( LaunchParams* params );
|
||||||
|
|
||||||
#endif /* XWFEATURE_SMS */
|
#endif /* XWFEATURE_SMS */
|
||||||
|
|
Loading…
Add table
Reference in a new issue