changeset 6086:d242fc975d65 draft

(svn r8821) -Regression: Unable to browse directories on *nix if the filesystem is not in UTF-8 charset and special characters are used. The string passed to opendir() which is UTF-8 was not parsed back to the filesystem format. Use a wrapper called ttd_opendir() instead of redefining opendir itself.
author Darkvater <Darkvater@openttd.org>
date Tue, 20 Feb 2007 00:09:23 +0000
parents 337f2016fc2b
children 637ddb9e6519
files src/fios.cpp src/fios.h src/newgrf_config.cpp src/strings.cpp src/win32.cpp
diffstat 5 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -224,7 +224,7 @@
 	}
 
 	/* Show subdirectories */
-	if (mode != SLD_NEW_GAME && (dir = opendir(_fios_path)) != NULL) {
+	if (mode != SLD_NEW_GAME && (dir = ttd_opendir(_fios_path)) != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
 
@@ -254,7 +254,7 @@
 	sort_start = _fios_count;
 
 	/* Show files */
-	dir = opendir(_fios_path);
+	dir = ttd_opendir(_fios_path);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			char fios_title[64];
--- a/src/fios.h
+++ b/src/fios.h
@@ -77,10 +77,21 @@
 	bool at_first_entry;
 };
 
-DIR *opendir(const char *path);
+DIR *opendir(const wchar_t *path);
 struct dirent *readdir(DIR *d);
 int closedir(DIR *d);
-
 #endif /* defined(WIN32) */
 
+/**
+ * A wrapper around opendir() which will convert the string from
+ * OPENTTD encoding to that of the filesystem. For all purposes this
+ * function behaves the same as the original opendir function
+ * @param path string to open directory of
+ * @return DIR pointer
+ */
+static inline DIR *ttd_opendir(const char *path)
+{
+	return opendir(OTTD2FS(path));
+}
+
 #endif /* FIOS_H */
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -274,7 +274,7 @@
 	struct dirent *dirent;
 	DIR *dir;
 
-	if ((dir = opendir(path)) == NULL) return 0;
+	if ((dir = ttd_opendir(path)) == NULL) return 0;
 
 	while ((dirent = readdir(dir)) != NULL) {
 		const char *d_name = FS2OTTD(dirent->d_name);
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -1164,7 +1164,7 @@
 	struct dirent *dirent;
 	int num = 0;
 
-	dir = opendir(_paths.lang_dir);
+	dir = ttd_opendir(_paths.lang_dir);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			const char *d_name = FS2OTTD(dirent->d_name);
--- a/src/win32.cpp
+++ b/src/win32.cpp
@@ -653,19 +653,19 @@
 	}
 }
 
-DIR *opendir(const char *path)
+DIR *opendir(const wchar_t *path)
 {
 	DIR *d;
 	UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box
-	DWORD fa = GetFileAttributesW(OTTD2FS(path));
+	DWORD fa = GetFileAttributesW(path);
 
 	if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) {
 		d = dir_calloc();
 		if (d != NULL) {
-			char search_path[MAX_PATH];
+			wchar_t search_path[MAX_PATH];
 			/* build search path for FindFirstFile */
-			snprintf(search_path, lengthof(search_path), "%s" PATHSEP "*", path);
-			d->hFind = FindFirstFileW(OTTD2FS(search_path), &d->fd);
+			_snwprintf_s(search_path, lengthof(search_path), L"%s\\*", path);
+			d->hFind = FindFirstFileW(search_path, &d->fd);
 
 			if (d->hFind != INVALID_HANDLE_VALUE ||
 					GetLastError() == ERROR_NO_MORE_FILES) { // the directory is empty