#ifndef EXTRACT_H #define EXTRACT_H #include #include #include #include #include // Values come from windows.h #ifndef IDYES #define IDYES 6 #endif #ifndef IDNO #define IDNO 7 #endif static constexpr size_t MB_BASE = 1024 * 1024; static constexpr size_t MB32 = 32 * MB_BASE; static constexpr size_t MB54 = 54 * MB_BASE; static constexpr size_t MB64 = 64 * MB_BASE; enum class RomSearchMode { Both = 0, Vanilla = 1, MQ = 2, }; class Extractor { std::unique_ptr mRomData = std::make_unique(MB64); std::string mCurrentRomPath; std::string mSearchPath; size_t mCurRomSize = 0; bool GetRomPathFromBox(); uint32_t GetRomVerCrc() const; size_t GetCurRomSize() const; bool ValidateAndFixRom(); bool ValidateRomSize() const; bool ValidateRom(bool skipCrcBox = false); bool ValidateNotCompressed() const; const char* GetZapdVerStr() const; void SetRomInfo(const std::string& path); void FilterRoms(std::vector& roms, RomSearchMode searchMode); void ShowSizeErrorBox() const; void ShowCrcErrorBox() const; void ShowCompressedErrorBox() const; int ShowRomPickBox(uint32_t verCrc) const; bool ManuallySearchForRom(); public: // TODO create some kind of abstraction for message boxes. static int ShowYesNoBox(const char* title, const char* text); static void ShowErrorBox(const char* title, const char* text); bool IsMasterQuest() const; bool ManuallySearchForRomMatchingType(RomSearchMode searchMode); void SetSearchPath(const std::string& path); void GetRoms(std::vector& roms); bool RunFileStandalone(std::string file); bool Run(std::string searchPath, RomSearchMode searchMode = RomSearchMode::Both); bool CallZapd(std::string installPath, std::string exportdir, std::atomic* extractCount, std::atomic* totalExtract); const char* GetZapdStr(); std::string Mkdtemp(); }; #endif