From c9fc52edb6abc014d5d5671c1634b01ace48de2f Mon Sep 17 00:00:00 2001
From: Thomas Guillemard <thog@protonmail.com>
Date: Thu, 19 Jul 2018 20:44:52 +0200
Subject: [PATCH] Fix SystemPathToSwitchPath platform issues and make sure to
 delete temporary NRO after sessions dispose (#293)

---
 Ryujinx.HLE/OsHle/Horizon.cs     |  1 -
 Ryujinx.HLE/OsHle/Process.cs     | 10 +++++-----
 Ryujinx.HLE/VirtualFileSystem.cs |  4 ++--
 3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/Ryujinx.HLE/OsHle/Horizon.cs b/Ryujinx.HLE/OsHle/Horizon.cs
index 9d8a937ff..70ae24be3 100644
--- a/Ryujinx.HLE/OsHle/Horizon.cs
+++ b/Ryujinx.HLE/OsHle/Horizon.cs
@@ -96,7 +96,6 @@ namespace Ryujinx.HLE.OsHle
 
             if (IsNro && (SwitchFilePath == null || !SwitchFilePath.StartsWith("sdmc:/")))
             {
-                // TODO: avoid copying the file if we are already inside a sdmc directory
                 string SwitchPath = $"sdmc:/switch/{Name}{Homebrew.TemporaryNroSuffix}";
                 string TempPath = Ns.VFs.SwitchPathToSystemPath(SwitchPath);
 
diff --git a/Ryujinx.HLE/OsHle/Process.cs b/Ryujinx.HLE/OsHle/Process.cs
index be27dcc28..c7606dc90 100644
--- a/Ryujinx.HLE/OsHle/Process.cs
+++ b/Ryujinx.HLE/OsHle/Process.cs
@@ -403,11 +403,6 @@ namespace Ryujinx.HLE.OsHle
         {
             if (Disposing && !Disposed)
             {
-                if (NeedsHbAbi && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix))
-                {
-                    File.Delete(Executables[0].FilePath);
-                }
-
                 //If there is still some thread running, disposing the objects is not
                 //safe as the thread may try to access those resources. Instead, we set
                 //the flag to have the Process disposed when all threads finishes.
@@ -431,6 +426,11 @@ namespace Ryujinx.HLE.OsHle
                     }
                 }
 
+                if (NeedsHbAbi && Executables.Count > 0 && Executables[0].FilePath.EndsWith(Homebrew.TemporaryNroSuffix))
+                {
+                    File.Delete(Executables[0].FilePath);
+                }
+
                 INvDrvServices.UnloadProcess(this);
 
                 AppletState.Dispose();
diff --git a/Ryujinx.HLE/VirtualFileSystem.cs b/Ryujinx.HLE/VirtualFileSystem.cs
index 38df81f87..df1fc9db1 100644
--- a/Ryujinx.HLE/VirtualFileSystem.cs
+++ b/Ryujinx.HLE/VirtualFileSystem.cs
@@ -57,11 +57,11 @@ namespace Ryujinx.HLE
 
         public string SystemPathToSwitchPath(string SystemPath)
         {
-            string BaseSystemPath = GetBasePath() + "/";
+            string BaseSystemPath = GetBasePath() + Path.DirectorySeparatorChar;
             if (SystemPath.StartsWith(BaseSystemPath))
             {
                 string RawPath = SystemPath.Replace(BaseSystemPath, "");
-                int FirstSeparatorOffset = RawPath.IndexOf('/');
+                int FirstSeparatorOffset = RawPath.IndexOf(Path.DirectorySeparatorChar);
                 if (FirstSeparatorOffset == -1)
                 {
                     return $"{RawPath}:/";