// // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved // LICENSE: Atomic Game Engine Editor and Tools EULA // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for // license information: https://github.com/AtomicGameEngine/AtomicGameEngine // #include #include #include #include #include #include #include #include "NETRunApp.h" DEFINE_APPLICATION_MAIN(Atomic::NETRunApp) namespace Atomic { NETRunApp::NETRunApp(Context* context) : Application(context) { } NETRunApp::~NETRunApp() { } void NETRunApp::Setup() { String coreCLRAbsPath; String execAssemblyPath; String tpaPaths; const Vector& arguments = GetArguments(); for (unsigned i = 0; i < arguments.Size(); ++i) { if (arguments[i].Length() > 1) { String argument = arguments[i].ToLower(); String value = i + 1 < arguments.Size() ? arguments[i + 1] : String::EMPTY; if (argument == "--coreclr-abspath") { if (!value.Length()) ErrorExit("Unable to parse --coreclr-abspath"); coreCLRAbsPath = AddTrailingSlash(value); } else if (argument == "--exec-assembly") { if (!value.Length()) ErrorExit("Unable to parse --exec-assembly"); execAssemblyPath = value; } else if (argument == "--tpa-paths") { if (!value.Length()) ErrorExit("Unable to parse --tpa-paths"); tpaPaths = AddTrailingSlash(value); } } } if (!coreCLRAbsPath.Length()) ErrorExit("Unable to parse --coreclr-abspath"); if (!execAssemblyPath.Length()) ErrorExit("Unable to parse --exec-assembly"); if (!tpaPaths.Length()) ErrorExit("Unable to parse --tpa-paths"); // Parse assembly String pathName, fileName, ext; SplitPath(execAssemblyPath, pathName, fileName, ext); // this needs to be full path to assembly assemblyToExecute_ = execAssemblyPath; NETHost::SetCoreCLRFilesAbsPath(coreCLRAbsPath); NETHost::SetCoreCLRTPAPaths(tpaPaths); NETHost::SetCoreCLRAssemblyLoadPaths(pathName); // Instantiate and register the AtomicNET subsystem SharedPtr netCore (new NETCore(context_)); context_->RegisterSubsystem(netCore); String netCoreErrorMsg; if (!netCore->Initialize(netCoreErrorMsg)) { ErrorExit(ToString("NetCore: Unable to initialize! %s", netCoreErrorMsg.CString())); } engineParameters_["Headless"] = true; engineParameters_["LogLevel"] = LOG_INFO; // no default resources (will be initialized later) engineParameters_["ResourcePaths"] = ""; } void NETRunApp::Start() { Application::Start(); NETCore* netCore = GetSubsystem(); assemblyArgs_.Push(assemblyToExecute_); assemblyArgs_.Push("--help"); netCore->ExecAssembly(assemblyToExecute_, assemblyArgs_); GetSubsystem()->Exit(); } void NETRunApp::Stop() { Application::Stop(); } void NETRunApp::ErrorExit(const String& message) { engine_->Exit(); // Close the rendering window exitCode_ = EXIT_FAILURE; // Only for WIN32, otherwise the error messages would be double posted on Mac OS X and Linux platforms if (!message.Length()) { #ifdef WIN32 Atomic::ErrorExit(startupErrors_.Length() ? startupErrors_ : "Application has been terminated due to unexpected error.", exitCode_); #endif } else Atomic::ErrorExit(message, exitCode_); } }