2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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.
18 * @file FApp_AppControlManager.cpp
19 * @brief This is the implementation for the _AppControlManager class.
24 #include <unique_ptr.h>
26 #include <appsvc/appsvc.h>
29 #include <content/mime_type.h>
31 #include <FBaseInteger.h>
32 #include <FBaseObject.h>
33 #include <FBaseString.h>
34 #include <FBaseColIListT.h>
35 #include <FBaseColArrayList.h>
36 #include <FBaseErrors.h>
37 #include <FAppAppControl.h>
38 #include <FAppAppManager.h>
39 #include <FAppIAppControlListener.h>
40 #include <FAppIAppControlResponseListener.h>
41 #include <FAppIAppFrame.h>
42 #include <FAppSqlDataControl.h>
43 #include <FAppMapDataControl.h>
44 #include <FAppPkgPackageInfo.h>
46 #include <FBaseSysLog.h>
47 #include <FBase_StringConverter.h>
48 #include <FBaseRt_LibraryImpl.h>
49 #include <FIo_DataControlResultSetImpl.h>
51 #include "FApp_AppArg.h"
52 #include "FApp_AppControlEventArg.h"
53 #include "FApp_AppControlRegistry.h"
54 #include "FApp_AppControlImpl.h"
55 #include "FApp_AppImpl.h"
56 #include "FApp_AppInfo.h"
57 #include "FApp_AppManagerEventArg.h"
59 #include "FApp_AppControlManager.h"
60 #include "FApp_AppManagerProxy.h"
61 #include "FApp_ConditionManagerProxy.h"
62 #include "FApp_IAppManagerEventListener.h"
63 #include "FApp_MapDataControlImpl.h"
64 #include "FApp_SqlDataControlImpl.h"
65 #include "FAppPkg_PackageManagerImpl.h"
66 #include "FAppPkg_PackageInfoImpl.h"
67 #include "FApp_AppMessageImpl.h"
68 #include "FApp_AppManagerImpl.h"
69 #include "FApp_AppControlResponseEvent.h"
71 using namespace Tizen::App::Package;
72 using namespace Tizen::Base;
73 using namespace Tizen::Base::Collection;
74 using namespace Tizen::Base::Runtime;
75 using namespace Tizen::Base::Utility;
76 using namespace Tizen::Io;
78 namespace Tizen { namespace App
81 const wchar_t TIZEN_OPERATION_PICK[] = L"http://tizen.org/appcontrol/operation/pick";
82 const wchar_t SELECTOR_NOTI_KEY[] = L"__APP_SVC_CALLER_NOTI__";
83 const int _MAX_PACKAGE_ID_LENGTH = 10;
85 _InProcessInfo::~_InProcessInfo(void)
90 _LaunchInfo::~_LaunchInfo(void)
96 _AppControlManager::_AppControlManager(void)
100 // AppControl event handling is expected to be performed in the main thread.
101 __appControlEvent.Construct();
102 __appControlEvent.AddListener(*dynamic_cast<_IAppControlSysEventListener*>(this));
103 __listenerList.Construct();
104 __pAppControlResponseEventContainer = new (std::nothrow)HashMapT<int, _AppControlResponseEvent*>;
105 __pAppControlResponseEventContainer->Construct();
106 __appControlResponseEventList.Construct();
109 _AppControlManager::~_AppControlManager(void)
112 __appControlEvent.RemoveListener(*dynamic_cast<_IAppControlSysEventListener*>(this));
113 IEnumeratorT<int>* pEnum = __appControlResponseEventList.GetEnumeratorN();
117 while(pEnum->MoveNext() == E_SUCCESS)
120 pEnum->GetCurrent(reqId);
121 if (__pAppControlResponseEventContainer != null)
123 _AppControlResponseEvent* pResponseEvent = null;
124 __pAppControlResponseEventContainer->GetValue(reqId, pResponseEvent);
125 delete pResponseEvent;
127 __pAppControlResponseEventContainer->Remove(reqId);
128 SysLog(NID_APP, "pResponseEvent gets deleted. reqId(%d)", reqId);
132 delete __pAppControlResponseEventContainer;
137 _AppControlManager::GetInstance(void)
139 static _AppControlManager inst;
145 _AppControlManager::GetMimeFromExt(const String& ext, String& out)
147 std::unique_ptr<char[]> pExtension(_StringConverter::CopyToCharArrayN(ext));
148 SysTryReturnResult(NID_APP, pExtension != null, E_OUT_OF_MEMORY, "String allocation failure.");
151 mime_type_get_mime_type(pExtension.get(), &mime);
153 SysTryReturnResult(NID_APP, mime != NULL, E_UNSUPPORTED_FORMAT, "MIME type conversion failure for %ls.", ext.GetPointer());
162 _AppControlManager::OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int res)
164 SysLog(NID_APP, "Received request Id %d, arg 0x%x", reqId, pAppArg);
167 // get launch info from request Id
168 _LaunchInfo* pInfo = __launchManager.FindItem(reqId);
169 SysTryReturnVoidResult(NID_APP, pInfo != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] request Id %d not found with response %d", reqId,
175 if (pInfo->magic == LAUNCH_INFO_MAGIC)
177 SysLog(NID_APP, "Invoking callback 0x%x", pInfo->launchCb);
180 if (pInfo->pUserData && (!__listenerList.Contains(pInfo->pUserData)))
182 (*pInfo->launchCb)(pInfo->pUserData, pInfo->pArg, pAppArg, static_cast<service_result_e>(res), pInfo->property, reqId);
187 SysLogException(NID_APP, E_SYSTEM, "Corrupted data structure.");
192 __launchManager.RemoveItem(reqId);
196 // callback for out-of-process AppControl start event
198 _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, const String& operationId)
200 SysLog(NID_APP, "Received request Id %d, app %ls, operationId %ls", reqId, appId.GetPointer(), operationId.GetPointer());
202 // get launch info from request Id
203 _LaunchInfo* pInfo = __launchManager.FindItem(reqId);
204 SysTryReturnVoidResult(NID_APP, pInfo != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] request Id %d not found.", reqId);
207 IAppControlResponseListener* pListener = static_cast<IAppControlResponseListener*>(pInfo->pUserData);
208 SysTryReturnVoidResult(NID_APP, typeid(pListener) == typeid(IAppControlResponseListener*), E_SYSTEM, "[E_SYSTEM] Invalid result callback.");
212 result r = E_SUCCESS;
213 AppId actualAppId = appId;
217 r = E_OPERATION_CANCELED;
219 SysLog(NID_APP, "Invoking callback 0x%x.", pListener);
221 _AppControlResponseEvent* pResponseEvent = null;
222 __pAppControlResponseEventContainer->GetValue(reqId, pResponseEvent);
223 SysLog(NID_APP, "StartResponseReceived Request Id(%d), ResponseEvent 0x%x.", reqId, pResponseEvent);
224 if (pResponseEvent != null)
226 String oId(operationId);
227 _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_START, actualAppId, oId, r, APP_CTRL_RESULT_SUCCEEDED, null, reqId);
229 if (pResponseEventArg != null)
231 pResponseEvent->Fire(*pResponseEventArg);
232 SysLog(NID_APP, "pResponseEvent is Fired");
237 pListener->OnAppControlStartResponseReceived(actualAppId, operationId, r);
238 SysLog(NID_APP, "OnAppControlStartResponseReceived called directly");
243 SysLog(NID_APP, "No listener registered.");
249 _AppControlManager::InvokeAppControlCompleteListener(IAppControlResponseListener& listener, const AppId& appId, const String& op, AppCtrlResult res, const IMap* pExtraData)
251 listener.OnAppControlCompleteResponseReceived(appId, op, res, pExtraData);
253 //_AppImpl::GetInstance()->RaiseWindow();
254 _AppImpl::GetInstance()->SendUserEvent(_APP_EVENT_RAISE, null, false);
256 SysLog(NID_APP, "AppControl response finished.");
261 _AppControlManager::InvokeLegacyAppControlCompleteListener(IAppControlEventListener& listener, const AppId& appId, const String& op, const IList* pList)
263 listener.OnAppControlCompleted(appId, op, pList);
265 //_AppImpl::GetInstance()->RaiseWindow();
266 _AppImpl::GetInstance()->SendUserEvent(_APP_EVENT_RAISE, null, false);
268 SysLog(NID_APP, "Legacy AppControl response finished.");
272 // callback for in-process event handling
274 _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* pArgs)
276 SysLog(NID_APP, "Received request Id %d, res %d, args 0x%x", reqId, res, pArgs);
278 // process proper callback
279 _InProcessInfo* pInfo = __inAppManager.FindItem(reqId);
280 SysTryReturnVoidResult(NID_APP, pInfo != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] request Id %d not found with args 0x%x", reqId,
283 if (pInfo->pListener)
285 String aId = pInfo->providerId;
286 String oId = pInfo->operationId;
288 SysLog(NID_APP, "Invoking callback 0x%x for (%ls, %ls).", pInfo->pListener, aId.GetPointer(), oId.GetPointer());
290 if (pInfo->property & _APPCONTROL_PROPERTY_ALIAS)
292 const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
293 pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(aId, oId);
296 aId = pEntry->provider;
297 oId = pEntry->operation;
299 SysLog(NID_APP, "Legacy AppControl (%ls, %ls).", aId.GetPointer(), oId.GetPointer());
305 IAppControlEventListener* pListener = dynamic_cast<IAppControlEventListener*>(pInfo->pListener);
308 ArrayList list(SingleObjectDeleter);
309 _AppArg::FillLegacyAppControlResult(list, res, pArgs, aId);
311 InvokeLegacyAppControlCompleteListener(*pListener, aId, oId, &list);
315 SysLog(NID_APP, "Wrong AppControl listener type.");
320 IAppControlResponseListener* pListener = dynamic_cast<IAppControlResponseListener*>(pInfo->pListener);
321 if (pListener && (!__listenerList.Contains(pInfo->pListener)))
323 _AppControlResponseEvent* pResponseEvent = null;
324 int responseEventRequestId = RESPONSE_EVENT_REQID_MAGIC + reqId;
325 __pAppControlResponseEventContainer->GetValue(responseEventRequestId, pResponseEvent);
327 if (pResponseEvent != null)
329 _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, aId, oId, E_SUCCESS, static_cast<AppCtrlResult>(res), const_cast<IMap*> (pArgs), responseEventRequestId);
330 if (pResponseEventArg != null)
332 pResponseEvent->Fire(*pResponseEventArg);
333 SysLog(NID_APP, "pResponseEvent is Fired");
338 InvokeAppControlCompleteListener(*pListener, aId, oId, ConvertAppControlResultCode(res), pArgs);
339 SysLog(NID_APP, "Listener called directly");
345 SysLog(NID_APP, "Wrong AppControl listener type.");
351 SysLogException(NID_APP, E_SYSTEM, "Invalid AppControl listener.");
354 // call TerminateAppControl
355 result (* pFunc)(int req) = null;
356 pFunc = reinterpret_cast<result (*)(int)>(pInfo->pLib->GetProcAddress(L"TerminateAppControl"));
359 (*pFunc)(pInfo->reqId);
363 SysLogException(NID_APP, E_SYSTEM, "No TerminateAppControl() function.");
366 // remove from list and unload dll
367 __inAppManager.RemoveItem(reqId);
372 _AppControlManager::SendAppControlEvent(IEventArg& arg)
374 return __appControlEvent.FireAsync(arg);
377 Tizen::Base::Collection::IMapT<int,_AppControlResponseEvent*>*
378 _AppControlManager::GetAppControlResponseEventContainer(void)
380 return __pAppControlResponseEventContainer;
384 // generic launch callback
386 LaunchResultCb(bundle* b, int request_code, appsvc_result_val res, void* data)
388 SysLog(NID_APP, "SLP callee result: %d", res);
390 _AppControlManager* pImpl = static_cast<_AppControlManager*>(data);
396 _AppArg* pAppArg = new (std::nothrow) _AppArg;
397 SysTryReturnVoidResult(NID_APP, pAppArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] AppControl event argument creation failure.");
399 _AppControlEventArg* pArg = null;
400 result r = pAppArg->Construct(b);
401 SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] AppControl event argument creation failure.", GetErrorMessage(r));
403 pArg = new (std::nothrow) _AppControlEventArg(request_code, pAppArg, res);
404 SysTryCatch(NID_APP, pArg != null, r = E_OUT_OF_MEMORY, r, "[E_OUT_OF_MEMORY] AppControl event argument creation failure.");
407 pImpl->SendAppControlEvent(*pArg);
417 _AppControlManager::SendAppControlStartResponse(int req, const char* pValue, const char* pOp)
419 _AppControlStartEventArg* pArg = new (std::nothrow) _AppControlStartEventArg(req, AppId(pValue), String(pOp));
420 SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "AppControl start event creation failure.");
422 SendAppControlEvent(*pArg);
429 _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data)
431 bundle* kb = msg.GetBundle();
432 SysTryReturnResult(NID_APP, kb != NULL, E_OUT_OF_MEMORY, "Bundle allocation failure.");
436 appsvc_set_pkgname(kb, pkg_name);
439 appsvc_set_operation(kb, (op) ? op : APPSVC_OPERATION_DEFAULT);
443 appsvc_set_mime(kb, mime);
448 appsvc_set_uri(kb, uri);
451 if (_AppImpl::GetInstance() != null)
453 const long handle = _AppImpl::GetInstance()->GetWindowHandle();
454 _AppArg::UpdateWindowHandle(kb, handle);
457 SysLog(NID_APP, "MIME(%s), URI(%s).", appsvc_get_mime(kb), appsvc_get_uri(kb));
458 int pid = appsvc_run_service(kb, 0, reinterpret_cast<appsvc_res_fn>(pCb), this);
460 result r = E_SUCCESS;
465 case APPSVC_RET_EILLACC:
466 r = E_ILLEGAL_ACCESS;
468 case APPSVC_RET_EINVAL:
475 SysLog(NID_APP, "[%s] Launching service %s failure", GetErrorMessage(r), pkg_name);
483 _AppControlManager::Launch(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data)
485 bundle* kb = msg.GetBundle();
486 SysTryReturn(NID_APP, kb != NULL, -1, E_OUT_OF_MEMORY, "Bundle allocation failure.");
490 appsvc_set_pkgname(kb, pkg_name);
493 appsvc_set_operation(kb, (op) ? op : APPSVC_OPERATION_DEFAULT);
497 appsvc_set_mime(kb, mime);
502 appsvc_set_uri(kb, uri);
505 if (_AppImpl::GetInstance() != null)
507 const long handle = _AppImpl::GetInstance()->GetWindowHandle();
508 _AppArg::UpdateWindowHandle(kb, handle);
511 SysLog(NID_APP, "MIME(%s), URI(%s).", appsvc_get_mime(kb), appsvc_get_uri(kb));
512 int pid = appsvc_run_service(kb, 0, reinterpret_cast<appsvc_res_fn>(pCb), this);
514 result r = E_SUCCESS;
519 case APPSVC_RET_EILLACC:
520 r = E_ILLEGAL_ACCESS;
522 case APPSVC_RET_EINVAL:
529 SysLog(NID_APP, "[%s]Launching service %s failure", GetErrorMessage(r), pkg_name);
538 _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const AppId& appId, const String& opId, const String* pUri, const String* pMime, AppSvcResFn pCb, void* data)
540 std::unique_ptr<char[]> pPackage(_StringConverter::CopyToCharArrayN(appId));
541 std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(opId));
543 const char* pUriData = null;
546 pUriData = _StringConverter::CopyToCharArrayN(*pUri);
549 const char* pMimeData = null;
552 pMimeData = _StringConverter::CopyToCharArrayN(*pMime);
555 int pid = Launch(msg, pPackage.get(), pOperation.get(), pMimeData, pUriData, pCb, data);
565 _AppControlManager::LaunchPkg(const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data)
569 return LaunchPkg(msg, pkg_name, op, mime, uri, pCb, data);
573 _AppControlManager::LaunchAppWithCondition(const AppId& appId, const String& condition, IList* pArrayArgs)
575 result r = E_SUCCESS;
576 _AppArg * pArg = new (std::nothrow) _AppArg();
577 SysTryCatch(NID_APP, pArg != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
579 r = pArg->ConstructForAppLaunchCondition(condition, pArrayArgs);
580 SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] ConstructForAppLaunchCondition(%ls, .. ) fails", GetErrorMessage(r), condition.GetPointer());
582 r = _AppControlManager::LaunchApp(appId, pArg);
589 _AppControlManager::LaunchApp(const AppId& appId, _AppArg* pArg, int req)
591 SysTryReturnResult(NID_APP, pArg != null, E_INVALID_ARG, "Invalid launch argument");
592 SysLog(NID_APP, "App: %ls.", appId.GetPointer());
594 String actualAppId = appId;
595 if (appId.GetLength() == 10)
597 const String& name = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(appId);
601 actualAppId.Append(L'.');
602 actualAppId.Append(name);
606 pArg->UpdateRequestId(req);
608 if (_AppImpl::GetInstance() != null)
610 const long handle = _AppImpl::GetInstance()->GetWindowHandle();
611 pArg->UpdateWindowHandle(handle);
617 actualAppId.SubString(0, 10, tempId);
619 tempId += L"_AppControl";
621 // [INFO] Ugly solution for submode support
622 pArg->UpdateAppId(tempId);
623 kb = pArg->GetBundle();
625 pid = appsvc_run_service(kb, req, LaunchResultCb, this);
628 SysLog(NID_APP, "Submode launch successful");
631 else if (pid == APPSVC_RET_EINVAL)
633 SysLog(NID_APP, "Argument overflow");
634 return E_MAX_EXCEEDED;
637 pArg->UpdateAppId(actualAppId);
639 // retry for possible failure
641 const int TRY_COUNT = 3;
642 const int TRY_SLEEP_TIME = 65;
645 kb = pArg->GetBundle();
646 pid = appsvc_run_service(kb, req, LaunchResultCb, this);
649 SysLog(NID_APP, "Application(%d) launched with reqId(%d) and arg(0x%x).", pid, req, pArg);
652 else if (pid == APPSVC_RET_EINVAL)
654 SysLog(NID_APP, "Argument overflow");
655 return E_MAX_EXCEEDED;
659 SysLog(NID_APP, "Waiting %dth time.", count);
660 Thread::Sleep(TRY_SLEEP_TIME);
662 while (count < TRY_COUNT);
664 result r = E_SUCCESS;
667 case APPSVC_RET_EILLACC:
668 r = E_ILLEGAL_ACCESS;
675 SysLogException(NID_APP, r, "[%s] Launching service failure for %ls", GetErrorMessage(r), appId.GetPointer());
681 _IsDefaultApplication(const AppId& packageId, const String& appId)
683 const String& execName = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(packageId);
686 result r = appId.IndexOf(L'.', 0, index);
693 appId.SubString(index + 1, tmp);
696 SysLog(NID_APP, "Default application %ls", tmp.GetPointer());
705 _AppControlManager::Launch(const _AppMessageImpl& msg, const AppId& aId, const String& oId, const String* pUriData, const String* pMimeType, AppSvcResFn pCb, void* pData)
707 SysLog(NID_APP, "Enter");
710 arg.Construct(msg, oId, pUriData, pMimeType);
712 int pid = Launch(aId, &arg, pCb, pData, -1);
713 SysTryReturn(NID_APP, pid >= 0, -1, GetLastResult(), "Launching(%ls) is failed", aId.GetPointer());
715 SysLog(NID_APP, "Exit");
722 _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, int req)
724 return Launch(appId, pArg, reinterpret_cast<AppSvcResFn>(LaunchResultCb), this, req);
729 _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, void* pData, int req)
731 SysTryReturn(NID_APP, pArg != null, -1, E_INVALID_ARG, "[E_INVALID_ARG] Invalid launch argument");
732 SysLog(NID_APP, "App: %ls.", appId.GetPointer());
734 String actualAppId = appId;
735 if (appId.GetLength() == 10)
737 const String& execName = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(appId);
739 if (!execName.IsEmpty())
741 actualAppId.Append(L'.');
742 actualAppId.Append(execName);
746 pArg->UpdateRequestId(req);
748 if (_AppImpl::GetInstance() != null)
750 const long handle = _AppImpl::GetInstance()->GetWindowHandle();
751 pArg->UpdateWindowHandle(handle);
758 actualAppId.SubString(0, 10, tempId);
760 if (_IsDefaultApplication(tempId, appId))
763 tempId += L"_AppControl";
765 // [INFO] Ugly solution for submode support
766 pArg->UpdateAppId(tempId);
767 kb = pArg->GetBundle();
769 pid = appsvc_run_service(kb, req, reinterpret_cast<appsvc_res_fn>(pCb), pData);
772 SysLog(NID_APP, "Submode launch successful");
773 SetLastResult(E_SUCCESS);
776 else if (pid == APPSVC_RET_EINVAL)
778 SetLastResult(E_MAX_EXCEEDED);
783 pArg->UpdateAppId(actualAppId);
785 // retry for possible failure
787 const int TRY_COUNT = 3;
788 const int TRY_SLEEP_TIME = 65;
791 kb = pArg->GetBundle();
792 pid = appsvc_run_service(kb, req, reinterpret_cast<appsvc_res_fn>(pCb), pData);
795 SysLog(NID_APP, "Application(%d) launched with reqId(%d) and arg(0x%x).", pid, req, pArg);
796 SetLastResult(E_SUCCESS);
799 else if (pid == APPSVC_RET_EINVAL)
801 SetLastResult(E_MAX_EXCEEDED);
806 SysLog(NID_APP, "Waiting %dth time with %d.", count, pid);
807 Thread::Sleep(TRY_SLEEP_TIME);
809 while (count < TRY_COUNT);
811 result r = E_SUCCESS;
814 case APPSVC_RET_EILLACC:
815 r = E_ILLEGAL_ACCESS;
822 SysLogException(NID_APP, r, "[%s] Launching service failure for %ls", GetErrorMessage(r), appId.GetPointer());
830 _AppControlManager::LaunchAppImplicit(_AppArg* pArg, int req)
832 SysTryReturnResult(NID_APP, pArg != null, E_INVALID_ARG, "Invalid launch argument");
834 result r = E_SUCCESS;
835 bundle* kb = pArg->GetBundle();
839 pArg->UpdateRequestId(req);
840 _AppMessageImpl::AddData(kb, SELECTOR_NOTI_KEY, _AppInfo::GetApplicationId());
843 if (_AppImpl::GetInstance() != null)
845 const long handle = _AppImpl::GetInstance()->GetWindowHandle();
846 _AppArg::UpdateWindowHandle(kb, handle);
849 int pid = appsvc_run_service(kb, req, LaunchResultCb, this);
854 SysLog(NID_APP, "Sending local process again.");
858 char pkgname[255] = {0, };
859 aul_app_get_pkgname_bypid(pid, pkgname, 255);
861 if (strncmp(pkgname, APP_SELECTOR, strlen(APP_SELECTOR)) != 0)
863 const char* pOperation = appsvc_get_operation(kb);
865 SysLog(NID_APP, "Starting application without selector : (%s, %s).", pkgname, pOperation);
867 SendAppControlStartResponse(req, pkgname, pOperation);
874 case APPSVC_RET_EINVAL:
877 case APPSVC_RET_ENOMATCH:
880 case APPSVC_RET_EILLACC:
881 r = E_ILLEGAL_ACCESS;
883 case APPSVC_RET_ERROR:
885 case APPSVC_RET_ELAUNCH:
893 SysLog(NID_APP, "[%s] Application(%d) launched with reqId(%d) and arg(0x%x).", GetErrorMessage(r), pid, req, pArg);
899 _AppControlManager::FinishAppControl(int reqId, int res, IMap* pMap)
901 SysLog(NID_APP, "req %d, res %d.", reqId, res);
902 _NativeAppControlEventArg* pArg = new (std::nothrow) _NativeAppControlEventArg(reqId, res, pMap);
903 SysTryReturnVoidResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Return argument allocation failure.");
905 SendAppControlEvent(*pArg);
906 SysLog(NID_APP, "Exit.");
910 _AppControlManager::FindResultRequest(int reqId) const
912 const _ResultInfo* pInfo = __resultManager.FindItem(reqId);
913 return (pInfo) ? &(pInfo->arg) : null;
917 _AppControlManager::AddLaunchRequest(_AppArg* pArg, LaunchCbType pCb, void* pData, int prop)
919 SysTryReturn(NID_APP, pArg != null, -1, E_INVALID_ARG, "[E_INVALID_ARG] Empty argument.");
921 _LaunchInfo* pItem = new (std::nothrow) _LaunchInfo(pArg, pCb, pData, prop);
922 SysTryReturn(NID_APP, pItem != null, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Empty argument.");
924 SysLog(NID_APP, "Registering callback 0x%x, 0x%x", pCb, pData);
926 return __launchManager.InsertItem(pItem);
930 _AppControlManager::RemoveLaunchRequest(int req)
932 __launchManager.RemoveItem(req);
936 _AppControlManager::RegisterRequest(service_s* service, int& req, _AppHandler& handler)
938 bundle* b = _AppArg::GetBundleFromSvc(service);
940 _AppArg* pArg = new (std::nothrow) _AppArg();
941 SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
944 result r = E_SUCCESS;
946 // ownership is transfered to RequestManager
947 _ResultInfo* pItem = new (std::nothrow) _ResultInfo(*pArg);
948 SysTryCatch(NID_APP, pItem != null, , r = E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Empty argument.");
950 req = __resultManager.InsertItem(pItem);
951 SysTryCatch(NID_APP, req != -1, , r = E_INVALID_STATE, "[E_INVALID_STATE] Invalid argument handling state.");
953 handler = _AppArg::GetHandler(b);
965 _AppControlManager::IsAllowedAppControl(const char aTable[][2][96], int count, const String& aId, const String& oId)
967 for (int i = 0; i < count; i++)
969 if (aId == aTable[i][0] && oId == aTable[i][1])
971 SysLog(NID_APP, "Found entry (%s, %s)", aTable[i][0], aTable[i][1]);
981 _AppControlManager::ConvertAppControlResultCode(int resCode)
983 AppCtrlResult ret = APP_CTRL_RESULT_FAILED;
987 case SERVICE_RESULT_SUCCEEDED:
988 ret = APP_CTRL_RESULT_SUCCEEDED;
990 case SERVICE_RESULT_FAILED:
991 ret = APP_CTRL_RESULT_CANCELED;
993 case SERVICE_RESULT_CANCELED:
994 ret = APP_CTRL_RESULT_ABORTED;
996 case APPSVC_OSP_RES_FAIL:
997 ret = APP_CTRL_RESULT_FAILED;
999 case APPSVC_OSP_RES_TERMINATE:
1000 ret = APP_CTRL_RESULT_TERMINATED;
1003 ret = APP_CTRL_RESULT_FAILED;
1012 _AppControlManager::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg)
1014 const _AppControlResponseEventArg* pEventArg = dynamic_cast<const _AppControlResponseEventArg*>(arg);
1016 if (pEventArg != null)
1018 IAppControlResponseListener* pResponseListener = pEventArg->GetListener();
1020 if(pResponseListener != null)
1022 if(pEventArg->GetType() == _APPCONTROL_RESPONSETYPE_START)
1024 pResponseListener->OnAppControlStartResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetResult());
1025 SysLog(NID_APP, "OnAppControlStartResponseReceived called");
1029 InvokeAppControlCompleteListener(*pResponseListener, pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData());
1030 SysLog(NID_APP, "Listener called");
1032 _AppControlResponseEvent* pResponseEvent = null;
1033 _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);
1034 _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->Remove(pEventArg->GetRequestId());
1036 delete pResponseEvent;
1037 SysLog(NID_APP, "pResponseEvent gets deleted, reqId(%d)", pEventArg->GetRequestId());
1042 SysLog(NID_APP, "Invalid ResponseListener");
1047 SysLog(NID_APP, "Invalid AppControl arguments : arg(0x%x)", &arg);
1052 _AppControlManager::GetAliasAppId(const AppId& appId)
1054 return _AppControlRegistry::GetInstance()->GetAliasAppId(appId);