diff --git a/xwords4/relay/dbmgr.cpp b/xwords4/relay/dbmgr.cpp index b0b46b9b2..677a587ea 100644 --- a/xwords4/relay/dbmgr.cpp +++ b/xwords4/relay/dbmgr.cpp @@ -225,6 +225,14 @@ DBMgr::ClearCIDs( void ) execSql( "UPDATE " TABLE_NAME " set cid = null" ); } +void +DBMgr::PublicRooms( int lang, int nPlayers, int* nNames, string& names ) +{ + *nNames = 2; + names.append( "hello world/2\n" ); + names.append( "Room 222/1\n" ); +} + void DBMgr::execSql( const char* query ) { diff --git a/xwords4/relay/dbmgr.h b/xwords4/relay/dbmgr.h index 621333ab4..d46d70612 100644 --- a/xwords4/relay/dbmgr.h +++ b/xwords4/relay/dbmgr.h @@ -21,9 +21,13 @@ #ifndef _DBMGR_H_ #define _DBMGR_H_ +#include + #include "xwrelay.h" #include +using namespace std; + class DBMgr { public: static DBMgr* Get(); @@ -46,6 +50,12 @@ class DBMgr { void AddCID( const char* connName, CookieID cid ); void ClearCID( const char* connName ); + /* Return list of roomName/playersStillWanted for open public games + matching this language and total game size. Will probably want to cache + lists locally and only update them every few seconds to avoid to many + queries.*/ + void PublicRooms( int lang, int nPlayers, int* nNames, string& names ); + private: DBMgr(); void execSql( const char* query ); /* no-results query */ diff --git a/xwords4/relay/xwrelay.cpp b/xwords4/relay/xwrelay.cpp index 894525a38..b9608d9d3 100644 --- a/xwords4/relay/xwrelay.cpp +++ b/xwords4/relay/xwrelay.cpp @@ -74,6 +74,7 @@ #include "timermgr.h" #include "permid.h" #include "lstnrmgr.h" +#include "dbmgr.h" static int s_nSpawns = 0; #define MAX_PROXY_LEN 64 @@ -645,18 +646,20 @@ handlePipe( int sig ) logf( XW_LOGINFO, "%s", __func__ ); } -bool +int read_packet( int sock, unsigned char* buf, int buflen ) { - bool result = false; + int result = -1; ssize_t nread; unsigned short msgLen; nread = recv( sock, &msgLen, sizeof(msgLen), MSG_WAITALL ); if ( nread == sizeof(msgLen) ) { msgLen = ntohs( msgLen ); - if ( msgLen >= buflen ) { + if ( msgLen <= buflen ) { nread = recv( sock, buf, msgLen, MSG_WAITALL ); - result = nread == msgLen; + if ( nread == msgLen ) { + result = nread; + } } } return result; @@ -677,7 +680,19 @@ handle_proxy_tproc( void* closure ) case PRX_NONE: break; case PRX_PUBROOMS: - logf( XW_LOGINFO, "%s: PRX_PUBROOMS", __func__ ); + if ( len >= 4 ) { + int lang = *bufp++; + int nPlayers = *bufp++; + string names; + int nNames; + DBMgr::Get()->PublicRooms( lang, nPlayers, &nNames, names ); + unsigned short netshort = htons( names.size() + + sizeof(unsigned short) ); + write( sock, &netshort, sizeof(netshort) ); + netshort = htons( (unsigned short)nNames ); + write( sock, &netshort, sizeof(netshort) ); + write( sock, names.c_str(), names.size() ); + } break; } }