(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.

This commit is contained in:
Darkvater 2007-02-20 00:09:23 +00:00
parent 5b237758aa
commit 92bbe45dd0
5 changed files with 22 additions and 11 deletions

View File

@ -224,7 +224,7 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_
}
/* 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 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_
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];

View File

@ -77,10 +77,21 @@ struct DIR {
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 */

View File

@ -274,7 +274,7 @@ static uint ScanPath(const char *path)
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);

View File

@ -1164,7 +1164,7 @@ static int GetLanguageList(char **languages, int max)
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);

View File

@ -653,19 +653,19 @@ static inline void dir_free(DIR *d)
}
}
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