60 lines
1.8 KiB
C++
60 lines
1.8 KiB
C++
#include <File.hpp>
|
|
#include <algorithm>
|
|
#include <unarr.h>
|
|
|
|
namespace Util {
|
|
std::vector<u8> OpenROM(const std::string &filename, size_t &sizeAdjusted) {
|
|
auto buf = ircolib::read_file_binary(filename);
|
|
sizeAdjusted = ircolib::next_pow2(buf.size());
|
|
return buf;
|
|
}
|
|
|
|
std::vector<u8> OpenArchive(const std::string &path, size_t &sizeAdjusted) {
|
|
const auto stream = ar_open_file(fs::path(path).string().c_str());
|
|
|
|
if (!stream) {
|
|
ircolib::panic("Could not open archive! Are you sure it's an archive?");
|
|
}
|
|
|
|
ar_archive *archive = ar_open_zip_archive(stream, false);
|
|
|
|
if (!archive)
|
|
archive = ar_open_rar_archive(stream);
|
|
if (!archive)
|
|
archive = ar_open_7z_archive(stream);
|
|
if (!archive)
|
|
archive = ar_open_tar_archive(stream);
|
|
|
|
if (!archive) {
|
|
ar_close(stream);
|
|
ircolib::panic(
|
|
"Could not open archive! Are you sure it's a supported archive? (7z, zip, rar and tar are supported)");
|
|
}
|
|
|
|
std::vector<u8> buf{};
|
|
|
|
std::vector<std::string> rom_exts{".n64", ".z64", ".v64", ".N64", ".Z64", ".V64"};
|
|
|
|
while (ar_parse_entry(archive)) {
|
|
auto filename = ar_entry_get_name(archive);
|
|
auto extension = fs::path(filename).extension();
|
|
|
|
if (std::ranges::any_of(rom_exts, [&](const auto &x) { return extension == x; })) {
|
|
const auto size = ar_entry_get_size(archive);
|
|
sizeAdjusted = ircolib::next_pow2(size);
|
|
buf.resize(sizeAdjusted);
|
|
ar_entry_uncompress(archive, buf.data(), size);
|
|
break;
|
|
}
|
|
|
|
ar_close_archive(archive);
|
|
ar_close(stream);
|
|
ircolib::panic("Could not find any rom image in the archive!");
|
|
}
|
|
|
|
ar_close_archive(archive);
|
|
ar_close(stream);
|
|
return buf;
|
|
}
|
|
} // namespace Util
|