From c627348c25774600e83248182336bdc857feda0a Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 23 Nov 2020 18:20:52 -0500 Subject: let players specify game path by running the installer from within it --- src/SMAPI.Installer/Framework/InstallerContext.cs | 103 ++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/SMAPI.Installer/Framework/InstallerContext.cs (limited to 'src/SMAPI.Installer/Framework/InstallerContext.cs') diff --git a/src/SMAPI.Installer/Framework/InstallerContext.cs b/src/SMAPI.Installer/Framework/InstallerContext.cs new file mode 100644 index 00000000..7531eaee --- /dev/null +++ b/src/SMAPI.Installer/Framework/InstallerContext.cs @@ -0,0 +1,103 @@ +using System; +using System.IO; +using Microsoft.Win32; +using StardewModdingAPI.Toolkit; +using StardewModdingAPI.Toolkit.Framework.GameScanning; +using StardewModdingAPI.Toolkit.Utilities; + +namespace StardewModdingAPI.Installer.Framework +{ + /// The installer context. + internal class InstallerContext + { + /********* + ** Fields + *********/ + /// The value that represents Windows 7. + private readonly Version Windows7Version = new Version(6, 1); + + /// The underlying toolkit game scanner. + private readonly GameScanner GameScanner = new GameScanner(); + + + /********* + ** Accessors + *********/ + /// The current OS. + public Platform Platform { get; } + + /// The human-readable OS name and version. + public string PlatformName { get; } + + /// The name of the Stardew Valley executable. + public string ExecutableName { get; } + + /// Whether the installer is running on Windows. + public bool IsWindows => this.Platform == Platform.Windows; + + /// Whether the installer is running on a Unix OS (including Linux or MacOS). + public bool IsUnix => !this.IsWindows; + + + /********* + ** Public methods + *********/ + /// Construct an instance. + public InstallerContext() + { + this.Platform = EnvironmentUtility.DetectPlatform(); + this.PlatformName = EnvironmentUtility.GetFriendlyPlatformName(this.Platform); + this.ExecutableName = EnvironmentUtility.GetExecutableName(this.Platform); + } + + /// Get the installer's version number. + public ISemanticVersion GetInstallerVersion() + { + var raw = this.GetType().Assembly.GetName().Version; + return new SemanticVersion(raw); + } + + /// Get whether the current system has .NET Framework 4.5 or later installed. This only applies on Windows. + /// The current platform is not Windows. + public bool HasNetFramework45() + { + switch (this.Platform) + { + case Platform.Windows: + using (RegistryKey versionKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full")) + return versionKey?.GetValue("Release") != null; // .NET Framework 4.5+ + + default: + throw new NotSupportedException("The installed .NET Framework version can only be checked on Windows."); + } + } + + /// Get whether the current system has XNA Framework installed. This only applies on Windows. + /// The current platform is not Windows. + public bool HasXna() + { + switch (this.Platform) + { + case Platform.Windows: + using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\XNA\Framework")) + return key != null; // XNA Framework 4.0+ + + default: + throw new NotSupportedException("The installed XNA Framework version can only be checked on Windows."); + } + } + + /// Whether the current OS supports newer versions of .NET Framework. + public bool CanInstallLatestNetFramework() + { + return Environment.OSVersion.Version >= this.Windows7Version; // Windows 7+ + } + + /// Get whether a folder seems to contain the game files. + /// The folder to check. + public bool LooksLikeGameFolder(DirectoryInfo dir) + { + return this.GameScanner.LooksLikeGameFolder(dir); + } + } +} -- cgit