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;
48 class LaunchpadAdapterImpl : public LaunchpadAdapter
51 LaunchpadAdapterImpl() : isLaunched(false) { }
52 void LoaderMain(int argc, char* argv[]) override;
54 std::map<int, FdHandler> Handlers;
58 loader_lifecycle_callback_s callbacks;
59 loader_adapter_s adapter;
60 LauncherInterface* launcher;
62 std::string launchPath;
65 LaunchpadAdapterImpl LaunchpadImpl;
66 LaunchpadAdapter& Launchpad = LaunchpadImpl;
68 #define WITH_SELF(data) \
69 LaunchpadAdapterImpl* self = static_cast<LaunchpadAdapterImpl*>(data); \
70 if (self == nullptr) \
72 _ERR("No LaunchpadImplData"); \
75 static Eina_Bool Fd_Handler(void *data, Ecore_Fd_Handler* handler)
79 int fd = ecore_main_fd_handler_fd_get(handler);
82 _ERR("Failed to get the Ecore FD");
86 if (ecore_main_fd_handler_active_get(handler, ECORE_FD_READ))
88 if (self->Handlers.find(fd) != self->Handlers.end())
90 self->Handlers[fd].receiver(fd);
93 else if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR))
95 _ERR("Ecore FD Handler Have Error");
101 return ECORE_CALLBACK_CANCEL;
104 static void Fd_Add(void *data, int fd, loader_receiver_cb receiver)
106 Ecore_Fd_Handler* handler = ecore_main_fd_handler_add(fd,
107 static_cast<Ecore_Fd_Handler_Flags>(ECORE_FD_READ | ECORE_FD_ERROR),
108 Fd_Handler, data, nullptr, nullptr);
109 if (handler == nullptr)
111 _ERR("Failed to add a FD handler to ecore main loop");
117 self->Handlers[fd] = {handler, receiver};
121 static void Fd_Remove(void *data, int fd)
125 if (self->Handlers.find(fd) != self->Handlers.end())
127 Ecore_Fd_Handler* handler = self->Handlers[fd].handler;
128 ecore_main_fd_handler_del(handler);
129 self->Handlers.erase(fd);
135 static void PreloadLibsAndWindow(bundle *extra, int type, void *user_data)
137 int elm_init_cnt = 0;
138 const char **so_array;
143 // Preload native libraries
145 _DBG("No extra data");
149 so_array = bundle_get_str_array(extra, "preload", &len);
154 for (i = 0; i < len; i++) {
155 handle = dlopen(so_array[i], RTLD_NOW);
156 _DBG("preload %s# - handle : %x", so_array[i], handle);
160 elm_init_cnt = elm_init(__argc, __argv);
161 _DBG("[candidate] elm init, returned: %d", elm_init_cnt);
163 elm_config_accel_preference_set("hw");
165 __win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC);
167 _DBG("[candidate] elm_win_add() failed");
171 elm_win_precreated_object_set(__win);
174 void LaunchpadAdapterImpl::LoaderMain(int argc, char* argv[])
178 callbacks.create = [](bundle *extra, int type, void *user_data)
181 PreloadLibsAndWindow(extra, type, user_data);
184 if (self->OnCreate != nullptr)
188 callbacks.launch = [](int argc, char** argv, const char* app_path,
189 const char* appid, const char* pkgid,
190 const char* pkg_type, void* user_data) -> int
194 self->appinfo.root = std::string(aul_get_app_root_path());
195 self->appinfo.path = app_path;
196 self->appinfo.id = appid;
197 self->appinfo.pkg = pkgid;
198 self->appinfo.type = pkg_type;
199 if (self->OnLaunch != nullptr)
200 self->OnLaunch(self->appinfo, argc, argv);
205 callbacks.terminate = [](int argc, char **argv, void* user_data) -> int
210 if (self->OnTerminate != nullptr)
211 self->OnTerminate(self->appinfo, argc, argv);
216 adapter.loop_begin = [](void *data)
218 ecore_main_loop_begin();
221 adapter.loop_quit = [](void *data)
223 ecore_main_loop_quit();
225 adapter.add_fd = Fd_Add;
226 adapter.remove_fd = Fd_Remove;
228 _DBG("launchpad_loader_main is start");
229 int r = launchpad_loader_main(argc, argv, &(this->callbacks), &(this->adapter), this);
230 _DBG("launchpad_loader_main is finished with [%d]", r);
235 } // namespace runtime