summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Pilley <anpilley@mycronite.net>2024-02-18 02:31:14 +0100
committerAndrew Pilley <anpilley@mycronite.net>2024-02-18 02:31:14 +0100
commitcb2e312f138a832224c994adbf3591c399931b6b (patch)
tree0f8afdd84ac97c88b70590427079d681b27cee6a
parent>.> spelling (diff)
downloadyuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar.gz
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar.bz2
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar.lz
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar.xz
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.tar.zst
yuzu-cb2e312f138a832224c994adbf3591c399931b6b.zip
-rw-r--r--src/frontend_common/content_manager.h5
-rw-r--r--src/yuzu/main.cpp23
2 files changed, 25 insertions, 3 deletions
diff --git a/src/frontend_common/content_manager.h b/src/frontend_common/content_manager.h
index f3efe3465..c4e97a47b 100644
--- a/src/frontend_common/content_manager.h
+++ b/src/frontend_common/content_manager.h
@@ -251,11 +251,12 @@ inline InstallResult InstallNCA(FileSys::VfsFilesystem& vfs, const std::string&
* \param callback Callback to report the progress of the installation. The first size_t
* parameter is the total size of the installed contents and the second is the current progress. If
* you return true to the callback, it will cancel the installation as soon as possible.
+ * \param firmware_only Set to true to only scan system nand NCAs (firmware), post firmware install.
* \return A list of entries that failed to install. Returns an empty vector if successful.
*/
inline std::vector<std::string> VerifyInstalledContents(
Core::System& system, FileSys::ManualContentProvider& provider,
- const std::function<bool(size_t, size_t)>& callback) {
+ const std::function<bool(size_t, size_t)>& callback, bool firmware_only = false) {
// Get content registries.
auto bis_contents = system.GetFileSystemController().GetSystemNANDContents();
auto user_contents = system.GetFileSystemController().GetUserNANDContents();
@@ -264,7 +265,7 @@ inline std::vector<std::string> VerifyInstalledContents(
if (bis_contents) {
content_providers.push_back(bis_contents);
}
- if (user_contents) {
+ if (user_contents && !firmware_only) {
content_providers.push_back(user_contents);
}
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index fc6f0d381..0d16bfd65 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -4248,7 +4248,7 @@ void GMainWindow::OnInstallFirmware() {
success = false;
}
- if (QtProgressCallback(100, 20 + (int)(((float)(i) / (float)out.size()) * 80.0))) {
+ if (QtProgressCallback(100, 20 + (int)(((float)(i) / (float)out.size()) * 70.0))) {
success = false;
cancelled = true;
break;
@@ -4268,6 +4268,27 @@ void GMainWindow::OnInstallFirmware() {
return;
}
+ // Re-scan VFS for the newly placed firmware files.
+ system->GetFileSystemController().CreateFactories(*vfs);
+
+ auto VerifyFirmwareCallback = [&](size_t total_size, size_t processed_size) {
+ progress.setValue(90 + static_cast<int>((processed_size * 10) / total_size));
+ return progress.wasCanceled();
+ };
+
+ auto result =
+ ContentManager::VerifyInstalledContents(*system, *provider, VerifyFirmwareCallback, true);
+
+ if (result.size() > 0) {
+ const auto failed_names =
+ QString::fromStdString(fmt::format("{}", fmt::join(result, "\n")));
+ progress.close();
+ QMessageBox::critical(
+ this, tr("Firmware integrity verification failed!"),
+ tr("Verification failed for the following files:\n\n%1").arg(failed_names));
+ return;
+ }
+
progress.close();
OnCheckFirmwareDecryption();
}