2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <launchpad.h>
24 #include <Elementary.h>
25 #include <bundle_internal.h>
39 Ecore_Fd_Handler *handler;
40 loader_receiver_cb receiver;
45 static Evas_Object *__win;
47 class LaunchpadAdapterImpl : public LaunchpadAdapter
50 LaunchpadAdapterImpl() :
56 void loaderMain(int argc, char* argv[]) override;
58 std::map<int, FdHandler> handlers;
62 loader_lifecycle_callback_s callbacks;
63 loader_adapter_s adapter;
64 LauncherInterface* launcher;
66 std::string __launchPath;
69 LaunchpadAdapterImpl LaunchpadImpl;
70 LaunchpadAdapter& Launchpad = LaunchpadImpl;
72 #define WITH_SELF(data) \
73 LaunchpadAdapterImpl* self = static_cast<LaunchpadAdapterImpl*>(data); \
74 if (self == nullptr) \
75 _ERR("No LaunchpadImplData"); \
78 static Eina_Bool fdHandler(void *data, Ecore_Fd_Handler* handler)
81 int fd = ecore_main_fd_handler_fd_get(handler);
83 _ERR("Failed to get the Ecore FD");
87 if (ecore_main_fd_handler_active_get(handler, ECORE_FD_READ)) {
88 if (self->handlers.find(fd) != self->handlers.end())
89 self->handlers[fd].receiver(fd);
90 } else if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR)) {
91 _ERR("Ecore FD Handler Have Error");
97 return ECORE_CALLBACK_CANCEL;
100 static void fdAdd(void *data, int fd, loader_receiver_cb receiver)
102 Ecore_Fd_Handler* handler = ecore_main_fd_handler_add(fd,
103 static_cast<Ecore_Fd_Handler_Flags>(ECORE_FD_READ | ECORE_FD_ERROR),
104 fdHandler, data, nullptr, nullptr);
105 if (handler == nullptr) {
106 _ERR("Failed to add a FD handler to ecore main loop");
110 self->handlers[fd] = {handler, receiver};
114 static void fdRemove(void *data, int fd)
117 if (self->handlers.find(fd) != self->handlers.end()) {
118 Ecore_Fd_Handler* handler = self->handlers[fd].handler;
119 ecore_main_fd_handler_del(handler);
120 self->handlers.erase(fd);
125 static void preloadLibsAndWindow(bundle *extra, int type, void *userData)
128 const char **soArray;
133 // Preload native libraries
135 _DBG("No extra data");
139 soArray = bundle_get_str_array(extra, "preload", &len);
144 for (i = 0; i < len; i++) {
145 handle = dlopen(soArray[i], RTLD_NOW);
146 _DBG("preload %s# - handle : %x", soArray[i], handle);
150 elmInitCnt = elm_init(__argc, __argv);
151 _DBG("[candidate] elm init, returned: %d", elmInitCnt);
153 elm_config_accel_preference_set("hw");
155 __win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC);
157 _DBG("[candidate] elm_win_add() failed");
161 elm_win_precreated_object_set(__win);
164 void LaunchpadAdapterImpl::loaderMain(int argc, char* argv[])
168 callbacks.create = [](bundle *extra, int type, void *userData) {
170 preloadLibsAndWindow(extra, type, userData);
171 WITH_SELF(userData) {
172 if (self->onCreate != nullptr)
176 callbacks.launch = [](int argc, char** argv, const char* appPath,
177 const char* appId, const char* pkgId,
178 const char* pkgType, void* userData) -> int {
179 WITH_SELF(userData) {
180 self->appInfo.root = std::string(aul_get_app_root_path());
181 self->appInfo.path = appPath;
182 self->appInfo.id = appId;
183 self->appInfo.pkg = pkgId;
184 self->appInfo.type = pkgType;
185 if (self->onLaunch != nullptr)
186 self->onLaunch(self->appInfo, argc, argv);
191 callbacks.terminate = [](int argc, char **argv, void* userData) -> int {
193 WITH_SELF(userData) {
194 if (self->onTerminate != nullptr)
195 self->onTerminate(self->appInfo, argc, argv);
200 adapter.loop_begin = [](void *data) {
201 ecore_main_loop_begin();
204 adapter.loop_quit = [](void *data) {
205 ecore_main_loop_quit();
207 adapter.add_fd = fdAdd;
208 adapter.remove_fd = fdRemove;
210 _DBG("launchpad_loader_main is start");
211 int r = launchpad_loader_main(argc, argv, &(this->callbacks), &(this->adapter), this);
212 _DBG("launchpad_loader_main is finished with [%d]", r);
217 } // namespace runtime