diff options
Diffstat (limited to 'Ryujinx.Ui.Common/Helper')
-rw-r--r-- | Ryujinx.Ui.Common/Helper/ConsoleHelper.cs | 49 | ||||
-rw-r--r-- | Ryujinx.Ui.Common/Helper/OpenHelper.cs | 39 | ||||
-rw-r--r-- | Ryujinx.Ui.Common/Helper/SetupValidator.cs | 119 |
3 files changed, 207 insertions, 0 deletions
diff --git a/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs b/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs new file mode 100644 index 00000000..d85a8121 --- /dev/null +++ b/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs @@ -0,0 +1,49 @@ +using Ryujinx.Common.Logging; +using System; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +namespace Ryujinx.Ui.Common.Helper +{ + public static class ConsoleHelper + { + public static bool SetConsoleWindowStateSupported => OperatingSystem.IsWindows(); + + public static void SetConsoleWindowState(bool show) + { + if (OperatingSystem.IsWindows()) + { + SetConsoleWindowStateWindows(show); + } + else if (show == false) + { + Logger.Warning?.Print(LogClass.Application, "OS doesn't support hiding console window"); + } + } + + [SupportedOSPlatform("windows")] + private static void SetConsoleWindowStateWindows(bool show) + { + const int SW_HIDE = 0; + const int SW_SHOW = 5; + + IntPtr hWnd = GetConsoleWindow(); + + if (hWnd == IntPtr.Zero) + { + Logger.Warning?.Print(LogClass.Application, "Attempted to show/hide console window but console window does not exist"); + return; + } + + ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE); + } + + [SupportedOSPlatform("windows")] + [DllImport("kernel32")] + static extern IntPtr GetConsoleWindow(); + + [SupportedOSPlatform("windows")] + [DllImport("user32")] + static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + } +}
\ No newline at end of file diff --git a/Ryujinx.Ui.Common/Helper/OpenHelper.cs b/Ryujinx.Ui.Common/Helper/OpenHelper.cs new file mode 100644 index 00000000..eaaa7392 --- /dev/null +++ b/Ryujinx.Ui.Common/Helper/OpenHelper.cs @@ -0,0 +1,39 @@ +using Ryujinx.Common.Logging; +using System; +using System.Diagnostics; + +namespace Ryujinx.Ui.Common.Helper +{ + public static class OpenHelper + { + public static void OpenFolder(string path) + { + Process.Start(new ProcessStartInfo + { + FileName = path, + UseShellExecute = true, + Verb = "open" + }); + } + + public static void OpenUrl(string url) + { + if (OperatingSystem.IsWindows()) + { + Process.Start(new ProcessStartInfo("cmd", $"/c start {url.Replace("&", "^&")}")); + } + else if (OperatingSystem.IsLinux()) + { + Process.Start("xdg-open", url); + } + else if (OperatingSystem.IsMacOS()) + { + Process.Start("open", url); + } + else + { + Logger.Notice.Print(LogClass.Application, $"Cannot open url \"{url}\" on this platform!"); + } + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Ui.Common/Helper/SetupValidator.cs b/Ryujinx.Ui.Common/Helper/SetupValidator.cs new file mode 100644 index 00000000..215601e5 --- /dev/null +++ b/Ryujinx.Ui.Common/Helper/SetupValidator.cs @@ -0,0 +1,119 @@ +using Ryujinx.Common.Logging; +using Ryujinx.HLE.FileSystem; +using Ryujinx.Ui.Common; +using System; +using System.IO; + +namespace Ryujinx.Ui.Common.Helper +{ + /// <summary> + /// Ensure installation validity + /// </summary> + public static class SetupValidator + { + public static bool IsFirmwareValid(ContentManager contentManager, out UserError error) + { + bool hasFirmware = contentManager.GetCurrentFirmwareVersion() != null; + + if (hasFirmware) + { + error = UserError.Success; + + return true; + } + else + { + error = UserError.NoFirmware; + + return false; + } + } + + public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion) + { + try + { + firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath); + } + catch (Exception) + { + firmwareVersion = null; + } + + return error == UserError.NoFirmware && Path.GetExtension(baseApplicationPath).ToLowerInvariant() == ".xci" && firmwareVersion != null; + } + + public static bool TryFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out UserError outError) + { + if (error == UserError.NoFirmware) + { + string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant(); + + // If the target app to start is a XCI, try to install firmware from it + if (baseApplicationExtension == ".xci") + { + SystemVersion firmwareVersion; + + try + { + firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath); + } + catch (Exception) + { + firmwareVersion = null; + } + + // The XCI is a valid firmware package, try to install the firmware from it! + if (firmwareVersion != null) + { + try + { + Logger.Info?.Print(LogClass.Application, $"Installing firmware {firmwareVersion.VersionString}"); + + contentManager.InstallFirmware(baseApplicationPath); + + Logger.Info?.Print(LogClass.Application, $"System version {firmwareVersion.VersionString} successfully installed."); + + outError = UserError.Success; + + return true; + } + catch (Exception) { } + } + + outError = error; + + return false; + } + } + + outError = error; + + return false; + } + + public static bool CanStartApplication(ContentManager contentManager, string baseApplicationPath, out UserError error) + { + if (Directory.Exists(baseApplicationPath) || File.Exists(baseApplicationPath)) + { + string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant(); + + // NOTE: We don't force homebrew developers to install a system firmware. + if (baseApplicationExtension == ".nro" || baseApplicationExtension == ".nso") + { + error = UserError.Success; + + return true; + } + + return IsFirmwareValid(contentManager, out error); + } + else + { + error = UserError.ApplicationNotFound; + + return false; + } + } + } +} |