summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2009-03-14 00:26:03 +0000
committermichi_cc <michi_cc@openttd.org>2009-03-14 00:26:03 +0000
commit8ffe6906af91ba738edc72820e4f56629cf83976 (patch)
treea2388efbe8139d4c302b94a0077a5cbf17fafd0b
parent968a2c95f8f402ab17267edf698752d88d351e81 (diff)
downloadopenttd-8ffe6906af91ba738edc72820e4f56629cf83976.tar.xz
(svn r15707) -Fix (r15686): The config file was not updated on Windows because rename() can't replace existing files.
-rw-r--r--src/ini.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/ini.cpp b/src/ini.cpp
index fda62950f..9df83fdc1 100644
--- a/src/ini.cpp
+++ b/src/ini.cpp
@@ -5,6 +5,7 @@
#include "stdafx.h"
#include "core/alloc_func.hpp"
#include "core/math_func.hpp"
+#include "core/mem_func.hpp"
#include "debug.h"
#include "ini_type.h"
#include "string_func.h"
@@ -15,6 +16,9 @@
# include <unistd.h>
#endif
+#ifdef WIN32
+# include <shellapi.h>
+#endif
IniItem::IniItem(IniGroup *parent, const char *name, size_t len) : next(NULL), value(NULL), comment(NULL)
{
@@ -304,6 +308,28 @@ bool IniFile::SaveToDisk(const char *filename)
fclose(f);
#endif
+#if defined(WIN32) || defined(WIN64)
+ /* Allocate space for one more \0 character. */
+ TCHAR tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1];
+ _tcsncpy(tfilename, OTTD2FS(filename), MAX_PATH);
+ _tcsncpy(tfile_new, OTTD2FS(file_new), MAX_PATH);
+ /* SHFileOperation wants a double '\0' terminated string. */
+ tfilename[MAX_PATH - 1] = '\0';
+ tfile_new[MAX_PATH - 1] = '\0';
+ tfilename[_tcslen(tfilename) + 1] = '\0';
+ tfile_new[_tcslen(tfile_new) + 1] = '\0';
+
+ /* Rename file without any user confirmation. */
+ SHFILEOPSTRUCT shfopt;
+ MemSetT(&shfopt, 0);
+ shfopt.wFunc = FO_MOVE;
+ shfopt.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SILENT;
+ shfopt.pFrom = tfile_new;
+ shfopt.pTo = tfilename;
+ SHFileOperation(&shfopt);
+#else
rename(file_new, filename);
+#endif
+
return true;
}