Set packageId for efltpk
[platform/framework/native/appfw.git] / src / app / FApp_AppControlManager.cpp
old mode 100755 (executable)
new mode 100644 (file)
index deb13b1..df4f4cc
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -76,8 +75,6 @@ using namespace Tizen::Base::Runtime;
 using namespace Tizen::Base::Utility;
 using namespace Tizen::Io;
 
-//extern const char* _DATACONTROL_RESULTSET_DIR;
-
 namespace Tizen { namespace App
 {
 
@@ -200,7 +197,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int
 void
 _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, const String& operationId)
 {
-       SysLog(NID_APP, "Received request Id %d, appId %ls, operationId %ls", reqId, appId.GetPointer(), operationId.GetPointer());
+       SysLog(NID_APP, "Received request Id %d, app %ls, operationId %ls", reqId, appId.GetPointer(), operationId.GetPointer());
 
        // get launch info from request Id
        _LaunchInfo* pInfo = __launchManager.FindItem(reqId);
@@ -227,7 +224,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, co
                if (pResponseEvent != null)
                {
                        String oId(operationId);
-                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_START, actualAppId, oId, r, APP_CTRL_RESULT_SUCCEEDED, null, reqId);
+                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_START, actualAppId, oId, r, APP_CTRL_RESULT_SUCCEEDED, null, reqId, false);
 
                        if (pResponseEventArg != null)
                        {
@@ -248,9 +245,37 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, co
 }
 
 
+void
+_AppControlManager::InvokeAppControlCompleteListener(IAppControlResponseListener& listener, const AppId& appId, const String& op, AppCtrlResult res, const IMap* pExtraData, bool isSubMode)
+{
+       listener.OnAppControlCompleteResponseReceived(appId, op, res, pExtraData);
+
+       if (!isSubMode)
+       {
+               _AppImpl::GetInstance()->SendUserEvent(_APP_EVENT_RAISE, null, false);
+       }
+
+       SysLog(NID_APP, "AppControl response finished.");
+}
+
+
+void
+_AppControlManager::InvokeLegacyAppControlCompleteListener(IAppControlEventListener& listener, const AppId& appId, const String& op, const IList* pList, bool isSubMode)
+{
+       listener.OnAppControlCompleted(appId, op, pList);
+
+       if (!isSubMode)
+       {
+               _AppImpl::GetInstance()->SendUserEvent(_APP_EVENT_RAISE, null, false);
+       }
+
+       SysLog(NID_APP, "Legacy AppControl response finished.");
+}
+
+
 // callback for in-process event handling
 void
-_AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* pArgs)
+_AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* pArgs, int property)
 {
        SysLog(NID_APP, "Received request Id %d, res %d, args 0x%x", reqId, res, pArgs);
 
@@ -275,10 +300,12 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
                                aId = pEntry->provider;
                                oId = pEntry->operation;
 
-                               SysLog(NID_APP, "Legacy AppControl name (%ls, %ls).", aId.GetPointer(), oId.GetPointer());
+                               SysLog(NID_APP, "Legacy AppControl (%ls, %ls).", aId.GetPointer(), oId.GetPointer());
                        }
                }
 
+               const bool isSubMode = (property & _APPCONTROL_PROPERTY_SUBMODE);
+
                if (pInfo->isLegacy)
                {
                        IAppControlEventListener* pListener = dynamic_cast<IAppControlEventListener*>(pInfo->pListener);
@@ -287,7 +314,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
                                ArrayList list(SingleObjectDeleter);
                                _AppArg::FillLegacyAppControlResult(list, res, pArgs, aId);
 
-                               pListener->OnAppControlCompleted(aId, oId, &list);
+                               InvokeLegacyAppControlCompleteListener(*pListener, aId, oId, &list, isSubMode);
                        }
                        else
                        {
@@ -305,7 +332,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
 
                                if (pResponseEvent != null)
                                {
-                                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, aId, oId, E_SUCCESS, static_cast<AppCtrlResult>(res), pArgs, responseEventRequestId);
+                                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, aId, oId, E_SUCCESS, static_cast<AppCtrlResult>(res), const_cast<IMap*> (pArgs), responseEventRequestId, isSubMode);
                                        if (pResponseEventArg != null)
                                        {
                                                pResponseEvent->Fire(*pResponseEventArg);
@@ -314,8 +341,9 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
                                }
                                else
                                {
-                                       pListener->OnAppControlCompleteResponseReceived(aId, oId, ConvertAppControlResultCode(res), pArgs);
-                                       SysLog(NID_APP, "OnAppControlCompleteResponseReceived called directly");
+                                       InvokeAppControlCompleteListener(*pListener, aId, oId, ConvertAppControlResultCode(res), pArgs, isSubMode);
+                                       SysLog(NID_APP, "Listener called directly");
+                                       delete pArgs;
                                }
                        }
                        else
@@ -443,11 +471,14 @@ _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const
                case APPSVC_RET_EILLACC:
                        r = E_ILLEGAL_ACCESS;
                        break;
+               case APPSVC_RET_EINVAL:
+                       r = E_MAX_EXCEEDED;
+                       break;
                default:
                        r = E_SYSTEM;
                        break;
                }
-               SysLog(NID_APP, "[%s]Launching service %s failure", GetErrorMessage(r), pkg_name);
+               SysLog(NID_APP, "[%s] Launching service %s failure", GetErrorMessage(r), pkg_name);
        }
 
        return r;
@@ -494,6 +525,9 @@ _AppControlManager::Launch(_AppMessageImpl& msg, const char* pkg_name, const cha
                case APPSVC_RET_EILLACC:
                        r = E_ILLEGAL_ACCESS;
                        break;
+               case APPSVC_RET_EINVAL:
+                       r = E_MAX_EXCEEDED;
+                       break;
                default:
                        r = E_SYSTEM;
                        break;
@@ -561,7 +595,7 @@ result
 _AppControlManager::LaunchApp(const AppId& appId, _AppArg* pArg, int req)
 {
        SysTryReturnResult(NID_APP, pArg != null, E_INVALID_ARG, "Invalid launch argument");
-       SysLog(NID_APP, "AppId: %ls.", appId.GetPointer());
+       SysLog(NID_APP, "App: %ls.", appId.GetPointer());
 
        String actualAppId = appId;
        if (appId.GetLength() == 10)
@@ -595,11 +629,16 @@ _AppControlManager::LaunchApp(const AppId& appId, _AppArg* pArg, int req)
        kb = pArg->GetBundle();
        
        pid = appsvc_run_service(kb, req, LaunchResultCb, this);
-       if (pid > 0)
+       if (pid >= 0)
        {
                SysLog(NID_APP, "Submode launch successful");
                return E_SUCCESS;
        }
+       else if (pid == APPSVC_RET_EINVAL)
+       {
+               SysLog(NID_APP, "Argument overflow");
+               return E_MAX_EXCEEDED;
+       }
 
        pArg->UpdateAppId(actualAppId);
 
@@ -611,11 +650,17 @@ _AppControlManager::LaunchApp(const AppId& appId, _AppArg* pArg, int req)
        {
                kb = pArg->GetBundle();
                pid = appsvc_run_service(kb, req, LaunchResultCb, this);
-               if (pid > 0)
+               if (pid >= 0)
                {
                        SysLog(NID_APP, "Application(%d) launched with reqId(%d) and arg(0x%x).", pid, req, pArg);
                        return E_SUCCESS;
                }
+               else if (pid == APPSVC_RET_EINVAL)
+               {
+                       SysLog(NID_APP, "Argument overflow");
+                       return E_MAX_EXCEEDED;
+               }
+
                count++;
                SysLog(NID_APP, "Waiting %dth time.", count);
                Thread::Sleep(TRY_SLEEP_TIME);
@@ -690,7 +735,7 @@ int
 _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, void* pData, int req)
 {
        SysTryReturn(NID_APP, pArg != null, -1, E_INVALID_ARG, "[E_INVALID_ARG] Invalid launch argument");
-       SysLog(NID_APP, "AppId: %ls.", appId.GetPointer());
+       SysLog(NID_APP, "App: %ls.", appId.GetPointer());
 
        String actualAppId = appId;
        if (appId.GetLength() == 10)
@@ -728,9 +773,15 @@ _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, v
                kb = pArg->GetBundle();
 
                pid = appsvc_run_service(kb, req, reinterpret_cast<appsvc_res_fn>(pCb), pData);
-               if (pid > 0)
+               if (pid >= 0)
                {
                        SysLog(NID_APP, "Submode launch successful");
+                       SetLastResult(E_SUCCESS);
+                       return pid;
+               }
+               else if (pid == APPSVC_RET_EINVAL)
+               {
+                       SetLastResult(E_MAX_EXCEEDED);
                        return pid;
                }
        }
@@ -745,13 +796,20 @@ _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, v
        {
                kb = pArg->GetBundle();
                pid = appsvc_run_service(kb, req, reinterpret_cast<appsvc_res_fn>(pCb), pData);
-               if (pid > 0)
+               if (pid >= 0)
                {
                        SysLog(NID_APP, "Application(%d) launched with reqId(%d) and arg(0x%x).", pid, req, pArg);
+                       SetLastResult(E_SUCCESS);
+                       return pid;
+               }
+               else if (pid == APPSVC_RET_EINVAL)
+               {
+                       SetLastResult(E_MAX_EXCEEDED);
                        return pid;
                }
+
                count++;
-               SysLog(NID_APP, "Waiting %dth time.", count);
+               SysLog(NID_APP, "Waiting %dth time with %d.", count, pid);
                Thread::Sleep(TRY_SLEEP_TIME);
        }
        while (count < TRY_COUNT);
@@ -788,9 +846,21 @@ _AppControlManager::LaunchAppImplicit(_AppArg* pArg, int req)
                _AppMessageImpl::AddData(kb, SELECTOR_NOTI_KEY, _AppInfo::GetApplicationId());
        }
 
+       if (_AppImpl::GetInstance() != null)
+       {
+               const long handle = _AppImpl::GetInstance()->GetWindowHandle();
+               _AppArg::UpdateWindowHandle(kb, handle);
+       }
+
        int pid = appsvc_run_service(kb, req, LaunchResultCb, this);
-       if (pid > 0)
+       if (pid >= 0)
        {
+               if (pid == 0)
+               {
+                       SysLog(NID_APP, "Sending local process again.");
+                       pid = getpid();
+               }
+
                char pkgname[255] = {0, };
                aul_app_get_pkgname_bypid(pid, pkgname, 255);
 
@@ -835,7 +905,7 @@ void
 _AppControlManager::FinishAppControl(int reqId, int res, IMap* pMap)
 {
        SysLog(NID_APP, "req %d, res %d.", reqId, res);
-       _NativeAppControlEventArg* pArg = new (std::nothrow) _NativeAppControlEventArg(reqId, res, pMap);
+       _NativeAppControlEventArg* pArg = new (std::nothrow) _NativeAppControlEventArg(reqId, res, pMap, _APPCONTROL_PROPERTY_SUBMODE);
        SysTryReturnVoidResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Return argument allocation failure.");
 
        SendAppControlEvent(*pArg);
@@ -867,11 +937,6 @@ _AppControlManager::RemoveLaunchRequest(int req)
 {
        __launchManager.RemoveItem(req);
 }
-int
-_AppControlManager::GetLaunchRequestCount(void)
-{
-       return __launchManager.GetCount();
-}
 
 result
 _AppControlManager::RegisterRequest(service_s* service, int& req, _AppHandler& handler)
@@ -879,7 +944,7 @@ _AppControlManager::RegisterRequest(service_s* service, int& req, _AppHandler& h
        bundle* b = _AppArg::GetBundleFromSvc(service);
 
        _AppArg* pArg = new (std::nothrow) _AppArg();
-       SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "rrayList creation failure.");
+       SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
        pArg->Construct(b);
 
        result r = E_SUCCESS;
@@ -967,8 +1032,8 @@ _AppControlManager::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtim
                        }
                        else
                        {
-                               pResponseListener->OnAppControlCompleteResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData());
-                               SysLog(NID_APP, "OnAppControlCompleteResponseReceived called");
+                               InvokeAppControlCompleteListener(*pResponseListener, pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData(), pEventArg->IsSubMode());
+                               SysLog(NID_APP, "Listener called");
 
                                _AppControlResponseEvent* pResponseEvent = null;
                                _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);