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:
		@@ -1811,6 +1811,43 @@ bool GMainWindow::SelectAndSetCurrentUser(
 | 
			
		||||
    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,
 | 
			
		||||
                           StartGameType type) {
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    ConfigureFilesystemProvider(filename.toStdString());
 | 
			
		||||
    const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData());
 | 
			
		||||
    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);
 | 
			
		||||
    bool CheckDarkMode();
 | 
			
		||||
    bool CheckSystemArchiveDecryption();
 | 
			
		||||
    void ConfigureFilesystemProvider(const std::string& filepath);
 | 
			
		||||
 | 
			
		||||
    QString GetTasStateDescription() const;
 | 
			
		||||
    bool CreateShortcut(const std::string& shortcut_path, const std::string& title,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user