forked from Mirror/Ryujinx
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>
This commit is contained in:
parent
57d3296ba4
commit
560ed5eebd
2 changed files with 32 additions and 13 deletions
|
@ -335,7 +335,14 @@ namespace Ryujinx.HLE.HOS
|
||||||
{
|
{
|
||||||
foreach (DlcNca dlcNca in dlcContainer.DlcNcaList)
|
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.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,22 +75,34 @@ namespace Ryujinx.Ui.Windows
|
||||||
|
|
||||||
foreach (DlcContainer dlcContainer in _dlcContainerList)
|
foreach (DlcContainer dlcContainer in _dlcContainerList)
|
||||||
{
|
{
|
||||||
TreeIter parentIter = ((TreeStore)_dlcTreeView.Model).AppendValues(false, "", dlcContainer.Path);
|
if (File.Exists(dlcContainer.Path))
|
||||||
|
|
||||||
using FileStream containerFile = File.OpenRead(dlcContainer.Path);
|
|
||||||
PartitionFileSystem pfs = new PartitionFileSystem(containerFile.AsStorage());
|
|
||||||
_virtualFileSystem.ImportTickets(pfs);
|
|
||||||
|
|
||||||
foreach (DlcNca dlcNca in dlcContainer.DlcNcaList)
|
|
||||||
{
|
{
|
||||||
pfs.OpenFile(out IFile ncaFile, dlcNca.Path.ToU8Span(), OpenMode.Read).ThrowIfFailure();
|
// The parent tree item has its own "enabled" check box, but it's the actual
|
||||||
Nca nca = TryCreateNca(ncaFile.AsStorage(), dlcContainer.Path);
|
// 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
|
||||||
if (nca != null)
|
// "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}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue