mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #1835 from lioncash/cache-global
filesystem: De-globalize registered_cache_union
This commit is contained in:
		
						commit
						f6b22d9251
					
				@ -794,7 +794,7 @@ void KeyManager::DeriveBase() {
 | 
			
		||||
 | 
			
		||||
void KeyManager::DeriveETicket(PartitionDataManager& data) {
 | 
			
		||||
    // ETicket keys
 | 
			
		||||
    const auto es = Service::FileSystem::GetUnionContents()->GetEntry(
 | 
			
		||||
    const auto es = Service::FileSystem::GetUnionContents().GetEntry(
 | 
			
		||||
        0x0100000000000033, FileSys::ContentRecordType::Program);
 | 
			
		||||
 | 
			
		||||
    if (es == nullptr)
 | 
			
		||||
 | 
			
		||||
@ -75,12 +75,12 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
 | 
			
		||||
 | 
			
		||||
    // Game Updates
 | 
			
		||||
    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 &&
 | 
			
		||||
        update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {
 | 
			
		||||
        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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -281,13 +281,13 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content
 | 
			
		||||
 | 
			
		||||
    // Game Updates
 | 
			
		||||
    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) {
 | 
			
		||||
        const auto new_nca = std::make_shared<NCA>(update, romfs, ivfc_offset);
 | 
			
		||||
        if (new_nca->GetStatus() == Loader::ResultStatus::Success &&
 | 
			
		||||
            new_nca->GetRomFS() != nullptr) {
 | 
			
		||||
            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();
 | 
			
		||||
        }
 | 
			
		||||
    } else if (update_raw != nullptr) {
 | 
			
		||||
@ -329,8 +329,8 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
 | 
			
		||||
    if (nacp != nullptr) {
 | 
			
		||||
        out.insert_or_assign("Update", nacp->GetVersionString());
 | 
			
		||||
    } else {
 | 
			
		||||
        if (installed->HasEntry(update_tid, ContentRecordType::Program)) {
 | 
			
		||||
            const auto meta_ver = installed->GetEntryVersion(update_tid);
 | 
			
		||||
        if (installed.HasEntry(update_tid, ContentRecordType::Program)) {
 | 
			
		||||
            const auto meta_ver = installed.GetEntryVersion(update_tid);
 | 
			
		||||
            if (meta_ver.value_or(0) == 0) {
 | 
			
		||||
                out.insert_or_assign("Update", "");
 | 
			
		||||
            } else {
 | 
			
		||||
@ -383,14 +383,13 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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;
 | 
			
		||||
    dlc_match.reserve(dlc_entries.size());
 | 
			
		||||
    std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match),
 | 
			
		||||
                 [this, &installed](const RegisteredCacheEntry& entry) {
 | 
			
		||||
                     return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id &&
 | 
			
		||||
                            installed->GetEntry(entry)->GetStatus() ==
 | 
			
		||||
                                Loader::ResultStatus::Success;
 | 
			
		||||
                            installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success;
 | 
			
		||||
                 });
 | 
			
		||||
    if (!dlc_match.empty()) {
 | 
			
		||||
        // 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 {
 | 
			
		||||
    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)
 | 
			
		||||
        return {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, Conte
 | 
			
		||||
 | 
			
		||||
    switch (storage) {
 | 
			
		||||
    case StorageId::None:
 | 
			
		||||
        res = Service::FileSystem::GetUnionContents()->GetEntry(title_id, type);
 | 
			
		||||
        res = Service::FileSystem::GetUnionContents().GetEntry(title_id, type);
 | 
			
		||||
        break;
 | 
			
		||||
    case StorageId::NandSystem:
 | 
			
		||||
        res = Service::FileSystem::GetSystemNANDContents()->GetEntry(title_id, type);
 | 
			
		||||
 | 
			
		||||
@ -34,14 +34,14 @@ static std::vector<u64> AccumulateAOCTitleIDs() {
 | 
			
		||||
    std::vector<u64> add_on_content;
 | 
			
		||||
    const auto rcu = FileSystem::GetUnionContents();
 | 
			
		||||
    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),
 | 
			
		||||
                   [](const FileSys::RegisteredCacheEntry& rce) { return rce.title_id; });
 | 
			
		||||
    add_on_content.erase(
 | 
			
		||||
        std::remove_if(
 | 
			
		||||
            add_on_content.begin(), add_on_content.end(),
 | 
			
		||||
            [&rcu](u64 tid) {
 | 
			
		||||
                return rcu->GetEntry(tid, FileSys::ContentRecordType::Data)->GetStatus() !=
 | 
			
		||||
                return rcu.GetEntry(tid, FileSys::ContentRecordType::Data)->GetStatus() !=
 | 
			
		||||
                       Loader::ResultStatus::Success;
 | 
			
		||||
            }),
 | 
			
		||||
        add_on_content.end());
 | 
			
		||||
 | 
			
		||||
@ -341,20 +341,9 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
 | 
			
		||||
    return sdmc_factory->Open();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<FileSys::RegisteredCacheUnion> registered_cache_union;
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<FileSys::RegisteredCacheUnion> GetUnionContents() {
 | 
			
		||||
    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::RegisteredCacheUnion GetUnionContents() {
 | 
			
		||||
    return FileSys::RegisteredCacheUnion{
 | 
			
		||||
        {GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()}};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FileSys::RegisteredCache* GetSystemNANDContents() {
 | 
			
		||||
@ -407,7 +396,6 @@ void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite) {
 | 
			
		||||
        bis_factory = nullptr;
 | 
			
		||||
        save_data_factory = nullptr;
 | 
			
		||||
        sdmc_factory = nullptr;
 | 
			
		||||
        ClearUnionContents();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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> OpenSDMC();
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<FileSys::RegisteredCacheUnion> GetUnionContents();
 | 
			
		||||
void ClearUnionContents();
 | 
			
		||||
FileSys::RegisteredCacheUnion GetUnionContents();
 | 
			
		||||
 | 
			
		||||
FileSys::RegisteredCache* GetSystemNANDContents();
 | 
			
		||||
FileSys::RegisteredCache* GetUserNANDContents();
 | 
			
		||||
 | 
			
		||||
@ -97,11 +97,11 @@ GameListWorker::~GameListWorker() = default;
 | 
			
		||||
 | 
			
		||||
void GameListWorker::AddInstalledTitlesToGameList() {
 | 
			
		||||
    const auto cache = Service::FileSystem::GetUnionContents();
 | 
			
		||||
    const auto installed_games = cache->ListEntriesFilter(FileSys::TitleType::Application,
 | 
			
		||||
                                                          FileSys::ContentRecordType::Program);
 | 
			
		||||
    const auto installed_games = cache.ListEntriesFilter(FileSys::TitleType::Application,
 | 
			
		||||
                                                         FileSys::ContentRecordType::Program);
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
        if (!loader)
 | 
			
		||||
            continue;
 | 
			
		||||
@ -112,7 +112,7 @@ void GameListWorker::AddInstalledTitlesToGameList() {
 | 
			
		||||
        loader->ReadProgramId(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)
 | 
			
		||||
            GetMetadataFromControlNCA(patch, *control, icon, name);
 | 
			
		||||
 | 
			
		||||
@ -141,11 +141,11 @@ void GameListWorker::AddInstalledTitlesToGameList() {
 | 
			
		||||
        emit EntryReady(list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const auto control_data = cache->ListEntriesFilter(FileSys::TitleType::Application,
 | 
			
		||||
                                                       FileSys::ContentRecordType::Control);
 | 
			
		||||
    const auto control_data = cache.ListEntriesFilter(FileSys::TitleType::Application,
 | 
			
		||||
                                                      FileSys::ContentRecordType::Control);
 | 
			
		||||
 | 
			
		||||
    for (const auto& entry : control_data) {
 | 
			
		||||
        auto nca = cache->GetEntry(entry);
 | 
			
		||||
        auto nca = cache.GetEntry(entry);
 | 
			
		||||
        if (nca != nullptr) {
 | 
			
		||||
            nca_control_map.insert_or_assign(entry.title_id, std::move(nca));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -907,7 +907,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
        failed();
 | 
			
		||||
@ -922,7 +922,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa
 | 
			
		||||
    if (*romfs_title_id == program_id) {
 | 
			
		||||
        romfs = file;
 | 
			
		||||
    } 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);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user