#ifndef INCLUDED_GAMELOADER_H #define INCLUDED_GAMELOADER_H #include "Util/NewConfig.h" #include "Pkgs/unzip.h" #include "Game.h" #include "ROMSet.h" #include #include class GameLoader { private: // Describes a file node in the game XML struct File { typedef std::shared_ptr ptr_t; uint32_t offset; std::string filename; uint32_t crc32; bool has_crc32; static ptr_t Create(const GameLoader &loader, const Util::Config::Node &file_node); bool Matches(const std::string &filename, uint32_t crc32) const; }; // Describes a region node in the game XML struct Region { typedef std::shared_ptr ptr_t; std::string region_name; size_t stride; size_t chunk_size; bool byte_swap; std::vector files; static ptr_t Create(const GameLoader &loader, const Util::Config::Node ®ion_node); }; std::map m_game_info_by_game; // ROMs not loaded here // Parsed XML typedef std::map RegionsByName_t; std::map m_regions_by_game; std::string m_xml_filename; // Zip file info struct ZippedFile { std::string filename; size_t uncompressed_size; uint32_t crc32; }; struct ZipArchive { std::string zipfilename; unzFile zf = nullptr; std::map files_by_crc; ~ZipArchive() { if (zf != nullptr) unzClose(zf); } }; bool LoadZipArchive(ZipArchive *zip, const std::string &zipfilename) const; bool LoadZippedFile(std::shared_ptr *buffer, size_t *file_size, const GameLoader::File::ptr_t &file, const ZipArchive &zip); const ZippedFile *LookupFile(const File::ptr_t &file, const ZipArchive &zip) const; static bool MissingAttrib(const GameLoader &loader, const Util::Config::Node &node, const std::string &attribute); bool ParseXML(const Util::Config::Node &xml); std::set IdentifyGamesFileBelongsTo(const std::string &filename, uint32_t crc32) const; std::vector IdentifyGamesInZipArchive(const ZipArchive &zip) const; bool ComputeRegionSize(uint32_t *region_size, const Region::ptr_t ®ion, const ZipArchive &zip) const; bool LoadRegion(ROM *buffer, const GameLoader::Region::ptr_t ®ion, const ZipArchive &zip); bool LoadROMs(ROMSet *rom_set, const std::string &game_name, const ZipArchive &zip); bool LoadDefinitionXML(const std::string &filename); public: GameLoader(const std::string &xml_file); bool Load(Game *game, ROMSet *rom_set, const std::string &zipfilename); const std::map &GetGames() const { return m_game_info_by_game; } }; #endif // INCLUDED_GAMELOADER_H