X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=NativeLauncher%2Flauncher%2Fmain.cc;h=4e2222d40939268b936f05651d201723b53e455a;hb=e430c6ace7708c84d5b33113d1901c68cb3edf9d;hp=c23e16fd903cf87e9b59067b92f088f9a826bd7c;hpb=ef1576a92d02831b3c2713fe8fed6bba63679ec4;p=platform%2Fcore%2Fdotnet%2Flauncher.git diff --git a/NativeLauncher/launcher/main.cc b/NativeLauncher/launcher/main.cc index c23e16f..4e2222d 100644 --- a/NativeLauncher/launcher/main.cc +++ b/NativeLauncher/launcher/main.cc @@ -25,104 +25,147 @@ #include #include #include +#include +#include -#define __XSTR(x) #x -#define __STR(x) __XSTR(x) +// By the specification, application id must be shorter than 50 character. +// To add margin, set CMD_LINE_SIZE to 64. (padding size is included) +#define APPID_MAX_LENGTH 52 -#ifndef VERSION -#define LAUNCHER_VERSION_STR "-Unknown-" -#else -#define LAUNCHER_VERSION_STR __STR(VERSION) -#endif - -static std::string VersionOption("--version"); static std::string StandaloneOption("--standalone"); +static std::string PaddingOption("--PADDING_TO_CHANGE_CMDLINE"); -int main(int argc, char *argv[]) +extern "C" int realMain(int argc, char *argv[], const char* mode) { int i; - bool standalone = false; - const char* standalonePath = nullptr; + bool standaloneMode = false; + char* standalonePath = nullptr; + bool corerunMode = false; + bool paddingExist = false; std::vector vargs; // start index 1 to avoid passing executable name "dotnet-launcher" as a parameter - for (i = 1; i argc-1) { + for (i = 1; i < argc; i++) { + if (StandaloneOption.compare(argv[i]) == 0) { + standaloneMode = true; + + if (i > argc - 1) { fprintf(stderr, "Assembly path must be after \"--standalone\" option\n"); return 1; } i++; standalonePath = argv[i]; + } else if (PaddingOption.compare(argv[i]) == 0) { + paddingExist = true; } else { vargs.push_back(argv[i]); } } - using tizen::runtime::LauncherInterface; + if (isManagedAssembly(argv[1]) || isNativeImage(argv[1])) { + corerunMode = true; + } + using tizen::runtime::Launchpad; using tizen::runtime::AppInfo; - std::unique_ptr runtime; - using tizen::runtime::dotnetcore::CoreRuntime; - std::unique_ptr coreRuntime(new CoreRuntime()); - runtime = std::move(coreRuntime); - if (standalone) { - _DBG("##### Run it standalone #########"); - const char* appId = getenv("AUL_APPID"); - _DBG("AUL_APPID : %s", appId); + std::unique_ptr runtime(new CoreRuntime(mode)); + + // Intiailize ecore first (signal handlers, etc.) before runtime init. + ecore_init(); + + if (corerunMode) { + _INFO("##### Run in corerun mode #####"); + char appId[APPID_MAX_LENGTH] = {0,}; std::string appRoot; - if (appId != nullptr) { + snprintf(appId, 16, "%s", "dotnet-launcher"); + appRoot = baseName(argv[1]); + + if (runtime->initialize(true) != 0) { + _ERR("Failed to initialize"); + return 1; + } + + int argsLen = vargs.size() - 1; + char** args = &vargs[1]; + if (runtime->launch(appId, appRoot.c_str(), argv[1], argsLen, args)) { + _ERR("Failed to launch"); + return 1; + } + } else if (standaloneMode) { + _INFO("##### Run in standalone mode #####"); + char appId[APPID_MAX_LENGTH] = {0,}; + std::string appRoot; + if (AUL_R_OK == aul_app_get_appid_bypid(getpid(), appId, sizeof(appId))) { const char* appRootPath = aul_get_app_root_path(); if (appRootPath != nullptr) appRoot = std::string(appRootPath); } else { - appId = "dotnet-launcher"; + // If appId is not set, it is executed directly by cmdline. + // In this case, appRoot is passed as an argument. + snprintf(appId, 16, "%s", "dotnet-launcher"); + appRoot = baseName(baseName(standalonePath)); } + _INFO("AUL_APPID : %s", appId); - if (appRoot.empty()) - appRoot = baseName(baseName(standalonePath)); if (runtime->initialize(true) != 0) { _ERR("Failed to initialize"); return 1; } + // change cmdline from dotnet-launcher to executable path + int cmdlineSize = paddingExist ? APPID_MAX_LENGTH : APPID_MAX_LENGTH - PaddingOption.length(); + memset(argv[0], '\0', cmdlineSize); + snprintf(argv[0], cmdlineSize, "%s", appId); + int argsLen = vargs.size(); char** args = &vargs[0]; if (runtime->launch(appId, appRoot.c_str(), standalonePath, argsLen, args)) { _ERR("Failed to launch"); - return 0; + return 1; } } else { + // change cmdline from dotnet-hydra-launcher to dotnet-launcher + if (strcmp(argv[0], "/usr/bin/dotnet-hydra-launcher") == 0) { + memset(argv[0], '\0', strlen("/usr/bin/dotnet-hydra-launcher")); + snprintf(argv[0], strlen("/usr/bin/dotnet-launcher") + 1, "/usr/bin/dotnet-launcher"); + } + Launchpad.onCreate = [&runtime]() { if (runtime->initialize(false) != 0) _ERR("Failed to initialized"); else - _DBG("Success to initialized"); + _INFO("Success to initialized"); }; Launchpad.onTerminate = [&runtime](const AppInfo& appInfo, int argc, char** argv) { - _DBG("terminated with app path : %s", appInfo.path.c_str()); - _DBG("appId : %s", appInfo.id.c_str()); - _DBG("pkg : %s", appInfo.pkg.c_str()); - _DBG("type : %s", appInfo.type.c_str()); - - // The launchpad pass the name of exe file to the first argument. - // For the C# spec, we have to skip this first argument. - - if (runtime->launch(appInfo.id.c_str(), appInfo.root.c_str(), appInfo.path.c_str(), argc-1, argv+1)) - _ERR("Failed to launch"); + _INFO("launch request with app path : %s", appInfo.path.c_str()); + _INFO("appId : %s", appInfo.id.c_str()); + _INFO("pkg : %s", appInfo.pkg.c_str()); + + // aul_get_app_root_path() can return NULL for error case. + if (appInfo.root.empty()) { + _ERR("Failed to launch. root path is set to NULL"); + } else { + // The launchpad pass the name of exe file to the first argument. + // For the C# spec, we have to skip this first argument. + if (runtime->launch(appInfo.id.c_str(), appInfo.root.c_str(), appInfo.path.c_str(), argc-1, argv+1)) + _ERR("Failed to launch"); + } }; - Launchpad.loaderMain(argc, argv); + int ret = Launchpad.loaderMain(argc, argv); + if (ret < 0) { + _ERR("fail to start loaderMain. candidate process is not created."); + return 1; + } } - runtime->dispose(); return 0; } + +int main(int argc, char *argv[]) +{ + return realMain(argc, argv, "default"); +}