2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #include "ApplicationManager.h"
22 #include <Commons/Exception.h>
23 #include <Commons/EventReceiver.h>
24 #include <Commons/Regex.h>
25 #include <plugins-ipc-message/ipc_message_support.h>
27 #include "ApplicationInformation.h"
28 #include "ApplicationContext.h"
29 #include "ApplicationControlData.h"
30 #include "ApplicationControl.h"
31 #include "Application.h"
35 // to launch app by aul
38 // to get package name by appid
40 #include <app_manager.h>
42 // To get cert information from package
43 #include <package_manager.h>
44 #include <package_info.h>
46 // To get app size and installed time
47 #include <pkgmgr-info.h>
52 #include <TimeTracer.h>
57 namespace Application {
60 using namespace WrtDeviceApis;
61 using namespace WrtDeviceApis::Commons;
65 typedef KeyMultiMap<ApplicationManager*, LaunchAppControlPendingEvent> LaunchAppControlPendingEventMap;
66 static LaunchAppControlPendingEventMap gLaunchAppControlPendingEventMap;
68 // Callback from 'app_manager_set_app_context_event_cb'
70 static void app_manager_app_context_event_callback(app_context_h app_context,
71 app_context_event_e event, void *user_data)
75 if(event != APP_CONTEXT_EVENT_TERMINATED)
80 ret = app_context_get_pid(app_context, &pid);
81 if(ret != APP_MANAGER_ERROR_NONE)
83 LoggerE("Fail to get pid of terminated app (" << ret << ")");
87 ApplicationManager* appManager = (ApplicationManager*)(user_data);
88 appManager->invokeManualAnswerKill(pid);
91 // get package name by id
92 static char* getPackageByAppId(const char* appId)
98 ret = app_manager_get_app_info(appId, &handle);
101 LoggerE("Fail to get appinfo");
105 ret = app_info_get_package(handle, &pkgName);
108 LoggerE("Fail to get pkgName");
112 ret = app_info_destroy(handle);
115 LoggerE("Fail to get destory appinfo");
123 // Callback of 'app_manager_foreach_app_context'
124 // Used by 'getAppsContext'
125 static bool app_manager_app_context_callback(app_context_h app_context, void *user_data)
132 std::string contextId;
134 if (user_data == NULL)
139 ret = app_context_get_app_id(app_context, &app_id);
140 if((ret != APP_MANAGER_ERROR_NONE) || (app_id == NULL))
142 LoggerE("Fail to get app id from context (" << ret << ")");
146 ret = app_context_get_pid(app_context, &pid);
147 if(ret != APP_MANAGER_ERROR_NONE)
149 LoggerE("Fail to get pid from context (" << ret << ")");
155 std::stringstream sstream;
157 contextId = sstream.str();
159 ApplicationContextPtr appContext(new ApplicationContext());
160 appContext->setAppId(app_id);
161 appContext->setContextId(contextId);
163 ApplicationContextArray* appContextArray = (ApplicationContextArray*)user_data;
165 appContextArray->push_back(appContext);
173 // Callback of 'service_send_launch_request'
174 // Used by 'launchAppControl'
175 static void service_reply_callback(service_h request, service_h reply,
176 service_result_e result, void *user_data)
178 LaunchAppControlPendingEventMap::DataKeyType key =
179 (LaunchAppControlPendingEventMap::DataKeyType)user_data;
181 LaunchAppControlPendingEvent *pendingEvent = gLaunchAppControlPendingEventMap.getData(key);
182 if(pendingEvent != NULL)
184 ApplicationManager *application = (ApplicationManager *)pendingEvent->getThisObject();
185 EventApplicationLaunchAppControlReplyPtr event = pendingEvent->getEvent();
186 application->invokeManualAnswerLaunchAppControl(request, reply, result, event);
192 gLaunchAppControlPendingEventMap.eraseData(key);
196 static bool package_cert_cb(package_info_h handle, package_cert_type_e cert_type, const char *cert_value, void *user_data)
198 ApplicationCertPtr cert(new ApplicationCert());
199 const char* certName = NULL;
202 case PACKAGE_INFO_AUTHOR_ROOT_CERT:
203 certName = "AUTHOR_ROOT";
205 case PACKAGE_INFO_AUTHOR_INTERMEDIATE_CERT:
206 certName = "AUTHOR_INTERMEDIATE";
208 case PACKAGE_INFO_AUTHOR_SIGNER_CERT:
209 certName = "AUTHOR_SIGNER";
211 case PACKAGE_INFO_DISTRIBUTOR_ROOT_CERT:
212 certName = "DISTRIBUTOR_ROOT";
214 case PACKAGE_INFO_DISTRIBUTOR_INTERMEDIATE_CERT:
215 certName = "DISTRIBUTOR_INTERMEDIATE";
217 case PACKAGE_INFO_DISTRIBUTOR_SIGNER_CERT:
218 certName = "DISTRIBUTOR_SIGNER";
220 case PACKAGE_INFO_DISTRIBUTOR2_ROOT_CERT:
221 certName = "DISTRIBUTOR2_ROOT";
223 case PACKAGE_INFO_DISTRIBUTOR2_INTERMEDIATE_CERT:
224 certName = "DISTRIBUTOR2_INTERMEDIATE";
226 case PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT:
227 certName = "DISTRIBUTOR2_SIGNER";
230 LoggerE("Unknow Cert type!!!");
234 cert->setType(certName);
235 cert->setValue(cert_value);
237 ApplicationCertArray *certs = (ApplicationCertArray *)user_data;
238 certs->push_back(cert);
243 static std::string get_current_app_id()
245 std::string appId = AppManagerWrapperSingleton::Instance().getCurrentAppId();
249 static int category_cb(const char *category, void *user_data)
251 if (category == NULL)
254 ApplicationInformation* appInfo = (ApplicationInformation*)user_data;
255 appInfo->addCategories(category);
259 static ApplicationInformationPtr create_app_info(pkgmgrinfo_appinfo_h handle)
263 char* iconPath = NULL;
264 bool noDisplay = false;
268 ApplicationInformationPtr appInfo(new ApplicationInformation());
269 ret = pkgmgrinfo_appinfo_get_appid(handle, &appId);
270 if (ret != PMINFO_R_OK) {
271 LoggerD("Fail to get name");
273 appInfo->setAppId(appId);
276 ret = pkgmgrinfo_appinfo_get_label(handle, &name);
277 if ((ret != PMINFO_R_OK) || (name == NULL)) {
278 LoggerD("Fail to get name");
280 appInfo->setName(name);
283 ret = pkgmgrinfo_appinfo_get_icon(handle, &iconPath);
284 if ((ret != PMINFO_R_OK) || (iconPath == NULL)) {
285 LoggerD("Fail to get icon");
287 appInfo->setIconPath(iconPath);
290 ret = pkgmgrinfo_appinfo_is_nodisplay(handle, &noDisplay);
291 if (ret != PMINFO_R_OK) {
292 LoggerD("Fail to get nodisplay");
294 appInfo->setShow(!noDisplay);
297 ret = pkgmgrinfo_appinfo_foreach_category(handle, category_cb, (void*)appInfo.Get());
298 if (ret != PMINFO_R_OK) {
299 LoggerD("Fail to get categories");
302 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgId);
303 if ((ret != PMINFO_R_OK) || (pkgId == NULL)) {
304 LoggerD("Fail to get pkg Id");
306 appInfo->setPackageId(pkgId);
309 char *version = NULL;
310 int installed_time = 0;
311 pkgmgrinfo_pkginfo_h pkginfo_h;
313 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgId, &pkginfo_h);
314 if (ret != PMINFO_R_OK) {
315 LoggerE("Fail to get package info");
317 ret = pkgmgrinfo_pkginfo_get_version(pkginfo_h, &version);
318 if (ret != PMINFO_R_OK) {
319 LoggerE("Fail to get version");
321 appInfo->setVersion(version);
324 ret = pkgmgrinfo_pkginfo_get_installed_time(pkginfo_h, &installed_time);
325 if (ret != PMINFO_R_OK) {
326 LoggerE("Fail to get installed date");
328 appInfo->setInstallDate(installed_time);
331 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
334 // remark : attribute "total size" is set at first attribute access time for performance.
339 static int installed_app_info_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
341 ApplicationInformationPtr appInfo = create_app_info(handle);
342 ApplicationInformationArray *appInfoArray = (ApplicationInformationArray*)user_data;
343 appInfoArray->push_back(appInfo);
347 // Callback from 'service_foreach_app_matched'
348 // Used by 'findAppControl'
349 static bool service_app_matched_callback(service_h service, const char *appid, void *user_data)
353 LoggerD("appid is NULL");
356 //ApplicationInformationPtr appInfo(new ApplicationInformation(appid));
357 pkgmgrinfo_appinfo_h handle;
358 int ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
359 if (ret != PMINFO_R_OK) {
360 LoggerD("Fail to get appInfo from appId : " << appid);
362 ApplicationInformationPtr appInfo = create_app_info(handle);
363 pkgmgrinfo_appinfo_destroy_appinfo(handle);
365 ApplicationInformationArray *appInfos = (ApplicationInformationArray *)user_data;
366 appInfos->push_back(appInfo);
372 static int app_meta_data_cb(const char *meta_key, const char *meta_value, void *user_data)
374 if ((meta_key == NULL) || (meta_value == NULL)) {
375 LoggerE("meta_key or meta_value is null");
379 ApplicationMetaDataPtr metaData(new ApplicationMetaData());
381 metaData->setKey(meta_key);
382 metaData->setValue(meta_value);
384 ApplicationMetaDataArray *metaDataArray = (ApplicationMetaDataArray *)user_data;
385 metaDataArray->push_back(metaData);
391 ApplicationManager::ApplicationManager() :
397 ApplicationManager::~ApplicationManager()
399 if(m_installedApplicationsEmitters.size() != 0)
401 AppManagerWrapperSingleton::Instance().unregisterAppListChangedCallbacks(this);
402 WatchIdMap::iterator iter = m_watchIdMap.begin();
403 for(; iter != m_watchIdMap.end(); iter++)
405 m_installedApplicationsEmitters.detach(iter->second);
409 LaunchAppControlPendingEventMap::DataPtrListType dataPtrList =
410 gLaunchAppControlPendingEventMap.getDataPtrList(this);
412 LaunchAppControlPendingEventMap::DataPtrListType::iterator iter = dataPtrList.begin();
413 for(; iter != dataPtrList.end(); iter++)
418 gLaunchAppControlPendingEventMap.eraseKey(this);
420 // unset context event callback which is registered by kill().
421 app_manager_unset_app_context_event_cb();
424 void ApplicationManager::launch(const EventApplicationLaunchPtr& event)
426 if (m_initialized == false) {
430 EventRequestReceiver<EventApplicationLaunch>::PostRequest(event);
433 void ApplicationManager::kill(const EventApplicationKillPtr& event)
435 if (m_initialized == false) {
439 EventRequestReceiver<EventApplicationKill>::PostRequest(event);
442 void ApplicationManager::launchAppControl(const EventApplicationLaunchAppControlPtr& event)
444 if (m_initialized == false) {
448 EventApplicationLaunchAppControlReplyPtr eventReply = event->getEventReply();
449 if(eventReply != NULL)
450 EventRequestReceiver<EventApplicationLaunchAppControlReply>::PostRequest(eventReply);
452 EventRequestReceiver<EventApplicationLaunchAppControl>::PostRequest(event);
455 void ApplicationManager::findAppControl(const EventApplicationFindAppControlPtr& event)
457 if (m_initialized == false) {
461 EventRequestReceiver<EventApplicationFindAppControl>::PostRequest(event);
464 void ApplicationManager::getAppsContext(const EventApplicationGetAppsContextPtr& event)
466 if (m_initialized == false) {
470 EventRequestReceiver<EventApplicationGetAppsContext>::PostRequest(event);
474 void ApplicationManager::getAppsInfo(const EventApplicationGetAppsInfoPtr& event)
476 if (m_initialized == false) {
480 EventRequestReceiver<EventApplicationGetAppsInfo>::PostRequest(event);
484 void ApplicationManager::addAppInfoEventListener(const EventApplicationAddAppInfoEventListenerPtr& event)
486 if (m_initialized == false) {
490 EventRequestReceiver<EventApplicationAddAppInfoEventListener>::PostRequest(event);
493 void ApplicationManager::removeAppInfoEventListener(const EventApplicationRemoveAppInfoEventListenerPtr& event)
495 if (m_initialized == false) {
499 EventRequestReceiver<EventApplicationRemoveAppInfoEventListener>::PostRequest(event);
503 void ApplicationManager::invokeManualAnswerLaunchAppControl(service_h request, service_h reply,
504 service_result_e result,
505 EventApplicationLaunchAppControlReplyPtr &event)
511 if(result == SERVICE_RESULT_SUCCEEDED)
513 // create new service object to store result.
514 ApplicationControlDataArrayPtr appControlDataArray(new ApplicationControlDataArray());
516 int result = service_foreach_extra_data(reply, service_extra_data_callback, appControlDataArray.Get());
517 if( result == SERVICE_ERROR_NONE)
519 event->setAppControlDataArray(appControlDataArray);
523 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
526 else if(result == SERVICE_RESULT_FAILED || result == SERVICE_RESULT_CANCELED)
528 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
531 EventRequestReceiver<EventApplicationLaunchAppControlReply>::ManualAnswer(event);
534 void ApplicationManager::invokeManualAnswerKill(int pid)
536 DPL::Mutex::ScopedLock lock(&m_killMapLock);
538 std::map<int, EventApplicationKillPtr>::iterator it = m_killEventMap.find(pid);
539 if (it == m_killEventMap.end()) {
543 EventApplicationKillPtr event = it->second;
544 m_killEventMap.erase(it);
546 EventRequestReceiver<EventApplicationKill>::ManualAnswer(event);
550 bool ApplicationManager::service_extra_data_callback(service_h service, const char *key, void* user_data)
554 ApplicationControlDataArray* appControlDataArray = (ApplicationControlDataArray*)user_data;
556 bool isArray = false;
557 ret = service_is_extra_data_array(service, key, &isArray);
558 if (ret != SERVICE_ERROR_NONE)
560 LoggerE("service_is_extra_data_array passes error");
561 // fail to checking. go to next extra data.
565 std::string keyStr(key);
572 ret = service_get_extra_data_array(service, key, &value, &length);
575 case SERVICE_ERROR_NONE: {
576 std::vector<std::string> valArray;
577 LoggerI("value length : " << length);
578 for (int i = 0; i < length; i++)
582 valArray.push_back(value[i]);
586 ApplicationControlDataPtr appControlData(new ApplicationControlData());
587 appControlData->setKey(keyStr);
588 appControlData->setValue(valArray);
589 appControlDataArray->push_back(appControlData);
591 for (int i = 0; i < length; i++)
600 case SERVICE_ERROR_INVALID_PARAMETER:
601 LoggerE("service_get_extra_data retuns SERVICE_ERROR_INVALID_PARAMETER");
603 case SERVICE_ERROR_KEY_NOT_FOUND:
604 LoggerE("service_get_extra_data retuns SERVICE_ERROR_KEY_NOT_FOUND");
606 case SERVICE_ERROR_OUT_OF_MEMORY:
607 LoggerE("service_get_extra_data retuns SERVICE_ERROR_OUT_OF_MEMORY");
610 LoggerE("service_get_extra_data retuns Error");
618 ret = service_get_extra_data(service, key, &value);
621 case SERVICE_ERROR_NONE:
625 LoggerE("service_get_extra_data returns NULL");
629 std::vector<std::string> valArray;
630 valArray.push_back(value);
632 ApplicationControlDataPtr appControlData(new ApplicationControlData());
633 appControlData->setKey(keyStr);
634 appControlData->setValue(valArray);
635 appControlDataArray->push_back(appControlData);
642 case SERVICE_ERROR_INVALID_PARAMETER:
643 LoggerE("service_get_extra_data retuns SERVICE_ERROR_INVALID_PARAMETER");
645 case SERVICE_ERROR_KEY_NOT_FOUND:
646 LoggerE("service_get_extra_data retuns SERVICE_ERROR_KEY_NOT_FOUND");
648 case SERVICE_ERROR_OUT_OF_MEMORY:
649 LoggerE("service_get_extra_data retuns SERVICE_ERROR_OUT_OF_MEMORY");
652 LoggerE("service_get_extra_data retuns Error");
661 ApplicationPtr ApplicationManager::getCurrentApplication()
663 std::string appId = get_current_app_id();
665 //ApplicationInformationPtr appinfo(new ApplicationInformation(appId));
666 pkgmgrinfo_appinfo_h handle;
667 TIME_TRACER_ITEM_BEGIN("(getCurrentApplication)pkgmgrinfo_appinfo_get_appinfo", 0);
668 int ret = pkgmgrinfo_appinfo_get_appinfo(appId.c_str(), &handle);
669 TIME_TRACER_ITEM_END("(getCurrentApplication)pkgmgrinfo_appinfo_get_appinfo", 0);
670 if (ret != PMINFO_R_OK) {
671 LoggerE("Fail to get appInfo");
672 ThrowMsg(UnknownException, "pkgmgrinfo_appinfo_get_appinfo error : unknown error");
674 ApplicationInformationPtr appInfo = create_app_info(handle);
675 pkgmgrinfo_appinfo_destroy_appinfo(handle);
678 ApplicationPtr app(new Application());
679 app->setAppInfo(appInfo);
681 LoggerD("set appinfo to application");
683 //int pid = getpid();
685 std::stringstream sstr;
687 app->setContextId(sstr.str());
694 ApplicationContextPtr ApplicationManager::getAppContext(const std::string id)
698 std::string contextId = id;
701 int selfpid = getppid();
703 if(contextId.empty())
705 std::stringstream sstr;
707 contextId = sstr.str();
709 appId = get_current_app_id();
714 std::stringstream(contextId) >> pid;
717 LoggerE("Given contextId is wrong");
718 ThrowMsg(NotFoundException, "Given contextId is wrong");
723 std::stringstream sstr;
725 contextId = sstr.str();
727 appId = get_current_app_id();
733 TIME_TRACER_ITEM_BEGIN("(getAppContext)app_manager_get_app_id", 0);
734 ret = app_manager_get_app_id(pid, &app_id);
735 TIME_TRACER_ITEM_END("(getAppContext)app_manager_get_app_id", 0);
736 if(ret != APP_MANAGER_ERROR_NONE)
743 case APP_MANAGER_ERROR_NO_SUCH_APP:
744 case APP_MANAGER_ERROR_INVALID_PARAMETER:
745 LoggerE("app_manager_get_app_id error : no such app");
746 ThrowMsg(NotFoundException, "app_manager_get_app_id error : no such app");
749 LoggerE("app_manager_get_app_id error (" << ret << ")");
750 ThrowMsg(UnknownException, "app_manager_get_app_id error : unknown error");
762 ApplicationContextPtr appContext(new ApplicationContext());
763 appContext->setAppId(appId);
764 appContext->setContextId(contextId);
770 ApplicationInformationPtr ApplicationManager::getAppInfo(const std::string id)
772 std::string appId = id;
773 // in case of no argument, get application information of current.
776 appId = get_current_app_id();
779 pkgmgrinfo_appinfo_h handle;
780 TIME_TRACER_ITEM_BEGIN("(getAppInfo)pkgmgrinfo_appinfo_get_appinfo", 0);
781 int ret = pkgmgrinfo_appinfo_get_appinfo(appId.c_str(), &handle);
782 TIME_TRACER_ITEM_END("(getAppInfo)pkgmgrinfo_appinfo_get_appinfo", 0);
783 if (ret != PMINFO_R_OK) {
784 ThrowMsg(NotFoundException, "Can not get appinfo");
787 ApplicationInformationPtr appInfo = create_app_info(handle);
789 pkgmgrinfo_appinfo_destroy_appinfo(handle);
795 ApplicationCertArrayPtr ApplicationManager::getAppCerts(const std::string id)
797 std::string appId = id;
799 // in case of no argument, get application information of current.
802 appId = get_current_app_id();
805 TIME_TRACER_ITEM_BEGIN("(getAppCerts)getPackageByAppId", 0);
806 char* package = getPackageByAppId(appId.c_str());
807 TIME_TRACER_ITEM_END("(getAppCerts)getPackageByAppId", 0);
810 LoggerE("Can not get package");
811 ThrowMsg(NotFoundException, "Can not get package");
814 package_info_h pkg_info;
817 TIME_TRACER_ITEM_BEGIN("(getAppCerts)package_manager_get_package_info", 0);
818 result = package_manager_get_package_info(package, &pkg_info);
819 TIME_TRACER_ITEM_END("(getAppCerts)package_manager_get_package_info", 0);
820 if (result != PACKAGE_MANAGER_ERROR_NONE)
822 ThrowMsg(UnknownException, "Can not get package info");
825 ApplicationCertArrayPtr certArray(new ApplicationCertArray());
827 TIME_TRACER_ITEM_BEGIN("(getAppCerts)package_info_foreach_cert_info", 0);
828 result = package_info_foreach_cert_info(pkg_info, package_cert_cb, (void*)certArray.Get());
829 TIME_TRACER_ITEM_END("(getAppCerts)package_info_foreach_cert_info", 0);
830 if ((result != PACKAGE_MANAGER_ERROR_NONE) && (result != PACKAGE_MANAGER_ERROR_IO_ERROR))
832 package_info_destroy(pkg_info);
833 ThrowMsg(UnknownException, "Can not get package cert info");
836 TIME_TRACER_ITEM_BEGIN("(getAppCerts)package_info_destroy", 0);
837 result = package_info_destroy(pkg_info);
838 TIME_TRACER_ITEM_END("(getAppCerts)package_info_destroy", 0);
839 if (result != PACKAGE_MANAGER_ERROR_NONE)
841 LoggerE("Failed to destroy package_info");
847 std::string ApplicationManager::getAppSharedURI(const std::string id)
849 #define TIZENAPIS_APP_FILE_SCHEME "file://"
850 #define TIZENAPIS_APP_SLASH "/"
851 #define TIZENAPIS_APP_SHARED "shared"
856 appId = get_current_app_id();
862 char* pkg_name = NULL;
863 TIME_TRACER_ITEM_BEGIN("(getAppSharedURI)app_manager_get_app_info", 0);
864 int ret = app_manager_get_app_info(appId.c_str(), &handle);
865 TIME_TRACER_ITEM_END("(getAppSharedURI)app_manager_get_app_info", 0);
866 if (ret != APP_ERROR_NONE) {
867 LoggerD("Fail to get appinfo");
868 //throw NotFoundException("Fail to get appinfo");
869 ThrowMsg(NotFoundException, "Fail to get appinfo");
872 TIME_TRACER_ITEM_BEGIN("(getAppSharedURI)app_info_get_package", 0);
873 ret = app_info_get_package(handle, &pkg_name);
874 TIME_TRACER_ITEM_END("(getAppSharedURI)app_info_get_package", 0);
875 if ((ret != APP_ERROR_NONE) || (pkg_name == NULL)) {
876 LoggerD("Fail to get pkg_name");
877 //throw NotFoundException("Fail to get pkg_name");
878 ThrowMsg(NotFoundException, "Fail to get pkg_name");
881 app_info_destroy(handle);
883 pkgmgrinfo_pkginfo_h pkginfo_h;
884 char* root_path = NULL;
886 TIME_TRACER_ITEM_BEGIN("(getAppSharedURI)pkgmgrinfo_pkginfo_get_pkginfo", 0);
887 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkg_name, &pkginfo_h);
888 TIME_TRACER_ITEM_END("(getAppSharedURI)pkgmgrinfo_pkginfo_get_pkginfo", 0);
889 if (ret != PMINFO_R_OK) {
891 //throw UnknownException("Fail to get pkginfo");
892 ThrowMsg(UnknownException, "Fail to get pkginfo");
895 TIME_TRACER_ITEM_BEGIN("(getAppSharedURI)pkgmgrinfo_pkginfo_get_root_path", 0);
896 ret = pkgmgrinfo_pkginfo_get_root_path(pkginfo_h, &root_path);
897 TIME_TRACER_ITEM_END("(getAppSharedURI)pkgmgrinfo_pkginfo_get_root_path", 0);
898 if ((ret != PMINFO_R_OK) || (root_path == NULL)) {
899 LoggerE("Fail to get root path");
901 //throw UnknownException("Fail to get rotpath");
902 ThrowMsg(UnknownException, "Fail to get rotpath");
905 std::string sharedURI = TIZENAPIS_APP_FILE_SCHEME + std::string(root_path) + TIZENAPIS_APP_SLASH + TIZENAPIS_APP_SHARED + TIZENAPIS_APP_SLASH;
908 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
913 ApplicationMetaDataArrayPtr ApplicationManager::getAppMetaData(const std::string id)
915 std::string appId = id;
917 // in case of no argument, get application information of current.
920 appId = get_current_app_id();
924 pkgmgrinfo_appinfo_h handle;
926 TIME_TRACER_ITEM_BEGIN("(getAppMetaData)pkgmgrinfo_appinfo_get_appinfo", 0);
927 ret = pkgmgrinfo_appinfo_get_appinfo(appId.c_str(), &handle);
928 TIME_TRACER_ITEM_END("(getAppMetaData)pkgmgrinfo_appinfo_get_appinfo", 0);
930 if (ret != PMINFO_R_OK) {
931 ThrowMsg(NotFoundException, "Cannot found application with given appId");
934 ApplicationMetaDataArrayPtr metaDataArray(new ApplicationMetaDataArray());
936 TIME_TRACER_ITEM_BEGIN("(getAppMetaData)pkgmgrinfo_appinfo_foreach_metadata", 0);
937 ret = pkgmgrinfo_appinfo_foreach_metadata(handle, app_meta_data_cb, (void*)metaDataArray.Get());
938 TIME_TRACER_ITEM_END("(getAppMetaData)pkgmgrinfo_appinfo_foreach_metadata", 0);
940 if (ret != PMINFO_R_OK) {
941 LoggerE("pkgmgrinfo_appinfo_metadata_filter_foreach() failed");
942 pkgmgrinfo_appinfo_destroy_appinfo(handle);
943 ThrowMsg(UnknownException, "fail to get custom tag");
946 pkgmgrinfo_appinfo_destroy_appinfo(handle);
948 return metaDataArray;
951 void ApplicationManager::OnRequestReceived(const EventApplicationLaunchPtr& event)
958 std::string appId = event->getAppId();
961 LoggerE("App id is mandatory field.");
962 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
966 // if the application is running, send raise event to the app instead of reset the application.
967 // give a second chance to launch application to avoid platform issue.
968 // this retry code will be removed after platform code change.
970 ret = aul_open_app(appId.c_str());
974 // delay 300ms for each retry
977 LoggerD("retry launch request : " << retry);
985 LoggerE("returns Not Found error");
986 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
989 LoggerE("returns internal IPC error");
990 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
993 LoggerE("returns Unknown error");
994 event->setExceptionCode(Commons::ExceptionCodes::UnknownException);
998 LoggerD("Success to launch.");
1001 Catch (WrtDeviceApis::Commons::Exception)
1003 LoggerE("Error on launch : " << _rethrown_exception.GetMessage());
1004 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1008 // Because of platform issue, some termination event is not come to app_manager_set_app_context_event_cb().
1009 // To prevent blocking issue by wating callback function, add termination checking code.
1010 // this function check whether callback is called or not after 3 sec. if callback is not called,
1011 // calls callback function forcibily.
1012 // After fixing platform issue, below code should be removed
1015 ApplicationManager* appManager;
1017 EventApplicationKillPtr event;
1020 gboolean check_terminate_callback (gpointer user_data)
1022 //EventApplicationKillPtr event = (EventApplicationKillPtr)data;
1023 KILL_DATA_T* data = (KILL_DATA_T*)user_data;
1025 char * appId = NULL;
1026 if (app_manager_get_app_id(data->pid, &appId) == APP_MANAGER_ERROR_NONE) {
1027 // if context is still alive, error callback should be called.
1028 data->event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1031 data->appManager->invokeManualAnswerKill(data->pid);
1037 void ApplicationManager::OnRequestReceived(const EventApplicationKillPtr& event)
1042 std::string contextId = event->getContextId();
1044 if(contextId.empty())
1046 LoggerE("Context id is mandatory");
1047 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1052 std::stringstream(contextId) >> pid;
1055 LoggerE("Given context id is wrong");
1056 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1060 // if kill request is come for current context, throw InvalidValueException by spec
1061 if (pid == getppid())
1063 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1067 char *appIdCStr = NULL;
1068 ret = app_manager_get_app_id(pid, &appIdCStr);
1069 if (ret != APP_MANAGER_ERROR_NONE)
1071 LoggerE("Error while getting app id (" << ret << ")");
1072 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1076 std::string appId = appIdCStr;
1079 app_context_h appContext;
1080 ret = app_manager_get_app_context (appId.c_str(), &appContext);
1081 if (ret != APP_MANAGER_ERROR_NONE)
1083 LoggerE("Error while getting app context (" << ret << ")");
1084 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1089 ret = app_manager_set_app_context_event_cb(app_manager_app_context_event_callback, this);
1090 if (ret != APP_MANAGER_ERROR_NONE)
1092 LoggerE("Error while registering app context event (" << ret << ")");
1093 event->setExceptionCode(Commons::ExceptionCodes::UnknownException);
1097 ret = app_manager_terminate_app(appContext);
1098 if (ret != APP_MANAGER_ERROR_NONE)
1100 LoggerE("Error while terminating app (" << ret << ")");
1101 event->setExceptionCode(Commons::ExceptionCodes::UnknownException);
1105 // Because of platform issue, some termination event is not come to app_manager_set_app_context_event_cb().
1106 // To prevent blocking issue by wating callback function, add termination checking code.
1107 // this function check whether callback is called or not after 3 sec. if callback is not called,
1108 // calls callback function forcibily.
1109 // After fixing platform issue, below code should be removed
1111 KILL_DATA_T *data = new KILL_DATA_T;
1113 data->appManager = this;
1114 data->event = event;
1115 g_timeout_add(3000, check_terminate_callback, (void*)data);
1118 DPL::Mutex::ScopedLock lock(&m_killMapLock);
1119 m_killEventMap[pid] = event;
1120 event->switchToManualAnswer();
1122 Catch (WrtDeviceApis::Commons::Exception)
1124 LoggerE("Error on kill : " << _rethrown_exception.GetMessage());
1125 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1129 void ApplicationManager::OnRequestReceived(const EventApplicationLaunchAppControlPtr& event)
1136 ApplicationControlPtr appControl = event->getAppControl();
1137 if(appControl == NULL)
1139 LoggerE("appControl is mandatory");
1140 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1144 std::string operation = appControl->getOperation();
1145 if(operation.empty())
1147 LoggerE("operation is madatory");
1148 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1152 std::string appId = event->getAppId();
1155 service_create(&service);
1159 service_set_app_id(service, appId.c_str());
1161 // get resolved app id for aliased app id cannot be used to app_manager_get_app_info()
1162 char* resolved_app_id = NULL;
1163 service_get_app_id(service, &resolved_app_id);
1165 // Application exist checking. if specific application is not exist, return Not Found Exception.
1167 if (app_manager_get_app_info(resolved_app_id, &info_h) != APP_MANAGER_ERROR_NONE) {
1168 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1169 if (resolved_app_id) {
1170 free(resolved_app_id);
1172 service_destroy(service);
1176 app_info_destroy(info_h);
1177 if (resolved_app_id) {
1178 free(resolved_app_id);
1182 const char* windowId = IPCMessageSupport::sendMessageToUiProcess("tizen://getWindowHandle", NULL);
1183 if (windowId != NULL)
1185 service_set_window(service, atoi(windowId));
1188 service_set_operation(service, operation.c_str() );
1190 std::string uri = appControl->getUri();
1193 service_set_uri(service, uri.c_str() );
1196 std::string mime = appControl->getMime();
1199 service_set_mime(service, mime.c_str() );
1202 std::string category = appControl->getCategory();
1203 if (!category.empty())
1205 service_set_category(service, category.c_str() );
1208 std::vector<ApplicationControlDataPtr> appControlDataArray = appControl->getAppControlDataArray();
1210 if(!appControlDataArray.empty())
1212 LoggerI(" data size : " << appControlDataArray.size());
1214 ApplicationControlDataArray::iterator iter;
1215 for(iter = appControlDataArray.begin(); iter != appControlDataArray.end(); iter++)
1217 ApplicationControlDataPtr appControlData = *iter;
1219 std::string key = appControlData->getKey();
1223 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1227 std::vector<std::string> valueArray = appControlData->getValue();
1228 size_t size = valueArray.size();
1230 const char **arr = (const char**)calloc(sizeof(char*), size);
1232 for (size_t j = 0; j < size; j++)
1234 arr[j] = valueArray.at(j).c_str();
1237 // @20121207-wscho: roll-back to return extra-data instead of extra-data array when the value size is one.
1238 const char *keyCStr = key.c_str();
1240 service_add_extra_data(service, keyCStr, arr[0]);
1242 service_add_extra_data_array(service, keyCStr, arr, size);
1250 LaunchAppControlPendingEvent *pendingEvent = NULL;
1251 LaunchAppControlPendingEventMap::DataKeyType key = 0;
1253 EventApplicationLaunchAppControlReplyPtr eventReply = event->getEventReply();
1256 pendingEvent = new LaunchAppControlPendingEvent((void*)this, eventReply);
1257 key = gLaunchAppControlPendingEventMap.insert(this, pendingEvent);
1260 // give a second chance to launch application to avoid platform issue.
1261 // this retry code will be removed after platform code change.
1263 ret = service_send_launch_request(service, service_reply_callback, (void *)key);
1264 if (ret != SERVICE_ERROR_LAUNCH_REJECTED) {
1267 // delay 300ms for each retry
1270 LoggerD("retry launch request : " << retry);
1273 service_destroy(service);
1275 if(ret != SERVICE_ERROR_NONE)
1279 case SERVICE_ERROR_INVALID_PARAMETER:
1280 LoggerE("service_send_launch_request returns SERVICE_ERROR_INVALID_PARAMETER");
1281 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1283 case SERVICE_ERROR_OUT_OF_MEMORY:
1284 LoggerE("service_send_launch_request returns SERVICE_ERROR_OUT_OF_MEMORY");
1285 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1287 case SERVICE_ERROR_LAUNCH_REJECTED:
1288 LoggerE("service_send_launch_request returns SERVICE_ERROR_LAUNCH_REJECTED!!!");
1289 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1291 case SERVICE_ERROR_APP_NOT_FOUND:
1292 LoggerE("service_send_launch_request returns SERVICE_ERROR_APP_NOT_FOUND");
1293 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1296 LoggerE("service_send_launch_request returns UNKNOWN ERROR!!!");
1297 event->setExceptionCode(Commons::ExceptionCodes::UnknownException);
1303 gLaunchAppControlPendingEventMap.eraseData(key);
1305 delete pendingEvent;
1306 pendingEvent = NULL;
1308 eventReply->cancelRequest();
1309 EventRequestReceiver<EventApplicationLaunchAppControlReply>::ManualAnswer(eventReply);
1313 Catch (WrtDeviceApis::Commons::Exception)
1315 LoggerE("Error on launchAppControl : " << _rethrown_exception.GetMessage());
1316 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1320 void ApplicationManager::OnRequestReceived(const EventApplicationLaunchAppControlReplyPtr& event)
1322 event->switchToManualAnswer();
1325 void ApplicationManager::OnRequestReceived(const EventApplicationFindAppControlPtr& event)
1329 ApplicationControlPtr appControl = event->getAppControl();
1330 if(appControl == NULL)
1332 LoggerE("appControl is NULL");
1333 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1337 std::string operation = appControl->getOperation();
1338 if(operation.empty())
1340 LoggerE("operation is madatory");
1341 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1346 service_create(&service);
1348 service_set_operation(service, operation.c_str() );
1350 std::string uri = appControl->getUri();
1353 service_set_uri(service, uri.c_str() );
1356 std::string mime = appControl->getMime();
1359 service_set_mime(service, mime.c_str() );
1362 std::string category = appControl->getCategory();
1363 if (!category.empty())
1365 service_set_category(service, category.c_str() );
1368 std::vector<ApplicationControlDataPtr> appControlDataArray = appControl->getAppControlDataArray();
1370 if(!appControlDataArray.empty())
1372 LoggerD(" data size : " << appControlDataArray.size());
1374 ApplicationControlDataArray::iterator iter;
1375 for(iter = appControlDataArray.begin(); iter != appControlDataArray.end(); iter++)
1377 ApplicationControlDataPtr appControlData = *iter;
1379 std::string key = appControlData->getKey();
1383 event->setExceptionCode(Commons::ExceptionCodes::InvalidArgumentException);
1387 std::vector<std::string> valueArray = appControlData->getValue();
1388 size_t size = valueArray.size();
1390 const char **arr = (const char**)calloc(sizeof(char*), size);
1392 for (size_t j = 0; j < size; j++)
1394 arr[j] = valueArray.at(j).c_str();
1397 // @20121207-wscho: roll-back to return extra-data instead of extra-data array when the value size is one.
1398 const char *keyCStr = key.c_str();
1400 service_add_extra_data(service, keyCStr, arr[0]);
1402 service_add_extra_data_array(service, keyCStr, arr, size);
1410 ApplicationInformationArrayPtr appInfos(new ApplicationInformationArray());
1412 int result = service_foreach_app_matched(service, service_app_matched_callback, (void *)appInfos.Get());
1413 if (result != SERVICE_ERROR_NONE)
1415 LoggerE("service_foreach_app_matched error (" << result << ")");
1416 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1417 service_destroy(service);
1421 service_destroy(service);
1423 event->setAppInfos(appInfos);
1425 Catch (WrtDeviceApis::Commons::Exception)
1427 LoggerE("Error on findAppControl : " << _rethrown_exception.GetMessage());
1428 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1433 void ApplicationManager::OnRequestReceived(const EventApplicationGetAppsContextPtr& event)
1439 ApplicationContextArrayPtr appContextArray = event->getAppContextArray();
1440 ret = app_manager_foreach_app_context(app_manager_app_context_callback, appContextArray.Get());
1441 if(ret != APP_MANAGER_ERROR_NONE)
1443 LoggerE("app_manager_foreach_app_context error (" << ret << ")");
1444 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1447 Catch (WrtDeviceApis::Commons::Exception)
1449 LoggerE("Error on : " << _rethrown_exception.GetMessage());
1450 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1456 void ApplicationManager::OnRequestReceived(const EventApplicationGetAppsInfoPtr& event)
1461 ApplicationInformationArrayPtr appInfoArray = event->getAppInfoArray();
1462 ret = pkgmgrinfo_appinfo_get_installed_list(installed_app_info_cb, (void*)appInfoArray.Get());
1463 if (ret != PMINFO_R_OK) {
1464 LoggerE("Error on getAppsInfo : ");
1465 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1468 Catch (WrtDeviceApis::Commons::Exception)
1470 LoggerE("Error on getAppsInfo : " << _rethrown_exception.GetMessage());
1471 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1476 void ApplicationManager::OnRequestReceived(const EventApplicationAddAppInfoEventListenerPtr& event)
1480 EventApplicationAppInfoEventListenerEmitterPtr emitter = event->getEmitter();
1482 if(m_installedApplicationsEmitters.size() == 0)
1484 LoggerD("First time registering event listener to this application object.");
1486 // Below can throw Exception
1487 AppManagerWrapperSingleton::Instance().registerAppListChangedCallbacks(this);
1490 m_installedApplicationsEmitters.attach(emitter);
1492 long watchId = AppManagerWrapperSingleton::Instance().getWatchIdAndInc();
1494 m_watchIdMap[watchId] = emitter->getId();
1496 event->setWatchId(watchId);
1498 Catch (WrtDeviceApis::Commons::Exception)
1500 LoggerE("Error on addAppInfoEventListener : " << _rethrown_exception.GetMessage());
1501 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1505 void ApplicationManager::OnRequestReceived(const EventApplicationRemoveAppInfoEventListenerPtr& event)
1509 long watchId = event->getWatchId();
1511 if(m_watchIdMap.find(watchId) == m_watchIdMap.end()) {
1512 ThrowMsg(NotFoundException, "No watchId : " << watchId);
1515 EventApplicationAppInfoEventListenerEmitter::IdType emitterId = m_watchIdMap[watchId];
1517 bool success = m_installedApplicationsEmitters.detach(emitterId);
1519 ThrowMsg(NotFoundException, "No watchId : " << watchId);
1521 if(m_installedApplicationsEmitters.size() == 0)
1523 LoggerD("No more event listener on this application object.");
1525 AppManagerWrapperSingleton::Instance().unregisterAppListChangedCallbacks(this);
1528 Catch (WrtDeviceApis::Commons::NotFoundException)
1530 LoggerE("Not found : " << _rethrown_exception.GetMessage());
1531 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1533 Catch (WrtDeviceApis::Commons::Exception)
1535 LoggerE("Error on removeAppInfoEventListener : " << _rethrown_exception.GetMessage());
1536 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
1542 void ApplicationManager::onAppManagerEventInstalled(const char *appId)
1544 EventApplicationAppInfoEventListenerPtr event(new EventApplicationAppInfoEventListener());
1546 pkgmgrinfo_appinfo_h handle;
1547 int ret = pkgmgrinfo_appinfo_get_appinfo(appId, &handle);
1548 if (ret != PMINFO_R_OK) {
1549 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1551 ApplicationInformationPtr appInfo = create_app_info(handle);
1552 event->setAppInfo(appInfo);
1553 pkgmgrinfo_appinfo_destroy_appinfo(handle);
1556 event->setType(EventApplicationAppInfoEventListener::OnInstalled);
1557 m_installedApplicationsEmitters.emit(event);
1560 void ApplicationManager::onAppManagerEventUninstalled(const char *appId)
1562 EventApplicationAppInfoEventListenerPtr event(new EventApplicationAppInfoEventListener());
1564 ApplicationInformationPtr appInfo(new ApplicationInformation(appId));
1566 event->setType(EventApplicationAppInfoEventListener::OnUninstalled);
1567 event->setAppInfo(appInfo);
1568 m_installedApplicationsEmitters.emit(event);
1571 void ApplicationManager::onAppManagerEventUpdated(const char *appId)
1573 EventApplicationAppInfoEventListenerPtr event(new EventApplicationAppInfoEventListener());
1575 pkgmgrinfo_appinfo_h handle;
1576 int ret = pkgmgrinfo_appinfo_get_appinfo(appId, &handle);
1577 if (ret != PMINFO_R_OK) {
1578 event->setExceptionCode(Commons::ExceptionCodes::NotFoundException);
1580 ApplicationInformationPtr appInfo = create_app_info(handle);
1581 event->setAppInfo(appInfo);
1582 pkgmgrinfo_appinfo_destroy_appinfo(handle);
1585 event->setType(EventApplicationAppInfoEventListener::OnUpdated);
1586 m_installedApplicationsEmitters.emit(event);
1589 void ApplicationManager::initialize()
1591 if (!m_initialized) {
1592 DPL::Mutex::ScopedLock lock(&m_initializationMutex);
1593 if (!m_initialized) {