Remove dependency from Elementary accepted/tizen/5.0/unified/20181214.065308 submit/tizen/20181213.064828 submit/tizen_5.0/20181213.064205
authorWoongsuk Cho <ws77.cho@samsung.com>
Fri, 7 Dec 2018 02:07:04 +0000 (11:07 +0900)
committer조웅석/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <ws77.cho@samsung.com>
Wed, 12 Dec 2018 22:18:36 +0000 (07:18 +0900)
To use dotnet-launcher on the headless device (device without a graphical user interface),
remove build and runtime dependency from Elementary.

Elementary is used in ther launcher.cc file to precreate elm_window for enhancing application startup time.
To remove dependency, load elementary library with dlopen.
If libelementary.so.1 file doesnot exist, precreation is skipped.

NativeLauncher/CMakeLists.txt
NativeLauncher/launcher/launcher.cc
packaging/dotnet-launcher.spec

index 600f4a6..5b98b24 100644 (file)
@@ -4,7 +4,7 @@ PROJECT("dotnet-tools")
 MESSAGE("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
 
 INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(${PROJECT_NAME} REQUIRED aul pkgmgr-info pkgmgr-installer dlog ecore bundle dlog liblaunchpad elementary glib-2.0 libsmack capi-appfw-app-common storage)
+PKG_CHECK_MODULES(${PROJECT_NAME} REQUIRED aul pkgmgr-info pkgmgr-installer dlog ecore bundle dlog liblaunchpad glib-2.0 libsmack capi-appfw-app-common storage)
 
 FOREACH(flag ${${PROJECT_NAME}_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
@@ -73,7 +73,7 @@ SET(${DOTNET_LAUNCHER_UTIL}_SOURCE_FILES
 )
 ADD_LIBRARY(${DOTNET_LAUNCHER_UTIL} SHARED ${${DOTNET_LAUNCHER_UTIL}_SOURCE_FILES})
 SET_TARGET_PROPERTIES(${DOTNET_LAUNCHER_UTIL} PROPERTIES COMPILE_FLAGS "-fPIC")
-TARGET_LINK_LIBRARIES(${DOTNET_LAUNCHER_UTIL} ${${PROJECT_NAME}_LDFLAGS})
+TARGET_LINK_LIBRARIES(${DOTNET_LAUNCHER_UTIL} ${${PROJECT_NAME}_LDFLAGS} "-ldl")
 
 SET(DOTNET_LAUNCHER "dotnet-launcher")
 SET(${DOTNET_LAUNCHER}_SOURCE_FILES
index 04eef9b..0bec483 100644 (file)
@@ -21,7 +21,6 @@
 #include <aul.h>
 
 #include <Ecore.h>
-#include <Elementary.h>
 #include <bundle_internal.h>
 
 #include <map>
@@ -42,7 +41,6 @@ struct FdHandler {
 
 static int __argc;
 static char **__argv;
-static Evas_Object *__win;
 
 class LaunchpadAdapterImpl : public LaunchpadAdapter
 {
@@ -120,26 +118,62 @@ static void fdRemove(void *data, int fd)
        }
 }
 
+// To run dotnet-launcher on the headless device, remove build dependency from EFL.
+#define ELEMENTARY_PATH "/usr/lib/libelementary.so.1"
+static void* __win;
+typedef int (*elm_init_ptr)(int argc, char **argv);
+typedef void (*elm_config_accel_preference_set_ptr)(const char *pref);
+typedef void* (*elm_win_add_ptr)(void* parent, const char* name, int type);
+typedef void (*elm_win_precreated_object_set_ptr)(void* win);
+
 static void preCreateWindow(bundle *extra, int type, void *userData)
 {
-       int elmInitCnt = 0;
-
-       // Precreate window
-       elmInitCnt = elm_init(__argc, __argv);
-       if (!elmInitCnt) {
-               _ERR("[candidate] elm_init() failed");
+       struct stat sb;
+       if (stat(ELEMENTARY_PATH, &sb) != 0) {
+               _ERR("[candidate] libelememantary is not exist. skip precreation");
                return;
        }
 
-       elm_config_accel_preference_set("hw");
+       int elmInitCnt = 0;
+       void* handle = nullptr;
+       elm_init_ptr elm_init = nullptr;
+       elm_config_accel_preference_set_ptr elm_config_accel_preference_set = nullptr;
+       elm_win_add_ptr elm_win_add = nullptr;
+       elm_win_precreated_object_set_ptr elm_win_precreated_object_set = nullptr;
+
+       handle = dlopen(ELEMENTARY_PATH, RTLD_NOW | RTLD_GLOBAL);
+       if (handle) {
+               elm_init = (elm_init_ptr)dlsym(handle, "elm_init");
+               if (elm_init) {
+                       elmInitCnt = elm_init(__argc, __argv);
+
+                       if (!elmInitCnt) {
+                               _ERR("[candidate] elm_init() failed");
+                               return;
+                       }
+               }
 
-       __win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC);
-       if (__win == NULL) {
-               _ERR("[candidate] elm_win_add() failed");
-               return;
-       }
+               elm_config_accel_preference_set = (elm_config_accel_preference_set_ptr)dlsym(handle, "elm_config_accel_preference_set");
+               if (elm_config_accel_preference_set) {
+                       elm_config_accel_preference_set("hw");
+               }
 
-       elm_win_precreated_object_set(__win);
+               elm_win_add = (elm_win_add_ptr)dlsym(handle, "elm_win_add");
+               if (elm_win_add) {
+                       // enum value of "ELM_WIN_BASIC" is 0
+                       __win = elm_win_add(NULL, "package_name", 0);
+                       if (__win == NULL) {
+                               _ERR("[candidate] elm_win_add() failed");
+                               return;
+                       }
+               }
+
+               elm_win_precreated_object_set = (elm_win_precreated_object_set_ptr)dlsym(handle, "elm_win_precreated_object_set");
+               if (elm_win_precreated_object_set) {
+                       elm_win_precreated_object_set(__win);
+               }
+               _INFO("elm window precreation is done");
+       }
 }
 
 int LaunchpadAdapterImpl::loaderMain(int argc, char* argv[])
index bfe292b..1c4f4a4 100644 (file)
@@ -15,7 +15,6 @@ BuildRequires: pkgconfig(ecore)
 BuildRequires: pkgconfig(liblaunchpad)
 BuildRequires: pkgconfig(pkgmgr-info)
 BuildRequires: pkgconfig(pkgmgr-installer)
-BuildRequires: pkgconfig(elementary)
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(libsmack)
 BuildRequires: pkgconfig(capi-appfw-app-common)