gui: Fixes the games icon when there is an update (#3148)

* gui: Fixes the games icon when there is a game update

Currently we just load the version of the update, instead of the whole NACP file. This PR fixes that. A little cleanup is made into the code to avoid duplicate things.
(Closes #3039)

* Fix condition
This commit is contained in:
Ac_K 2022-02-22 14:53:39 +01:00 committed by GitHub
parent f1460d5494
commit ccf23fc629
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -242,15 +242,18 @@ namespace Ryujinx.Ui.App
} }
else else
{ {
// Store the ControlFS in variable called controlFs
GetControlFsAndTitleId(pfs, out IFileSystem controlFs, out titleId); GetControlFsAndTitleId(pfs, out IFileSystem controlFs, out titleId);
// Check if there is an update available.
if (IsUpdateApplied(titleId, out IFileSystem updatedControlFs))
{
// Replace the original ControlFs by the updated one.
controlFs = updatedControlFs;
}
ReadControlData(controlFs, controlHolder.ByteSpan); ReadControlData(controlFs, controlHolder.ByteSpan);
// Get the title name, title ID, developer name and version number from the NACP GetGameInformation(ref controlHolder.Value, out titleName, out _, out developer, out version);
version = IsUpdateApplied(titleId, out string updateVersion) ? updateVersion : controlHolder.Value.DisplayVersion.ToString();
GetNameIdDeveloper(ref controlHolder.Value, out titleName, out _, out developer);
// Read the icon from the ControlFS and store it as a byte array // Read the icon from the ControlFS and store it as a byte array
try try
@ -351,10 +354,7 @@ namespace Ryujinx.Ui.App
// Read the NACP data // Read the NACP data
Read(assetOffset + (int)nacpOffset, (int)nacpSize).AsSpan().CopyTo(controlHolder.ByteSpan); Read(assetOffset + (int)nacpOffset, (int)nacpSize).AsSpan().CopyTo(controlHolder.ByteSpan);
// Get the title name, title ID, developer name and version number from the NACP GetGameInformation(ref controlHolder.Value, out titleName, out titleId, out developer, out version);
version = controlHolder.Value.DisplayVersion.ToString();
GetNameIdDeveloper(ref controlHolder.Value, out titleName, out titleId, out developer);
} }
else else
{ {
@ -554,7 +554,7 @@ namespace Ryujinx.Ui.App
return readableString; return readableString;
} }
private void GetNameIdDeveloper(ref ApplicationControlProperty controlData, out string titleName, out string titleId, out string publisher) private void GetGameInformation(ref ApplicationControlProperty controlData, out string titleName, out string titleId, out string publisher, out string version)
{ {
_ = Enum.TryParse(_desiredTitleLanguage.ToString(), out TitleLanguage desiredTitleLanguage); _ = Enum.TryParse(_desiredTitleLanguage.ToString(), out TitleLanguage desiredTitleLanguage);
@ -611,10 +611,14 @@ namespace Ryujinx.Ui.App
{ {
titleId = "0000000000000000"; titleId = "0000000000000000";
} }
version = controlData.DisplayVersion.ToString();
} }
private bool IsUpdateApplied(string titleId, out string version) private bool IsUpdateApplied(string titleId, out IFileSystem updatedControlFs)
{ {
updatedControlFs = null;
string updatePath = "(unknown)"; string updatePath = "(unknown)";
try try
@ -623,14 +627,7 @@ namespace Ryujinx.Ui.App
if (patchNca != null && controlNca != null) if (patchNca != null && controlNca != null)
{ {
ApplicationControlProperty controlData = new ApplicationControlProperty(); updatedControlFs = controlNca?.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None);
using var nacpFile = new UniqueRef<IFile>();
controlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None).OpenFile(ref nacpFile.Ref(), "/control.nacp".ToU8Span(), OpenMode.Read).ThrowIfFailure();
nacpFile.Get.Read(out _, 0, SpanHelpers.AsByteSpan(ref controlData), ReadOption.None).ThrowIfFailure();
version = controlData.DisplayVersion.ToString();
return true; return true;
} }
@ -645,8 +642,6 @@ namespace Ryujinx.Ui.App
Logger.Warning?.Print(LogClass.Application, $"Your key set is missing a key with the name: {exception.Name}. Errored File: {updatePath}"); Logger.Warning?.Print(LogClass.Application, $"Your key set is missing a key with the name: {exception.Name}. Errored File: {updatePath}");
} }
version = "";
return false; return false;
} }
} }