filesystem: De-globalize registered_cache_union
We can just return a new instance of this when it's requested. This only ever holds pointers to the existing registed caches, so it's not a large object. Plus, this also gets rid of the need to keep around a separate member function just to properly clear out the union. Gets rid of one of five globals in the filesystem code.
This commit is contained in:
parent
e88cdcc912
commit
db4523f1ec
|
@ -794,7 +794,7 @@ void KeyManager::DeriveBase() {
|
||||||
|
|
||||||
void KeyManager::DeriveETicket(PartitionDataManager& data) {
|
void KeyManager::DeriveETicket(PartitionDataManager& data) {
|
||||||
// ETicket keys
|
// ETicket keys
|
||||||
const auto es = Service::FileSystem::GetUnionContents()->GetEntry(
|
const auto es = Service::FileSystem::GetUnionContents().GetEntry(
|
||||||
0x0100000000000033, FileSys::ContentRecordType::Program);
|
0x0100000000000033, FileSys::ContentRecordType::Program);
|
||||||
|
|
||||||
if (es == nullptr)
|
if (es == nullptr)
|
||||||
|
|
|
@ -75,12 +75,12 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
|
||||||
|
|
||||||
// Game Updates
|
// Game Updates
|
||||||
const auto update_tid = GetUpdateTitleID(title_id);
|
const auto update_tid = GetUpdateTitleID(title_id);
|
||||||
const auto update = installed->GetEntry(update_tid, ContentRecordType::Program);
|
const auto update = installed.GetEntry(update_tid, ContentRecordType::Program);
|
||||||
|
|
||||||
if (update != nullptr && update->GetExeFS() != nullptr &&
|
if (update != nullptr && update->GetExeFS() != nullptr &&
|
||||||
update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {
|
update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {
|
||||||
LOG_INFO(Loader, " ExeFS: Update ({}) applied successfully",
|
LOG_INFO(Loader, " ExeFS: Update ({}) applied successfully",
|
||||||
FormatTitleVersion(installed->GetEntryVersion(update_tid).value_or(0)));
|
FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0)));
|
||||||
exefs = update->GetExeFS();
|
exefs = update->GetExeFS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,13 +281,13 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content
|
||||||
|
|
||||||
// Game Updates
|
// Game Updates
|
||||||
const auto update_tid = GetUpdateTitleID(title_id);
|
const auto update_tid = GetUpdateTitleID(title_id);
|
||||||
const auto update = installed->GetEntryRaw(update_tid, type);
|
const auto update = installed.GetEntryRaw(update_tid, type);
|
||||||
if (update != nullptr) {
|
if (update != nullptr) {
|
||||||
const auto new_nca = std::make_shared<NCA>(update, romfs, ivfc_offset);
|
const auto new_nca = std::make_shared<NCA>(update, romfs, ivfc_offset);
|
||||||
if (new_nca->GetStatus() == Loader::ResultStatus::Success &&
|
if (new_nca->GetStatus() == Loader::ResultStatus::Success &&
|
||||||
new_nca->GetRomFS() != nullptr) {
|
new_nca->GetRomFS() != nullptr) {
|
||||||
LOG_INFO(Loader, " RomFS: Update ({}) applied successfully",
|
LOG_INFO(Loader, " RomFS: Update ({}) applied successfully",
|
||||||
FormatTitleVersion(installed->GetEntryVersion(update_tid).value_or(0)));
|
FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0)));
|
||||||
romfs = new_nca->GetRomFS();
|
romfs = new_nca->GetRomFS();
|
||||||
}
|
}
|
||||||
} else if (update_raw != nullptr) {
|
} else if (update_raw != nullptr) {
|
||||||
|
@ -329,8 +329,8 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
|
||||||
if (nacp != nullptr) {
|
if (nacp != nullptr) {
|
||||||
out.insert_or_assign("Update", nacp->GetVersionString());
|
out.insert_or_assign("Update", nacp->GetVersionString());
|
||||||
} else {
|
} else {
|
||||||
if (installed->HasEntry(update_tid, ContentRecordType::Program)) {
|
if (installed.HasEntry(update_tid, ContentRecordType::Program)) {
|
||||||
const auto meta_ver = installed->GetEntryVersion(update_tid);
|
const auto meta_ver = installed.GetEntryVersion(update_tid);
|
||||||
if (meta_ver.value_or(0) == 0) {
|
if (meta_ver.value_or(0) == 0) {
|
||||||
out.insert_or_assign("Update", "");
|
out.insert_or_assign("Update", "");
|
||||||
} else {
|
} else {
|
||||||
|
@ -383,14 +383,13 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
|
||||||
}
|
}
|
||||||
|
|
||||||
// DLC
|
// DLC
|
||||||
const auto dlc_entries = installed->ListEntriesFilter(TitleType::AOC, ContentRecordType::Data);
|
const auto dlc_entries = installed.ListEntriesFilter(TitleType::AOC, ContentRecordType::Data);
|
||||||
std::vector<RegisteredCacheEntry> dlc_match;
|
std::vector<RegisteredCacheEntry> dlc_match;
|
||||||
dlc_match.reserve(dlc_entries.size());
|
dlc_match.reserve(dlc_entries.size());
|
||||||
std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match),
|
std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match),
|
||||||
[this, &installed](const RegisteredCacheEntry& entry) {
|
[this, &installed](const RegisteredCacheEntry& entry) {
|
||||||
return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id &&
|
return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id &&
|
||||||
installed->GetEntry(entry)->GetStatus() ==
|
installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success;
|
||||||
Loader::ResultStatus::Success;
|
|
||||||
});
|
});
|
||||||
if (!dlc_match.empty()) {
|
if (!dlc_match.empty()) {
|
||||||
// Ensure sorted so DLC IDs show in order.
|
// Ensure sorted so DLC IDs show in order.
|
||||||
|
@ -411,7 +410,7 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
|
||||||
std::pair<std::unique_ptr<NACP>, VirtualFile> PatchManager::GetControlMetadata() const {
|
std::pair<std::unique_ptr<NACP>, VirtualFile> PatchManager::GetControlMetadata() const {
|
||||||
const auto installed{Service::FileSystem::GetUnionContents()};
|
const auto installed{Service::FileSystem::GetUnionContents()};
|
||||||
|
|
||||||
const auto base_control_nca = installed->GetEntry(title_id, ContentRecordType::Control);
|
const auto base_control_nca = installed.GetEntry(title_id, ContentRecordType::Control);
|
||||||
if (base_control_nca == nullptr)
|
if (base_control_nca == nullptr)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, Conte
|
||||||
|
|
||||||
switch (storage) {
|
switch (storage) {
|
||||||
case StorageId::None:
|
case StorageId::None:
|
||||||
res = Service::FileSystem::GetUnionContents()->GetEntry(title_id, type);
|
res = Service::FileSystem::GetUnionContents().GetEntry(title_id, type);
|
||||||
break;
|
break;
|
||||||
case StorageId::NandSystem:
|
case StorageId::NandSystem:
|
||||||
res = Service::FileSystem::GetSystemNANDContents()->GetEntry(title_id, type);
|
res = Service::FileSystem::GetSystemNANDContents()->GetEntry(title_id, type);
|
||||||
|
|
|
@ -32,14 +32,14 @@ static std::vector<u64> AccumulateAOCTitleIDs() {
|
||||||
std::vector<u64> add_on_content;
|
std::vector<u64> add_on_content;
|
||||||
const auto rcu = FileSystem::GetUnionContents();
|
const auto rcu = FileSystem::GetUnionContents();
|
||||||
const auto list =
|
const auto list =
|
||||||
rcu->ListEntriesFilter(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);
|
rcu.ListEntriesFilter(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);
|
||||||
std::transform(list.begin(), list.end(), std::back_inserter(add_on_content),
|
std::transform(list.begin(), list.end(), std::back_inserter(add_on_content),
|
||||||
[](const FileSys::RegisteredCacheEntry& rce) { return rce.title_id; });
|
[](const FileSys::RegisteredCacheEntry& rce) { return rce.title_id; });
|
||||||
add_on_content.erase(
|
add_on_content.erase(
|
||||||
std::remove_if(
|
std::remove_if(
|
||||||
add_on_content.begin(), add_on_content.end(),
|
add_on_content.begin(), add_on_content.end(),
|
||||||
[&rcu](u64 tid) {
|
[&rcu](u64 tid) {
|
||||||
return rcu->GetEntry(tid, FileSys::ContentRecordType::Data)->GetStatus() !=
|
return rcu.GetEntry(tid, FileSys::ContentRecordType::Data)->GetStatus() !=
|
||||||
Loader::ResultStatus::Success;
|
Loader::ResultStatus::Success;
|
||||||
}),
|
}),
|
||||||
add_on_content.end());
|
add_on_content.end());
|
||||||
|
|
|
@ -329,20 +329,9 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
|
||||||
return sdmc_factory->Open();
|
return sdmc_factory->Open();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<FileSys::RegisteredCacheUnion> registered_cache_union;
|
FileSys::RegisteredCacheUnion GetUnionContents() {
|
||||||
|
return FileSys::RegisteredCacheUnion{
|
||||||
std::shared_ptr<FileSys::RegisteredCacheUnion> GetUnionContents() {
|
{GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()}};
|
||||||
if (registered_cache_union == nullptr) {
|
|
||||||
registered_cache_union =
|
|
||||||
std::make_shared<FileSys::RegisteredCacheUnion>(std::vector<FileSys::RegisteredCache*>{
|
|
||||||
GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()});
|
|
||||||
}
|
|
||||||
|
|
||||||
return registered_cache_union;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClearUnionContents() {
|
|
||||||
registered_cache_union = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FileSys::RegisteredCache* GetSystemNANDContents() {
|
FileSys::RegisteredCache* GetSystemNANDContents() {
|
||||||
|
@ -395,7 +384,6 @@ void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) {
|
||||||
bis_factory = nullptr;
|
bis_factory = nullptr;
|
||||||
save_data_factory = nullptr;
|
save_data_factory = nullptr;
|
||||||
sdmc_factory = nullptr;
|
sdmc_factory = nullptr;
|
||||||
ClearUnionContents();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto nand_directory = vfs.OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir),
|
auto nand_directory = vfs.OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir),
|
||||||
|
|
|
@ -48,8 +48,7 @@ ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space,
|
||||||
ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space);
|
ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space);
|
||||||
ResultVal<FileSys::VirtualDir> OpenSDMC();
|
ResultVal<FileSys::VirtualDir> OpenSDMC();
|
||||||
|
|
||||||
std::shared_ptr<FileSys::RegisteredCacheUnion> GetUnionContents();
|
FileSys::RegisteredCacheUnion GetUnionContents();
|
||||||
void ClearUnionContents();
|
|
||||||
|
|
||||||
FileSys::RegisteredCache* GetSystemNANDContents();
|
FileSys::RegisteredCache* GetSystemNANDContents();
|
||||||
FileSys::RegisteredCache* GetUserNANDContents();
|
FileSys::RegisteredCache* GetUserNANDContents();
|
||||||
|
|
|
@ -97,11 +97,11 @@ GameListWorker::~GameListWorker() = default;
|
||||||
|
|
||||||
void GameListWorker::AddInstalledTitlesToGameList() {
|
void GameListWorker::AddInstalledTitlesToGameList() {
|
||||||
const auto cache = Service::FileSystem::GetUnionContents();
|
const auto cache = Service::FileSystem::GetUnionContents();
|
||||||
const auto installed_games = cache->ListEntriesFilter(FileSys::TitleType::Application,
|
const auto installed_games = cache.ListEntriesFilter(FileSys::TitleType::Application,
|
||||||
FileSys::ContentRecordType::Program);
|
FileSys::ContentRecordType::Program);
|
||||||
|
|
||||||
for (const auto& game : installed_games) {
|
for (const auto& game : installed_games) {
|
||||||
const auto file = cache->GetEntryUnparsed(game);
|
const auto file = cache.GetEntryUnparsed(game);
|
||||||
std::unique_ptr<Loader::AppLoader> loader = Loader::GetLoader(file);
|
std::unique_ptr<Loader::AppLoader> loader = Loader::GetLoader(file);
|
||||||
if (!loader)
|
if (!loader)
|
||||||
continue;
|
continue;
|
||||||
|
@ -112,7 +112,7 @@ void GameListWorker::AddInstalledTitlesToGameList() {
|
||||||
loader->ReadProgramId(program_id);
|
loader->ReadProgramId(program_id);
|
||||||
|
|
||||||
const FileSys::PatchManager patch{program_id};
|
const FileSys::PatchManager patch{program_id};
|
||||||
const auto control = cache->GetEntry(game.title_id, FileSys::ContentRecordType::Control);
|
const auto control = cache.GetEntry(game.title_id, FileSys::ContentRecordType::Control);
|
||||||
if (control != nullptr)
|
if (control != nullptr)
|
||||||
GetMetadataFromControlNCA(patch, *control, icon, name);
|
GetMetadataFromControlNCA(patch, *control, icon, name);
|
||||||
|
|
||||||
|
@ -141,11 +141,11 @@ void GameListWorker::AddInstalledTitlesToGameList() {
|
||||||
emit EntryReady(list);
|
emit EntryReady(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto control_data = cache->ListEntriesFilter(FileSys::TitleType::Application,
|
const auto control_data = cache.ListEntriesFilter(FileSys::TitleType::Application,
|
||||||
FileSys::ContentRecordType::Control);
|
FileSys::ContentRecordType::Control);
|
||||||
|
|
||||||
for (const auto& entry : control_data) {
|
for (const auto& entry : control_data) {
|
||||||
auto nca = cache->GetEntry(entry);
|
auto nca = cache.GetEntry(entry);
|
||||||
if (nca != nullptr) {
|
if (nca != nullptr) {
|
||||||
nca_control_map.insert_or_assign(entry.title_id, std::move(nca));
|
nca_control_map.insert_or_assign(entry.title_id, std::move(nca));
|
||||||
}
|
}
|
||||||
|
|
|
@ -905,7 +905,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto installed = Service::FileSystem::GetUnionContents();
|
const auto installed = Service::FileSystem::GetUnionContents();
|
||||||
auto romfs_title_id = SelectRomFSDumpTarget(*installed, program_id);
|
const auto romfs_title_id = SelectRomFSDumpTarget(installed, program_id);
|
||||||
|
|
||||||
if (!romfs_title_id) {
|
if (!romfs_title_id) {
|
||||||
failed();
|
failed();
|
||||||
|
@ -920,7 +920,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa
|
||||||
if (*romfs_title_id == program_id) {
|
if (*romfs_title_id == program_id) {
|
||||||
romfs = file;
|
romfs = file;
|
||||||
} else {
|
} else {
|
||||||
romfs = installed->GetEntry(*romfs_title_id, FileSys::ContentRecordType::Data)->GetRomFS();
|
romfs = installed.GetEntry(*romfs_title_id, FileSys::ContentRecordType::Data)->GetRomFS();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto extracted = FileSys::ExtractRomFS(romfs, FileSys::RomFSExtractionType::Full);
|
const auto extracted = FileSys::ExtractRomFS(romfs, FileSys::RomFSExtractionType::Full);
|
||||||
|
|
Reference in New Issue