tron@2186: /* $Id$ */ tron@2186: rubidium@10039: /** @file fileio_func.h Functions for Standard In/Out file operations */ belugas@6179: rubidium@10039: #ifndef FILEIO_FUNC_H rubidium@10039: #define FILEIO_FUNC_H truelight@0: rubidium@10039: #include "fileio_type.h" rubidium@6929: rubidium@9390: void FioSeekTo(size_t pos, int mode); rubidium@9390: void FioSeekToFile(uint8 slot, size_t pos); rubidium@9390: size_t FioGetPos(); peter1138@8374: const char *FioGetFilename(uint8 slot); rubidium@6247: byte FioReadByte(); rubidium@6247: uint16 FioReadWord(); rubidium@6247: uint32 FioReadDword(); rubidium@6247: void FioCloseAll(); truelight@0: void FioOpenFile(int slot, const char *filename); glx@9146: void FioReadBlock(void *ptr, size_t size); truelight@0: void FioSkipBytes(int n); rubidium@6929: void FioCreateDirectory(const char *filename); rubidium@6298: rubidium@6929: /** rubidium@6929: * The searchpaths OpenTTD could search through. rubidium@6929: * At least one of the slots has to be filled with a path. rubidium@6929: * NULL paths tell that there is no such path for the rubidium@6929: * current operating system. rubidium@6929: */ rubidium@6929: extern const char *_searchpaths[NUM_SEARCHPATHS]; rubidium@6929: rubidium@6929: /** rubidium@6929: * Checks whether the given search path is a valid search path rubidium@6929: * @param sp the search path to check rubidium@6929: * @return true if the search path is valid rubidium@6929: */ rubidium@6929: static inline bool IsValidSearchPath(Searchpath sp) rubidium@6929: { rubidium@6929: return sp < NUM_SEARCHPATHS && _searchpaths[sp] != NULL; rubidium@6929: } rubidium@6929: rubidium@6929: /** Iterator for all the search paths */ rubidium@6944: #define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp)) rubidium@6929: truelight@7592: void FioFCloseFile(FILE *f); truelight@7574: FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR, size_t *filesize = NULL); rubidium@6929: bool FioCheckFileExists(const char *filename, Subdirectory subdir = DATA_DIR); rubidium@6929: char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename); rubidium@6929: char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename); rubidium@6929: char *FioAppendDirectory(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir); rubidium@6929: char *FioGetDirectory(char *buf, size_t buflen, Subdirectory subdir); rubidium@6929: rubidium@6929: static inline const char *FioGetSubdirectory(Subdirectory subdir) rubidium@6929: { rubidium@6929: extern const char *_subdirs[NUM_SUBDIRS]; rubidium@6929: assert(subdir < NUM_SUBDIRS); rubidium@6929: return _subdirs[subdir]; rubidium@6929: } rubidium@6298: rubidium@6875: void SanitizeFilename(char *filename); rubidium@6298: void AppendPathSeparator(char *buf, size_t buflen); rubidium@6317: void DeterminePaths(const char *exe); rubidium@8131: void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); rubidium@8131: bool FileExists(const char *filename); truelight@0: rubidium@6929: extern char *_personal_dir; ///< custom directory for personal settings, saves, newgrf, etc. rubidium@6929: rubidium@10036: /** Helper for scanning for files with a given name */ rubidium@10036: class FileScanner rubidium@10036: { rubidium@10036: public: rubidium@10047: /** Destruct the proper one... */ rubidium@10047: virtual ~FileScanner() {} rubidium@10047: rubidium@10036: uint Scan(const char *extension, Subdirectory sd, bool tars = true); rubidium@10036: rubidium@10036: /** rubidium@10036: * Add a file with the given filename. rubidium@10036: * @param filename the full path to the file to read rubidium@10036: * @param basepath_length amount of characters to chop of before to get a rubidium@10036: * filename relative to the search path. rubidium@10036: * @return true if the file is added. rubidium@10036: */ rubidium@10036: virtual bool AddFile(const char *filename, size_t basepath_length) = 0; rubidium@10036: }; rubidium@10036: rubidium@10039: rubidium@10039: /* Implementation of opendir/readdir/closedir for Windows */ rubidium@10039: #if defined(WIN32) rubidium@10039: #include rubidium@10039: struct DIR; rubidium@10039: rubidium@10039: struct dirent { // XXX - only d_name implemented rubidium@10039: TCHAR *d_name; // name of found file rubidium@10039: /* little hack which will point to parent DIR struct which will rubidium@10039: * save us a call to GetFileAttributes if we want information rubidium@10039: * about the file (for example in function fio_bla) */ rubidium@10039: DIR *dir; rubidium@10039: }; rubidium@10039: rubidium@10039: struct DIR { rubidium@10039: HANDLE hFind; rubidium@10039: /* the dirent returned by readdir. rubidium@10039: * note: having only one global instance is not possible because rubidium@10039: * multiple independent opendir/readdir sequences must be supported. */ rubidium@10039: dirent ent; rubidium@10039: WIN32_FIND_DATA fd; rubidium@10039: /* since opendir calls FindFirstFile, we need a means of telling the rubidium@10039: * first call to readdir that we already have a file. rubidium@10039: * that's the case iff this is true */ rubidium@10039: bool at_first_entry; rubidium@10039: }; rubidium@10039: rubidium@10039: DIR *opendir(const TCHAR *path); rubidium@10039: struct dirent *readdir(DIR *d); rubidium@10039: int closedir(DIR *d); rubidium@10039: #else rubidium@10039: /* Use system-supplied opendir/readdir/closedir functions */ rubidium@10039: # include rubidium@10039: # include rubidium@10039: #endif /* defined(WIN32) */ rubidium@10039: rubidium@10039: /** rubidium@10039: * A wrapper around opendir() which will convert the string from rubidium@10039: * OPENTTD encoding to that of the filesystem. For all purposes this rubidium@10039: * function behaves the same as the original opendir function rubidium@10039: * @param path string to open directory of rubidium@10039: * @return DIR pointer rubidium@10039: */ rubidium@10039: static inline DIR *ttd_opendir(const char *path) rubidium@10039: { rubidium@10039: return opendir(OTTD2FS(path)); rubidium@10039: } rubidium@10039: rubidium@10039: #endif /* FILEIO_FUNC_H */