mirror of
https://github.com/GravitLauncher/Launcher
synced 2025-01-24 16:19:23 +03:00
RuntimeProvider
This commit is contained in:
parent
1b374c3093
commit
b49d17a018
4 changed files with 184 additions and 142 deletions
|
@ -2,126 +2,16 @@
|
||||||
|
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import ru.gravit.launcher.client.*;
|
import ru.gravit.launcher.client.*;
|
||||||
import ru.gravit.launcher.gui.choosebox.CheckComboBox;
|
import ru.gravit.launcher.gui.JSRuntimeProvider;
|
||||||
import ru.gravit.launcher.gui.choosebox.CheckComboBoxSkin;
|
import ru.gravit.launcher.gui.RuntimeProvider;
|
||||||
import ru.gravit.launcher.gui.choosebox.CheckModel;
|
|
||||||
import ru.gravit.launcher.gui.choosebox.IndexedCheckModel;
|
|
||||||
import ru.gravit.launcher.gui.indicator.RingProgressIndicator;
|
|
||||||
import ru.gravit.launcher.gui.indicator.RingProgressIndicatorSkin;
|
|
||||||
import ru.gravit.launcher.hasher.FileNameMatcher;
|
|
||||||
import ru.gravit.launcher.hasher.HashedDir;
|
|
||||||
import ru.gravit.launcher.hasher.HashedEntry;
|
|
||||||
import ru.gravit.launcher.hasher.HashedFile;
|
|
||||||
import ru.gravit.launcher.profiles.ClientProfile;
|
|
||||||
import ru.gravit.launcher.profiles.PlayerProfile;
|
|
||||||
import ru.gravit.launcher.profiles.Texture;
|
|
||||||
import ru.gravit.launcher.request.*;
|
|
||||||
import ru.gravit.launcher.request.auth.AuthRequest;
|
|
||||||
import ru.gravit.launcher.request.auth.CheckServerRequest;
|
|
||||||
import ru.gravit.launcher.request.auth.JoinServerRequest;
|
|
||||||
import ru.gravit.launcher.request.auth.SetProfileRequest;
|
|
||||||
import ru.gravit.launcher.request.update.LauncherRequest;
|
|
||||||
import ru.gravit.launcher.request.update.ProfilesRequest;
|
|
||||||
import ru.gravit.launcher.request.update.UpdateRequest;
|
|
||||||
import ru.gravit.launcher.request.uuid.BatchProfileByUsernameRequest;
|
|
||||||
import ru.gravit.launcher.request.uuid.ProfileByUUIDRequest;
|
|
||||||
import ru.gravit.launcher.request.uuid.ProfileByUsernameRequest;
|
|
||||||
import ru.gravit.launcher.serialize.HInput;
|
|
||||||
import ru.gravit.launcher.serialize.HOutput;
|
|
||||||
import ru.gravit.launcher.serialize.signed.SignedBytesHolder;
|
|
||||||
import ru.gravit.launcher.serialize.signed.SignedObjectHolder;
|
|
||||||
import ru.gravit.launcher.serialize.stream.EnumSerializer;
|
|
||||||
import ru.gravit.launcher.serialize.stream.StreamObject;
|
|
||||||
import ru.gravit.utils.HTTPRequest;
|
|
||||||
import ru.gravit.utils.helper.*;
|
import ru.gravit.utils.helper.*;
|
||||||
|
|
||||||
import javax.script.*;
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
public class LauncherEngine {
|
public class LauncherEngine {
|
||||||
@LauncherAPI
|
|
||||||
public static void addLauncherClassBindings(Map<String, Object> bindings) {
|
|
||||||
bindings.put("LauncherClass", Launcher.class);
|
|
||||||
bindings.put("LauncherConfigClass", LauncherConfig.class);
|
|
||||||
bindings.put("HTTPRequestClass", HTTPRequest.class);
|
|
||||||
|
|
||||||
// Set client class bindings
|
|
||||||
bindings.put("PlayerProfileClass", PlayerProfile.class);
|
|
||||||
bindings.put("PlayerProfileTextureClass", Texture.class);
|
|
||||||
bindings.put("ClientProfileClass", ClientProfile.class);
|
|
||||||
bindings.put("ClientProfileVersionClass", ClientProfile.Version.class);
|
|
||||||
bindings.put("ClientLauncherClass", ClientLauncher.class);
|
|
||||||
bindings.put("ClientLauncherParamsClass", ClientLauncher.Params.class);
|
|
||||||
bindings.put("ServerPingerClass", ServerPinger.class);
|
|
||||||
|
|
||||||
// Set request class bindings
|
|
||||||
bindings.put("RequestClass", Request.class);
|
|
||||||
bindings.put("RequestTypeClass", RequestType.class);
|
|
||||||
bindings.put("RequestExceptionClass", RequestException.class);
|
|
||||||
bindings.put("CustomRequestClass", CustomRequest.class);
|
|
||||||
bindings.put("PingRequestClass", PingRequest.class);
|
|
||||||
bindings.put("AuthRequestClass", AuthRequest.class);
|
|
||||||
bindings.put("JoinServerRequestClass", JoinServerRequest.class);
|
|
||||||
bindings.put("CheckServerRequestClass", CheckServerRequest.class);
|
|
||||||
bindings.put("UpdateRequestClass", UpdateRequest.class);
|
|
||||||
bindings.put("LauncherRequestClass", LauncherRequest.class);
|
|
||||||
bindings.put("SetProfileRequestClass", SetProfileRequest.class);
|
|
||||||
bindings.put("ProfilesRequestClass", ProfilesRequest.class);
|
|
||||||
bindings.put("ProfileByUsernameRequestClass", ProfileByUsernameRequest.class);
|
|
||||||
bindings.put("ProfileByUUIDRequestClass", ProfileByUUIDRequest.class);
|
|
||||||
bindings.put("BatchProfileByUsernameRequestClass", BatchProfileByUsernameRequest.class);
|
|
||||||
|
|
||||||
// Set hasher class bindings
|
|
||||||
bindings.put("FileNameMatcherClass", FileNameMatcher.class);
|
|
||||||
bindings.put("HashedDirClass", HashedDir.class);
|
|
||||||
bindings.put("HashedFileClass", HashedFile.class);
|
|
||||||
bindings.put("HashedEntryTypeClass", HashedEntry.Type.class);
|
|
||||||
|
|
||||||
// Set serialization class bindings
|
|
||||||
bindings.put("HInputClass", HInput.class);
|
|
||||||
bindings.put("HOutputClass", HOutput.class);
|
|
||||||
bindings.put("StreamObjectClass", StreamObject.class);
|
|
||||||
bindings.put("StreamObjectAdapterClass", StreamObject.Adapter.class);
|
|
||||||
bindings.put("SignedBytesHolderClass", SignedBytesHolder.class);
|
|
||||||
bindings.put("SignedObjectHolderClass", SignedObjectHolder.class);
|
|
||||||
bindings.put("EnumSerializerClass", EnumSerializer.class);
|
|
||||||
|
|
||||||
// Set helper class bindings
|
|
||||||
bindings.put("CommonHelperClass", CommonHelper.class);
|
|
||||||
bindings.put("IOHelperClass", IOHelper.class);
|
|
||||||
bindings.put("EnvHelperClass", EnvHelper.class);
|
|
||||||
bindings.put("JVMHelperClass", JVMHelper.class);
|
|
||||||
bindings.put("JVMHelperOSClass", JVMHelper.OS.class);
|
|
||||||
bindings.put("LogHelperClass", LogHelper.class);
|
|
||||||
bindings.put("LogHelperOutputClass", LogHelper.Output.class);
|
|
||||||
bindings.put("SecurityHelperClass", SecurityHelper.class);
|
|
||||||
bindings.put("DigestAlgorithmClass", SecurityHelper.DigestAlgorithm.class);
|
|
||||||
bindings.put("VerifyHelperClass", VerifyHelper.class);
|
|
||||||
bindings.put("DirBridgeClass", DirBridge.class);
|
|
||||||
bindings.put("FunctionalBridgeClass", FunctionalBridge.class);
|
|
||||||
bindings.put("LauncherSettingsClass", LauncherSettings.class);
|
|
||||||
|
|
||||||
// Load JS API if available
|
|
||||||
try {
|
|
||||||
Class.forName("javafx.application.Application");
|
|
||||||
bindings.put("JSApplicationClass", JSApplication.class);
|
|
||||||
bindings.put("RingProgressIndicatorClass", RingProgressIndicator.class);
|
|
||||||
bindings.put("RingProgressIndicatorSkinClass", RingProgressIndicatorSkin.class);
|
|
||||||
bindings.put("CheckComboBoxClass", CheckComboBox.class);
|
|
||||||
bindings.put("CheckModelClass", CheckModel.class);
|
|
||||||
bindings.put("IndexedCheckModelClass", IndexedCheckModel.class);
|
|
||||||
bindings.put("CheckComboBoxSkinClass", CheckComboBoxSkin.class);
|
|
||||||
} catch (ClassNotFoundException ignored) {
|
|
||||||
LogHelper.warning("JavaFX API isn't available");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String... args) throws Throwable {
|
public static void main(String... args) throws Throwable {
|
||||||
JVMHelper.checkStackTrace(LauncherEngine.class);
|
JVMHelper.checkStackTrace(LauncherEngine.class);
|
||||||
|
@ -153,30 +43,13 @@ public static void initGson()
|
||||||
|
|
||||||
// Instance
|
// Instance
|
||||||
private final AtomicBoolean started = new AtomicBoolean(false);
|
private final AtomicBoolean started = new AtomicBoolean(false);
|
||||||
|
public RuntimeProvider runtimeProvider;
|
||||||
private final ScriptEngine engine = CommonHelper.newScriptEngine();
|
|
||||||
|
|
||||||
private LauncherEngine() {
|
private LauncherEngine() {
|
||||||
setScriptBindings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
|
||||||
public Object loadScript(String path) throws IOException, ScriptException {
|
|
||||||
URL url = Launcher.getResourceURL(path);
|
|
||||||
LogHelper.debug("Loading script: '%s'", url);
|
|
||||||
try (BufferedReader reader = IOHelper.newReader(url)) {
|
|
||||||
return engine.eval(reader, engine.getBindings(ScriptContext.ENGINE_SCOPE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setScriptBindings() {
|
|
||||||
LogHelper.info("Setting up script engine bindings");
|
|
||||||
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
|
||||||
bindings.put("launcher", this);
|
|
||||||
|
|
||||||
// Add launcher class bindings
|
|
||||||
addLauncherClassBindings(bindings);
|
|
||||||
}
|
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void start(String... args) throws Throwable {
|
public void start(String... args) throws Throwable {
|
||||||
|
@ -184,22 +57,19 @@ public void start(String... args) throws Throwable {
|
||||||
Launcher.modulesManager = new ClientModuleManager(this);
|
Launcher.modulesManager = new ClientModuleManager(this);
|
||||||
LauncherConfig.getAutogenConfig().initModules(); //INIT
|
LauncherConfig.getAutogenConfig().initModules(); //INIT
|
||||||
Launcher.modulesManager.preInitModules();
|
Launcher.modulesManager.preInitModules();
|
||||||
|
if(runtimeProvider == null) runtimeProvider = new JSRuntimeProvider();
|
||||||
|
runtimeProvider.init(false);
|
||||||
Objects.requireNonNull(args, "args");
|
Objects.requireNonNull(args, "args");
|
||||||
if (started.getAndSet(true))
|
if (started.getAndSet(true))
|
||||||
throw new IllegalStateException("Launcher has been already started");
|
throw new IllegalStateException("Launcher has been already started");
|
||||||
Launcher.modulesManager.initModules();
|
Launcher.modulesManager.initModules();
|
||||||
// Load init.js script
|
// Load init.js script
|
||||||
|
runtimeProvider.preLoad();
|
||||||
FunctionalBridge.worker = new RequestWorker();
|
FunctionalBridge.worker = new RequestWorker();
|
||||||
CommonHelper.newThread("FX Task Worker", true, FunctionalBridge.worker).start();
|
CommonHelper.newThread("FX Task Worker", true, FunctionalBridge.worker).start();
|
||||||
CommonHelper.newThread("GetHWID Thread",true, FunctionalBridge::getHWID).start();
|
CommonHelper.newThread("GetHWID Thread",true, FunctionalBridge::getHWID).start();
|
||||||
loadScript(Launcher.API_SCRIPT_FILE);
|
|
||||||
loadScript(Launcher.CONFIG_SCRIPT_FILE);
|
|
||||||
LogHelper.debug("Dir: %s", DirBridge.dir);
|
LogHelper.debug("Dir: %s", DirBridge.dir);
|
||||||
loadScript(Launcher.INIT_SCRIPT_FILE);
|
runtimeProvider.run(args);
|
||||||
LogHelper.info("Invoking start() function");
|
|
||||||
Invocable invoker = (Invocable) engine;
|
|
||||||
Launcher.modulesManager.postInitModules();
|
|
||||||
invoker.invokeFunction("start", (Object) args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LauncherEngine clientInstance() {
|
public static LauncherEngine clientInstance() {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import ru.gravit.launcher.*;
|
import ru.gravit.launcher.*;
|
||||||
|
import ru.gravit.launcher.gui.JSRuntimeProvider;
|
||||||
import ru.gravit.launcher.hasher.DirWatcher;
|
import ru.gravit.launcher.hasher.DirWatcher;
|
||||||
import ru.gravit.launcher.hasher.FileNameMatcher;
|
import ru.gravit.launcher.hasher.FileNameMatcher;
|
||||||
import ru.gravit.launcher.hasher.HashedDir;
|
import ru.gravit.launcher.hasher.HashedDir;
|
||||||
|
@ -405,18 +406,19 @@ public static Process launch(
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void main(String... args) throws Throwable {
|
public static void main(String... args) throws Throwable {
|
||||||
Launcher.modulesManager = new ClientModuleManager(null);
|
LauncherEngine engine = LauncherEngine.clientInstance();
|
||||||
|
Launcher.modulesManager = new ClientModuleManager(engine);
|
||||||
LauncherConfig.getAutogenConfig().initModules(); //INIT
|
LauncherConfig.getAutogenConfig().initModules(); //INIT
|
||||||
initGson();
|
initGson();
|
||||||
LauncherEngine engine = LauncherEngine.clientInstance();
|
|
||||||
engine.loadScript(Launcher.API_SCRIPT_FILE);
|
|
||||||
engine.loadScript(Launcher.CONFIG_SCRIPT_FILE);
|
|
||||||
Launcher.modulesManager.preInitModules();
|
Launcher.modulesManager.preInitModules();
|
||||||
checkJVMBitsAndVersion();
|
checkJVMBitsAndVersion();
|
||||||
JVMHelper.verifySystemProperties(ClientLauncher.class, true);
|
JVMHelper.verifySystemProperties(ClientLauncher.class, true);
|
||||||
EnvHelper.checkDangerousParams();
|
EnvHelper.checkDangerousParams();
|
||||||
JVMHelper.checkStackTrace(ClientLauncher.class);
|
JVMHelper.checkStackTrace(ClientLauncher.class);
|
||||||
LogHelper.printVersion("Client Launcher");
|
LogHelper.printVersion("Client Launcher");
|
||||||
|
if(engine.runtimeProvider == null) engine.runtimeProvider = new JSRuntimeProvider();
|
||||||
|
engine.runtimeProvider.init(true);
|
||||||
|
engine.runtimeProvider.preLoad();
|
||||||
// Read and delete params file
|
// Read and delete params file
|
||||||
LogHelper.debug("Reading ClientLauncher params");
|
LogHelper.debug("Reading ClientLauncher params");
|
||||||
Params params;
|
Params params;
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
package ru.gravit.launcher.gui;
|
||||||
|
|
||||||
|
import ru.gravit.launcher.JSApplication;
|
||||||
|
import ru.gravit.launcher.Launcher;
|
||||||
|
import ru.gravit.launcher.LauncherAPI;
|
||||||
|
import ru.gravit.launcher.LauncherConfig;
|
||||||
|
import ru.gravit.launcher.client.*;
|
||||||
|
import ru.gravit.launcher.gui.choosebox.CheckComboBox;
|
||||||
|
import ru.gravit.launcher.gui.choosebox.CheckComboBoxSkin;
|
||||||
|
import ru.gravit.launcher.gui.choosebox.CheckModel;
|
||||||
|
import ru.gravit.launcher.gui.choosebox.IndexedCheckModel;
|
||||||
|
import ru.gravit.launcher.gui.indicator.RingProgressIndicator;
|
||||||
|
import ru.gravit.launcher.gui.indicator.RingProgressIndicatorSkin;
|
||||||
|
import ru.gravit.launcher.hasher.FileNameMatcher;
|
||||||
|
import ru.gravit.launcher.hasher.HashedDir;
|
||||||
|
import ru.gravit.launcher.hasher.HashedEntry;
|
||||||
|
import ru.gravit.launcher.hasher.HashedFile;
|
||||||
|
import ru.gravit.launcher.profiles.ClientProfile;
|
||||||
|
import ru.gravit.launcher.profiles.PlayerProfile;
|
||||||
|
import ru.gravit.launcher.profiles.Texture;
|
||||||
|
import ru.gravit.launcher.request.*;
|
||||||
|
import ru.gravit.launcher.request.auth.AuthRequest;
|
||||||
|
import ru.gravit.launcher.request.auth.CheckServerRequest;
|
||||||
|
import ru.gravit.launcher.request.auth.JoinServerRequest;
|
||||||
|
import ru.gravit.launcher.request.auth.SetProfileRequest;
|
||||||
|
import ru.gravit.launcher.request.update.LauncherRequest;
|
||||||
|
import ru.gravit.launcher.request.update.ProfilesRequest;
|
||||||
|
import ru.gravit.launcher.request.update.UpdateRequest;
|
||||||
|
import ru.gravit.launcher.request.uuid.BatchProfileByUsernameRequest;
|
||||||
|
import ru.gravit.launcher.request.uuid.ProfileByUUIDRequest;
|
||||||
|
import ru.gravit.launcher.request.uuid.ProfileByUsernameRequest;
|
||||||
|
import ru.gravit.launcher.serialize.HInput;
|
||||||
|
import ru.gravit.launcher.serialize.HOutput;
|
||||||
|
import ru.gravit.launcher.serialize.signed.SignedBytesHolder;
|
||||||
|
import ru.gravit.launcher.serialize.signed.SignedObjectHolder;
|
||||||
|
import ru.gravit.launcher.serialize.stream.EnumSerializer;
|
||||||
|
import ru.gravit.launcher.serialize.stream.StreamObject;
|
||||||
|
import ru.gravit.utils.HTTPRequest;
|
||||||
|
import ru.gravit.utils.helper.*;
|
||||||
|
|
||||||
|
import javax.script.*;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class JSRuntimeProvider implements RuntimeProvider {
|
||||||
|
|
||||||
|
private final ScriptEngine engine = CommonHelper.newScriptEngine();
|
||||||
|
@LauncherAPI
|
||||||
|
public static void addLauncherClassBindings(Map<String, Object> bindings) {
|
||||||
|
bindings.put("LauncherClass", Launcher.class);
|
||||||
|
bindings.put("LauncherConfigClass", LauncherConfig.class);
|
||||||
|
bindings.put("HTTPRequestClass", HTTPRequest.class);
|
||||||
|
|
||||||
|
// Set client class bindings
|
||||||
|
bindings.put("PlayerProfileClass", PlayerProfile.class);
|
||||||
|
bindings.put("PlayerProfileTextureClass", Texture.class);
|
||||||
|
bindings.put("ClientProfileClass", ClientProfile.class);
|
||||||
|
bindings.put("ClientProfileVersionClass", ClientProfile.Version.class);
|
||||||
|
bindings.put("ClientLauncherClass", ClientLauncher.class);
|
||||||
|
bindings.put("ClientLauncherParamsClass", ClientLauncher.Params.class);
|
||||||
|
bindings.put("ServerPingerClass", ServerPinger.class);
|
||||||
|
|
||||||
|
// Set request class bindings
|
||||||
|
bindings.put("RequestClass", Request.class);
|
||||||
|
bindings.put("RequestTypeClass", RequestType.class);
|
||||||
|
bindings.put("RequestExceptionClass", RequestException.class);
|
||||||
|
bindings.put("CustomRequestClass", CustomRequest.class);
|
||||||
|
bindings.put("PingRequestClass", PingRequest.class);
|
||||||
|
bindings.put("AuthRequestClass", AuthRequest.class);
|
||||||
|
bindings.put("JoinServerRequestClass", JoinServerRequest.class);
|
||||||
|
bindings.put("CheckServerRequestClass", CheckServerRequest.class);
|
||||||
|
bindings.put("UpdateRequestClass", UpdateRequest.class);
|
||||||
|
bindings.put("LauncherRequestClass", LauncherRequest.class);
|
||||||
|
bindings.put("SetProfileRequestClass", SetProfileRequest.class);
|
||||||
|
bindings.put("ProfilesRequestClass", ProfilesRequest.class);
|
||||||
|
bindings.put("ProfileByUsernameRequestClass", ProfileByUsernameRequest.class);
|
||||||
|
bindings.put("ProfileByUUIDRequestClass", ProfileByUUIDRequest.class);
|
||||||
|
bindings.put("BatchProfileByUsernameRequestClass", BatchProfileByUsernameRequest.class);
|
||||||
|
|
||||||
|
// Set hasher class bindings
|
||||||
|
bindings.put("FileNameMatcherClass", FileNameMatcher.class);
|
||||||
|
bindings.put("HashedDirClass", HashedDir.class);
|
||||||
|
bindings.put("HashedFileClass", HashedFile.class);
|
||||||
|
bindings.put("HashedEntryTypeClass", HashedEntry.Type.class);
|
||||||
|
|
||||||
|
// Set serialization class bindings
|
||||||
|
bindings.put("HInputClass", HInput.class);
|
||||||
|
bindings.put("HOutputClass", HOutput.class);
|
||||||
|
bindings.put("StreamObjectClass", StreamObject.class);
|
||||||
|
bindings.put("StreamObjectAdapterClass", StreamObject.Adapter.class);
|
||||||
|
bindings.put("SignedBytesHolderClass", SignedBytesHolder.class);
|
||||||
|
bindings.put("SignedObjectHolderClass", SignedObjectHolder.class);
|
||||||
|
bindings.put("EnumSerializerClass", EnumSerializer.class);
|
||||||
|
|
||||||
|
// Set helper class bindings
|
||||||
|
bindings.put("CommonHelperClass", CommonHelper.class);
|
||||||
|
bindings.put("IOHelperClass", IOHelper.class);
|
||||||
|
bindings.put("EnvHelperClass", EnvHelper.class);
|
||||||
|
bindings.put("JVMHelperClass", JVMHelper.class);
|
||||||
|
bindings.put("JVMHelperOSClass", JVMHelper.OS.class);
|
||||||
|
bindings.put("LogHelperClass", LogHelper.class);
|
||||||
|
bindings.put("LogHelperOutputClass", LogHelper.Output.class);
|
||||||
|
bindings.put("SecurityHelperClass", SecurityHelper.class);
|
||||||
|
bindings.put("DigestAlgorithmClass", SecurityHelper.DigestAlgorithm.class);
|
||||||
|
bindings.put("VerifyHelperClass", VerifyHelper.class);
|
||||||
|
bindings.put("DirBridgeClass", DirBridge.class);
|
||||||
|
bindings.put("FunctionalBridgeClass", FunctionalBridge.class);
|
||||||
|
bindings.put("LauncherSettingsClass", LauncherSettings.class);
|
||||||
|
|
||||||
|
// Load JS API if available
|
||||||
|
try {
|
||||||
|
Class.forName("javafx.application.Application");
|
||||||
|
bindings.put("JSApplicationClass", JSApplication.class);
|
||||||
|
bindings.put("RingProgressIndicatorClass", RingProgressIndicator.class);
|
||||||
|
bindings.put("RingProgressIndicatorSkinClass", RingProgressIndicatorSkin.class);
|
||||||
|
bindings.put("CheckComboBoxClass", CheckComboBox.class);
|
||||||
|
bindings.put("CheckModelClass", CheckModel.class);
|
||||||
|
bindings.put("IndexedCheckModelClass", IndexedCheckModel.class);
|
||||||
|
bindings.put("CheckComboBoxSkinClass", CheckComboBoxSkin.class);
|
||||||
|
} catch (ClassNotFoundException ignored) {
|
||||||
|
LogHelper.warning("JavaFX API isn't available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@LauncherAPI
|
||||||
|
public Object loadScript(String path) throws IOException, ScriptException {
|
||||||
|
URL url = Launcher.getResourceURL(path);
|
||||||
|
LogHelper.debug("Loading script: '%s'", url);
|
||||||
|
try (BufferedReader reader = IOHelper.newReader(url)) {
|
||||||
|
return engine.eval(reader, engine.getBindings(ScriptContext.ENGINE_SCOPE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setScriptBindings() {
|
||||||
|
LogHelper.info("Setting up script engine bindings");
|
||||||
|
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||||
|
bindings.put("launcher", this);
|
||||||
|
|
||||||
|
// Add launcher class bindings
|
||||||
|
JSRuntimeProvider.addLauncherClassBindings(bindings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(String[] args) throws ScriptException, NoSuchMethodException, IOException {
|
||||||
|
loadScript(Launcher.INIT_SCRIPT_FILE);
|
||||||
|
LogHelper.info("Invoking start() function");
|
||||||
|
Invocable invoker = (Invocable) engine;
|
||||||
|
Launcher.modulesManager.postInitModules();
|
||||||
|
invoker.invokeFunction("start", (Object) args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void preLoad() throws IOException, ScriptException {
|
||||||
|
loadScript(Launcher.API_SCRIPT_FILE);
|
||||||
|
loadScript(Launcher.CONFIG_SCRIPT_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(boolean clientInstance) {
|
||||||
|
setScriptBindings();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ru.gravit.launcher.gui;
|
||||||
|
|
||||||
|
public interface RuntimeProvider {
|
||||||
|
void run(String[] args) throws Exception;
|
||||||
|
void preLoad() throws Exception;
|
||||||
|
void init(boolean clientInstance) throws Exception;
|
||||||
|
}
|
Loading…
Reference in a new issue