From dd8da57cfb5ca8e27174097605d91178f33111ef Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 13 Oct 2021 20:14:17 +0800 Subject: [PATCH] New 'Platform' class --- .../jackhuang/hmcl/game/LauncherHelper.java | 4 +- .../hmcl/ui/versions/VersionSettingsPage.java | 2 +- .../hmcl/launch/DefaultLauncher.java | 2 +- .../hmcl/util/platform/JavaVersion.java | 2 +- .../hmcl/util/platform/Platform.java | 73 +++++++++++++++++++ 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 2fdcb1018..6b5040ac5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -432,13 +432,13 @@ public final class LauncherHelper { } } - if (javaVersion.getPlatform() != Architecture.SYSTEM.getBits()) { + if (javaVersion.getBits() != Architecture.SYSTEM.getBits()) { Controllers.dialog(i18n("launch.advice.different_platform"), i18n("message.warning"), MessageType.ERROR, continueAction); suggested = true; } // 32-bit JVM cannot make use of too much memory. - if (javaVersion.getPlatform() == Bits.BIT_32 && + if (javaVersion.getBits() == Bits.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) { // 1.5 * 1024 is an inaccurate number. // Actual memory limit depends on operating system and memory. diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index e546c84bf..e8083d2f4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -547,7 +547,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag Task.supplyAsync(JavaVersion::getJavas).thenAcceptAsync(Schedulers.javafx(), list -> { List> options = list.stream() .map(javaVersion -> new MultiFileItem.Option<>(javaVersion.getVersion() + i18n("settings.game.java_directory.bit", - javaVersion.getPlatform().getBit()), javaVersion) + javaVersion.getBits().getBit()), javaVersion) .setSubtitle(javaVersion.getBinary().toString())) .collect(Collectors.toList()); options.add(0, javaAutoDeterminedOption); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index d7533eb26..b72a14f3b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -160,7 +160,7 @@ public class DefaultLauncher extends Launcher { // As 32-bit JVM allocate 320KB for stack by default rather than 64-bit version allocating 1MB, // causing Minecraft 1.13 crashed accounting for java.lang.StackOverflowError. - if (options.getJava().getPlatform() == Bits.BIT_32) { + if (options.getJava().getBits() == Bits.BIT_32) { res.addDefault("-Xss", "1m"); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java index 02aa1c057..583513840 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java @@ -64,7 +64,7 @@ public final class JavaVersion { return longVersion; } - public Bits getPlatform() { + public Bits getBits() { return platform; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java new file mode 100644 index 000000000..57e6ef279 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Platform.java @@ -0,0 +1,73 @@ +package org.jackhuang.hmcl.util.platform; + +import java.util.Objects; + +public final class Platform { + public static final Platform UNKNOWN = new Platform(OperatingSystem.UNKNOWN, Architecture.UNKNOWN); + public static final Platform CURRENT = new Platform(OperatingSystem.CURRENT_OS, Architecture.JDK); + + public static final Platform WINDOWS_X86_64 = new Platform(OperatingSystem.WINDOWS, Architecture.X86_64); + public static final Platform OSX_X86_64 = new Platform(OperatingSystem.OSX, Architecture.X86_64); + public static final Platform LINUX_X86_64 = new Platform(OperatingSystem.LINUX, Architecture.X86_64); + + private final OperatingSystem os; + private final Architecture arch; + + private Platform(OperatingSystem os, Architecture arch) { + this.os = os; + this.arch = arch; + } + + public static Platform getPlatform() { + return CURRENT; + } + + public static Platform getPlatform(OperatingSystem os, Architecture arch) { + if (os == OperatingSystem.UNKNOWN && arch == Architecture.UNKNOWN) { + return UNKNOWN; + } + + if (arch == Architecture.X86_64) { + switch (os) { + case WINDOWS: + return WINDOWS_X86_64; + case OSX: + return OSX_X86_64; + case LINUX: + return LINUX_X86_64; + } + } + + return new Platform(os, arch); + } + + public OperatingSystem getOperatingSystem() { + return os; + } + + public Architecture getArchitecture() { + return arch; + } + + public Bits getBits() { + return arch.getBits(); + } + + @Override + public int hashCode() { + return Objects.hash(os, arch); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Platform)) return false; + Platform platform = (Platform) o; + return os == platform.os && arch == platform.arch; + } + + @Override + public String toString() { + return os.getCheckedName() + "-" + arch; // TODO: getCheckedName() + } +}