tron@2186: /* $Id$ */ tron@2186: belugas@6527: /** @file fileio.h Declarations for Standard In/Out file operations */ belugas@6505: truelight@0: #ifndef FILEIO_H truelight@0: #define FILEIO_H truelight@0: rubidium@9703: #include rubidium@9703: #include rubidium@9724: #include "core/enum_type.hpp" rubidium@9628: glx@10776: void FioSeekTo(size_t pos, int mode); glx@10776: void FioSeekToFile(uint8 slot, size_t pos); glx@10776: size_t FioGetPos(); rubidium@9724: const char *FioGetFilename(uint8 slot); rubidium@6573: byte FioReadByte(); rubidium@6573: uint16 FioReadWord(); rubidium@6573: uint32 FioReadDword(); rubidium@6573: void FioCloseAll(); truelight@0: void FioOpenFile(int slot, const char *filename); rubidium@10513: void FioReadBlock(void *ptr, size_t size); truelight@0: void FioSkipBytes(int n); rubidium@9628: void FioCreateDirectory(const char *filename); rubidium@6624: rubidium@9628: /** rubidium@9628: * The different kinds of subdirectories OpenTTD uses rubidium@9628: */ rubidium@9628: enum Subdirectory { rubidium@9628: BASE_DIR, ///< Base directory for all subdirectories rubidium@9628: SAVE_DIR, ///< Base directory for all savegames rubidium@9628: AUTOSAVE_DIR, ///< Subdirectory of save for autosaves rubidium@9628: SCENARIO_DIR, ///< Base directory for all scenarios rubidium@9628: HEIGHTMAP_DIR, ///< Subdirectory of scenario for heightmaps rubidium@9628: GM_DIR, ///< Subdirectory for all music rubidium@9628: DATA_DIR, ///< Subdirectory for all data (GRFs, sample.cat, intro game) rubidium@9628: LANG_DIR, ///< Subdirectory for all translation files truebrain@10649: AI_DIR, ///< Subdirectory for all AI files rubidium@9628: NUM_SUBDIRS, ///< Number of subdirectories rubidium@9628: NO_DIRECTORY, ///< A path without any base directory rubidium@9628: }; rubidium@9628: rubidium@9628: /** rubidium@9628: * Types of searchpaths OpenTTD might use rubidium@9628: */ rubidium@9628: enum Searchpath { glx@9629: SP_FIRST_DIR, glx@9629: SP_WORKING_DIR = SP_FIRST_DIR, ///< Search in the working directory glx@9629: SP_PERSONAL_DIR, ///< Search in the personal directory glx@9629: SP_SHARED_DIR, ///< Search in the shared directory, like 'Shared Files' under Windows glx@9629: SP_BINARY_DIR, ///< Search in the directory where the binary resides glx@9629: SP_INSTALLATION_DIR, ///< Search in the installation directory glx@9629: SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle rubidium@9628: NUM_SEARCHPATHS rubidium@9628: }; rubidium@9628: rubidium@9628: DECLARE_POSTFIX_INCREMENT(Searchpath); rubidium@9628: rubidium@9628: /** rubidium@9628: * The searchpaths OpenTTD could search through. rubidium@9628: * At least one of the slots has to be filled with a path. rubidium@9628: * NULL paths tell that there is no such path for the rubidium@9628: * current operating system. rubidium@9628: */ rubidium@9628: extern const char *_searchpaths[NUM_SEARCHPATHS]; rubidium@9628: rubidium@9628: /** rubidium@9703: * The define of a TarList. rubidium@9703: */ rubidium@9703: struct TarListEntry { rubidium@9703: const char *filename; truebrain@10649: const char *dirname; rubidium@9703: }; rubidium@9703: struct TarFileListEntry { rubidium@9703: TarListEntry *tar; rubidium@10513: size_t size; rubidium@10513: size_t position; rubidium@9703: }; rubidium@9703: typedef std::map TarList; rubidium@9703: typedef std::map TarFileList; rubidium@9703: extern TarList _tar_list; rubidium@9703: extern TarFileList _tar_filelist; rubidium@9703: rubidium@9703: /** rubidium@9628: * Checks whether the given search path is a valid search path rubidium@9628: * @param sp the search path to check rubidium@9628: * @return true if the search path is valid rubidium@9628: */ rubidium@9628: static inline bool IsValidSearchPath(Searchpath sp) rubidium@9628: { rubidium@9628: return sp < NUM_SEARCHPATHS && _searchpaths[sp] != NULL; rubidium@9628: } rubidium@9628: rubidium@9628: /** Iterator for all the search paths */ glx@9629: #define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp)) rubidium@9703: #define FOR_ALL_TARS(tar) for (tar = _tar_filelist.begin(); tar != _tar_filelist.end(); tar++) rubidium@9628: rubidium@9703: typedef bool FioTarFileListCallback(const char *filename, int size, void *userdata); rubidium@9703: FILE *FioTarFileList(const char *tar, const char *mode, size_t *filesize, FioTarFileListCallback *callback, void *userdata); rubidium@9703: rubidium@9703: void FioFCloseFile(FILE *f); rubidium@9703: FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR, size_t *filesize = NULL); rubidium@9628: bool FioCheckFileExists(const char *filename, Subdirectory subdir = DATA_DIR); rubidium@9628: char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename); rubidium@9628: char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename); rubidium@9628: char *FioAppendDirectory(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir); rubidium@9628: char *FioGetDirectory(char *buf, size_t buflen, Subdirectory subdir); rubidium@9628: rubidium@9628: static inline const char *FioGetSubdirectory(Subdirectory subdir) rubidium@9628: { rubidium@9628: extern const char *_subdirs[NUM_SUBDIRS]; rubidium@9628: assert(subdir < NUM_SUBDIRS); rubidium@9628: return _subdirs[subdir]; rubidium@9628: } rubidium@6624: glx@9627: void SanitizeFilename(char *filename); rubidium@6624: void AppendPathSeparator(char *buf, size_t buflen); truelight@9476: void DeterminePaths(const char *exe); rubidium@9723: void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); rubidium@9723: bool FileExists(const char *filename); truebrain@10649: const char *FioTarFirstDir(const char *tarname); truelight@0: rubidium@9628: extern char *_personal_dir; ///< custom directory for personal settings, saves, newgrf, etc. rubidium@9628: truelight@0: #endif /* FILEIO_H */