Explorar o código

Fix checking for the wrong metadata files for applications launched with a different program index (#7055)

* Fix checking for the wrong update metadata file

* Apply the same fix for dlc.json

* Use the base application ids for updates and DLCs in the GUI too

This shouldn't actually change anything, since the program index part of the application id
should always be 0 for all applications currently seen by the GUI.

This was just done for completeness.
TSRBerry hai 1 ano
pai
achega
add681144b

+ 1 - 1
src/Ryujinx.Gtk3/UI/Widgets/GameTableContextMenu.cs

@@ -473,7 +473,7 @@ namespace Ryujinx.UI.Widgets
 
 
         private void ManageDlc_Clicked(object sender, EventArgs args)
         private void ManageDlc_Clicked(object sender, EventArgs args)
         {
         {
-            new DlcWindow(_virtualFileSystem, _applicationData.IdString, _applicationData).Show();
+            new DlcWindow(_virtualFileSystem, _applicationData.IdBaseString, _applicationData).Show();
         }
         }
 
 
         private void ManageCheats_Clicked(object sender, EventArgs args)
         private void ManageCheats_Clicked(object sender, EventArgs args)

+ 7 - 7
src/Ryujinx.Gtk3/UI/Windows/DlcWindow.cs

@@ -24,7 +24,7 @@ namespace Ryujinx.UI.Windows
     public class DlcWindow : Window
     public class DlcWindow : Window
     {
     {
         private readonly VirtualFileSystem _virtualFileSystem;
         private readonly VirtualFileSystem _virtualFileSystem;
-        private readonly string _applicationId;
+        private readonly string _applicationIdBase;
         private readonly string _dlcJsonPath;
         private readonly string _dlcJsonPath;
         private readonly List<DownloadableContentContainer> _dlcContainerList;
         private readonly List<DownloadableContentContainer> _dlcContainerList;
 
 
@@ -36,16 +36,16 @@ namespace Ryujinx.UI.Windows
         [GUI] TreeSelection _dlcTreeSelection;
         [GUI] TreeSelection _dlcTreeSelection;
 #pragma warning restore CS0649, IDE0044
 #pragma warning restore CS0649, IDE0044
 
 
-        public DlcWindow(VirtualFileSystem virtualFileSystem, string titleId, ApplicationData applicationData) : this(new Builder("Ryujinx.Gtk3.UI.Windows.DlcWindow.glade"), virtualFileSystem, titleId, applicationData) { }
+        public DlcWindow(VirtualFileSystem virtualFileSystem, string applicationIdBase, ApplicationData applicationData) : this(new Builder("Ryujinx.Gtk3.UI.Windows.DlcWindow.glade"), virtualFileSystem, applicationIdBase, applicationData) { }
 
 
-        private DlcWindow(Builder builder, VirtualFileSystem virtualFileSystem, string applicationId, ApplicationData applicationData) : base(builder.GetRawOwnedObject("_dlcWindow"))
+        private DlcWindow(Builder builder, VirtualFileSystem virtualFileSystem, string applicationIdBase, ApplicationData applicationData) : base(builder.GetRawOwnedObject("_dlcWindow"))
         {
         {
             builder.Autoconnect(this);
             builder.Autoconnect(this);
 
 
-            _applicationId = applicationId;
+            _applicationIdBase = applicationIdBase;
             _virtualFileSystem = virtualFileSystem;
             _virtualFileSystem = virtualFileSystem;
-            _dlcJsonPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, _applicationId, "dlc.json");
-            _baseTitleInfoLabel.Text = $"DLC Available for {applicationData.Name} [{applicationId.ToUpper()}]";
+            _dlcJsonPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, _applicationIdBase, "dlc.json");
+            _baseTitleInfoLabel.Text = $"DLC Available for {applicationData.Name} [{applicationIdBase.ToUpper()}]";
 
 
             try
             try
             {
             {
@@ -163,7 +163,7 @@ namespace Ryujinx.UI.Windows
 
 
                 if (nca.Header.ContentType == NcaContentType.PublicData)
                 if (nca.Header.ContentType == NcaContentType.PublicData)
                 {
                 {
-                    if (nca.GetProgramIdBase() != (ulong.Parse(_applicationId, NumberStyles.HexNumber) & ~0x1FFFUL))
+                    if (nca.GetProgramIdBase() != ulong.Parse(_applicationIdBase, NumberStyles.HexNumber))
                     {
                     {
                         continue;
                         continue;
                     }
                     }

+ 2 - 2
src/Ryujinx.Gtk3/UI/Windows/TitleUpdateWindow.cs

@@ -51,7 +51,7 @@ namespace Ryujinx.UI.Windows
 
 
             _applicationData = applicationData;
             _applicationData = applicationData;
             _virtualFileSystem = virtualFileSystem;
             _virtualFileSystem = virtualFileSystem;
-            _updateJsonPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, applicationData.IdString, "updates.json");
+            _updateJsonPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, applicationData.IdBaseString, "updates.json");
             _radioButtonToPathDictionary = new Dictionary<RadioButton, string>();
             _radioButtonToPathDictionary = new Dictionary<RadioButton, string>();
 
 
             try
             try
@@ -67,7 +67,7 @@ namespace Ryujinx.UI.Windows
                 };
                 };
             }
             }
 
 
-            _baseTitleInfoLabel.Text = $"Updates Available for {applicationData.Name} [{applicationData.IdString}]";
+            _baseTitleInfoLabel.Text = $"Updates Available for {applicationData.Name} [{applicationData.IdBaseString}]";
 
 
             // Try to get updates from PFS first
             // Try to get updates from PFS first
             AddUpdate(_applicationData.Path, true);
             AddUpdate(_applicationData.Path, true);

+ 1 - 1
src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs

@@ -139,7 +139,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
             ulong titleIdBase = mainNca.GetProgramIdBase();
             ulong titleIdBase = mainNca.GetProgramIdBase();
 
 
             // Load update information if exists.
             // Load update information if exists.
-            string titleUpdateMetadataPath = Path.Combine(AppDataManager.GamesDirPath, mainNca.Header.TitleId.ToString("x16"), "updates.json");
+            string titleUpdateMetadataPath = Path.Combine(AppDataManager.GamesDirPath, titleIdBase.ToString("x16"), "updates.json");
             if (File.Exists(titleUpdateMetadataPath))
             if (File.Exists(titleUpdateMetadataPath))
             {
             {
                 updatePath = JsonHelper.DeserializeFromFile(titleUpdateMetadataPath, _applicationSerializerContext.TitleUpdateMetadata).Selected;
                 updatePath = JsonHelper.DeserializeFromFile(titleUpdateMetadataPath, _applicationSerializerContext.TitleUpdateMetadata).Selected;

+ 1 - 1
src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs

@@ -118,7 +118,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
                 device.Configuration.ContentManager.ClearAocData();
                 device.Configuration.ContentManager.ClearAocData();
 
 
                 // Load DownloadableContents.
                 // Load DownloadableContents.
-                string addOnContentMetadataPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, mainNca.Header.TitleId.ToString("x16"), "dlc.json");
+                string addOnContentMetadataPath = System.IO.Path.Combine(AppDataManager.GamesDirPath, mainNca.GetProgramIdBase().ToString("x16"), "dlc.json");
                 if (File.Exists(addOnContentMetadataPath))
                 if (File.Exists(addOnContentMetadataPath))
                 {
                 {
                     List<DownloadableContentContainer> dlcContainerList = JsonHelper.DeserializeFromFile(addOnContentMetadataPath, _contentSerializerContext.ListDownloadableContentContainer);
                     List<DownloadableContentContainer> dlcContainerList = JsonHelper.DeserializeFromFile(addOnContentMetadataPath, _contentSerializerContext.ListDownloadableContentContainer);

+ 2 - 0
src/Ryujinx.UI.Common/App/ApplicationData.cs

@@ -42,6 +42,8 @@ namespace Ryujinx.UI.App.Common
 
 
         [JsonIgnore] public ulong IdBase => Id & ~0x1FFFUL;
         [JsonIgnore] public ulong IdBase => Id & ~0x1FFFUL;
 
 
+        [JsonIgnore] public string IdBaseString => IdBase.ToString("x16");
+
         public static string GetBuildId(VirtualFileSystem virtualFileSystem, IntegrityCheckLevel checkLevel, string titleFilePath)
         public static string GetBuildId(VirtualFileSystem virtualFileSystem, IntegrityCheckLevel checkLevel, string titleFilePath)
         {
         {
             using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read);
             using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read);

+ 1 - 1
src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs

@@ -103,7 +103,7 @@ namespace Ryujinx.Ava.UI.ViewModels
                 _storageProvider = desktop.MainWindow.StorageProvider;
                 _storageProvider = desktop.MainWindow.StorageProvider;
             }
             }
 
 
-            _downloadableContentJsonPath = Path.Combine(AppDataManager.GamesDirPath, applicationData.IdString, "dlc.json");
+            _downloadableContentJsonPath = Path.Combine(AppDataManager.GamesDirPath, applicationData.IdBaseString, "dlc.json");
 
 
             if (!File.Exists(_downloadableContentJsonPath))
             if (!File.Exists(_downloadableContentJsonPath))
             {
             {

+ 2 - 2
src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs

@@ -88,7 +88,7 @@ namespace Ryujinx.Ava.UI.ViewModels
                 StorageProvider = desktop.MainWindow.StorageProvider;
                 StorageProvider = desktop.MainWindow.StorageProvider;
             }
             }
 
 
-            TitleUpdateJsonPath = Path.Combine(AppDataManager.GamesDirPath, ApplicationData.IdString, "updates.json");
+            TitleUpdateJsonPath = Path.Combine(AppDataManager.GamesDirPath, ApplicationData.IdBaseString, "updates.json");
 
 
             try
             try
             {
             {
@@ -96,7 +96,7 @@ namespace Ryujinx.Ava.UI.ViewModels
             }
             }
             catch
             catch
             {
             {
-                Logger.Warning?.Print(LogClass.Application, $"Failed to deserialize title update data for {ApplicationData.IdString} at {TitleUpdateJsonPath}");
+                Logger.Warning?.Print(LogClass.Application, $"Failed to deserialize title update data for {ApplicationData.IdBaseString} at {TitleUpdateJsonPath}");
 
 
                 TitleUpdateWindowData = new TitleUpdateMetadata
                 TitleUpdateWindowData = new TitleUpdateMetadata
                 {
                 {

+ 1 - 1
src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs

@@ -38,7 +38,7 @@ namespace Ryujinx.Ava.UI.Windows
                 SecondaryButtonText = "",
                 SecondaryButtonText = "",
                 CloseButtonText = "",
                 CloseButtonText = "",
                 Content = new DownloadableContentManagerWindow(virtualFileSystem, applicationData),
                 Content = new DownloadableContentManagerWindow(virtualFileSystem, applicationData),
-                Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdString),
+                Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdBaseString),
             };
             };
 
 
             Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
             Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());

+ 1 - 1
src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs

@@ -40,7 +40,7 @@ namespace Ryujinx.Ava.UI.Windows
                 SecondaryButtonText = "",
                 SecondaryButtonText = "",
                 CloseButtonText = "",
                 CloseButtonText = "",
                 Content = new TitleUpdateWindow(virtualFileSystem, applicationData),
                 Content = new TitleUpdateWindow(virtualFileSystem, applicationData),
-                Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdString),
+                Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdBaseString),
             };
             };
 
 
             Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
             Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());