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); } } }