yuzu/main: Ensure NCAs are registered in content provider when launching from CLI
Fixes updates and DLC not being loaded when launching yuzu from the command line. Similar to https://github.com/yuzu-emu/yuzu/pull/11357. Fixes https://github.com/yuzu-emu/yuzu/issues/8352,
This commit is contained in:
parent
7d89f2c146
commit
59b3c30f94
|
@ -1811,6 +1811,43 @@ bool GMainWindow::SelectAndSetCurrentUser(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) {
|
||||||
|
// Ensure all NCAs are registered before launching the game
|
||||||
|
const auto file = vfs->OpenFile(filepath, FileSys::Mode::Read);
|
||||||
|
if (!file) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto loader = Loader::GetLoader(*system, file);
|
||||||
|
if (!loader) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto file_type = loader->GetFileType();
|
||||||
|
if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 program_id = 0;
|
||||||
|
const auto res2 = loader->ReadProgramId(program_id);
|
||||||
|
if (res2 == Loader::ResultStatus::Success && file_type == Loader::FileType::NCA) {
|
||||||
|
provider->AddEntry(FileSys::TitleType::Application,
|
||||||
|
FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()), program_id,
|
||||||
|
file);
|
||||||
|
} else if (res2 == Loader::ResultStatus::Success &&
|
||||||
|
(file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) {
|
||||||
|
const auto nsp = file_type == Loader::FileType::NSP
|
||||||
|
? std::make_shared<FileSys::NSP>(file)
|
||||||
|
: FileSys::XCI{file}.GetSecurePartitionNSP();
|
||||||
|
for (const auto& title : nsp->GetNCAs()) {
|
||||||
|
for (const auto& entry : title.second) {
|
||||||
|
provider->AddEntry(entry.first.first, entry.first.second, title.first,
|
||||||
|
entry.second->GetBaseFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t program_index,
|
void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t program_index,
|
||||||
StartGameType type) {
|
StartGameType type) {
|
||||||
LOG_INFO(Frontend, "yuzu starting...");
|
LOG_INFO(Frontend, "yuzu starting...");
|
||||||
|
@ -1825,6 +1862,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
|
||||||
|
|
||||||
last_filename_booted = filename;
|
last_filename_booted = filename;
|
||||||
|
|
||||||
|
ConfigureFilesystemProvider(filename.toStdString());
|
||||||
const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData());
|
const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData());
|
||||||
const auto loader = Loader::GetLoader(*system, v_file, program_id, program_index);
|
const auto loader = Loader::GetLoader(*system, v_file, program_id, program_index);
|
||||||
|
|
||||||
|
|
|
@ -399,6 +399,7 @@ private:
|
||||||
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
|
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
|
||||||
bool CheckDarkMode();
|
bool CheckDarkMode();
|
||||||
bool CheckSystemArchiveDecryption();
|
bool CheckSystemArchiveDecryption();
|
||||||
|
void ConfigureFilesystemProvider(const std::string& filepath);
|
||||||
|
|
||||||
QString GetTasStateDescription() const;
|
QString GetTasStateDescription() const;
|
||||||
bool CreateShortcut(const std::string& shortcut_path, const std::string& title,
|
bool CreateShortcut(const std::string& shortcut_path, const std::string& title,
|
||||||
|
|
Loading…
Reference in a new issue