tGraphical server now "works" with the new metaserver - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3088bfbc9025eba238f99baf604f946717a24ff3
 (DIR) parent d24cffd2fc68fbbff1b5bb82700e108b4f9d3e81
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun, 17 Jun 2001 22:50:55 +0000
       
       Graphical server now "works" with the new metaserver
       
       
       Diffstat:
         M src/dopewars.h                      |       1 +
         M src/message.c                       |      23 +++++++++++++++++------
         M src/message.h                       |       2 ++
         M src/serverside.c                    |      36 +++++++++++++++++++++++++++++++
       
       4 files changed, 56 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -287,6 +287,7 @@ typedef struct tagConnBuf {
        /* Handles reading and writing messages from/to a network connection */
        typedef struct tagNetworkBuffer {
           int fd;                /* File descriptor of the socket */
       +   gint InputTag;         /* Identifier for gdk_input routines */
           char Terminator;       /* Character that separates messages */
           char StripChar;        /* Character that should be removed from messages */
           ConnBuf ReadBuf;       /* New data, waiting for the application */
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -402,19 +402,31 @@ gboolean RespondToSelect(NetworkBuffer *NetBuf,fd_set *readfds,
           return DataWaiting;
        }
        
       +gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf,gboolean ReadReady,
       +                             gboolean WriteReady,gboolean *DoneOK) {
       +   gboolean ReadOK,WriteOK,ErrorOK;
       +   gboolean DataWaiting=FALSE;
       +
       +   *DoneOK=TRUE;
       +   if (!NetBuf || NetBuf->fd<=0) return DataWaiting;
       +
       +   DataWaiting=DoNetworkBufferStuff(NetBuf,ReadReady,WriteReady,FALSE,
       +                                    &ReadOK,&WriteOK,&ErrorOK);
       +
       +   *DoneOK=(WriteOK && ErrorOK && ReadOK);
       +   return DataWaiting;
       +}
       +
        gboolean PlayerHandleNetwork(Player *Play,gboolean ReadReady,
                                     gboolean WriteReady,gboolean *DoneOK) {
        /* Reads and writes player data from/to the network if it is ready.  */
        /* If any data were read, TRUE is returned. "DoneOK" is set TRUE     */
        /* unless a fatal error (i.e. the connection was broken) occurred.   */
       -   gboolean ReadOK,WriteOK,ErrorOK;
           gboolean DataWaiting=FALSE;
        
           *DoneOK=TRUE;
       -   if (!Play || Play->NetBuf.fd<=0) return DataWaiting;
       -
       -   DataWaiting=DoNetworkBufferStuff(&Play->NetBuf,ReadReady,WriteReady,FALSE,
       -                                    &ReadOK,&WriteOK,&ErrorOK);
       +   if (!Play) return DataWaiting;
       +   DataWaiting=NetBufHandleNetwork(&Play->NetBuf,ReadReady,WriteReady,DoneOK);
        
        /* If we've written out everything, then ask not to be notified of
           socket write-ready status in future */
       t@@ -423,7 +435,6 @@ gboolean PlayerHandleNetwork(Player *Play,gboolean ReadReady,
              (*SocketWriteTestPt)(Play,FALSE);
           }
        
       -   *DoneOK=(WriteOK && ErrorOK && ReadOK);
           return DataWaiting;
        }
        
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -130,6 +130,8 @@ void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf,fd_set *readfds,
        gboolean RespondToSelect(NetworkBuffer *NetBuf,fd_set *readfds,
                                 fd_set *writefds,fd_set *errorfds,
                                 gboolean *DoneOK);
       +gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf,gboolean ReadReady,
       +                             gboolean WriteReady,gboolean *DoneOK);
        gboolean PlayerHandleNetwork(Player *Play,gboolean ReadReady,
                                     gboolean WriteReady,gboolean *DoneOK);
        gboolean ReadPlayerDataFromWire(Player *Play);
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -82,6 +82,7 @@ static GScanner *Scanner;
        
        /* Data waiting to be sent to/read from the metaserver */
        NetworkBuffer MetaNetBuf;
       +gint MetaInputTag=0;
        
        /* Handle to the high score file */
        static FILE *ScoreFP=NULL;
       t@@ -110,6 +111,11 @@ static char HelpText[] = {
        int SendSingleHighScore(Player *Play,struct HISCORE *Score,
                                int index,char Bold);
        
       +#ifdef GUI_SERVER
       +static void GuiHandleMeta(gpointer data,gint socket,
       +                          GdkInputCondition condition);
       +#endif
       +
        void RegisterWithMetaServer(gboolean Up,gboolean SendData,
                                    gboolean RespectTimeout) {
        /* Sends server details to the metaserver, if specified. If "Up" is  */
       t@@ -152,6 +158,11 @@ void RegisterWithMetaServer(gboolean Up,gboolean SendData,
              dopelog(2,_("Waiting for metaserver connect to %s:%d..."),MetaName,
                      MetaPort);
           } else return;
       +#ifdef GUI_SERVER
       +   if (MetaInputTag) gdk_input_remove(MetaInputTag);
       +   MetaInputTag=gdk_input_add(MetaNetBuf.fd,GDK_INPUT_READ|GDK_INPUT_WRITE,
       +                              GuiHandleMeta,NULL);
       +#endif
           MetaPlayerPending=FALSE;
           text=g_string_new("");
           query=g_string_new("");
       t@@ -979,6 +990,31 @@ static void GuiDoCommand(GtkWidget *widget,gpointer data) {
           if (IsServerShutdown()) GuiQuitServer();
        }
        
       +void GuiHandleMeta(gpointer data,gint socket,GdkInputCondition condition) {
       +   gboolean DoneOK;
       +   gchar *buf;
       +   static gboolean ReadingHeaders=TRUE;
       +
       +   if (MetaNetBuf.WaitConnect) ReadingHeaders=TRUE;
       +   if (NetBufHandleNetwork(&MetaNetBuf,condition&GDK_INPUT_READ,
       +                           condition&GDK_INPUT_WRITE,&DoneOK)) {
       +      while ((buf=GetWaitingMessage(&MetaNetBuf))) {
       +         if (buf[0] || ReadingHeaders) {
       +            dopelog(ReadingHeaders ? 4 : 2,"MetaServer: %s",buf);
       +         }
       +         if (buf[0]==0) ReadingHeaders=FALSE;
       +         g_free(buf);
       +      }
       +   }
       +   if (!DoneOK) {
       +      dopelog(4,"MetaServer: (closed)\n");
       +      ShutdownNetworkBuffer(&MetaNetBuf);
       +      gdk_input_remove(MetaInputTag);
       +      MetaInputTag=0;
       +      if (IsServerShutdown()) GuiQuitServer();
       +   }
       +}
       +
        static void GuiHandleSocket(gpointer data,gint socket,
                                    GdkInputCondition condition) {
           Player *Play;