// license:BSD-3-Clause // copyright-holders:Aaron Giles /*************************************************************************** media_ident.h Media identify. ***************************************************************************/ #ifndef MAME_FRONTEND_MEDIA_IDENT_H #define MAME_FRONTEND_MEDIA_IDENT_H #include "drivenum.h" #include "romload.h" #include // media_identifier class identifies media by hash via a search in // the driver database class media_identifier { public: // construction/destruction media_identifier(emu_options &options); // getters unsigned total() const { return m_total; } unsigned matches() const { return m_matches; } unsigned nonroms() const { return m_nonroms; } // operations void reset() { m_total = m_matches = m_nonroms = 0; } void identify(const char *name); void identify_file(const char *name); void identify_data(const char *name, const uint8_t *data, std::size_t length); private: enum class file_flavour { RAW, JED, CHD }; class match_data { public: match_data( std::string &&shortname, std::string &&fullname, std::string &&romname, bool bad, bool device) : m_shortname(std::move(shortname)) , m_fullname(std::move(fullname)) , m_romname(std::move(romname)) , m_bad(bad) , m_device(device) { } match_data(match_data const &) = default; match_data(match_data &&) = default; match_data &operator=(match_data const &) = default; match_data &operator=(match_data &&) = default; std::string const &shortname() const { return m_shortname; } std::string const &fullname() const { return m_fullname; } std::string const &romname() const { return m_romname; } bool bad() const { return m_bad; } bool device() const { return m_device; } private: std::string m_shortname; std::string m_fullname; std::string m_romname; bool m_bad; bool m_device; }; class file_info { public: file_info( std::string &&name, std::uint64_t length, util::hash_collection &&hashes, file_flavour flavour) : m_name(std::move(name)) , m_length(length) , m_hashes(std::move(hashes)) , m_flavour(flavour) { } file_info(file_info const &) = default; file_info(file_info &&) = default; file_info &operator=(file_info const &) = default; file_info &operator=(file_info &&) = default; std::string const &name() const { return m_name; } std::uint64_t length() const { return m_length; } util::hash_collection const &hashes() const { return m_hashes; } file_flavour flavour() const { return m_flavour; } std::vector const &matches() const { return m_matches; } void match(device_t const &device, romload::file const &rom, util::hash_collection const &hashes); void match(std::string const &list, software_info const &software, rom_entry const &rom, util::hash_collection const &hashes); private: std::string m_name; std::uint64_t m_length; util::hash_collection m_hashes; file_flavour m_flavour; std::vector m_matches; }; void collect_files(std::vector &info, char const *path); void digest_file(std::vector &info, char const *path); void digest_data(std::vector &info, char const *name, void const *data, std::uint64_t length); void match_hashes(std::vector &info); void print_results(std::vector const &info); driver_enumerator m_drivlist; unsigned m_total; unsigned m_matches; unsigned m_nonroms; }; #endif /* MAME_FRONTEND_MEDIA_IDENT_H */