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>
40 Ecore_Fd_Handler *handler;
41 loader_receiver_cb receiver;
46 static Evas_Object *__win;
47 static Evas_Object *__bg;
48 static Evas_Object *__conform;
50 class LaunchpadAdapterImpl : public LaunchpadAdapter
53 LaunchpadAdapterImpl() : isLaunched(false) { }
54 void LoaderMain(int argc, char* argv[]) override;
56 std::map<int, FdHandler> Handlers;
60 loader_lifecycle_callback_s callbacks;
61 loader_adapter_s adapter;
62 LauncherInterface* launcher;
64 std::string launchPath;
67 LaunchpadAdapterImpl LaunchpadImpl;
68 LaunchpadAdapter& Launchpad = LaunchpadImpl;
70 #define WITH_SELF(data) \
71 LaunchpadAdapterImpl* self = static_cast<LaunchpadAdapterImpl*>(data); \
72 if (self == nullptr) \
74 _ERR("No LaunchpadImplData"); \
77 static Eina_Bool Fd_Handler(void *data, Ecore_Fd_Handler* handler)
81 int fd = ecore_main_fd_handler_fd_get(handler);
84 _ERR("Failed to get the Ecore FD");
88 if (ecore_main_fd_handler_active_get(handler, ECORE_FD_READ))
90 if (self->Handlers.find(fd) != self->Handlers.end())
92 self->Handlers[fd].receiver(fd);
95 else if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR))
97 _ERR("Ecore FD Handler Have Error");
103 return ECORE_CALLBACK_CANCEL;
106 static void Fd_Add(void *data, int fd, loader_receiver_cb receiver)
108 Ecore_Fd_Handler* handler = ecore_main_fd_handler_add(fd,
109 static_cast<Ecore_Fd_Handler_Flags>(ECORE_FD_READ | ECORE_FD_ERROR),
110 Fd_Handler, data, nullptr, nullptr);
111 if (handler == nullptr)
113 _ERR("Failed to add a FD handler to ecore main loop");
119 self->Handlers[fd] = {handler, receiver};
123 static void Fd_Remove(void *data, int fd)
127 if (self->Handlers.find(fd) != self->Handlers.end())
129 Ecore_Fd_Handler* handler = self->Handlers[fd].handler;
130 ecore_main_fd_handler_del(handler);
131 self->Handlers.erase(fd);
137 static void PreloadLibsAndWindow(bundle *extra, int type, void *user_data)
139 int elm_init_cnt = 0;
140 const char **so_array;
145 // Preload native libraries
147 _DBG("No extra data");
151 so_array = bundle_get_str_array(extra, "preload", &len);
156 for (i = 0; i < len; i++) {
157 handle = dlopen(so_array[i], RTLD_NOW);
158 _DBG("preload %s# - handle : %x\n", so_array[i], handle);
162 elm_init_cnt = elm_init(__argc, __argv);
163 _DBG("[candidate] elm init, returned: %d", elm_init_cnt);
165 elm_config_accel_preference_set("hw");
167 __win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC);
169 _DBG("[candidate] elm_win_add() failed");
173 elm_win_precreated_object_set(__win);
176 void LaunchpadAdapterImpl::LoaderMain(int argc, char* argv[])
180 callbacks.create = [](bundle *extra, int type, void *user_data)
183 PreloadLibsAndWindow(extra, type, user_data);
186 if (self->OnCreate != nullptr)
190 callbacks.launch = [](int argc, char** argv, const char* app_path,
191 const char* appid, const char* pkgid,
192 const char* pkg_type, void* user_data) -> int
196 self->appinfo.root = std::string(aul_get_app_root_path());
197 self->appinfo.path = app_path;
198 self->appinfo.id = appid;
199 self->appinfo.pkg = pkgid;
200 self->appinfo.type = pkg_type;
201 if (self->OnLaunch != nullptr)
202 self->OnLaunch(self->appinfo, argc, argv);
207 callbacks.terminate = [](int argc, char **argv, void* user_data) -> int
212 if (self->OnTerminate != nullptr)
213 self->OnTerminate(self->appinfo, argc, argv);
218 adapter.loop_begin = [](void *data)
220 ecore_main_loop_begin();
223 adapter.loop_quit = [](void *data)
225 ecore_main_loop_quit();
227 adapter.add_fd = Fd_Add;
228 adapter.remove_fd = Fd_Remove;
230 _DBG("launchpad_loader_main is start");
231 int r = launchpad_loader_main(argc, argv, &(this->callbacks), &(this->adapter), this);
232 _DBG("launchpad_loader_main is finished with [%d]", r);
237 } // namespace runtime