Fix DLC error handling

This commit is contained in:
Isaac Marovitz 2024-08-19 19:57:03 +01:00
parent 0137c9e635
commit fa239ac96d
No known key found for this signature in database
GPG key ID: 97250B2B09A132E1

View file

@ -135,13 +135,13 @@ namespace Ryujinx.Ava.UI.ViewModels
foreach (DownloadableContentNca downloadableContentNca in downloadableContentContainer.DownloadableContentNcaList) foreach (DownloadableContentNca downloadableContentNca in downloadableContentContainer.DownloadableContentNcaList)
{ {
using UniqueRef<IFile> ncaFile = new(); Nca nca = TryOpenNca(partitionFileSystem, downloadableContentNca.FullPath);
partitionFileSystem.OpenFile(ref ncaFile.Ref, downloadableContentNca.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); if (nca == null)
Nca nca = TryOpenNca(ncaFile.Get.AsStorage(), downloadableContentContainer.ContainerPath);
if (nca != null)
{ {
continue;
}
var content = new DownloadableContentModel(nca.Header.TitleId.ToString("X16"), var content = new DownloadableContentModel(nca.Header.TitleId.ToString("X16"),
downloadableContentContainer.ContainerPath, downloadableContentContainer.ContainerPath,
downloadableContentNca.FullPath, downloadableContentNca.FullPath,
@ -158,7 +158,6 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
} }
}
// NOTE: Try to load downloadable contents from PFS last to preserve enabled state. // NOTE: Try to load downloadable contents from PFS last to preserve enabled state.
AddDownloadableContent(_applicationData.Path); AddDownloadableContent(_applicationData.Path);
@ -189,17 +188,20 @@ namespace Ryujinx.Ava.UI.ViewModels
return false; return false;
} }
private Nca TryOpenNca(IStorage ncaStorage, string containerPath) private Nca TryOpenNca(IFileSystem partitionFileSystem, string fullPath)
{ {
try try
{ {
return new Nca(_virtualFileSystem.KeySet, ncaStorage); using UniqueRef<IFile> ncaFile = new();
partitionFileSystem.OpenFile(ref ncaFile.Ref, fullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure();
return new Nca(_virtualFileSystem.KeySet, ncaFile.Get.AsStorage());
} }
catch (Exception ex) catch (Exception ex)
{ {
Dispatcher.UIThread.InvokeAsync(async () => Dispatcher.UIThread.InvokeAsync(async () =>
{ {
await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogLoadFileErrorMessage], ex.Message, containerPath)); await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogLoadFileErrorMessage], ex.Message, fullPath));
}); });
} }
@ -244,11 +246,8 @@ namespace Ryujinx.Ava.UI.ViewModels
bool success = false; bool success = false;
foreach (DirectoryEntryEx fileEntry in partitionFileSystem.EnumerateEntries("/", "*.nca")) foreach (DirectoryEntryEx fileEntry in partitionFileSystem.EnumerateEntries("/", "*.nca"))
{ {
using var ncaFile = new UniqueRef<IFile>(); Nca nca = TryOpenNca(partitionFileSystem, fileEntry.FullPath);
partitionFileSystem.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure();
Nca nca = TryOpenNca(ncaFile.Get.AsStorage(), path);
if (nca == null) if (nca == null)
{ {
continue; continue;
@ -261,7 +260,8 @@ namespace Ryujinx.Ava.UI.ViewModels
continue; continue;
} }
var content = new DownloadableContentModel(nca.Header.TitleId.ToString("X16"), path, fileEntry.FullPath, true); var content = new DownloadableContentModel(nca.Header.TitleId.ToString("X16"), path,
fileEntry.FullPath, true);
DownloadableContents.Add(content); DownloadableContents.Add(content);
Dispatcher.UIThread.InvokeAsync(() => SelectedDownloadableContents.Add(content)); Dispatcher.UIThread.InvokeAsync(() => SelectedDownloadableContents.Add(content));