From 107fa6b4f73c4b9178e5055995500fa9ad75da27 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 27 Oct 2022 19:52:09 -0400 Subject: Code refactors - Refactor LauncherFactory.LauncherProvider to LauncherFactory - Refactor all launcher related components to launcher package - some basic code cleanup - Rename all, allSafe -> getList and first, firstSafe -> getString - Rename Utils -> LegacyUtils Signed-off-by: solonovamax --- .../launcher/org/prismlauncher/EntryPoint.java | 4 +- libraries/launcher/org/prismlauncher/Launcher.java | 23 ----- .../org/prismlauncher/LauncherFactory.java | 84 ----------------- .../org/prismlauncher/impl/AbstractLauncher.java | 95 ------------------- .../org/prismlauncher/impl/LegacyLauncher.java | 104 -------------------- .../org/prismlauncher/impl/StandardLauncher.java | 51 ---------- .../org/prismlauncher/launcher/Launcher.java | 22 +++++ .../prismlauncher/launcher/LauncherFactory.java | 77 +++++++++++++++ .../prismlauncher/launcher/LauncherProvider.java | 44 +++++++++ .../launcher/impl/AbstractLauncher.java | 96 +++++++++++++++++++ .../launcher/impl/LegacyLauncher.java | 105 +++++++++++++++++++++ .../launcher/impl/StandardLauncher.java | 51 ++++++++++ .../org/prismlauncher/utils/LegacyUtils.java | 54 +++++++++++ .../org/prismlauncher/utils/Parameters.java | 32 +++---- .../launcher/org/prismlauncher/utils/Utils.java | 49 ---------- 15 files changed, 468 insertions(+), 423 deletions(-) delete mode 100644 libraries/launcher/org/prismlauncher/Launcher.java delete mode 100644 libraries/launcher/org/prismlauncher/LauncherFactory.java delete mode 100644 libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java delete mode 100644 libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java delete mode 100644 libraries/launcher/org/prismlauncher/impl/StandardLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/Launcher.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/utils/LegacyUtils.java delete mode 100644 libraries/launcher/org/prismlauncher/utils/Utils.java (limited to 'libraries/launcher/org/prismlauncher') diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 37db6a5d..44e947b1 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -53,6 +53,8 @@ package org.prismlauncher; import org.prismlauncher.exception.ParseException; +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.launcher.LauncherFactory; import org.prismlauncher.utils.Parameters; import java.io.BufferedReader; @@ -81,7 +83,7 @@ public final class EntryPoint { } private Action parseLine(String inData) throws ParseException { - if (inData.length() == 0) + if (inData.isEmpty()) throw new ParseException("Unexpected empty string!"); String first = inData; diff --git a/libraries/launcher/org/prismlauncher/Launcher.java b/libraries/launcher/org/prismlauncher/Launcher.java deleted file mode 100644 index 50c2c9c8..00000000 --- a/libraries/launcher/org/prismlauncher/Launcher.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher; - -public interface Launcher { - - void launch() throws Throwable; - -} diff --git a/libraries/launcher/org/prismlauncher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/LauncherFactory.java deleted file mode 100644 index 5b18cc5f..00000000 --- a/libraries/launcher/org/prismlauncher/LauncherFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * PolyMC - Minecraft Launcher - * Copyright (C) 2022 icelimetea, - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.prismlauncher; - - -import org.prismlauncher.impl.LegacyLauncher; -import org.prismlauncher.impl.StandardLauncher; -import org.prismlauncher.utils.Parameters; - -import java.util.HashMap; -import java.util.Map; - - -public final class LauncherFactory { - private static final Map launcherRegistry = new HashMap<>(); - - static { - launcherRegistry.put("standard", new LauncherProvider() { - @Override - public Launcher provide(Parameters parameters) { - return new StandardLauncher(parameters); - } - }); - launcherRegistry.put("legacy", new LauncherProvider() { - @Override - public Launcher provide(Parameters parameters) { - return new LegacyLauncher(parameters); - } - }); - } - private LauncherFactory() { - } - - public static Launcher createLauncher(Parameters parameters) { - String name = parameters.first("launcher"); - - LauncherProvider launcherProvider = launcherRegistry.get(name); - - if (launcherProvider == null) - throw new IllegalArgumentException("Invalid launcher type: " + name); - - return launcherProvider.provide(parameters); - } - - public interface LauncherProvider { - - Launcher provide(Parameters parameters); - - } - -} diff --git a/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java deleted file mode 100644 index 49a984f5..00000000 --- a/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.impl; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.prismlauncher.Launcher; -import org.prismlauncher.exception.ParseException; -import org.prismlauncher.utils.Parameters; - -public abstract class AbstractLauncher implements Launcher { - - private static final int DEFAULT_WINDOW_WIDTH = 854; - private static final int DEFAULT_WINDOW_HEIGHT = 480; - - // parameters, separated from ParamBucket - protected final List mcParams; - private final String mainClass; - - // secondary parameters - protected final int width; - protected final int height; - protected final boolean maximize; - - protected final String serverAddress, serverPort; - - protected final ClassLoader classLoader; - - public AbstractLauncher(Parameters params) { - classLoader = ClassLoader.getSystemClassLoader(); - - mcParams = params.allSafe("param", new ArrayList()); - mainClass = params.firstSafe("mainClass", "net.minecraft.client.Minecraft"); - - serverAddress = params.firstSafe("serverAddress", null); - serverPort = params.firstSafe("serverPort", null); - - String windowParams = params.firstSafe("windowParams", null); - - if ("max".equals(windowParams) || windowParams == null) { - maximize = windowParams != null; - - width = DEFAULT_WINDOW_WIDTH; - height = DEFAULT_WINDOW_HEIGHT; - } else { - maximize = false; - - int byIndex = windowParams.indexOf('x'); - - if (byIndex != -1) { - try { - width = Integer.parseInt(windowParams.substring(0, byIndex)); - height = Integer.parseInt(windowParams.substring(byIndex + 1)); - return; - } catch(NumberFormatException pass) { - } - } - - throw new ParseException("Invalid window size parameter value: " + windowParams); - } - } - - protected Class loadMain() throws ClassNotFoundException { - return classLoader.loadClass(mainClass); - } - - protected void loadAndInvokeMain() throws Throwable, ClassNotFoundException { - invokeMain(loadMain()); - } - - protected void invokeMain(Class mainClass) throws Throwable { - MethodHandle method = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); - - method.invokeExact(mcParams.toArray(new String[0])); - } - -} diff --git a/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java deleted file mode 100644 index 30a4dba7..00000000 --- a/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.impl; - -import java.applet.Applet; -import java.io.File; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.prismlauncher.applet.LegacyFrame; -import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.Utils; - -@SuppressWarnings("removal") -public final class LegacyLauncher extends AbstractLauncher { - - private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); - - private final String user, session; - private final String title; - private final String appletClass; - - private final boolean noApplet; - private final String cwd; - - public LegacyLauncher(Parameters params) { - super(params); - - user = params.first("userName"); - session = params.first("sessionId"); - title = params.firstSafe("windowTitle", "Minecraft"); - appletClass = params.firstSafe("appletClass", "net.minecraft.client.MinecraftApplet"); - - List traits = params.allSafe("traits", Collections.emptyList()); - noApplet = traits.contains("noapplet"); - - cwd = System.getProperty("user.dir"); - } - - @Override - public void launch() throws Throwable { - Class main = loadMain(); - Field gameDirField = Utils.getMinecraftGameDirField(main); - - if (gameDirField == null) { - LOGGER.warning("Could not find Mineraft path field."); - } else { - gameDirField.setAccessible(true); - gameDirField.set(null, new File(cwd)); - } - - if (!noApplet) { - LOGGER.info("Launching with applet wrapper..."); - - try { - Class appletClass = classLoader.loadClass(this.appletClass); - - MethodHandle constructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); - Applet applet = (Applet) constructor.invoke(); - - LegacyFrame window = new LegacyFrame(title, applet); - - window.start( - user, - session, - width, - height, - maximize, - serverAddress, - serverPort, - mcParams.contains("--demo") - ); - - return; - } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Applet wrapper failed:", e); - - LOGGER.warning("Falling back to using main class."); - } - } - - invokeMain(main); - } - -} diff --git a/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java deleted file mode 100644 index c651b060..00000000 --- a/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.impl; - -import org.prismlauncher.utils.Parameters; - -public final class StandardLauncher extends AbstractLauncher { - - public StandardLauncher(Parameters params) { - super(params); - } - - @Override - public void launch() throws Throwable { - // window size, title and state - - // FIXME: there is no good way to maximize the minecraft window from here. - // the following often breaks linux screen setups - // mcparams.add("--fullscreen"); - - if (!maximize) { - mcParams.add("--width"); - mcParams.add(Integer.toString(width)); - mcParams.add("--height"); - mcParams.add(Integer.toString(height)); - } - - if (serverAddress != null) { - mcParams.add("--server"); - mcParams.add(serverAddress); - mcParams.add("--port"); - mcParams.add(serverPort); - } - - loadAndInvokeMain(); - } - -} diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java new file mode 100644 index 00000000..1cea255c --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -0,0 +1,22 @@ +/* + * Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.launcher; + + +public interface Launcher { + void launch() throws Throwable; +} diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java new file mode 100644 index 00000000..6c601171 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2022 icelimetea, + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.launcher; + + +import org.prismlauncher.launcher.impl.LegacyLauncher; +import org.prismlauncher.launcher.impl.StandardLauncher; +import org.prismlauncher.utils.Parameters; + +import java.util.HashMap; +import java.util.Map; + + +public final class LauncherFactory { + private static final Map launcherRegistry = new HashMap<>(); + + static { + launcherRegistry.put("standard", new LauncherProvider() { + @Override + public Launcher provide(Parameters parameters) { + return new StandardLauncher(parameters); + } + }); + launcherRegistry.put("legacy", new LauncherProvider() { + @Override + public Launcher provide(Parameters parameters) { + return new LegacyLauncher(parameters); + } + }); + } + private LauncherFactory() { + } + + public static Launcher createLauncher(Parameters parameters) { + String name = parameters.getString("launcher"); + + LauncherProvider launcherProvider = launcherRegistry.get(name); + + if (launcherProvider == null) + throw new IllegalArgumentException("Invalid launcher type: " + name); + + return launcherProvider.provide(parameters); + } +} diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java new file mode 100644 index 00000000..b6d1caab --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 solonovamax, + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.launcher; + + +import org.prismlauncher.utils.Parameters; + + +public interface LauncherProvider { + Launcher provide(Parameters parameters); +} diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java new file mode 100644 index 00000000..637c5da7 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -0,0 +1,96 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.launcher.impl; + + +import org.prismlauncher.exception.ParseException; +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.utils.Parameters; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.ArrayList; +import java.util.List; + + +public abstract class AbstractLauncher implements Launcher { + + private static final int DEFAULT_WINDOW_WIDTH = 854; + private static final int DEFAULT_WINDOW_HEIGHT = 480; + + // parameters, separated from ParamBucket + protected final List mcParams; + private final String mainClass; + + // secondary parameters + protected final int width; + protected final int height; + protected final boolean maximize; + + protected final String serverAddress, serverPort; + + protected final ClassLoader classLoader; + + protected AbstractLauncher(Parameters params) { + classLoader = ClassLoader.getSystemClassLoader(); + + mcParams = params.getList("param", new ArrayList()); + mainClass = params.getString("mainClass", "net.minecraft.client.Minecraft"); + + serverAddress = params.getString("serverAddress", null); + serverPort = params.getString("serverPort", null); + + String windowParams = params.getString("windowParams", null); + + if ("max".equals(windowParams) || windowParams == null) { + maximize = windowParams != null; + + width = DEFAULT_WINDOW_WIDTH; + height = DEFAULT_WINDOW_HEIGHT; + } else { + maximize = false; + + int byIndex = windowParams.indexOf('x'); + + if (byIndex != -1) { + try { + width = Integer.parseInt(windowParams.substring(0, byIndex)); + height = Integer.parseInt(windowParams.substring(byIndex + 1)); + return; + } catch (NumberFormatException ignored) { + } + } + + throw new ParseException("Invalid window size parameter value: " + windowParams); + } + } + + protected Class loadMain() throws ClassNotFoundException { + return classLoader.loadClass(mainClass); + } + + protected void loadAndInvokeMain() throws Throwable { + invokeMain(loadMain()); + } + + protected void invokeMain(Class mainClass) throws Throwable { + MethodHandle method = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); + + method.invokeExact(mcParams.toArray(new String[0])); + } + +} diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java new file mode 100644 index 00000000..181156c6 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -0,0 +1,105 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.launcher.impl; + + +import org.prismlauncher.applet.LegacyFrame; +import org.prismlauncher.utils.LegacyUtils; +import org.prismlauncher.utils.Parameters; + +import java.applet.Applet; +import java.io.File; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +@SuppressWarnings("removal") +public final class LegacyLauncher extends AbstractLauncher { + + private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); + + private final String user, session; + private final String title; + private final String appletClass; + + private final boolean noApplet; + private final String cwd; + + public LegacyLauncher(Parameters params) { + super(params); + + user = params.getString("userName"); + session = params.getString("sessionId"); + title = params.getString("windowTitle", "Minecraft"); + appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); + + List traits = params.getList("traits", Collections.emptyList()); + noApplet = traits.contains("noapplet"); + + cwd = System.getProperty("user.dir"); + } + + @Override + public void launch() throws Throwable { + Class main = loadMain(); + Field gameDirField = LegacyUtils.getMinecraftGameDirField(main); + + if (gameDirField == null) { + LOGGER.warning("Could not find Mineraft path field."); + } else { + gameDirField.setAccessible(true); + gameDirField.set(null, new File(cwd)); + } + + if (!noApplet) { + LOGGER.info("Launching with applet wrapper..."); + + try { + Class appletClass = classLoader.loadClass(this.appletClass); + + MethodHandle constructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); + Applet applet = (Applet) constructor.invoke(); + + LegacyFrame window = new LegacyFrame(title, applet); + + window.start( + user, + session, + width, + height, + maximize, + serverAddress, + serverPort, + mcParams.contains("--demo") + ); + + return; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Applet wrapper failed:", e); + + LOGGER.warning("Falling back to using main class."); + } + } + + invokeMain(main); + } + +} diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java new file mode 100644 index 00000000..c1d33958 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -0,0 +1,51 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.launcher.impl; + +import org.prismlauncher.utils.Parameters; + +public final class StandardLauncher extends AbstractLauncher { + + public StandardLauncher(Parameters params) { + super(params); + } + + @Override + public void launch() throws Throwable { + // window size, title and state + + // FIXME: there is no good way to maximize the minecraft window from here. + // the following often breaks linux screen setups + // mcparams.add("--fullscreen"); + + if (!maximize) { + mcParams.add("--width"); + mcParams.add(Integer.toString(width)); + mcParams.add("--height"); + mcParams.add(Integer.toString(height)); + } + + if (serverAddress != null) { + mcParams.add("--server"); + mcParams.add(serverAddress); + mcParams.add("--port"); + mcParams.add(serverPort); + } + + loadAndInvokeMain(); + } + +} diff --git a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java new file mode 100644 index 00000000..7607d731 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.utils; + + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + + +public final class LegacyUtils { + + private LegacyUtils() { + } + + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * + * @param clazz the class to scan + */ + public static Field getMinecraftGameDirField(Class clazz) { + // Field we're looking for is always + // private static File obfuscatedName = null; + for (Field field : clazz.getDeclaredFields()) { + // Has to be File + if (field.getType() != File.class) + continue; + + // And Private Static. + if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) + continue; + + return field; + } + + return null; + } + +} + diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index dcaba18d..00b0701f 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -39,39 +39,39 @@ public final class Parameters { params.add(value); } - public List all(String key) throws ParameterNotFoundException { + public List getList(String key) throws ParameterNotFoundException { List params = map.get(key); - + if (params == null) throw new ParameterNotFoundException(key); - + return params; } - - public List allSafe(String key, List def) { + + public List getList(String key, List def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params; } - - public String first(String key) throws ParameterNotFoundException { - List list = all(key); - + + public String getString(String key) throws ParameterNotFoundException { + List list = getList(key); + if (list.isEmpty()) throw new ParameterNotFoundException(key); - + return list.get(0); } - - public String firstSafe(String key, String def) { + + public String getString(String key, String def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params.get(0); } diff --git a/libraries/launcher/org/prismlauncher/utils/Utils.java b/libraries/launcher/org/prismlauncher/utils/Utils.java deleted file mode 100644 index 79f5367b..00000000 --- a/libraries/launcher/org/prismlauncher/utils/Utils.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.utils; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; - -public final class Utils { - - private Utils() {} - - /** - * Finds a field that looks like a Minecraft base folder in a supplied class - * - * @param clazz the class to scan - */ - public static Field getMinecraftGameDirField(Class clazz) { - for (Field f : clazz.getDeclaredFields()) { - // Has to be File - if (f.getType() != File.class) - continue; - - // And Private Static. - if (!Modifier.isStatic(f.getModifiers()) || !Modifier.isPrivate(f.getModifiers())) - continue; - - return f; - } - - return null; - } - -} - -- cgit