URI:
       tStore log/score/config files in AppData - vaccinewars - be a doctor and try to vaccinate the world
  HTML git clone git://src.adamsgaard.dk/vaccinewars
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit f6cbc8315299ce88c405cd826d990cdb19a0c09a
   DIR parent 1024456d3fa3d80248ae1f8d99392eec154c4545
  HTML Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 30 Nov 2020 23:11:30 -0800
       
       Store log/score/config files in AppData
       
       Rather than trying to place them in the same directory
       as the dopewars binary on Windows, place log files, high score
       files, and per-user config files in the per-user application
       data directory. Closes #52.
       
       Diffstat:
         M ChangeLog                           |       4 ++++
         M doc/configfile.html                 |       3 ++-
         M doc/windows.html                    |      12 +++++++-----
         M src/dopewars.c                      |      12 +++++++++++-
         M src/winmain.c                       |      22 +++++++++++++++++++++-
       
       5 files changed, 45 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/ChangeLog b/ChangeLog
       t@@ -16,6 +16,10 @@ SVN
              https://curl.haxx.se/libcurl/c/libcurl-tutorial.html#Environment)
            - The default web browser on Linux has changed from 'mozilla' to
              'firefox'; on Mac the system-configured default browser is used.
       +    - On Windows the high score file and config file are now stored in the
       +      user application data directory (e.g.
       +      C:\Users\foo\AppData\Local\dopewars) rather than the same directory as
       +      the dopewars binary.
            - Add sound support on Mac.
            - Add 64-bit Windows binaries.
            - Fix for a DOS against the server using the REQUESTJET message type
   DIR diff --git a/doc/configfile.html b/doc/configfile.html
       t@@ -31,7 +31,8 @@ location settings <i>Port</i> and <i>Server</i> are still useful).</p>
        <li>The global configuration file (if present) <b>/etc/dopewars</b></li>
        <li>The user-specific file (if present) <b>~/.dopewars</b></li>
        <li><i>(Windows only)</i> The file <b>dopewars-config.txt</b> in the current
       -directory</li>
       +user's application data directory (e.g.
       +<tt>C:\Users\foo\AppData\Local\dopewars\</tt>)</li>
        <li>Options specified on the <a href="commandline.html">command line</a></li>
        </ol>
        
   DIR diff --git a/doc/windows.html b/doc/windows.html
       t@@ -37,17 +37,19 @@ details.</p>
        identical. Both will accept the same command line parameters and configuration
        options. However, since the standard Unix paths for the high score file and
        configuration files do not translate well to Windows, by default the program
       -will look for both the high score file <b>dopewars.sco</b> in the current
       -directory, and will read a global configuration file <b>dopewars-config.txt</b>
       -from the directory in which the dopewars binary was installed, followed by
       -a per-user configuration file of the same name in the working directory.</p>
       +will look for the high score file <b>dopewars.sco</b> in the current
       +user's application data directory (e.g. 
       +<tt>C:\Users\foo\AppData\Local\dopewars\</tt>), and will read a global
       +configuration file <b>dopewars-config.txt</b> from the directory in which the
       +dopewars binary was installed, followed by a per-user configuration file of
       +the same name in the AppData directory.</p>
        
        <hr />
        <ul>
        <li><a href="index.html">Main index</a></li>
        </ul>
        <p>
       -  Last update: <b>19-10-2002</b><br />
       +  Last update: <b>30-11-2020</b><br />
          Valid <a href="http://validator.w3.org/check/referer">XHTML 1.1</a>
        </p>
        </body>
   DIR diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -2337,6 +2337,10 @@ gchar *GetDocIndex(void)
          return file;
        }
        
       +#ifdef CYGWIN
       +extern gchar *appdata_path;
       +#endif
       +
        /*
         * Returns the pathname of the global (all users) configuration file,
         * as a dynamically-allocated string that must be later freed. On
       t@@ -2367,7 +2371,8 @@ gchar *GetGlobalConfigFile(void)
        gchar *GetLocalConfigFile(void)
        {
        #ifdef CYGWIN
       -  return g_strdup("dopewars-config.txt");
       +  return g_strdup_printf("%s/dopewars-config.txt",
       +                         appdata_path ? appdata_path : ".");
        #else
          gchar *home, *conf = NULL;
        
       t@@ -2771,7 +2776,12 @@ struct CMDLINE *GeneralStartup(int argc, char *argv[])
        {
          /* First, open the hard-coded high score file with possibly
           * elevated privileges */
       +#ifdef CYGWIN
       +  priv_hiscore = g_strdup_printf("%s/dopewars.sco",
       +                                 appdata_path ? appdata_path : DPSCOREDIR);
       +#else
          priv_hiscore = g_strdup_printf("%s/dopewars.sco", DPSCOREDIR);
       +#endif
          HiScoreFile = g_strdup(priv_hiscore);
          OpenHighScoreFile();
          DropPrivileges();
   DIR diff --git a/src/winmain.c b/src/winmain.c
       t@@ -26,9 +26,11 @@
        
        #ifdef CYGWIN
        
       +#include <direct.h>
        #include <winsock2.h>
        #include <windows.h>
        #include <commctrl.h>
       +#include <shlobj.h>
        #include <glib.h>
        #include <stdlib.h>
        
       t@@ -104,9 +106,25 @@ static void WindowPrintEnd()
        
        static FILE *LogFile = NULL;
        
       +gchar *appdata_path = NULL;
       +
       +static void GetAppDataPath()
       +{
       +  char shfolder[MAX_PATH];
       +
       +  if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA,
       +                                 NULL, 0, shfolder))) {
       +    appdata_path = g_strdup_printf("%s/dopewars", shfolder);
       +    mkdir(appdata_path);
       +  }
       +}
       +
        static void LogFileStart()
        {
       -  LogFile = fopen("dopewars-log.txt", "w");
       +  char *logfile = g_strdup_printf("%s/dopewars-log.txt",
       +                                  appdata_path ? appdata_path : ".");
       +  LogFile = fopen(logfile, "w");
       +  g_free(logfile);
        }
        
        static void LogFilePrintFunc(const gchar *string)
       t@@ -266,6 +284,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            g_free(modpath);
          }
        
       +  GetAppDataPath();
       +
          LogFileStart();
          g_set_print_handler(LogFilePrintFunc);