tron@2186: /* $Id$ */ tron@2186: belugas@6201: /** @file fileio.h Declarations for Standard In/Out file operations */ belugas@6179: truelight@0: #ifndef FILEIO_H truelight@0: #define FILEIO_H truelight@0: truelight@7592: #include truelight@7592: #include rubidium@8263: #include "core/enum_type.hpp" rubidium@6929: truelight@0: void FioSeekTo(uint32 pos, int mode); truelight@7570: void FioSeekToFile(uint8 slot, uint32 pos); rubidium@6247: uint32 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 different kinds of subdirectories OpenTTD uses rubidium@6929: */ rubidium@6929: enum Subdirectory { rubidium@6929: BASE_DIR, ///< Base directory for all subdirectories rubidium@6929: SAVE_DIR, ///< Base directory for all savegames rubidium@6929: AUTOSAVE_DIR, ///< Subdirectory of save for autosaves rubidium@6929: SCENARIO_DIR, ///< Base directory for all scenarios rubidium@6929: HEIGHTMAP_DIR, ///< Subdirectory of scenario for heightmaps rubidium@6929: GM_DIR, ///< Subdirectory for all music rubidium@6929: DATA_DIR, ///< Subdirectory for all data (GRFs, sample.cat, intro game) rubidium@6929: LANG_DIR, ///< Subdirectory for all translation files rubidium@6929: NUM_SUBDIRS, ///< Number of subdirectories rubidium@6935: NO_DIRECTORY, ///< A path without any base directory rubidium@6929: }; rubidium@6929: rubidium@6929: /** rubidium@6929: * Types of searchpaths OpenTTD might use rubidium@6929: */ rubidium@6929: enum Searchpath { rubidium@6944: SP_FIRST_DIR, rubidium@6944: SP_WORKING_DIR = SP_FIRST_DIR, ///< Search in the working directory rubidium@6944: SP_PERSONAL_DIR, ///< Search in the personal directory rubidium@6944: SP_SHARED_DIR, ///< Search in the shared directory, like 'Shared Files' under Windows rubidium@6944: SP_BINARY_DIR, ///< Search in the directory where the binary resides rubidium@6944: SP_INSTALLATION_DIR, ///< Search in the installation directory rubidium@6944: SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle rubidium@6929: NUM_SEARCHPATHS rubidium@6929: }; rubidium@6929: rubidium@6929: DECLARE_POSTFIX_INCREMENT(Searchpath); rubidium@6929: 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: /** truelight@7592: * The define of a TarList. truelight@7581: */ truelight@7592: struct TarListEntry { truelight@7592: const char *filename; truelight@7592: }; truelight@7592: struct TarFileListEntry { truelight@7592: TarListEntry *tar; glx@9146: size_t size; glx@9146: size_t position; truelight@7592: }; truelight@7592: typedef std::map TarList; truelight@7592: typedef std::map TarFileList; truelight@7592: extern TarList _tar_list; truelight@7592: extern TarFileList _tar_filelist; truelight@7581: truelight@7581: /** 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)) truelight@7592: #define FOR_ALL_TARS(tar) for (tar = _tar_filelist.begin(); tar != _tar_filelist.end(); tar++) truelight@7581: truelight@7581: typedef bool FioTarFileListCallback(const char *filename, int size, void *userdata); truelight@7581: FILE *FioTarFileList(const char *tar, const char *mode, size_t *filesize, FioTarFileListCallback *callback, void *userdata); 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: truelight@0: #endif /* FILEIO_H */