summaryrefslogtreecommitdiff
path: root/src/SMAPI.Installer/Framework/InstallerContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Installer/Framework/InstallerContext.cs')
-rw-r--r--src/SMAPI.Installer/Framework/InstallerContext.cs103
1 files changed, 103 insertions, 0 deletions
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
+{
+ /// <summary>The installer context.</summary>
+ internal class InstallerContext
+ {
+ /*********
+ ** Fields
+ *********/
+ /// <summary>The <see cref="Environment.OSVersion"/> value that represents Windows 7.</summary>
+ private readonly Version Windows7Version = new Version(6, 1);
+
+ /// <summary>The underlying toolkit game scanner.</summary>
+ private readonly GameScanner GameScanner = new GameScanner();
+
+
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>The current OS.</summary>
+ public Platform Platform { get; }
+
+ /// <summary>The human-readable OS name and version.</summary>
+ public string PlatformName { get; }
+
+ /// <summary>The name of the Stardew Valley executable.</summary>
+ public string ExecutableName { get; }
+
+ /// <summary>Whether the installer is running on Windows.</summary>
+ public bool IsWindows => this.Platform == Platform.Windows;
+
+ /// <summary>Whether the installer is running on a Unix OS (including Linux or MacOS).</summary>
+ public bool IsUnix => !this.IsWindows;
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ public InstallerContext()
+ {
+ this.Platform = EnvironmentUtility.DetectPlatform();
+ this.PlatformName = EnvironmentUtility.GetFriendlyPlatformName(this.Platform);
+ this.ExecutableName = EnvironmentUtility.GetExecutableName(this.Platform);
+ }
+
+ /// <summary>Get the installer's version number.</summary>
+ public ISemanticVersion GetInstallerVersion()
+ {
+ var raw = this.GetType().Assembly.GetName().Version;
+ return new SemanticVersion(raw);
+ }
+
+ /// <summary>Get whether the current system has .NET Framework 4.5 or later installed. This only applies on Windows.</summary>
+ /// <exception cref="NotSupportedException">The current platform is not Windows.</exception>
+ 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.");
+ }
+ }
+
+ /// <summary>Get whether the current system has XNA Framework installed. This only applies on Windows.</summary>
+ /// <exception cref="NotSupportedException">The current platform is not Windows.</exception>
+ 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.");
+ }
+ }
+
+ /// <summary>Whether the current OS supports newer versions of .NET Framework.</summary>
+ public bool CanInstallLatestNetFramework()
+ {
+ return Environment.OSVersion.Version >= this.Windows7Version; // Windows 7+
+ }
+
+ /// <summary>Get whether a folder seems to contain the game files.</summary>
+ /// <param name="dir">The folder to check.</param>
+ public bool LooksLikeGameFolder(DirectoryInfo dir)
+ {
+ return this.GameScanner.LooksLikeGameFolder(dir);
+ }
+ }
+}