tBasic support for converting network messages to and from UTF-8. - 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 144a831286a6d11ed7e534b991e412ad8bed983f
 (DIR) parent 203e30e33f384b52c4b4d60050b9722c6d876d90
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon,  5 Aug 2002 11:36:35 +0000
       
       Basic support for converting network messages to and from UTF-8.
       
       
       Diffstat:
         M src/dopewars.c                      |       4 +---
         M src/message.c                       |      39 +++++++++++++++++++++++++++++--
         M src/message.h                       |       1 +
         M src/winmain.c                       |       6 ++----
       
       4 files changed, 41 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -2750,9 +2750,7 @@ int main(int argc, char *argv[])
          } else if (WantConvert) {
            ConvertHighScoreFile();
          } else {
       -#ifdef NETWORKING
       -    StartNetworking();
       -#endif
       +    InitNetwork();
            if (Server) {
        #ifdef NETWORKING
        #ifdef GUI_SERVER
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -36,6 +36,8 @@
        #include <string.h>
        #include <stdlib.h>
        #include <glib.h>
       +
       +#include "convert.h"
        #include "dopewars.h"
        #include "message.h"
        #include "network.h"
       t@@ -100,6 +102,8 @@
        
        GSList *FirstClient;
        
       +static Converter *netconv = NULL;
       +
        void (*ClientMessageHandlerPt)(char *, Player *) = NULL;
        
        /* 
       t@@ -247,7 +251,11 @@ void InitAbilities(Player *Play)
          Play->Abil.Local[A_DRUGVALUE] = (DrugValue ? TRUE : FALSE);
          Play->Abil.Local[A_TSTRING] = TRUE;
          Play->Abil.Local[A_DONEFIGHT] = TRUE;
       +#ifdef HAVE_GLIB2
       +  Play->Abil.Local[A_UTF8] = TRUE;
       +#else
          Play->Abil.Local[A_UTF8] = FALSE;
       +#endif
        
          if (!Network) {
            for (i = 0; i < A_NUM; i++) {
       t@@ -310,6 +318,10 @@ void CombineAbilities(Player *Play)
          for (i = 0; i < A_NUM; i++) {
            Play->Abil.Shared[i] = (Play->Abil.Remote[i] && Play->Abil.Local[i]);
          }
       +
       +  if (HaveAbility(Play, A_UTF8)) {
       +    Conv_SetCodeset(netconv, "UTF-8");
       +  }
        }
        
        /* 
       t@@ -362,7 +374,16 @@ gboolean PlayerHandleNetwork(Player *Play, gboolean ReadReady,
        
        gchar *GetWaitingPlayerMessage(Player *Play)
        {
       -  return GetWaitingMessage(&Play->NetBuf);
       +  gchar *unconv, *conv;
       +
       +  unconv = GetWaitingMessage(&Play->NetBuf);
       +  if (unconv && Conv_Needed(netconv)) {
       +    conv = Conv_ToInternal(netconv, unconv, -1);
       +    g_free(unconv);
       +    return conv;
       +  } else {
       +    return unconv;
       +  }
        }
        
        gboolean ReadPlayerDataFromWire(Player *Play)
       t@@ -372,7 +393,13 @@ gboolean ReadPlayerDataFromWire(Player *Play)
        
        void QueuePlayerMessageForSend(Player *Play, gchar *data)
        {
       -  QueueMessageForSend(&Play->NetBuf, data);
       +  if (Conv_Needed(netconv)) {
       +    gchar *conv = Conv_ToExternal(netconv, data, -1);
       +    QueueMessageForSend(&Play->NetBuf, conv);
       +    g_free(conv);
       +  } else {
       +    QueueMessageForSend(&Play->NetBuf, data);
       +  }
        }
        
        gboolean WritePlayerDataToWire(Player *Play)
       t@@ -935,6 +962,14 @@ void SwitchToSinglePlayer(Player *Play)
          }
        }
        
       +void InitNetwork(void)
       +{
       +  netconv = Conv_New();
       +#ifdef NETWORKING
       +  StartNetworking();
       +#endif
       +}
       +
        /* 
         * Closes down the client side of the network connection. Clears the list
         * of client players (with the exception of "you", the player "Play"),
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -93,6 +93,7 @@ extern GSList *FirstClient;
        
        extern void (*ClientMessageHandlerPt) (char *, Player *);
        
       +void InitNetwork(void);
        void AddURLEnc(GString *str, gchar *unenc);
        void chomp(char *str);
        void BroadcastToClients(AICode AI, MsgCode Code, char *Data, Player *From,
 (DIR) diff --git a/src/winmain.c b/src/winmain.c
       t@@ -280,7 +280,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            WindowPrintEnd();
        #ifdef NETWORKING
          } else if (is_service) {
       -    StartNetworking();
       +    InitNetwork();
            Network = Server = TRUE;
            win32_init(hInstance, hPrevInstance, "mainicon");
            ServiceMain();
       t@@ -292,9 +292,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            ConvertHighScoreFile();
            WindowPrintEnd();
          } else {
       -#ifdef NETWORKING
       -    StartNetworking();
       -#endif
       +    InitNetwork();
            if (Server) {
        #ifdef NETWORKING
        #ifdef GUI_SERVER