1 // Common interface for loading file data from various sources 2 3 // Game_Music_Emu $vers 4 #ifndef GME_LOADER_H 5 #define GME_LOADER_H 6 7 #include "blargg_common.h" 8 #include "Data_Reader.h" 9 10 class Gme_Loader { 11 public: 12 13 // Each loads game music data from a file and returns an error if 14 // file is wrong type or is seriously corrupt. Minor problems are 15 // reported using warning(). 16 17 // Loads from file on disk 18 blargg_err_t load_file( const char path [] ); 19 20 // Loads from custom data source (see Data_Reader.h) 21 blargg_err_t load( Data_Reader& ); 22 23 // Loads from file already read into memory. Object might keep pointer to 24 // data; if it does, you MUST NOT free it until you're done with the file. 25 blargg_err_t load_mem( void const* data, long size ); 26 27 // Most recent warning string, or NULL if none. Clears current warning after 28 // returning. 29 const char* warning(); 30 31 // Unloads file from memory 32 virtual void unload(); 33 34 virtual ~Gme_Loader(); 35 36 protected: 37 typedef BOOST::uint8_t byte; 38 39 // File data in memory, or 0 if data was loaded with load_() file_begin()40 byte const* file_begin() const { return file_begin_; } file_end()41 byte const* file_end() const { return file_end_; } file_size()42 int file_size() const { return (int) (file_end_ - file_begin_); } 43 44 // Sets warning string set_warning(const char s[])45 void set_warning( const char s [] ) { warning_ = s; } 46 47 // At least one must be overridden 48 virtual blargg_err_t load_( Data_Reader& ); // default loads then calls load_mem_() 49 virtual blargg_err_t load_mem_( byte const data [], int size ); // use data in memory 50 51 // Optionally overridden pre_load()52 virtual void pre_load() { unload(); } // called before load_()/load_mem_() post_load()53 virtual blargg_err_t post_load() { return blargg_ok; } // called after load_()/load_mem_() succeeds 54 55 private: 56 // noncopyable 57 Gme_Loader( const Gme_Loader& ); 58 Gme_Loader& operator = ( const Gme_Loader& ); 59 60 // Implementation 61 public: 62 Gme_Loader(); 63 BLARGG_DISABLE_NOTHROW 64 65 blargg_vector<byte> file_data; // used only when loading from file to load_mem_() 66 byte const* file_begin_; 67 byte const* file_end_; 68 const char* warning_; 69 70 blargg_err_t load_mem_wrapper( byte const [], int ); 71 blargg_err_t post_load_( blargg_err_t err ); 72 }; 73 74 // Files are read with GME_FILE_READER. Default supports gzip if zlib is available. 75 #ifndef GME_FILE_READER 76 #ifdef HAVE_ZLIB_H 77 #define GME_FILE_READER Gzip_File_Reader 78 #else 79 #define GME_FILE_READER Std_File_Reader 80 #endif 81 #elif defined (GME_FILE_READER_INCLUDE) 82 #include GME_FILE_READER_INCLUDE 83 #endif 84 warning()85inline const char* Gme_Loader::warning() 86 { 87 const char* s = warning_; 88 warning_ = NULL; 89 return s; 90 } 91 92 #endif 93