X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fapp%2FFApp_AppControlImpl.cpp;h=a43f50fd1176a9283f602de20fbd577157a2ea40;hb=171728a26c90c3e5f0aad90716ed509db10e95e2;hp=eb6139a5c8fa515dd1573bf9fae80e11280496bb;hpb=655837f34dd097f2232353d8d3fb2daf97366462;p=platform%2Fframework%2Fnative%2Fappfw.git diff --git a/src/app/FApp_AppControlImpl.cpp b/src/app/FApp_AppControlImpl.cpp index eb6139a..a43f50f 100755 --- a/src/app/FApp_AppControlImpl.cpp +++ b/src/app/FApp_AppControlImpl.cpp @@ -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* pEnum = __appControlResponseEventList.GetEnumeratorN(); + IMapT* 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 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* 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* 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 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* 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 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(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