changeset 6240:1d99c3541c11 draft

(svn r9043) -Fix [FS#652]: the personal (.openttd) directories were hidden in the load/save directory listings (stepancheg).
author rubidium <rubidium@openttd.org>
date Tue, 06 Mar 2007 22:37:04 +0000
parents e1da44372e24
children 76e69c6edf9a
files src/fios.cpp src/os2.cpp src/unix.cpp src/win32.cpp
diffstat 4 files changed, 20 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -33,6 +33,7 @@
 /* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */
 extern bool FiosIsRoot(const char *path);
 extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+extern bool FiosIsHiddenFile(const struct dirent *ent);
 extern void FiosGetDrives(void);
 extern bool FiosGetDiskFreeSpace(const char *path, uint32 *tot);
 
@@ -227,7 +228,8 @@
 
 			/* found file must be directory, but not '.' or '..' */
 			if (FiosIsValidFile(_fios_path, dirent, &sb) && (sb.st_mode & S_IFDIR) &&
-				strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) {
+					(!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) &&
+					strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) {
 				fios = FiosAlloc();
 				fios->type = FIOS_TYPE_DIR;
 				fios->mtime = 0;
@@ -258,7 +260,7 @@
 			char *t;
 			ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
 
-			if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG)) continue;
+			if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG) || FiosIsHiddenFile(dirent)) continue;
 
 			/* File has no extension, skip it */
 			if ((t = strrchr(d_name, '.')) == NULL) continue;
--- a/src/os2.cpp
+++ b/src/os2.cpp
@@ -114,11 +114,15 @@
 	char filename[MAX_PATH];
 
 	snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name);
-	if (stat(filename, sb) != 0) return false;
+	return stat(filename, sb) == 0;
+}
 
-	return (ent->d_name[0] != '.'); // hidden file
+bool FiosIsHiddenFile(const struct dirent *ent)
+{
+	return ent->d_name[0] == '.';
 }
 
+
 static void ChangeWorkingDirectory(char *exe)
 {
 	char *s = strrchr(exe, PATHSEPCHAR);
--- a/src/unix.cpp
+++ b/src/unix.cpp
@@ -92,9 +92,12 @@
 #endif
 	snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name);
 
-	if (stat(filename, sb) != 0) return false;
+	return stat(filename, sb) == 0;
+}
 
-	return (ent->d_name[0] != '.'); // hidden file
+bool FiosIsHiddenFile(const struct dirent *ent)
+{
+	return ent->d_name[0] == '.';
 }
 
 #if defined(__BEOS__) || defined(__linux__)
--- a/src/win32.cpp
+++ b/src/win32.cpp
@@ -749,7 +749,6 @@
 	// hectonanoseconds between Windows and POSIX epoch
 	static const int64 posix_epoch_hns = 0x019DB1DED53E8000LL;
 	const WIN32_FIND_DATAW *fd = &ent->dir->fd;
-	if (fd->dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) return false;
 
 	sb->st_size  = ((uint64) fd->nFileSizeHigh << 32) + fd->nFileSizeLow;
 	/* UTC FILETIME to seconds-since-1970 UTC
@@ -763,6 +762,11 @@
 	return true;
 }
 
+bool FiosIsHiddenFile(const struct dirent *ent)
+{
+	return (ent->dir->fd.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) != 0;
+}
+
 bool FiosGetDiskFreeSpace(const char *path, uint32 *tot)
 {
 	UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS);  // disable 'no-disk' message box