refinement of osp-appfw log messages
[platform/framework/native/appfw.git] / src / app / FApp_AppControlImpl.cpp
index eb6139a..a43f50f 100755 (executable)
@@ -46,6 +46,9 @@
 #include "FApp_AppInfo.h"
 #include "FAppPkg_PackageManagerImpl.h"
 #include "FApp_Aul.h"
+#include "FApp_AppControlEventArg.h"
+#include "FApp_AppControlResponseEvent.h"
+#include "FBaseRt_ThreadImpl.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
@@ -73,10 +76,33 @@ _AppControlImpl::_AppControlImpl(const AppControl& value)
        , _property(_APPCONTROL_PROPERTY_NONE)
        , _processId(_REQ_ID_INVALID)
 {
+       __appControlResponseEventList.Construct();
 }
 
 _AppControlImpl::~_AppControlImpl(void)
 {
+       IEnumeratorT<int>* pEnum = __appControlResponseEventList.GetEnumeratorN();
+       IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = null;
+       if(pEnum != null)
+       {
+               pResponseEventContainer = _AppControlManager::GetInstance()->GetAppControlResponseEventContainer();
+       }
+
+       while(pEnum->MoveNext() == E_SUCCESS)
+       {
+               int reqId;
+               pEnum->GetCurrent(reqId);
+               if (pResponseEventContainer != null)
+               {
+                       _AppControlResponseEvent* pResponseEvent = null;
+                       pResponseEventContainer->GetValue(reqId, pResponseEvent);
+                       delete pResponseEvent;
+
+                       pResponseEventContainer->Remove(reqId);
+                       SysLog(NID_APP, "pResponseEvent gets deleted. reqId(%d)", reqId);
+               }
+       }
+       delete pEnum;
 }
 
 AppControl*
@@ -151,6 +177,7 @@ _AppControlImpl::GetInstance(AppControl& ac)
 result
 _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SYSTEM;
 
        if (_property & _APPCONTROL_PROPERTY_SLP)
@@ -165,6 +192,7 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
        {
                SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -172,6 +200,7 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
 result
 _AppControlImpl::Start(const String* pUriData, const String* pDataType, const IMap* pExtraData, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SYSTEM;
 
        if (_property & _APPCONTROL_PROPERTY_SLP)
@@ -186,6 +215,7 @@ _AppControlImpl::Start(const String* pUriData, const String* pDataType, const IM
        {
                SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -194,6 +224,7 @@ result
 _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPattern, const String* pDataType, const String* pCategory, const IMap* pExtraData, IAppControlResponseListener* pListener)
 {
        // [FIXME] valid argument size checking required
+       SysLog(NID_APP, "Enter");
 
        std::unique_ptr<bundle, BundleDeleter> pBundle(bundle_create());
        SysTryReturnResult(NID_APP, pBundle.get(), E_OUT_OF_MEMORY, "Bundle creation failure.");
@@ -241,6 +272,7 @@ _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPatte
 result
 _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -272,6 +304,7 @@ _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pLis
                delete pArg;
                SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer());
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -279,6 +312,7 @@ _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pLis
 result
 _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -294,6 +328,27 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _property);
                req = reqObj.GetRequestNumber();
 
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*this, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       pResponseEventContainer->Add(req, pAppControlResponseEvent);
+                                       __appControlResponseEventList.Add(req);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+                               }
+                       }
+               }
+
                _processId = pImpl->Launch(_path, pArg, req);           
                if (_processId < 0)
                {
@@ -309,6 +364,7 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
                delete pArg;
                SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer());
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -316,6 +372,7 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
 result
 _AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -343,6 +400,7 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppCont
        }
 
        // [FIXME] launch registration is not working correctly
+       SysLog(NID_APP, "Exit");
 
 CATCH:
        return r;
@@ -351,6 +409,7 @@ CATCH:
 result
 _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -368,6 +427,26 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlRe
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _APPCONTROL_PROPERTY_NONE);
                req = reqObj.GetRequestNumber();
 
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*pImpl, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       pResponseEventContainer->Add(req, pAppControlResponseEvent);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+                               }
+                       }
+               }
                r = pImpl->LaunchAppImplicit(pArg, req);
                SysTryCatch(NID_APP, r == E_SUCCESS, reqObj.Invalidate(), r, "[%s] Propagating." , GetErrorMessage(r));
        }
@@ -376,6 +455,7 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlRe
                r = pImpl->LaunchAppImplicit(pArg, -1);
                delete pArg;
        }
+       SysLog(NID_APP, "Exit");
 
        // [FIXME] launch registration is not working correctly
 
@@ -385,7 +465,7 @@ CATCH:
 }
 
 result
-_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
 {
        SysLog(NID_APP, "Result value %d", res);
 
@@ -416,7 +496,7 @@ _AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg,
 
        if (prop & _APPCONTROL_PROPERTY_ALIAS)
        {
-               _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+               const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
                pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
                if (pEntry)
                {
@@ -432,7 +512,7 @@ _AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg,
                String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
                if (!tmp.IsEmpty())
                {
-                       SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
+                       SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
 
                        provider = tmp;
                }
@@ -450,9 +530,9 @@ _AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg,
 }
 
 result
-_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
 {
-       SysLog(NID_APP, "Result value %d", res);
+       SysLog(NID_APP, "Result value : %d, property : 0x%x", res, prop);
 
        SysTryReturnResult(NID_APP, data && pResArg && pArg, E_SYSTEM, "Invalid result (callback, result, arg) = (0x%x, 0x%x, 0x%x).",
                                          data, pResArg,
@@ -481,14 +561,14 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
 
        if (prop & _APPCONTROL_PROPERTY_ALIAS)
        {
-               _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
-               pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
+               const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+               pEntry = _AppControlRegistry::GetInstance()->GetReverseRuntimeAliasEntry(provider, oId);
                if (pEntry)
                {
                        provider = pEntry->provider;
                        oId = pEntry->operation;
 
-                       SysLog(NID_APP, "Legacy AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
+                       SysLog(NID_APP, "Original AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
                }
        }
 
@@ -497,7 +577,7 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
                String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
                if (!tmp.IsEmpty())
                {
-                       SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
+                       SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
 
                        provider = tmp;
                }
@@ -505,35 +585,25 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
 
        std::unique_ptr<HashMap> pMap(pResArg->GetArgMapN());
 
-       AppCtrlResult ret = APP_CTRL_RESULT_FAILED;
-       // to prevent enum overflow;
-       int resCode = res;
-       switch(resCode)
-       {
-       case SERVICE_RESULT_SUCCEEDED:
-               ret = APP_CTRL_RESULT_SUCCEEDED;
-               break;
-       case SERVICE_RESULT_FAILED:
-               ret = APP_CTRL_RESULT_CANCELED;
-               break;
-       case SERVICE_RESULT_CANCELED:
-               ret = APP_CTRL_RESULT_ABORTED;
-               break;
-       case APPSVC_OSP_RES_FAIL:
-               ret = APP_CTRL_RESULT_FAILED;
-               break;
-       case APPSVC_OSP_RES_TERMINATE:
-               ret = APP_CTRL_RESULT_TERMINATED;
-               break;
-       default:
-               ret = APP_CTRL_RESULT_FAILED;
-               break;
-       }
+       AppCtrlResult ret = _AppControlManager::ConvertAppControlResultCode(res);
 
        SysLog(NID_APP, "Result code : 0x%x.", ret);
 
        // proper callback invokation
-       pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+       _AppControlResponseEvent* pResponseEvent = null;
+       _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(reqId, pResponseEvent);
+
+       if (pResponseEvent != null)
+       {
+               _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, provider, oId, E_SUCCESS, ret, pMap.get(), reqId);
+               pResponseEvent->Fire(*pResponseEventArg);
+               SysLog(NID_APP, "OnAppControlCompleteResponseReceived, pResponseEvent is Fired");
+       }
+       else
+       {
+               pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+               SysLog(NID_APP, "OnAppControlCompleteResponseReceived, Called");
+       }
 
        return E_SUCCESS;
 }
@@ -541,6 +611,7 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
 result
 _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
@@ -583,6 +654,7 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p
 
        _reqId = req;
 
+       SysLog(NID_APP, "Exit");
        return E_SUCCESS;
 
 CATCH:
@@ -604,6 +676,7 @@ CATCH:
 result
 _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
@@ -627,6 +700,29 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
                {
                        req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
                }
+
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*this, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = _AppControlManager::GetInstance()->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       int responseEventRequestId = RESPONSE_EVENT_REQID_MAGIC + req;
+                                       pResponseEventContainer->Add(responseEventRequestId, pAppControlResponseEvent);
+                                       __appControlResponseEventList.Add(responseEventRequestId);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", responseEventRequestId);
+                               }
+                       }
+               }
        }
        r = InvokeStartAppControl(*pLib, req, _provider, _opId, pUriData, pMimeType, pDataList);
 
@@ -646,6 +742,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
        }
 
        _reqId = req;
+       SysLog(NID_APP, "Exit");
 
        return E_SUCCESS;
 
@@ -800,7 +897,7 @@ _AppControlImpl::GetAppName(void)
 
                                if (pNewInfo.get())
                                {
-                                       _appName = pNewInfo->GetAppName();
+                                       _appName = pNewInfo->GetAppDisplayName();
                                }
                                else
                                {
@@ -809,7 +906,7 @@ _AppControlImpl::GetAppName(void)
                        }
                        else
                        {
-                               _appName = pInfo->GetAppName();
+                               _appName = pInfo->GetAppDisplayName();
                        }
                        SysLog(NID_APP, "Initializing AppName(%ls) for %ls.", _appName.GetPointer(), appId.GetPointer());
                }
@@ -842,7 +939,7 @@ _AppControlImpl::GetCategoryListN(void) const
        const AppId& appId = GetAppId();
        SysTryReturn(NID_APP, !appId.IsEmpty(), null, E_SYSTEM, "[E_SYSTEM] Empty appId.");
 
-       SysLog(NID_APP, "Acquiring category for appId %ls.", appId.GetPointer());
+       SysLog(NID_APP, "Acquiring category for app %ls.", appId.GetPointer());
 
        std::unique_ptr<PackageAppInfo> pAppInfo(_PackageManagerImpl::GetInstance()->GetPackageAppInfoN(appId));
        SysTryReturn(NID_APP, pAppInfo.get() != null, null, E_SYSTEM, "[E_SYSTEM] Getting PackageAppInfo failed.");
@@ -856,4 +953,42 @@ _AppControlImpl::StopAppControlResponseListener(IAppControlResponseListener* pLi
        _AppControlManager::GetInstance()->__listenerList.Add(pListener);
 }
 
+void
+_AppControlImpl::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg)
+{
+       const _AppControlResponseEventArg* pEventArg = dynamic_cast<const _AppControlResponseEventArg*>(arg);
+
+       if (pEventArg != null)
+       {
+               IAppControlResponseListener* pResponseListener = pEventArg->GetListener();
+
+               if(pResponseListener != null)
+               {
+                       if(pEventArg->GetType() == _APPCONTROL_RESPONSETYPE_COMPLETE)
+                       {
+                               pResponseListener->OnAppControlCompleteResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData());
+                               SysLog(NID_APP, "OnAppControlCompleteResponseReceived called");
+
+                               _AppControlResponseEvent* pResponseEvent = null;
+                               _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);
+                               _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->Remove(pEventArg->GetRequestId());
+                               delete pResponseEvent;
+                               SysLog(NID_APP, "pResponseEvent gets deleted, reqId(%d)", pEventArg->GetRequestId());
+                       }
+                       else
+                       {
+                               SysLog(NID_APP, "Unexpected AppControlResponseType(%d)", pEventArg->GetType());
+                       }
+               }
+               else
+               {
+                       SysLog(NID_APP, "Invalid ResponseListener");
+               }
+       }
+       else
+       {
+               SysLog(NID_APP, "Invalid AppControl arguments : arg(0x%x)", &arg);
+       }
+
+}
 }}    //Tizen::App