// license:BSD-3-Clause // copyright-holders:Aaron Giles /*************************************************************************** fileio.h Core file I/O interface functions and definitions. ***************************************************************************/ #pragma once #ifndef __FILEIO_H__ #define __FILEIO_H__ #include "corefile.h" #include "hash.h" // some systems use macros for getc/putc rather than functions #ifdef getc #undef getc #endif //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // forward declarations struct zip_file_header; struct zip_file; struct _7z_file_header; struct _7z_file; // ======================> path_iterator // helper class for iterating over configured paths class path_iterator { public: // construction/destruction path_iterator(const char *searchpath); // getters bool next(astring &buffer, const char *name = NULL); // reset void reset() { m_current = m_base; m_index = 0; } private: // internal state const char * m_base; const char * m_current; int m_index; }; // ======================> file_enumerator // iterate over all files in all paths specified in the searchpath class file_enumerator { public: // construction/destruction file_enumerator(const char *searchpath); ~file_enumerator(); // iterator const osd_directory_entry *next(); private: // internal state path_iterator m_iterator; osd_directory * m_curdir; astring m_pathbuffer; //int m_buflen; }; // ======================> emu_file class emu_file { public: // file open/creation emu_file(UINT32 openflags); emu_file(const char *searchpath, UINT32 openflags); virtual ~emu_file(); // getters operator core_file *(); operator core_file &(); bool is_open() const { return (m_file != NULL); } const char *filename() const { return m_filename; } const char *fullpath() const { return m_fullpath; } UINT32 openflags() const { return m_openflags; } hash_collection &hashes(const char *types); // setters void remove_on_close() { m_remove_on_close = true; } void set_openflags(UINT32 openflags) { assert(m_file == NULL); m_openflags = openflags; } // open/close file_error open(const char *name); file_error open(const char *name1, const char *name2); file_error open(const char *name1, const char *name2, const char *name3); file_error open(const char *name1, const char *name2, const char *name3, const char *name4); file_error open(const char *name, UINT32 crc); file_error open(const char *name1, const char *name2, UINT32 crc); file_error open(const char *name1, const char *name2, const char *name3, UINT32 crc); file_error open(const char *name1, const char *name2, const char *name3, const char *name4, UINT32 crc); file_error open_next(); file_error open_ram(const void *data, UINT32 length); void close(); // control file_error compress(int compress); int seek(INT64 offset, int whence); UINT64 tell(); bool eof(); UINT64 size(); // reading UINT32 read(void *buffer, UINT32 length); int getc(); int ungetc(int c); char *gets(char *s, int n); // writing UINT32 write(const void *buffer, UINT32 length); int puts(const char *s); int vprintf(const char *fmt, va_list va); int printf(const char *fmt, ...) ATTR_PRINTF(2,3); private: bool compressed_file_ready(void); // internal helpers file_error attempt_zipped(); file_error load_zipped_file(); bool zip_filename_match(const zip_file_header &header, const astring &filename); bool zip_header_is_path(const zip_file_header &header); file_error attempt__7zped(); file_error load__7zped_file(); // internal state astring m_filename; // original filename provided astring m_fullpath; // full filename core_file * m_file; // core file pointer path_iterator m_iterator; // iterator for paths UINT32 m_crc; // iterator for paths UINT32 m_openflags; // flags we used for the open hash_collection m_hashes; // collection of hashes zip_file * m_zipfile; // ZIP file pointer dynamic_buffer m_zipdata; // ZIP file data UINT64 m_ziplength; // ZIP file length _7z_file * m__7zfile; // 7Z file pointer dynamic_buffer m__7zdata; // 7Z file data UINT64 m__7zlength; // 7Z file length bool m_remove_on_close; // flag: remove the file when closing }; #endif /* __FILEIO_H__ */