patch_manager: Return a std::unique_ptr from ParseControlNCA() and GetControlMetadata() instead of a std::shared_ptr
Neither of these functions require the use of shared ownership of the returned pointer. This makes it more difficult to create reference cycles with, and makes the interface more generic, as std::shared_ptr instances can be created from a std::unique_ptr, but the vice-versa isn't possible. This also alters relevant functions to take NCA arguments by const reference rather than a const reference to a std::shared_ptr. These functions don't alter the ownership of the memory used by the NCA instance, so we can make the interface more generic by not assuming anything about the type of smart pointer the NCA is contained within and make it the caller's responsibility to ensure the supplied NCA is valid.
This commit is contained in:
parent
561d79e034
commit
6636f3ff47
|
@ -345,23 +345,22 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::shared_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 {};
|
||||||
|
|
||||||
return ParseControlNCA(base_control_nca);
|
return ParseControlNCA(*base_control_nca);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::shared_ptr<NACP>, VirtualFile> PatchManager::ParseControlNCA(
|
std::pair<std::unique_ptr<NACP>, VirtualFile> PatchManager::ParseControlNCA(const NCA& nca) const {
|
||||||
const std::shared_ptr<NCA>& nca) const {
|
const auto base_romfs = nca.GetRomFS();
|
||||||
const auto base_romfs = nca->GetRomFS();
|
|
||||||
if (base_romfs == nullptr)
|
if (base_romfs == nullptr)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const auto romfs = PatchRomFS(base_romfs, nca->GetBaseIVFCOffset(), ContentRecordType::Control);
|
const auto romfs = PatchRomFS(base_romfs, nca.GetBaseIVFCOffset(), ContentRecordType::Control);
|
||||||
if (romfs == nullptr)
|
if (romfs == nullptr)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -373,7 +372,7 @@ std::pair<std::shared_ptr<NACP>, VirtualFile> PatchManager::ParseControlNCA(
|
||||||
if (nacp_file == nullptr)
|
if (nacp_file == nullptr)
|
||||||
nacp_file = extracted->GetFile("Control.nacp");
|
nacp_file = extracted->GetFile("Control.nacp");
|
||||||
|
|
||||||
const auto nacp = nacp_file == nullptr ? nullptr : std::make_shared<NACP>(nacp_file);
|
auto nacp = nacp_file == nullptr ? nullptr : std::make_unique<NACP>(nacp_file);
|
||||||
|
|
||||||
VirtualFile icon_file;
|
VirtualFile icon_file;
|
||||||
for (const auto& language : FileSys::LANGUAGE_NAMES) {
|
for (const auto& language : FileSys::LANGUAGE_NAMES) {
|
||||||
|
@ -382,6 +381,6 @@ std::pair<std::shared_ptr<NACP>, VirtualFile> PatchManager::ParseControlNCA(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {nacp, icon_file};
|
return {std::move(nacp), icon_file};
|
||||||
}
|
}
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -57,11 +57,10 @@ public:
|
||||||
|
|
||||||
// Given title_id of the program, attempts to get the control data of the update and parse it,
|
// Given title_id of the program, attempts to get the control data of the update and parse it,
|
||||||
// falling back to the base control data.
|
// falling back to the base control data.
|
||||||
std::pair<std::shared_ptr<NACP>, VirtualFile> GetControlMetadata() const;
|
std::pair<std::unique_ptr<NACP>, VirtualFile> GetControlMetadata() const;
|
||||||
|
|
||||||
// Version of GetControlMetadata that takes an arbitrary NCA
|
// Version of GetControlMetadata that takes an arbitrary NCA
|
||||||
std::pair<std::shared_ptr<NACP>, VirtualFile> ParseControlNCA(
|
std::pair<std::unique_ptr<NACP>, VirtualFile> ParseControlNCA(const NCA& nca) const;
|
||||||
const std::shared_ptr<NCA>& nca) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
u64 title_id;
|
u64 title_id;
|
||||||
|
|
|
@ -35,7 +35,7 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::tie(nacp_file, icon_file) =
|
std::tie(nacp_file, icon_file) =
|
||||||
FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(control_nca);
|
FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
|
||||||
}
|
}
|
||||||
|
|
||||||
AppLoader_NSP::~AppLoader_NSP() = default;
|
AppLoader_NSP::~AppLoader_NSP() = default;
|
||||||
|
|
|
@ -49,7 +49,7 @@ private:
|
||||||
std::unique_ptr<AppLoader> secondary_loader;
|
std::unique_ptr<AppLoader> secondary_loader;
|
||||||
|
|
||||||
FileSys::VirtualFile icon_file;
|
FileSys::VirtualFile icon_file;
|
||||||
std::shared_ptr<FileSys::NACP> nacp_file;
|
std::unique_ptr<FileSys::NACP> nacp_file;
|
||||||
u64 title_id;
|
u64 title_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::tie(nacp_file, icon_file) =
|
std::tie(nacp_file, icon_file) =
|
||||||
FileSys::PatchManager(xci->GetProgramTitleID()).ParseControlNCA(control_nca);
|
FileSys::PatchManager(xci->GetProgramTitleID()).ParseControlNCA(*control_nca);
|
||||||
}
|
}
|
||||||
|
|
||||||
AppLoader_XCI::~AppLoader_XCI() = default;
|
AppLoader_XCI::~AppLoader_XCI() = default;
|
||||||
|
|
|
@ -49,7 +49,7 @@ private:
|
||||||
std::unique_ptr<AppLoader_NCA> nca_loader;
|
std::unique_ptr<AppLoader_NCA> nca_loader;
|
||||||
|
|
||||||
FileSys::VirtualFile icon_file;
|
FileSys::VirtualFile icon_file;
|
||||||
std::shared_ptr<FileSys::NACP> nacp_file;
|
std::unique_ptr<FileSys::NACP> nacp_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Loader
|
} // namespace Loader
|
||||||
|
|
|
@ -27,9 +27,8 @@
|
||||||
#include "yuzu/ui_settings.h"
|
#include "yuzu/ui_settings.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void GetMetadataFromControlNCA(const FileSys::PatchManager& patch_manager,
|
void GetMetadataFromControlNCA(const FileSys::PatchManager& patch_manager, const FileSys::NCA& nca,
|
||||||
const std::shared_ptr<FileSys::NCA>& nca, std::vector<u8>& icon,
|
std::vector<u8>& icon, std::string& name) {
|
||||||
std::string& name) {
|
|
||||||
auto [nacp, icon_file] = patch_manager.ParseControlNCA(nca);
|
auto [nacp, icon_file] = patch_manager.ParseControlNCA(nca);
|
||||||
if (icon_file != nullptr)
|
if (icon_file != nullptr)
|
||||||
icon = icon_file->ReadAllBytes();
|
icon = icon_file->ReadAllBytes();
|
||||||
|
@ -110,7 +109,7 @@ void GameListWorker::AddInstalledTitlesToGameList() {
|
||||||
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);
|
||||||
|
|
||||||
auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
|
auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
|
||||||
|
|
||||||
|
@ -197,8 +196,8 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
||||||
res2 == Loader::ResultStatus::Success) {
|
res2 == Loader::ResultStatus::Success) {
|
||||||
// Use from metadata pool.
|
// Use from metadata pool.
|
||||||
if (nca_control_map.find(program_id) != nca_control_map.end()) {
|
if (nca_control_map.find(program_id) != nca_control_map.end()) {
|
||||||
const auto nca = nca_control_map[program_id];
|
const auto& nca = nca_control_map[program_id];
|
||||||
GetMetadataFromControlNCA(patch, nca, icon, name);
|
GetMetadataFromControlNCA(patch, *nca, icon, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue