aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLogan Stromberg <loganstromberg@gmail.com>2021-11-29 10:21:27 -0800
committerGitHub <noreply@github.com>2021-11-29 15:21:27 -0300
commit560ed5eebda0c8e54c3c029a9bf54000e52a2933 (patch)
tree46750d8b12fbda6613602a92d3dab9e0b25a8ed4
parent57d3296ba4e5c1fc7ca30376c7ca8eb3041ae2f6 (diff)
Don't blow up everything if a DLC file is moved or renamed. (#2867)
* Don't blow up everything if a DLC file is missing * change comment * More correctly setting the "enabled" check box on dlc dialog for the add-on NSP based on the enabled state of all NCAs in the package. * Update Ryujinx.HLE/HOS/ApplicationLoader.cs Co-authored-by: Ac_K <Acoustik666@gmail.com> Co-authored-by: Logan Stromberg <lostromb@microsoft.com> Co-authored-by: Ac_K <Acoustik666@gmail.com>
-rw-r--r--Ryujinx.HLE/HOS/ApplicationLoader.cs9
-rw-r--r--Ryujinx/Ui/Windows/DlcWindow.cs36
2 files changed, 32 insertions, 13 deletions
diff --git a/Ryujinx.HLE/HOS/ApplicationLoader.cs b/Ryujinx.HLE/HOS/ApplicationLoader.cs
index f794d199..767496d2 100644
--- a/Ryujinx.HLE/HOS/ApplicationLoader.cs
+++ b/Ryujinx.HLE/HOS/ApplicationLoader.cs
@@ -335,7 +335,14 @@ namespace Ryujinx.HLE.HOS
{
foreach (DlcNca dlcNca in dlcContainer.DlcNcaList)
{
- _device.Configuration.ContentManager.AddAocItem(dlcNca.TitleId, dlcContainer.Path, dlcNca.Path, dlcNca.Enabled);
+ if (File.Exists(dlcContainer.Path))
+ {
+ _device.Configuration.ContentManager.AddAocItem(dlcNca.TitleId, dlcContainer.Path, dlcNca.Path, dlcNca.Enabled);
+ }
+ else
+ {
+ Logger.Warning?.Print(LogClass.Application, $"Cannot find AddOnContent file {dlcContainer.Path}. It may have been moved or renamed.");
+ }
}
}
}
diff --git a/Ryujinx/Ui/Windows/DlcWindow.cs b/Ryujinx/Ui/Windows/DlcWindow.cs
index ee9bea6b..bda4d167 100644
--- a/Ryujinx/Ui/Windows/DlcWindow.cs
+++ b/Ryujinx/Ui/Windows/DlcWindow.cs
@@ -75,22 +75,34 @@ namespace Ryujinx.Ui.Windows
foreach (DlcContainer dlcContainer in _dlcContainerList)
{
- TreeIter parentIter = ((TreeStore)_dlcTreeView.Model).AppendValues(false, "", dlcContainer.Path);
-
- using FileStream containerFile = File.OpenRead(dlcContainer.Path);
- PartitionFileSystem pfs = new PartitionFileSystem(containerFile.AsStorage());
- _virtualFileSystem.ImportTickets(pfs);
-
- foreach (DlcNca dlcNca in dlcContainer.DlcNcaList)
+ if (File.Exists(dlcContainer.Path))
{
- pfs.OpenFile(out IFile ncaFile, dlcNca.Path.ToU8Span(), OpenMode.Read).ThrowIfFailure();
- Nca nca = TryCreateNca(ncaFile.AsStorage(), dlcContainer.Path);
-
- if (nca != null)
+ // The parent tree item has its own "enabled" check box, but it's the actual
+ // nca entries that store the enabled / disabled state. A bit of a UI inconsistency.
+ // Maybe a tri-state check box would be better, but for now we check the parent
+ // "enabled" box if all child NCAs are enabled. Usually fine since each nsp has only one nca.
+ bool areAllContentPacksEnabled = dlcContainer.DlcNcaList.TrueForAll((nca) => nca.Enabled);
+ TreeIter parentIter = ((TreeStore)_dlcTreeView.Model).AppendValues(areAllContentPacksEnabled, "", dlcContainer.Path);
+ using FileStream containerFile = File.OpenRead(dlcContainer.Path);
+ PartitionFileSystem pfs = new PartitionFileSystem(containerFile.AsStorage());
+ _virtualFileSystem.ImportTickets(pfs);
+
+ foreach (DlcNca dlcNca in dlcContainer.DlcNcaList)
{
- ((TreeStore)_dlcTreeView.Model).AppendValues(parentIter, dlcNca.Enabled, nca.Header.TitleId.ToString("X16"), dlcNca.Path);
+ pfs.OpenFile(out IFile ncaFile, dlcNca.Path.ToU8Span(), OpenMode.Read).ThrowIfFailure();
+ Nca nca = TryCreateNca(ncaFile.AsStorage(), dlcContainer.Path);
+
+ if (nca != null)
+ {
+ ((TreeStore)_dlcTreeView.Model).AppendValues(parentIter, dlcNca.Enabled, nca.Header.TitleId.ToString("X16"), dlcNca.Path);
+ }
}
}
+ else
+ {
+ // DLC file moved or renamed. Allow the user to remove it without crashing the whole dialog.
+ TreeIter parentIter = ((TreeStore)_dlcTreeView.Model).AppendValues(false, "", $"(MISSING) {dlcContainer.Path}");
+ }
}
}