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);