mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-26 04:32:35 +01:00
PARAM.SFO loader improvement
This commit is contained in:
parent
f8ea50caae
commit
c35da0085f
@ -189,7 +189,7 @@ error_code cellHddGameCheck(ppu_thread& ppu, u32 version, vm::cptr<char> dirName
|
|||||||
if (!new_data)
|
if (!new_data)
|
||||||
{
|
{
|
||||||
const auto cat = psf::get_string(sfo, "CATEGORY", "");
|
const auto cat = psf::get_string(sfo, "CATEGORY", "");
|
||||||
if (cat != "HG"sv && cat != "AM"sv && cat != "AP"sv && cat != "AT"sv && cat != "AV"sv && cat != "BV"sv && cat != "WT"sv)
|
if (!psf::is_cat_hdd(cat))
|
||||||
{
|
{
|
||||||
return { CELL_GAMEDATA_ERROR_BROKEN, fmt::format("CATEGORY='%s'", cat) };
|
return { CELL_GAMEDATA_ERROR_BROKEN, fmt::format("CATEGORY='%s'", cat) };
|
||||||
}
|
}
|
||||||
@ -594,7 +594,7 @@ error_code cellGameDataCheck(u32 type, vm::cptr<char> dirName, vm::ptr<CellGameC
|
|||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case CELL_GAME_GAMETYPE_HDD: return cat != "HG"sv && cat != "AM"sv && cat != "AP"sv && cat != "AT"sv && cat != "AV"sv && cat != "BV"sv && cat != "WT"sv;
|
case CELL_GAME_GAMETYPE_HDD: return !psf::is_cat_hdd(cat);
|
||||||
case CELL_GAME_GAMETYPE_GAMEDATA: return cat != "GD"sv;
|
case CELL_GAME_GAMETYPE_GAMEDATA: return cat != "GD"sv;
|
||||||
case CELL_GAME_GAMETYPE_DISC: return cat != "DG"sv;
|
case CELL_GAME_GAMETYPE_DISC: return cat != "DG"sv;
|
||||||
default: fmt::throw_exception("Unreachable");
|
default: fmt::throw_exception("Unreachable");
|
||||||
|
@ -116,10 +116,6 @@ namespace psf
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
entry::~entry()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string& entry::as_string() const
|
const std::string& entry::as_string() const
|
||||||
{
|
{
|
||||||
ensure(m_type == format::string || m_type == format::array);
|
ensure(m_type == format::string || m_type == format::array);
|
||||||
@ -246,6 +242,15 @@ namespace psf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto cat = get_string(pair.sfo, "CATEGORY", "");
|
||||||
|
constexpr std::string_view valid_cats[]{"GD", "DG", "HG", "AM", "AP", "AT", "AV", "BV", "WT", "HM", "CB", "SF", "2P", "2G", "1P", "PP", "MN", "PE", "2D", "SD", "MS"};
|
||||||
|
|
||||||
|
if (std::find(std::begin(valid_cats), std::end(valid_cats), cat) == std::end(valid_cats))
|
||||||
|
{
|
||||||
|
psf_log.error("Unknown category ('%s')", cat);
|
||||||
|
PSF_CHECK(false, corrupt);
|
||||||
|
}
|
||||||
|
|
||||||
#undef PSF_CHECK
|
#undef PSF_CHECK
|
||||||
return pair;
|
return pair;
|
||||||
}
|
}
|
||||||
@ -339,7 +344,7 @@ namespace psf
|
|||||||
return std::move(static_cast<fs::container_stream<std::vector<u8>>*>(stream.release().get())->obj);
|
return std::move(static_cast<fs::container_stream<std::vector<u8>>*>(stream.release().get())->obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string_view get_string(const registry& psf, const std::string& key, std::string_view def)
|
std::string_view get_string(const registry& psf, std::string_view key, std::string_view def)
|
||||||
{
|
{
|
||||||
const auto found = psf.find(key);
|
const auto found = psf.find(key);
|
||||||
|
|
||||||
@ -351,7 +356,7 @@ namespace psf
|
|||||||
return found->second.as_string();
|
return found->second.as_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 get_integer(const registry& psf, const std::string& key, u32 def)
|
u32 get_integer(const registry& psf, std::string_view key, u32 def)
|
||||||
{
|
{
|
||||||
const auto found = psf.find(key);
|
const auto found = psf.find(key);
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ namespace psf
|
|||||||
// Construct integer entry, assign the value
|
// Construct integer entry, assign the value
|
||||||
entry(u32 value);
|
entry(u32 value);
|
||||||
|
|
||||||
~entry();
|
~entry() = default;
|
||||||
|
|
||||||
const std::string& as_string() const;
|
const std::string& as_string() const;
|
||||||
u32 as_integer() const;
|
u32 as_integer() const;
|
||||||
@ -55,7 +55,7 @@ namespace psf
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Define PSF registry as a sorted map of entries:
|
// Define PSF registry as a sorted map of entries:
|
||||||
using registry = std::map<std::string, entry>;
|
using registry = std::map<std::string, entry, std::less<>>;
|
||||||
|
|
||||||
struct load_result_t
|
struct load_result_t
|
||||||
{
|
{
|
||||||
@ -77,13 +77,13 @@ namespace psf
|
|||||||
std::vector<u8> save_object(const registry&, std::vector<u8>&& init = std::vector<u8>{});
|
std::vector<u8> save_object(const registry&, std::vector<u8>&& init = std::vector<u8>{});
|
||||||
|
|
||||||
// Get string value or default value
|
// Get string value or default value
|
||||||
std::string_view get_string(const registry& psf, const std::string& key, std::string_view def = ""sv);
|
std::string_view get_string(const registry& psf, std::string_view key, std::string_view def = ""sv);
|
||||||
|
|
||||||
// Get integer value or default value
|
// Get integer value or default value
|
||||||
u32 get_integer(const registry& psf, const std::string& key, u32 def = 0);
|
u32 get_integer(const registry& psf, std::string_view key, u32 def = 0);
|
||||||
|
|
||||||
// Assign new entry
|
// Assign new entry
|
||||||
inline void assign(registry& psf, const std::string& key, entry&& _entry)
|
inline void assign(registry& psf, std::string_view key, entry&& _entry)
|
||||||
{
|
{
|
||||||
const auto found = psf.find(key);
|
const auto found = psf.find(key);
|
||||||
|
|
||||||
@ -108,4 +108,10 @@ namespace psf
|
|||||||
{
|
{
|
||||||
return {format::array, max_size, value};
|
return {format::array, max_size, value};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Checks if of HDD catgeory (assumes a valid category is being passed)
|
||||||
|
constexpr bool is_cat_hdd(std::string_view cat)
|
||||||
|
{
|
||||||
|
return cat.size() == 2u && cat[1] != 'D' && cat != "DG"sv && cat != "MS"sv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user