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()85 inline const char* Gme_Loader::warning()
86 {
87 	const char* s = warning_;
88 	warning_ = NULL;
89 	return s;
90 }
91 
92 #endif
93