aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs
diff options
context:
space:
mode:
authorTSRBerry <20988865+TSRBerry@users.noreply.github.com>2024-08-03 23:31:34 +0200
committerGitHub <noreply@github.com>2024-08-03 22:31:34 +0100
commit263eb97f79f02db12c2499ceec7e957b91bc008b (patch)
tree5f0676b4d82e5c3851f923f4ba4f39066fb6b3b9 /src/Ryujinx.UI.Common/App/ApplicationLibrary.cs
parent30049022574f0aecaa94c0f24c64f5c9f3fb7ad9 (diff)
Avoid race conditions while launching games directly from the command line (#7116)
* optimization: Load application metadata only for applications with IDs * Load applications when necessary This prevents loading applications when launching an application directly from the command line (or a shortcut). Instead, applications will be loaded after the emulation was stopped by the user. * Show the title in the configured language when launching an application * Rename DesiredTitleLanguage to DesiredLanguage
Diffstat (limited to 'src/Ryujinx.UI.Common/App/ApplicationLibrary.cs')
-rw-r--r--src/Ryujinx.UI.Common/App/ApplicationLibrary.cs57
1 files changed, 30 insertions, 27 deletions
diff --git a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs
index cd95c4d8..2defc1f6 100644
--- a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs
+++ b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs
@@ -34,6 +34,7 @@ namespace Ryujinx.UI.App.Common
{
public class ApplicationLibrary
{
+ public Language DesiredLanguage { get; set; }
public event EventHandler<ApplicationAddedEventArgs> ApplicationAdded;
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
@@ -45,7 +46,6 @@ namespace Ryujinx.UI.App.Common
private readonly VirtualFileSystem _virtualFileSystem;
private readonly IntegrityCheckLevel _checkLevel;
- private Language _desiredTitleLanguage;
private CancellationTokenSource _cancellationToken;
private static readonly ApplicationJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
@@ -221,7 +221,7 @@ namespace Ryujinx.UI.App.Common
{
using UniqueRef<IFile> icon = new();
- controlFs.OpenFile(ref icon.Ref, $"/icon_{_desiredTitleLanguage}.dat".ToU8Span(), OpenMode.Read).ThrowIfFailure();
+ controlFs.OpenFile(ref icon.Ref, $"/icon_{DesiredLanguage}.dat".ToU8Span(), OpenMode.Read).ThrowIfFailure();
using MemoryStream stream = new();
@@ -432,35 +432,40 @@ namespace Ryujinx.UI.App.Common
foreach (var data in applications)
{
- ApplicationMetadata appMetadata = LoadAndSaveMetaData(data.IdString, appMetadata =>
+ // Only load metadata for applications with an ID
+ if (data.Id != 0)
{
- appMetadata.Title = data.Name;
-
- // Only do the migration if time_played has a value and timespan_played hasn't been updated yet.
- if (appMetadata.TimePlayedOld != default && appMetadata.TimePlayed == TimeSpan.Zero)
+ ApplicationMetadata appMetadata = LoadAndSaveMetaData(data.IdString, appMetadata =>
{
- appMetadata.TimePlayed = TimeSpan.FromSeconds(appMetadata.TimePlayedOld);
- appMetadata.TimePlayedOld = default;
- }
+ appMetadata.Title = data.Name;
- // Only do the migration if last_played has a value and last_played_utc doesn't exist yet.
- if (appMetadata.LastPlayedOld != default && !appMetadata.LastPlayed.HasValue)
- {
- // Migrate from string-based last_played to DateTime-based last_played_utc.
- if (DateTime.TryParse(appMetadata.LastPlayedOld, out DateTime lastPlayedOldParsed))
+ // Only do the migration if time_played has a value and timespan_played hasn't been updated yet.
+ if (appMetadata.TimePlayedOld != default && appMetadata.TimePlayed == TimeSpan.Zero)
{
- appMetadata.LastPlayed = lastPlayedOldParsed;
+ appMetadata.TimePlayed = TimeSpan.FromSeconds(appMetadata.TimePlayedOld);
+ appMetadata.TimePlayedOld = default;
+ }
+
+ // Only do the migration if last_played has a value and last_played_utc doesn't exist yet.
+ if (appMetadata.LastPlayedOld != default && !appMetadata.LastPlayed.HasValue)
+ {
+ // Migrate from string-based last_played to DateTime-based last_played_utc.
+ if (DateTime.TryParse(appMetadata.LastPlayedOld, out DateTime lastPlayedOldParsed))
+ {
+ appMetadata.LastPlayed = lastPlayedOldParsed;
+
+ // Migration successful: deleting last_played from the metadata file.
+ appMetadata.LastPlayedOld = default;
+ }
- // Migration successful: deleting last_played from the metadata file.
- appMetadata.LastPlayedOld = default;
}
+ });
- }
- });
+ data.Favorite = appMetadata.Favorite;
+ data.TimePlayed = appMetadata.TimePlayed;
+ data.LastPlayed = appMetadata.LastPlayed;
+ }
- data.Favorite = appMetadata.Favorite;
- data.TimePlayed = appMetadata.TimePlayed;
- data.LastPlayed = appMetadata.LastPlayed;
data.FileExtension = Path.GetExtension(applicationPath).TrimStart('.').ToUpper();
data.FileSize = fileSize;
data.Path = applicationPath;
@@ -482,13 +487,11 @@ namespace Ryujinx.UI.App.Common
controlFile.Get.Read(out _, 0, outProperty, ReadOption.None).ThrowIfFailure();
}
- public void LoadApplications(List<string> appDirs, Language desiredTitleLanguage)
+ public void LoadApplications(List<string> appDirs)
{
int numApplicationsFound = 0;
int numApplicationsLoaded = 0;
- _desiredTitleLanguage = desiredTitleLanguage;
-
_cancellationToken = new CancellationTokenSource();
// Builds the applications list with paths to found applications
@@ -847,7 +850,7 @@ namespace Ryujinx.UI.App.Common
private void GetApplicationInformation(ref ApplicationControlProperty controlData, ref ApplicationData data)
{
- _ = Enum.TryParse(_desiredTitleLanguage.ToString(), out TitleLanguage desiredTitleLanguage);
+ _ = Enum.TryParse(DesiredLanguage.ToString(), out TitleLanguage desiredTitleLanguage);
if (controlData.Title.ItemsRo.Length > (int)desiredTitleLanguage)
{