From de650df6bfc3dd0c7a962312f4d826ba907b8abc Mon Sep 17 00:00:00 2001 From: Young Ik Cho Date: Thu, 10 Oct 2013 15:24:07 +0900 Subject: [PATCH] move general AppControl launch logic to plugin Change-Id: Ib224b45f631919c1e7202c4cce1427910ad8dc24 Signed-off-by: Young Ik Cho --- src/app/FApp_AppArg.cpp | 94 +---- src/app/FApp_AppControlEvent.cpp | 2 +- src/app/FApp_AppControlEventArg.cpp | 50 +-- src/app/FApp_AppControlEventArg.h | 16 +- src/app/FApp_AppControlImpl.cpp | 504 ++++--------------------- src/app/{inc => }/FApp_AppControlImpl.h | 89 ++--- src/app/FApp_AppControlManager.cpp | 229 +++-------- src/app/FApp_AppControlRegistry.cpp | 207 ++-------- src/app/FApp_AppControlRegistry.h | 15 - src/app/FApp_AppManagerImpl.cpp | 10 +- src/app/FApp_AppMessageImpl.cpp | 7 + src/app/FApp_RequestManagerT.cpp | 4 +- src/app/inc/FApp_AppArg.h | 18 +- src/app/inc/FApp_AppControlManager.h | 21 +- src/app/inc/FApp_AppMessageImpl.h | 2 + src/app/inc/FApp_IAppControlSysEventListener.h | 2 +- src/app/inc/FApp_LaunchInfo.h | 24 +- src/app/inc/FApp_RequestManagerT.h | 2 + 18 files changed, 258 insertions(+), 1038 deletions(-) rename src/app/{inc => }/FApp_AppControlImpl.h (76%) diff --git a/src/app/FApp_AppArg.cpp b/src/app/FApp_AppArg.cpp index 96c0ae3..3f79949 100644 --- a/src/app/FApp_AppArg.cpp +++ b/src/app/FApp_AppArg.cpp @@ -80,9 +80,6 @@ static const char BUNDLE_KEY_PREFIX_UG[] = "__UG_"; static const char OSP_K_SUBMODE_CALLEE[] = "__OSP_SUB_CALLEE__"; static const char OSP_K_SERVICE_CALLEE[] = "__OSP_SERVICE_CALLEE__"; -const char TIZEN_NOTIFICATION_DATA[] = "http://tizen.org/appcontrol/data/notification"; -const wchar_t LEGACY_OPERATION_MAIN[] = L"osp.operation.MAIN"; - _AppArg::_AppArg(void) : __pBundle(null) @@ -120,26 +117,6 @@ _AppArg::Construct(const IList* pList) result -_AppArg::Construct(const _AppControlImpl& ac, const IList* pList) -{ - __pBundle = bundle_create(); - SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure."); - - return CreateAppControlArg(__pBundle, ac, pList); -} - - -result -_AppArg::Construct(const _AppControlImpl& ac, const String* pUri, const String* pMime, const IMap* pList) -{ - __pBundle = bundle_create(); - SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure."); - - return CreateAppControlArg(__pBundle, ac, pUri, pMime, pList); -} - - -result _AppArg::Construct(const _SqlDataControlImpl& dc, _DataControlRequestType requestType, const IList* pList) { __pBundle = bundle_create(); @@ -563,9 +540,9 @@ _AppArg::GetCallerAppId(void) const AppId -_AppArg::GetCalleeAppId(void) const +_AppArg::GetCalleeAppId(bundle* pBundle) { - const char* pBundleValue = bundle_get_val(__pBundle, AUL_K_CALLEE_APPID); + const char* pBundleValue = bundle_get_val(pBundle, AUL_K_CALLEE_APPID); const AppId retVal = pBundleValue; @@ -879,73 +856,6 @@ _AppArg::CreateAppLaunchConditionArg(bundle* b, const String& condition, const I } -result -_AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const IList* pList) -{ - SysAssertf(b != null, "Valid bundle should be supplied"); - - bundle* pb = b; - - AddStrArray(pb, OSP_K_ARG, pList); - - std::unique_ptr pOperation(_StringConverter::CopyToCharArrayN(ac._opId)); - if (pOperation) - { - appsvc_set_operation(pb, pOperation.get()); - } - - bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_APPCONTROL); - - return E_SUCCESS; -} - - -result -_AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const String* pUriData, const String* pMimeType, const IMap* pMap) -{ - return CreateAppControlArg(b, ac._opId, pUriData, pMimeType, pMap); -} - - -result -_AppArg::CreateAppControlArg(bundle* b, const String& oId, const String* pUriData, const String* pMimeType, const IMap* pMap) -{ - SysAssertf(b != null, "Valid bundle should be supplied"); - - bundle* pb = b; - - std::unique_ptr pOperation(_StringConverter::CopyToCharArrayN(oId)); - if (pOperation.get()) - { - appsvc_set_operation(pb, pOperation.get()); - } - - if (pUriData) - { - std::unique_ptr pUri(_StringConverter::CopyToCharArrayN(*pUriData)); - if (pUri.get()) - { - appsvc_set_uri(pb, pUri.get()); - } - } - - if (pMimeType) - { - std::unique_ptr pMime(_StringConverter::CopyToCharArrayN(*pMimeType)); - if (pMime.get()) - { - appsvc_set_mime(pb, pMime.get()); - } - } - - AddStrMap(pb, pMap); - - bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_APPCONTROL); - - return E_SUCCESS; -} - - namespace { const int MAX_LEN_DATA_CONTROL_REQ_TYPE = 8; diff --git a/src/app/FApp_AppControlEvent.cpp b/src/app/FApp_AppControlEvent.cpp index 5843165..ae009bd 100644 --- a/src/app/FApp_AppControlEvent.cpp +++ b/src/app/FApp_AppControlEvent.cpp @@ -52,7 +52,7 @@ _AppControlEvent::FireImpl(IEventListener& listener, const IEventArg& arg) if (pNativeArg != null) { - pListener->OnAppControlEventReceivedN(pNativeArg->GetRequestId(), pNativeArg->GetResult(), pNativeArg->GetArgs(), pNativeArg->GetProperty()); + pListener->OnAppControlPluginEventReceivedN(pNativeArg->GetRequestId(), pNativeArg->GetResult(), pNativeArg->GetOptionalAppId(), pNativeArg->GetOptionalOperationId(), pNativeArg->GetArgs(), pNativeArg->GetProperty()); return; } diff --git a/src/app/FApp_AppControlEventArg.cpp b/src/app/FApp_AppControlEventArg.cpp index 12404f0..dfc257d 100644 --- a/src/app/FApp_AppControlEventArg.cpp +++ b/src/app/FApp_AppControlEventArg.cpp @@ -44,53 +44,19 @@ _AppControlEventArg::~_AppControlEventArg(void) _NativeAppControlEventArg::_NativeAppControlEventArg(int reqId, int res, IMap* pArg, int prop) : __reqId(reqId) , __result(res) - , __pArgs(null) + , __pArgs(pArg) , __property(prop) { - if (pArg == null) - { - return; - } - -#if 0 - HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter); - SysTryReturnVoidResult(NID_APP, pMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory."); - - pMap->Construct(); - - std::unique_ptr pMapEnum(pArg->GetMapEnumeratorN()); - - while(pMapEnum->MoveNext() == E_SUCCESS) - { - String* pKey = dynamic_cast(pMapEnum->GetKey()); - String* pVal = dynamic_cast(pMapEnum->GetValue()); - - if (pKey == null || pVal == null) - { - continue; - } - - pMap->Add(new (std::nothrow) String(*pKey), new (std::nothrow) String(*pVal)); - } - - __pArgs = pMap; -#else - // ownership is transferred to event - __pArgs = pArg; -#endif - - return; } -_NativeAppControlEventArg::~_NativeAppControlEventArg(void) +_NativeAppControlEventArg::_NativeAppControlEventArg(int reqId, int res, const AppId& appId, const String& oId, IMap* pArg, int prop) + : __reqId(reqId) + , __result(res) + , __pArgs(pArg) + , __property(prop) + , __optAppId(appId) + , __optOperationId(oId) { -/* - if (__pArgs) - { - SysLog(NID_APP, "Deleting native AppControl argument."); - delete __pArgs; - } -*/ } } } // Tizen::App diff --git a/src/app/FApp_AppControlEventArg.h b/src/app/FApp_AppControlEventArg.h index 621fcf3..5585266 100644 --- a/src/app/FApp_AppControlEventArg.h +++ b/src/app/FApp_AppControlEventArg.h @@ -102,7 +102,9 @@ class _NativeAppControlEventArg public: _NativeAppControlEventArg(int reqId, int res, Tizen::Base::Collection::IMap* pArgs, int prop); - virtual ~_NativeAppControlEventArg(void); + _NativeAppControlEventArg(int reqId, int res, const AppId& appId, const Tizen::Base::String& oId, Tizen::Base::Collection::IMap* pArgs, int prop); + + virtual ~_NativeAppControlEventArg(void) {} int GetRequestId(void) const { @@ -124,11 +126,23 @@ public: return __property; } + AppId GetOptionalAppId(void) const + { + return __optAppId; + } + + Tizen::Base::String GetOptionalOperationId(void) const + { + return __optOperationId; + } + private: const int __reqId; const int __result; Tizen::Base::Collection::IMap* __pArgs; const int __property; + AppId __optAppId; + Tizen::Base::String __optOperationId; }; // _NativeAppControlEventArg /** diff --git a/src/app/FApp_AppControlImpl.cpp b/src/app/FApp_AppControlImpl.cpp index 0b5961a..d5db899 100644 --- a/src/app/FApp_AppControlImpl.cpp +++ b/src/app/FApp_AppControlImpl.cpp @@ -33,8 +33,6 @@ #include #include -#include - #include "FApp_AppControlImpl.h" #include "FApp_AppControlManager.h" #include "FApp_IAppControlPluginProvider.h" @@ -59,14 +57,13 @@ namespace { static const int _REQ_ID_INVALID = -1; +const wchar_t ACTL_IMPLICIT_PLUGIN[] = L"libosp-ac-implicit.so"; } namespace Tizen { namespace App { -const wchar_t TIZEN_OPERATION_MAIN[] = L"http://tizen.org/appcontrol/operation/main"; - _AppControlImpl::_AppControlImpl(const AppControl& value) : _appControl(value) , _reqId(_REQ_ID_INVALID) @@ -103,7 +100,7 @@ _AppControlImpl::~_AppControlImpl(void) } AppControl* -_AppControlImpl::CreateN(const String& path, const String& aId, const String& oId, const String& name, int prop) +_AppControlImpl::CreateN(const String& path, const String& aId, const String& oId, int prop) { SysTryReturn(NID_APP, !path.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] Path is empty."); SysTryReturn(NID_APP, !aId.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] Provider Id is empty."); @@ -116,48 +113,13 @@ _AppControlImpl::CreateN(const String& path, const String& aId, const String& oI SysTryReturn(NID_APP, pImpl != null, null, E_OUT_OF_MEMORY, "AppControlImpl instance must not be null."); pImpl->_path = path; - pImpl->_provider = aId; + pImpl->_appId = aId; pImpl->_opId = oId; - // [FIXME] Proper App name setting - pImpl->_appName = name; pImpl->_property = prop; return pAc; } -AppControl* -_AppControlImpl::CreateN(const AppId& appId, const String& operationId, bool changeAppId) -{ - SysTryReturn(NID_APP, !appId.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] appId is empty."); - - AppControl* pAc = new (std::nothrow) AppControl; - SysTryReturn(NID_APP, pAc != null, null, E_OUT_OF_MEMORY, "AppControl allocation failure."); - - _AppControlImpl* pImpl = pAc->__pAppControlImpl; - SysTryReturn(NID_APP, pImpl != null, null, E_OUT_OF_MEMORY, "AppControlImpl instance must not be null."); - - pImpl->_path = appId; - pImpl->_provider = appId; - pImpl->_opId = operationId; - //pImpl->_appName = appId; - pImpl->_property |= (_APPCONTROL_PROPERTY_OSP | _APPCONTROL_PROPERTY_PUBLIC); - - if (changeAppId) - { - pImpl->_property |= _APPCONTROL_PROPERTY_APPID_CHANGE; - } - - return pAc; -} - -AppControl* -_AppControlImpl::CreateN(const AppControl& ac) -{ - const _AppControlImpl* pImpl = GetInstance(ac); - SysTryReturn(NID_APP, pImpl != null, null, E_INVALID_STATE, "AppControlImpl instance must not be null."); - - return CreateN(pImpl->_path, pImpl->_provider, pImpl->_opId, pImpl->_appName, pImpl->_property); -} const _AppControlImpl* _AppControlImpl::GetInstance(const AppControl& ac) @@ -188,51 +150,6 @@ _AppControlImpl::GetAppControlPluginProvider(const String& path) return (*pProvider)(); } -result -_AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener) -{ - SysLog(NID_APP, "Enter"); - result r = E_SYSTEM; - - if (_property & _APPCONTROL_PROPERTY_SLP) - { - r = StartNative(pDataList, pListener); - } - else if (_property & _APPCONTROL_PROPERTY_OSP) - { - r = StartOsp(pDataList, pListener); - } - else - { - SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property); - } - SysLog(NID_APP, "Exit"); - - return r; -} - -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) - { - r = StartNative(pUriData, pDataType, pExtraData, pListener); - } - else if (_property & _APPCONTROL_PROPERTY_OSP) - { - r = StartOsp(pUriData, pDataType, pExtraData, pListener); - } - else - { - SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property); - } - SysLog(NID_APP, "Exit"); - - return r; -} result _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPattern, const String* pDataType, const String* pCategory, const IMap* pExtraData, IAppControlResponseListener* pListener) @@ -283,351 +200,68 @@ _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPatte return StartImplicit(pBundle.get(), pExtraData, pListener); } -result -_AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pListener) -{ - SysLog(NID_APP, "Enter"); - result r = E_SUCCESS; - - _AppArg* pArg = new (std::nothrow) _AppArg; - SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "Argument allocation failure."); - - pArg->Construct(*this, pDataList); - - _AppControlManager* pImpl = _AppControlManager::GetInstance(); - int req = _REQ_ID_INVALID; - - if (pListener) - { - _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCbLegacy, pListener, _property); - req = reqObj.GetRequestNumber(); - - _processId = pImpl->Launch(_path, pArg, req); - - if (_processId < 0) - { - reqObj.Invalidate(); - r = GetLastResult(); - SysLog(NID_APP, "[%s]Launching(%ls) is failed" , GetErrorMessage(r), _path.GetPointer()); - return r; - } - } - else - { - _processId = pImpl->Launch(_path, pArg); - delete pArg; - SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer()); - } - SysLog(NID_APP, "Exit"); - - return r; -} result -_AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener) +_AppControlImpl::StartImplicit(const _AppMessageImpl& msg, IEventListener* pListener, bool isLegacy) { SysLog(NID_APP, "Enter"); - result r = E_SUCCESS; - - _AppArg* pArg = new (std::nothrow) _AppArg; - SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "Argument allocation failure."); - - pArg->Construct(*this, pUriData, pMimeType, pDataList); - - _AppControlManager* pImpl = _AppControlManager::GetInstance(); int req = _REQ_ID_INVALID; - if (pListener) - { - _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) - { - reqObj.Invalidate(); - r = GetLastResult(); - SysLog(NID_APP, "[%s]Launching(%ls) is failed" , GetErrorMessage(r), _path.GetPointer()); - return r; - } - } - else - { - _processId = pImpl->Launch(_path, pArg); - delete pArg; - SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer()); - } - SysLog(NID_APP, "Exit"); - - return r; -} - -result -_AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener) -{ - SysLog(NID_APP, "Enter"); - result r = E_SUCCESS; - - _AppArg* pArg = new (std::nothrow) _AppArg; - SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "Argument allocation failure."); - - pArg->Construct(pBundle); - - _AppMessageImpl::AddData(pArg->GetBundle(), pDataList); - - _AppControlManager* pImpl = _AppControlManager::GetInstance(); - int req = _REQ_ID_INVALID; - - if (pListener) - { - _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCbLegacy, pListener, _APPCONTROL_PROPERTY_NONE); - req = reqObj.GetRequestNumber(); - - r = pImpl->LaunchAppImplicit(pArg, req); - SysTryCatch(NID_APP, r == E_SUCCESS, reqObj.Invalidate(), r, "[%s] Propagating." , GetErrorMessage(r)); - } - else - { - r = pImpl->LaunchAppImplicit(pArg, -1); - delete pArg; - } - - // [FIXME] launch registration is not working correctly - SysLog(NID_APP, "Exit"); - -CATCH: - return r; -} - -result -_AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener) -{ - SysLog(NID_APP, "Enter"); - result r = E_SUCCESS; - - _AppArg* pArg = new (std::nothrow) _AppArg; - SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "Argument allocation failure."); - - pArg->Construct(pBundle); - - _AppArg::AddStrMap(pArg->GetBundle(), pData); - - _AppControlManager* pImpl = _AppControlManager::GetInstance(); - int req = _REQ_ID_INVALID; + _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(ACTL_IMPLICIT_PLUGIN); + SysTryReturnResult(NID_APP, pProvider != null, E_OBJ_NOT_FOUND, "Propagating."); if (pListener) { - _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _APPCONTROL_PROPERTY_NONE); - req = reqObj.GetRequestNumber(); - - if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN) + _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(isLegacy, pProvider, pListener); + if (pItem) { - _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); - } - } + req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem); } - r = pImpl->LaunchAppImplicit(pArg, req); - SysTryCatch(NID_APP, r == E_SUCCESS, reqObj.Invalidate(), r, "[%s] Propagating." , GetErrorMessage(r)); - } - else - { - r = pImpl->LaunchAppImplicit(pArg, -1); - delete pArg; } - SysLog(NID_APP, "Exit"); - // [FIXME] launch registration is not working correctly + result r = InvokeStartAppControl(pProvider, req, L"", msg); -CATCH: - - return r; -} - -result -_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId) -{ - SysLog(NID_APP, "Result value %d", res); - - SysTryReturnResult(NID_APP, data && pResArg && pArg, E_SYSTEM, "Invalid result (callback, result, arg) = (0x%x, 0x%x, 0x%x).", - data, pResArg, - pArg); - - bundle* b = pResArg->GetBundle(); - SysTryReturnResult(NID_APP, b != NULL, E_SYSTEM, "Invalid result bundle."); - - IAppControlEventListener* pListener = static_cast(data); - SysTryReturnResult(NID_APP, pListener == null || typeid(pListener) == typeid(IAppControlEventListener*), E_SYSTEM, "Invalid result callback"); - - bundle* inb = pArg->GetBundle(); - SysTryReturnResult(NID_APP, inb != NULL, E_SYSTEM, "Empty caller bundle."); - - String oId; - - AppId provider = pResArg->GetCalleeAppId(); - - const char* p = appsvc_get_operation(inb); - if (p) - { - oId = p; - } - - SysLog(NID_APP, "Invoking callback with (%ls, %ls)", provider.GetPointer(), oId.GetPointer()); - - if (prop & _APPCONTROL_PROPERTY_ALIAS) + if (pListener == null) { - const _AppControlRegistry::_AppControlAliasEntry* pEntry = null; - pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId); - if (pEntry) - { - provider = pEntry->provider; - oId = pEntry->operation; - - SysLog(NID_APP, "Legacy AppControl(%ls, %ls).", provider.GetPointer(), oId.GetPointer()); - } + pProvider->Release(); } - if (prop & _APPCONTROL_PROPERTY_APPID_CHANGE) + // after acquring request number, pLib should be managed from the list, not CATCH + if (IsFailed(r)) { - String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider); - if (!tmp.IsEmpty()) - { - SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer()); + _AppControlManager::GetInstance()->__inAppManager.RemoveItem(req); + SysLog(NID_APP, "[%s] A system error has occurred.", GetErrorMessage(r)); - provider = tmp; - } + return r; } - const bool isSubMode = _AppArg::IsSubMode(b); - const bool isServiceCallee = _AppArg::IsServiceApp(b); - - std::unique_ptr pMap(pResArg->GetArgMapN()); - - ArrayList list(SingleObjectDeleter); - _AppArg::FillLegacyAppControlResult(list, res, pMap.get(), provider); - - _AppControlManager::InvokeLegacyAppControlCompleteListener(*pListener, provider, oId, &list, isSubMode | isServiceCallee); - + SysLog(NID_APP, "Exit %d", req); return E_SUCCESS; } + result -_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId) +_AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener) { - 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, - pArg); - - bundle* b = pResArg->GetBundle(); - SysTryReturnResult(NID_APP, b != NULL, E_SYSTEM, "Invalid result bundle."); - - IAppControlResponseListener* pListener = static_cast(data); - SysTryReturnResult(NID_APP, pListener == null || typeid(pListener) == typeid(IAppControlResponseListener*), E_SYSTEM, "Invalid result callback"); - - bundle* inb = pArg->GetBundle(); - SysTryReturnResult(NID_APP, inb != NULL, E_SYSTEM, "Empty caller bundle."); - - String oId; - - AppId provider = pResArg->GetCalleeAppId(); - - const char* p = appsvc_get_operation(inb); - if (p) - { - oId = p; - } - - SysLog(NID_APP, "Invoking callback with (%ls, %ls)", provider.GetPointer(), oId.GetPointer()); - - if (prop & _APPCONTROL_PROPERTY_ALIAS) - { - const _AppControlRegistry::_AppControlAliasEntry* pEntry = null; - pEntry = _AppControlRegistry::GetInstance()->GetReverseRuntimeAliasEntry(provider, oId); - if (pEntry) - { - provider = pEntry->provider; - oId = pEntry->operation; - - SysLog(NID_APP, "Original AppControl(%ls, %ls).", provider.GetPointer(), oId.GetPointer()); - } - } - - if (prop & _APPCONTROL_PROPERTY_APPID_CHANGE) - { - String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider); - if (!tmp.IsEmpty()) - { - SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer()); - - provider = tmp; - } - } + _AppMessageImpl msg(pBundle); + msg.AddData(pDataList); - const bool isSubMode = _AppArg::IsSubMode(b); - const bool isServiceCallee = _AppArg::IsServiceApp(b); - - std::unique_ptr pMap(pResArg->GetArgMapN()); - - AppCtrlResult ret = _AppControlManager::ConvertAppControlResultCode(res); - - SysLog(NID_APP, "Result code : 0x%x.", ret); + return StartImplicit(msg, pListener, true); +} - // proper callback invokation - _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.release(), reqId, isSubMode | isServiceCallee); - pResponseEvent->Fire(*pResponseEventArg); - SysLog(NID_APP, "OnAppControlCompleteResponseReceived, pResponseEvent is Fired"); - } - else - { - _AppControlManager::InvokeAppControlCompleteListener(*pListener, provider, oId, ret, pMap.get(), isSubMode | isServiceCallee); - } +result +_AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener) +{ + _AppMessageImpl msg(pBundle); + _AppArg::AddStrMap(msg.GetBundle(), pData); - return E_SUCCESS; + return StartImplicit(msg, pListener, false); } + result -_AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* pListener) +_AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener) { SysLog(NID_APP, "Enter"); _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId); @@ -636,18 +270,18 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p int req = _REQ_ID_INVALID; _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path); - SysTryReturnResult(NID_APP, pProvider != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Propagating."); + SysTryReturnResult(NID_APP, pProvider != null, E_OBJ_NOT_FOUND, "Propagating."); if (pListener) { - _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_provider, _opId, _property, true, pProvider, pListener); + _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_appId, _opId, _property, true, pProvider, pListener); if (pItem) { req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem); } } - result r = InvokeStartAppControl(pProvider, req, _provider, _opId, pDataList); + result r = InvokeStartAppControl(pProvider, req, _appId, _opId, pDataList); if (pListener == null) { @@ -670,7 +304,7 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p } result -_AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener) +_AppControlImpl::Start(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener) { SysLog(NID_APP, "Enter"); _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId); @@ -684,7 +318,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co if (pListener) { - _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_provider, _opId, _property, false, pProvider, pListener); + _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_appId, _opId, _property, false, pProvider, pListener); if (pItem) { req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem); @@ -713,7 +347,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co } } } - r = InvokeStartAppControl(pProvider, req, _provider, _opId, pUriData, pMimeType, pDataList); + r = InvokeStartAppControl(pProvider, req, _appId, _opId, pUriData, pMimeType, pDataList); if (pListener == null) { @@ -758,12 +392,21 @@ _AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, in result _AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const String& oId, const String* pUri, const String* pMime, const IMap* pMap) { - SysTryReturnResult(NID_APP, pProvider != null, E_SYSTEM, "Wrong AppControl provider plugin for %ls, %ls (%d).", appId.GetPointer(), oId.GetPointer(), req); - _AppMessageImpl msg(appId, oId, pUri, pMime, pMap); - return pProvider->StartAppControlPlugin(req, appId, msg, null); + + return InvokeStartAppControl(pProvider, req, appId, msg); +} + + +result +_AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const _AppMessageImpl& message) +{ + SysTryReturnResult(NID_APP, pProvider != null, E_SYSTEM, "Wrong AppControl provider plugin for %ls(%d).", appId.GetPointer(), req); + + return pProvider->StartAppControlPlugin(req, appId, message, null); } + static bool IsValidAppControl(const String& appcontrolID) { @@ -816,40 +459,33 @@ _AppControlImpl::Stop(void) const String appcontrolID(GetAppControlProviderId()); SysTryReturnResult(NID_APP, IsValidAppControl(appcontrolID), E_INVALID_OPERATION, "Invalid appcontrolID(%ls)", appcontrolID.GetPointer()); - if (_property & _APPCONTROL_PROPERTY_SLP) + result (*pStop)(int req) = null; + + if (_reqId != _REQ_ID_INVALID) { - result (*pStop)(int req) = null; + _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId); + SysTryReturnResult(NID_APP, pInfo != null, E_INVALID_OPERATION, "Request ID %d is not found.", _reqId); - if (_reqId != _REQ_ID_INVALID) + if (pInfo->pProvider) { - _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId); - SysTryReturnResult(NID_APP, pInfo != null, E_INVALID_OPERATION, "Request ID %d is not found.", _reqId); - - if (pInfo->pProvider) - { - pInfo->pProvider->StopAppControlPlugin(_reqId); - } + pInfo->pProvider->StopAppControlPlugin(_reqId); + } - _AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId); + _AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId); - _reqId = _REQ_ID_INVALID; - } - else + _reqId = _REQ_ID_INVALID; + } + else + { + _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path); + if (pProvider) { - _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path); - if (pProvider) - { - pProvider->StopAppControlPlugin(_reqId); - SysLog(NID_APP, "Request %d is stopped.", _reqId); + pProvider->StopAppControlPlugin(-1); + SysLog(NID_APP, "Request is stopped."); - pProvider->Release(); - } + pProvider->Release(); } } - else if (_property & _APPCONTROL_PROPERTY_OSP) - { - _Aul::TerminateApplicationByPid(_processId); - } return E_SUCCESS; } @@ -907,13 +543,13 @@ _AppControlImpl::GetAppName(void) String _AppControlImpl::GetAppId(void) const { - return (_property & _APPCONTROL_PROPERTY_OSP) ? _path : _provider; + return _appId; } const String& _AppControlImpl::GetAppControlProviderId(void) const { - return _provider; + return _appId; } const String& diff --git a/src/app/inc/FApp_AppControlImpl.h b/src/app/FApp_AppControlImpl.h similarity index 76% rename from src/app/inc/FApp_AppControlImpl.h rename to src/app/FApp_AppControlImpl.h index 8137caf..85e833b 100644 --- a/src/app/inc/FApp_AppControlImpl.h +++ b/src/app/FApp_AppControlImpl.h @@ -22,8 +22,6 @@ #ifndef _FAPP_INTERNAL_APP_CONTROL_IMPL_H_ #define _FAPP_INTERNAL_APP_CONTROL_IMPL_H_ -#include - #include #include #include @@ -40,6 +38,7 @@ typedef struct _bundle_t bundle; namespace Tizen { namespace Base { class String; } } namespace Tizen { namespace Base { namespace Collection { class IList; } } } +namespace Tizen { namespace Base { namespace Runtime { class IEventListener; } } } namespace Tizen { namespace App { @@ -48,22 +47,17 @@ class AppControl; class IAppControlEventListener; class IAppControlResponseListener; class _IAppControlPluginProvider; -class _AppArg; +class _AppMessageImpl; enum _AppControlProperty { _APPCONTROL_PROPERTY_NONE = 0x0, _APPCONTROL_PROPERTY_PUBLIC = 0x01, - _APPCONTROL_PROPERTY_PERSISTENT_DLL = 0x08, - _APPCONTROL_PROPERTY_SLP = 0x100, - _APPCONTROL_PROPERTY_OSP = 0x200, - _APPCONTROL_PROPERTY_ALIAS = 0x400, - _APPCONTROL_PROPERTY_APPID_CHANGE = 0x800, _APPCONTROL_PROPERTY_SUBMODE = 0x1000, _APPCONTROL_PROPERTY_SERVICE_CALLEE = 0x2000, }; -class _OSP_EXPORT_ _AppControlImpl +class _OSP_LOCAL_ _AppControlImpl : public Tizen::Base::Object , public Tizen::App::_IAppControlResponseEventListener , virtual public Tizen::Base::Runtime::IEventListener @@ -72,17 +66,7 @@ public: /** * AppControl delegate constructor */ - static AppControl* CreateN(const Tizen::Base::String& path, const Tizen::Base::String& aId, const Tizen::Base::String& oId, const Tizen::Base::String& name, int prop); - - /** - * AppControl delegate constructor - */ - static AppControl* CreateN(const AppId& appId, const Tizen::Base::String& operationId, bool changeAppId); - - /** - * AppControl delegate constructor - */ - static AppControl* CreateN(const AppControl& ac); + static AppControl* CreateN(const Tizen::Base::String& path, const Tizen::Base::String& aId, const Tizen::Base::String& oId, int prop); /** * Internal GetImpl() method. @@ -95,30 +79,30 @@ public: static _AppControlImpl* GetInstance(AppControl& ac); /** - * Starts the resolved application control. @n - * Once the application starts, it goes to the background and the target - * application control is displayed. - * - * @return An error code - * @param[in] pDataList The data list to deliver to the resolved application control @n - * The maximum size of the list is 4096 bytes. - * @param[in] pListener The application control callback listener @n - * Some application controls need to get the callback result by implementing - * the IAppControlEventListener interface. - * @exception E_SUCCESS The method is successful. - * @exception E_MAX_EXCEEDED The size of @c pDataList has exceeded the maximum limit. - * @exception E_OUT_OF_MEMORY The memory is insufficient. - * @exception E_OBJ_NOT_FOUND The target application control resource is not found. - * @exception E_IN_PROGRESS The application control is in progress: @n - * - The application has already started an _AppControlImpl. @n - * - The target application has already started. - * @exception E_SYSTEM A system error has occurred. - * @remarks If the %IAppControlEventListener instance (@c pListener) needs to get the - * callback result for an application control, it should be valid till - * IAppControlEventListener::OnAppControlCompleted() is invoked. - * For example, a form object listener should not be deleted before the - * system invokes IAppControlEventListener::OnAppControlCompleted(). - */ + * Starts the resolved application control. @n + * Once the application starts, it goes to the background and the target + * application control is displayed. + * + * @return An error code + * @param[in] pDataList The data list to deliver to the resolved application control @n + * The maximum size of the list is 4096 bytes. + * @param[in] pListener The application control callback listener @n + * Some application controls need to get the callback result by implementing + * the IAppControlEventListener interface. + * @exception E_SUCCESS The method is successful. + * @exception E_MAX_EXCEEDED The size of @c pDataList has exceeded the maximum limit. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_OBJ_NOT_FOUND The target application control resource is not found. + * @exception E_IN_PROGRESS The application control is in progress: @n + * - The application has already started an _AppControlImpl. @n + * - The target application has already started. + * @exception E_SYSTEM A system error has occurred. + * @remarks If the %IAppControlEventListener instance (@c pListener) needs to get the + * callback result for an application control, it should be valid till + * IAppControlEventListener::OnAppControlCompleted() is invoked. + * For example, a form object listener should not be deleted before the + * system invokes IAppControlEventListener::OnAppControlCompleted(). + */ result Start(const Tizen::Base::Collection::IList* pDataList, IAppControlEventListener* pListener); /** @@ -232,6 +216,8 @@ public: static result StartImplicit(bundle* pBundle, const Tizen::Base::Collection::IMap* pData, IAppControlResponseListener* pListener); + static result StartImplicit(const _AppMessageImpl& msg, Tizen::Base::Runtime::IEventListener* pListener, bool isLegacy); + bool IsPublic(void) const { return (_property & _APPCONTROL_PROPERTY_PUBLIC); @@ -260,23 +246,13 @@ private: */ virtual ~_AppControlImpl(void); - result StartOsp(const Tizen::Base::Collection::IList* pDataList, IAppControlEventListener* pListener); - - result StartOsp(const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData, IAppControlResponseListener* pListener); - - result StartNative(const Tizen::Base::Collection::IList* pDataList, IAppControlEventListener* pListener); - - result StartNative(const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData, IAppControlResponseListener* pListener); - static _IAppControlPluginProvider* GetAppControlPluginProvider(const Tizen::Base::String& path); static result InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const Tizen::Base::String& appId, const Tizen::Base::String& oId, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pMap); static result InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const Tizen::Base::String& appId, const Tizen::Base::String& oId, const Tizen::Base::Collection::IList* pList); - static result AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId); - - static result AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId); + static result InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const Tizen::Base::String& appId, const _AppMessageImpl& message); protected: static const unsigned long _LIBRARY_OPTION = Tizen::Base::Runtime::_LIBRARY_LOAD_OPTION_LAZY | Tizen::Base::Runtime::_LIBRARY_LOAD_OPTION_NODELETE; @@ -284,7 +260,7 @@ protected: const AppControl& _appControl; Tizen::Base::String _path; - Tizen::Base::String _provider; + Tizen::Base::String _appId; Tizen::Base::String _opId; Tizen::Base::String _appName; int _reqId; @@ -295,7 +271,6 @@ private: Tizen::Base::Collection::ArrayListT __appControlResponseEventList; friend class AppControl; - friend class _AppArg; }; // _AppControlImpl } } // Tizen::App diff --git a/src/app/FApp_AppControlManager.cpp b/src/app/FApp_AppControlManager.cpp index 7fa2684..0d15ee1 100644 --- a/src/app/FApp_AppControlManager.cpp +++ b/src/app/FApp_AppControlManager.cpp @@ -43,8 +43,8 @@ #include #include #include - #include + #include #include @@ -75,15 +75,14 @@ using namespace Tizen::Base::Runtime; using namespace Tizen::Base::Utility; using namespace Tizen::Io; -namespace -{ -const char SELECTOR_NOTI_KEY[] = "__APP_SVC_CALLER_NOTI__"; -} namespace Tizen { namespace App { -const wchar_t TIZEN_OPERATION_PICK[] = L"http://tizen.org/appcontrol/operation/pick"; +const wchar_t TIZEN_OPERATION_PICK[] = L"http://tizen.org/appcontrol/operation/pick"; +const wchar_t TIZEN_OPERATION_MAIN[] = L"http://tizen.org/appcontrol/operation/main"; +const wchar_t LEGACY_OPERATION_MAIN[] = L"osp.operation.MAIN"; +const char TIZEN_NOTIFICATION_DATA[] = "http://tizen.org/appcontrol/data/notification"; _AppControlManager::_AppControlManager(void) { @@ -151,7 +150,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int //_AppArg::Print(b); // get launch info from request Id - _LaunchInfo* pInfo = __launchManager.FindItem(reqId); + _DataControlInfo* pInfo = __launchManager.FindItem(reqId); SysTryReturnVoidResult(NID_APP, pInfo != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] request Id %d not found with response %d", reqId, res); @@ -179,23 +178,24 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int } -// callback for out-of-process AppControl start event +// callback for AppControl start event void _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, const String& operationId) { 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); + _InProcessInfo* pInfo = __inAppManager.FindItem(reqId); SysTryReturnVoidResult(NID_APP, pInfo != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] request Id %d not found.", reqId); // at least listener - IAppControlResponseListener* pListener = static_cast(pInfo->pUserData); - SysTryReturnVoidResult(NID_APP, typeid(pListener) == typeid(IAppControlResponseListener*), E_SYSTEM, "[E_SYSTEM] Invalid result callback."); + IAppControlResponseListener* pListener = dynamic_cast(pInfo->pListener); + SysTryReturnVoidResult(NID_APP, pListener != null, E_SYSTEM, "[E_SYSTEM] Invalid result callback for req %d, app %ls.", reqId, appId.GetPointer()); + + result r = E_SUCCESS; if (pListener) { - result r = E_SUCCESS; AppId actualAppId = appId; if (appId == L'c') { @@ -228,6 +228,12 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, co { SysLog(NID_APP, "No listener registered."); } + + if (r == E_OPERATION_CANCELED) + { + SysLog(NID_APP, "Removed start listener as operation is canceled."); + __inAppManager.RemoveItem(reqId); + } } @@ -261,7 +267,7 @@ _AppControlManager::InvokeLegacyAppControlCompleteListener(IAppControlEventListe // callback for in-process event handling void -_AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* pArgs, int property) +_AppControlManager::OnAppControlPluginEventReceivedN(int reqId, int res, const AppId& optAppId, const String& optOperation, const IMap* pArgs, int property) { SysLog(NID_APP, "Received request Id %d, res %d, args 0x%x", reqId, res, pArgs); @@ -272,24 +278,25 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p if (pInfo->pListener) { - String aId = pInfo->providerId; - String oId = pInfo->operationId; + String aId; + String oId; - SysLog(NID_APP, "Invoking callback 0x%x for (%ls, %ls).", pInfo->pListener, aId.GetPointer(), oId.GetPointer()); - - if (pInfo->property & _APPCONTROL_PROPERTY_ALIAS) + if (optAppId.IsEmpty()) { - const _AppControlRegistry::_AppControlAliasEntry* pEntry = null; - pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(aId, oId); - if (pEntry) - { - aId = pEntry->provider; - oId = pEntry->operation; + String aId = pInfo->providerId; + String oId = pInfo->operationId; + } + else + { + // implicit launch only + aId = optAppId; + oId = optOperation; - SysLog(NID_APP, "Legacy AppControl (%ls, %ls).", aId.GetPointer(), oId.GetPointer()); - } + SysLog(NID_APP, "Changing appId/operation for implicit launch."); } + SysLog(NID_APP, "Invoking callback 0x%x for (%ls, %ls).", pInfo->pListener, aId.GetPointer(), oId.GetPointer()); + const bool isSubMode = (property & _APPCONTROL_PROPERTY_SUBMODE); const bool isServiceCallee = (property & _APPCONTROL_PROPERTY_SERVICE_CALLEE); @@ -344,12 +351,15 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p SysLogException(NID_APP, E_SYSTEM, "Invalid AppControl listener."); } +#if 0 + // [FIXME] following logic is not needed. // call TerminateAppControl if (pInfo->pProvider) { pInfo->pProvider->StopAppControlPlugin(pInfo->reqId); SysLog(NID_APP, "AppControl stopped for req %d.", pInfo->reqId); } +#endif // remove from list and unload dll __inAppManager.RemoveItem(reqId); @@ -375,11 +385,6 @@ IsMatchingProcListener(const _InProcessInfo& info, IEventListener* pListener) return (info.pListener == pListener); } -static bool -IsMatchingLaunchListener(const _LaunchInfo& info, IEventListener* pListener) -{ - return (info.pUserData == pListener); -} void _AppControlManager::StopAppControlResponseListener(IAppControlResponseListener* pListener) @@ -391,14 +396,6 @@ _AppControlManager::StopAppControlResponseListener(IAppControlResponseListener* __inAppManager.RemoveItem(pProcInfo); SysLog(NID_APP, "Listener 0x%x is removed from in-process stub list.", pListener); } - - _LaunchInfo* pLaunchInfo = __launchManager.FindItemWithListener(IsMatchingLaunchListener, pListener); - if (pLaunchInfo) - { - __launchManager.RemoveItem(pLaunchInfo); - SysLog(NID_APP, "Listener 0x%x is removed from launch request list.", pListener); - } - } @@ -450,7 +447,6 @@ result _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data) { bundle* kb = msg.GetBundle(); - SysTryReturnResult(NID_APP, kb != NULL, E_OUT_OF_MEMORY, "Bundle allocation failure."); if (pkg_name) { @@ -469,31 +465,12 @@ _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const appsvc_set_uri(kb, uri); } - if (_AppImpl::GetInstance() != null) - { - const long handle = _AppImpl::GetInstance()->GetWindowHandle(); - _AppArg::UpdateWindowHandle(kb, handle); - } - - SysLog(NID_APP, "MIME(%s), URI(%s).", appsvc_get_mime(kb), appsvc_get_uri(kb)); - int pid = appsvc_run_service(kb, 0, reinterpret_cast(pCb), this); + int pid = LaunchPkg(msg, pCb, data); result r = E_SUCCESS; if (pid < 0) { - switch (pid) - { - 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); + r = GetLastResult(); } return r; @@ -592,33 +569,6 @@ _AppControlManager::LaunchPkg(_AppMessageImpl& msg, AppSvcResFn pCb, void* data) } -int -_AppControlManager::LaunchPkg(_AppMessageImpl& msg, const AppId& appId, const String& opId, const String* pUri, const String* pMime, AppSvcResFn pCb, void* data) -{ - std::unique_ptr pPackage(_StringConverter::CopyToCharArrayN(appId)); - std::unique_ptr pOperation(_StringConverter::CopyToCharArrayN(opId)); - - const char* pUriData = null; - if (pUri) - { - pUriData = _StringConverter::CopyToCharArrayN(*pUri); - } - - const char* pMimeData = null; - if (pMime) - { - pMimeData = _StringConverter::CopyToCharArrayN(*pMime); - } - - int pid = Launch(msg, pPackage.get(), pOperation.get(), pMimeData, pUriData, pCb, data); - - delete [] pUriData; - delete [] pMimeData; - - return pid; -} - - result _AppControlManager::LaunchPkg(const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data) { @@ -767,14 +717,14 @@ _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, int req) int -_AppControlManager::Launch(const _AppMessageImpl& msg, AppSvcResFn pCb, void* pData) +_AppControlManager::Launch(const _AppMessageImpl& msg, AppSvcResFn pCb, void* pData, int req) { const bundle* pBundle = msg.GetBundle(); _AppArg arg; arg.Construct(pBundle); - return Launch(_AppMessageImpl::GetApplicationId(pBundle), &arg, pCb, pData, -1); + return Launch(_AppMessageImpl::GetApplicationId(pBundle), &arg, pCb, pData, req); } @@ -785,18 +735,6 @@ _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, v SysLog(NID_APP, "App: %ls.", appId.GetPointer()); String actualAppId = appId; -#if 0 - if (appId.GetLength() == 10) - { - const String& execName = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(appId); - - if (!execName.IsEmpty()) - { - actualAppId.Append(L'.'); - actualAppId.Append(execName); - } - } -#endif pArg->UpdateRequestId(req); @@ -882,78 +820,6 @@ _AppControlManager::Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, v return pid; } -result -_AppControlManager::LaunchAppImplicit(_AppArg* pArg, int req) -{ - SysTryReturnResult(NID_APP, pArg != null, E_INVALID_ARG, "Invalid launch argument"); - - result r = E_SUCCESS; - bundle* kb = pArg->GetBundle(); - - if (req >= 0) - { - pArg->UpdateRequestId(req); - appsvc_add_data(kb, SELECTOR_NOTI_KEY, appinfo_get_appid()); - } - - 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) - { - SysLog(NID_APP, "Sending local process again."); - pid = getpid(); - } - - char pkgname[255] = {0, }; - if (aul_app_get_pkgname_bypid(pid, pkgname, 255) != AUL_R_OK) - { - SysLog(NID_APP, "Fail to get package name by pid : (%d).", pid); - return E_SYSTEM; - } - - if (strncmp(pkgname, APP_SELECTOR, strlen(APP_SELECTOR)) != 0) - { - const char* pOperation = appsvc_get_operation(kb); - - SysLog(NID_APP, "Starting application without selector : (%s, %s).", pkgname, pOperation); - - SendAppControlStartResponse(req, pkgname, pOperation); - } - } - else - { - switch (pid) - { - case APPSVC_RET_EINVAL: - r = E_OBJ_NOT_FOUND; - break; - case APPSVC_RET_ENOMATCH: - r = E_OBJ_NOT_FOUND; - break; - case APPSVC_RET_EILLACC: - r = E_ILLEGAL_ACCESS; - break; - case APPSVC_RET_ERROR: - // fall through - case APPSVC_RET_ELAUNCH: - // fall through - default: - r = E_SYSTEM; - break; - } - } - - SysLog(NID_APP, "[%s] Application(%d) launched with reqId(%d) and arg(0x%x).", GetErrorMessage(r), pid, req, pArg); - - return r; -} void _AppControlManager::FinishAppControl(int reqId, int res, IMap* pMap) @@ -963,9 +829,20 @@ _AppControlManager::FinishAppControl(int reqId, int res, IMap* pMap) SysTryReturnVoidResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Return argument allocation failure."); SendAppControlEvent(*pArg); - SysLog(NID_APP, "Exit."); } + + void +_AppControlManager::FinishAppControl(int reqId, int res, const AppId& appId, const String& oId, IMap* pMap, int prop) +{ + SysLog(NID_APP, "req %d, res %d, appId(%ls), oId(%ls).", reqId, res, appId.GetPointer(), oId.GetPointer()); + _NativeAppControlEventArg* pArg = new (std::nothrow) _NativeAppControlEventArg(reqId, res, appId, oId, pMap, prop); + SysTryReturnVoidResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Return argument allocation failure."); + + SendAppControlEvent(*pArg); +} + + void _AppControlManager::RemoveResultRequest(int reqId) { @@ -984,7 +861,7 @@ _AppControlManager::AddLaunchRequest(_AppArg* pArg, LaunchCbType pCb, void* pDat { SysTryReturn(NID_APP, pArg != null, -1, E_INVALID_ARG, "[E_INVALID_ARG] Empty argument."); - _LaunchInfo* pItem = new (std::nothrow) _LaunchInfo(pArg, pCb, pData, prop); + _DataControlInfo* pItem = new (std::nothrow) _DataControlInfo(pArg, pCb, pData, prop); SysTryReturn(NID_APP, pItem != null, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Empty argument."); SysLog(NID_APP, "Registering callback 0x%x, 0x%x", pCb, pData); diff --git a/src/app/FApp_AppControlRegistry.cpp b/src/app/FApp_AppControlRegistry.cpp index 866f405..6c97827 100644 --- a/src/app/FApp_AppControlRegistry.cpp +++ b/src/app/FApp_AppControlRegistry.cpp @@ -21,8 +21,9 @@ #include #include -#include #include +#include +#include #include #include @@ -35,14 +36,11 @@ #include #include -#include "FAppPkg_PackageManagerImpl.h" #include "FApp_AppControlImpl.h" -#include "FApp_Aul.h" #include "FApp_AppControlRegistry.h" #include "FApp_AppMessageImpl.h" #include "FApp_TemplateUtil.h" -using namespace Tizen::App::Package; using namespace Tizen::Base; using namespace Tizen::Base::Collection; using namespace Tizen::Io; @@ -52,7 +50,7 @@ namespace const wchar_t ACTL_DEFAULT_FILE[] = L"/usr/etc/app-control-info.ini"; const wchar_t ACTL_LEGACY_FILE[] = L"/usr/etc/app-control-alias.ini"; -const wchar_t ACTL_ALIAS_FILE[] = L"/usr/etc/app-control-appid.ini"; +const wchar_t ACTL_DEFAULT_PLUGIN[] = L"libosp-ac-platform.so"; const wchar_t TIZEN_ALIAS_APPID_PREFIX[] = L"tizen."; @@ -75,17 +73,11 @@ _AppControlRegistry::_AppControlRegistry(void) __tizenList.Construct(); __aliasList.Construct(); - - __aliasAppId.Construct(); - - __runtimeAlias.Construct(); } _AppControlRegistry::~_AppControlRegistry(void) { _DeleteCollectionMapValue(__aliasList); - - _DeleteCollection<_AppControlAliasEntry>(__runtimeAlias); } _AppControlRegistry* @@ -101,8 +93,6 @@ _AppControlRegistry::GetInstance(void) __pSelf->LoadTizenAppControlRegistry(); __pSelf->LoadLegacyList(); - - __pSelf->LoadAliasList(); } return __pSelf; @@ -239,49 +229,6 @@ _AppControlRegistry::LoadLegacyList(void) return E_SUCCESS; } -result -_AppControlRegistry::LoadAliasList(void) -{ - _RegistryImpl reg; - - const String regPath = ACTL_ALIAS_FILE; - - result r = reg.Construct(regPath, REG_OPEN_READ_ONLY, null); - SysTryReturn(NID_APP, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r)); - - HashMap* pMap = null; - r = reg.GetEntryListN(L"Alias", &pMap); - if (r != E_SUCCESS) - { - SysLog(NID_APP, "[%s] Propagating.", GetErrorMessage(r)); - pMap->RemoveAll(true); - delete pMap; - return r; - } - - String* pKey = null; - String* pVal = null; - std::unique_ptr pEnum(pMap->GetMapEnumeratorN()); - SysTryCatch(NID_APP, pEnum.get(), r = E_OUT_OF_MEMORY , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory error."); - - while(pEnum->MoveNext() == E_SUCCESS) - { - pKey = static_cast(pEnum->GetKey()); - pVal = static_cast(pEnum->GetValue()); - - __aliasAppId.Add(*pKey, *pVal); - //SysLog(NID_APP, "(%ls, %ls)", pKey->GetPointer(), pVal->GetPointer()); - } - - SysLog(NID_APP, "Loading %d alias sections", __aliasAppId.GetCount()); - -CATCH: - pMap->RemoveAll(true); - delete pMap; - - return r; -} - AppControl* _AppControlRegistry::GetTizenAppControlN(const String& aId, const String& oId) const @@ -289,6 +236,8 @@ _AppControlRegistry::GetTizenAppControlN(const String& aId, const String& oId) c int count = 0; const String* pAppId = &aId; const String* pOperation = &oId; + + // legacy check first do { const _AppControlAliasEntry* const pEntry = GetAppControlAliasEntry(*pAppId, *pOperation); @@ -311,36 +260,9 @@ _AppControlRegistry::GetTizenAppControlN(const String& aId, const String& oId) c SysLog(NID_APP, "Found matching AppControl (%ls, %ls)", pAppId->GetPointer(), pOperation->GetPointer()); const String& soName = GetTizenAppControlProvider(*pAppId, *pOperation); + SysAssert(!soName.IsEmpty()); - if (soName.IsEmpty()) - { - AppControl* pAc = GetAppControlN(*pAppId, *pOperation); - if (pAc) - { - _AppControlImpl* pImpl = _AppControlImpl::GetInstance(*pAc); - pImpl->SetProperty(_APPCONTROL_PROPERTY_ALIAS); - - const _AppControlAliasEntry* pLookupEntry = GetReverseRuntimeAliasEntry(*pAppId, *pOperation); - if (pLookupEntry == null) - { - // no entry found : add new one - _AppControlAliasEntry* pEntry = new (std::nothrow) _AppControlAliasEntry(aId, oId, *pAppId, *pOperation); - if (pEntry) - { - // may fail - __runtimeAlias.Add(pEntry); - SysLog(NID_APP, "Setting alias app (%ls -> %ls).", aId.GetPointer(), pAppId->GetPointer()); - } - } - } - else - { - SysLog(NID_APP, "No AppControl instance for (%ls, %ls)", pAppId->GetPointer(), pOperation->GetPointer()); - } - return pAc; - } - - return _AppControlImpl::CreateN(soName, *pAppId, *pOperation, L"", _APPCONTROL_PROPERTY_PUBLIC | _APPCONTROL_PROPERTY_SLP); + return _AppControlImpl::CreateN(soName, *pAppId, *pOperation, _APPCONTROL_PROPERTY_PUBLIC); } @@ -355,8 +277,8 @@ _AppControlRegistry::GetTizenAppControlProvider(const String& appId, const Strin return val; } - SysLog(NID_APP, "No platform AppControl and use custom AppControl instead."); - return L""; + SysLog(NID_APP, "Default platform AppControl %ls is used.", ACTL_DEFAULT_PLUGIN); + return String(ACTL_DEFAULT_PLUGIN); } @@ -366,8 +288,9 @@ _AppControlRegistry::GetTizenAppControlProvider(const String& appId, const Strin struct AppSvcIterData { public: - AppSvcIterData(ArrayList* pArr, const String& op) : pArray(pArr), operation(op) {} + AppSvcIterData(const _AppControlRegistry* pRegs, ArrayList* pArr, const String& op) : pThis(pRegs), pArray(pArr), operation(op) {} + const _AppControlRegistry* pThis; ArrayList* pArray; const String& operation; }; @@ -383,6 +306,8 @@ AppSvcIterFnCb(const char* pAppId, void* pData) AppSvcIterData* pAppSvcIterData = static_cast(pData); ArrayList* pList = pAppSvcIterData->pArray; SysAssert(pList != null); + const _AppControlRegistry* pThis = pAppSvcIterData->pThis; + SysAssert(pThis != null); const String& operation = pAppSvcIterData->operation; if (pAppId == NULL) @@ -392,7 +317,7 @@ AppSvcIterFnCb(const char* pAppId, void* pData) } String appId = pAppId; - AppControl* pAc = _AppControlImpl::CreateN(appId, operation, false); + AppControl* pAc = pThis->GetTizenAppControlN(appId, operation); if (pAc == null) { SysLog(NID_APP, "AppControl allocation failure for %ls.", appId.GetPointer()); @@ -433,7 +358,7 @@ _AppControlRegistry::FindAppControlListN(const String* pOid, const String* pUri, SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] ArrayList creation failure."); pList->Construct(); - AppSvcIterData data(pList, operation); + AppSvcIterData data(this, pList, operation); appsvc_get_list(pBundle.get(), AppSvcIterFnCb, reinterpret_cast(&data)); @@ -474,108 +399,26 @@ _AppControlRegistry::GetAppControlAliasEntry(const String& aId, const String& oI } -const _AppControlRegistry::_AppControlAliasEntry* -_AppControlRegistry::GetReverseAppControlAliasEntry(const String& aId, const String& oId) const -{ - std::unique_ptr< IMapEnumeratorT > pEnum(__aliasList.GetMapEnumeratorN()); - - while (pEnum->MoveNext() == E_SUCCESS) - { - _AppControlAliasEntry* pEntry = null; - pEnum->GetValue(pEntry); - if (pEntry->provider2 == aId && pEntry->operation2 == oId) - { - SysLog(NID_APP, "Found matching AppControl (%ls, %ls)<-(%ls, %ls)", aId.GetPointer(), oId.GetPointer(), pEntry->provider.GetPointer(), pEntry->operation.GetPointer()); - - return pEntry; - } - } - - return null; -} - - -const _AppControlRegistry::_AppControlAliasEntry* -_AppControlRegistry::GetReverseRuntimeAliasEntry(const String& aId, const String& oId) const -{ - std::unique_ptr< IEnumeratorT<_AppControlAliasEntry*> > pEnum(__runtimeAlias.GetEnumeratorN()); - - while (pEnum->MoveNext() == E_SUCCESS) - { - _AppControlAliasEntry* pEntry = null; - pEnum->GetCurrent(pEntry); - if (pEntry->provider2 == aId && pEntry->operation2 == oId) - { - SysLog(NID_APP, "Found matching AppControl (%ls, %ls)->(%ls, %ls)", aId.GetPointer(), oId.GetPointer(), pEntry->provider2.GetPointer(), pEntry->operation2.GetPointer()); - - return pEntry; - } - } - - return null; -} - - -AppControl* -_AppControlRegistry::GetAppControlN(const String& appId, const String& operationId) const -{ - bool changeAppId = false; - - String actualAppId = appId; - if (appId.StartsWith(TIZEN_ALIAS_APPID_PREFIX, 0)) - { - const String& tmp = GetAliasAppId(appId); - - if (!tmp.IsEmpty()) - { - actualAppId = tmp; - SysLog(NID_APP, "Found alias app (%ls -> %ls).", appId.GetPointer(), tmp.GetPointer()); - - changeAppId = true; - } - } - - bool b = _Aul::IsInstalled(actualAppId); - SysTryReturn(NID_APP, b == true, null, E_APP_NOT_INSTALLED, "[E_APP_NOT_INSTALLED] %ls not installed.", actualAppId.GetPointer()); - - return _AppControlImpl::CreateN(actualAppId, operationId, changeAppId); -} - - AppId _AppControlRegistry::GetAliasAppId(const AppId& appId) const { - String tmp; - result r = __aliasAppId.GetValue(appId, tmp); - if (r != E_SUCCESS) - { - tmp.Clear(); - } - - return tmp; -} + std::unique_ptr pBundle(bundle_create()); + if (pBundle.get()) + { + std::unique_ptr pAppId(_StringConverter::CopyToCharArrayN(appId)); -AppId -_AppControlRegistry::GetReverseAliasAppId(const AppId& appId) const -{ - std::unique_ptr< IMapEnumeratorT > pEnum(__aliasAppId.GetMapEnumeratorN()); + // appsvc_set_appid() lookup for actual app ID internally + appsvc_set_appid(pBundle.get(), pAppId.get()); + const char* pTmp = appsvc_get_appid(pBundle.get()); - String key; - String value; - while (pEnum->MoveNext() == E_SUCCESS) - { - pEnum->GetKey(key); - pEnum->GetValue(value); - if (value == appId) + if (pTmp) { - return key; + return String(pTmp); } } - SysLog(NID_APP, "No entry found for %ls", appId.GetPointer()); - return L""; + return String(); } - } } // Tizen::App diff --git a/src/app/FApp_AppControlRegistry.h b/src/app/FApp_AppControlRegistry.h index 30c413e..05eb5be 100644 --- a/src/app/FApp_AppControlRegistry.h +++ b/src/app/FApp_AppControlRegistry.h @@ -79,7 +79,6 @@ public: const Tizen::Base::String operation2; }; - typedef Tizen::Base::Collection::ArrayListT<_AppControlAliasEntry*> RuntimeAliasType; typedef Tizen::Base::Collection::MultiHashMapT AppControlAliasList; typedef Tizen::Base::Collection::HashMapT AliasMapType; @@ -91,20 +90,12 @@ public: AppControl* GetTizenAppControlN(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const; - AppControl* GetAppControlN(const Tizen::Base::String& appId, const Tizen::Base::String& operationId) const; - Tizen::Base::Collection::ArrayList* FindAppControlListN(const Tizen::Base::String* pOid, const Tizen::Base::String* pUri, const Tizen::Base::String* pMimeType, const Tizen::Base::String* pCategory) const; const _AppControlAliasEntry* GetAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const; - const _AppControlAliasEntry* GetReverseAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const; - - const _AppControlAliasEntry* GetReverseRuntimeAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const; - AppId GetAliasAppId(const AppId& appId) const; - AppId GetReverseAliasAppId(const AppId& appId) const; - private: _AppControlRegistry(const _AppControlRegistry& rhs); @@ -114,8 +105,6 @@ private: result LoadLegacyList(void); - result LoadAliasList(void); - Tizen::Base::String GetTizenAppControlProvider(const Tizen::Base::String& appId, const Tizen::Base::String& opId) const; private: @@ -123,10 +112,6 @@ private: AppControlAliasList __aliasList; - AliasMapType __aliasAppId; - - mutable RuntimeAliasType __runtimeAlias; - static _AppControlRegistry* __pSelf; }; // _AppControlRegistry diff --git a/src/app/FApp_AppManagerImpl.cpp b/src/app/FApp_AppManagerImpl.cpp index 2528c1e..8ef7d29 100644 --- a/src/app/FApp_AppManagerImpl.cpp +++ b/src/app/FApp_AppManagerImpl.cpp @@ -196,14 +196,6 @@ _AppManagerImpl::FindAppControlN(const AppId& aId, const String& oId) AppControl* pAc = null; pAc = pRegs->GetTizenAppControlN(aId, oId); - if (pAc != null) - { - SetLastResult(E_SUCCESS); - return pAc; - } - - pAc = pRegs->GetAppControlN(aId, oId); - SysTryReturn(NID_APP, pAc != null, null, E_OBJ_NOT_FOUND, "[%s] No matching AppControl instance found (%ls, %ls).", GetErrorMessage(E_OBJ_NOT_FOUND), aId.GetPointer(), oId.GetPointer()); SetLastResult(E_SUCCESS); @@ -469,7 +461,7 @@ _AppManagerImpl::LaunchApplication(const String& appId, const IList* pArguments, // "The length of appid exceeded the limit(%d).", // WIDGET_APP_MAX_APPID_LENGTH); - std::unique_ptr pAc(_AppControlRegistry::GetInstance()->GetAppControlN(appId, TIZEN_OPERATION_MAIN)); + std::unique_ptr pAc(FindAppControlN(appId, TIZEN_OPERATION_MAIN)); SysTryReturnResult(NID_APP, pAc.get() != null, E_OBJ_NOT_FOUND, "The target application (%ls) is not found.", appId.GetPointer()); if (pArguments) diff --git a/src/app/FApp_AppMessageImpl.cpp b/src/app/FApp_AppMessageImpl.cpp index 56d22d6..00bac76 100644 --- a/src/app/FApp_AppMessageImpl.cpp +++ b/src/app/FApp_AppMessageImpl.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -47,6 +48,12 @@ _AppMessageImpl::_AppMessageImpl(void) SysAssert(__pBundle != NULL); } +_AppMessageImpl::_AppMessageImpl(const bundle* pBundle) +: __pBundle(bundle_dup(const_cast(pBundle))) +{ + SysAssert(__pBundle != NULL); +} + _AppMessageImpl::_AppMessageImpl(const _AppMessageImpl&rhs) : __pBundle(bundle_dup(rhs.__pBundle)) { diff --git a/src/app/FApp_RequestManagerT.cpp b/src/app/FApp_RequestManagerT.cpp index 9b03b53..d1ba185 100644 --- a/src/app/FApp_RequestManagerT.cpp +++ b/src/app/FApp_RequestManagerT.cpp @@ -47,7 +47,7 @@ _InProcessInfo::~_InProcessInfo(void) } } -_LaunchInfo::~_LaunchInfo(void) +_DataControlInfo::~_DataControlInfo(void) { delete pArg; } @@ -247,7 +247,7 @@ _RequestManagerT<_ResultInfo>::RemoveItem(int reqId) // explicit template initialization -template class _RequestManagerT<_LaunchInfo>; +template class _RequestManagerT<_DataControlInfo>; template class _RequestManagerT<_InProcessInfo>; template class _RequestManagerT<_ResultInfo>; diff --git a/src/app/inc/FApp_AppArg.h b/src/app/inc/FApp_AppArg.h index 2be9d68..49975e2 100644 --- a/src/app/inc/FApp_AppArg.h +++ b/src/app/inc/FApp_AppArg.h @@ -40,7 +40,6 @@ class HashMap; namespace Tizen { namespace App { -class _AppControlImpl; class _AppMessageImpl; class _SqlDataControlImpl; class _MapDataControlImpl; @@ -86,10 +85,6 @@ public: result Construct(const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pMap); - result Construct(const _AppControlImpl& ac, const Tizen::Base::Collection::IList* pList); - - result Construct(const _AppControlImpl& ac, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pMap); - result Construct(const _SqlDataControlImpl& dc, _DataControlRequestType requestType, const Tizen::Base::Collection::IList* pList); result Construct(const _MapDataControlImpl& dc, _DataControlRequestType requestType, const Tizen::Base::Collection::IList* pList); @@ -128,7 +123,10 @@ public: return GetCallerPid(__pBundle); } - AppId GetCalleeAppId(void) const; + AppId GetCalleeAppId(void) const + { + return GetCalleeAppId(__pBundle); + } void Print() const { @@ -184,6 +182,8 @@ public: static void UpdateServiceApp(bundle* b); static bool IsServiceApp(bundle* b); + + static AppId GetCalleeAppId(bundle* b); static result UpdateWindowHandle(bundle* b, long handle); @@ -206,12 +206,6 @@ private: static result CreateLaunchArg(bundle* b, const Tizen::Base::Collection::IList* pList); - static result CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const Tizen::Base::Collection::IList* pList); - - static result CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pList); - - static result CreateAppControlArg(bundle* b, const Tizen::Base::String& oId, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pMap); - static result CreateSqlDataControlArg(bundle* b, const _SqlDataControlImpl& dc, _DataControlRequestType requestType, const Tizen::Base::Collection::IList* pList); static result CreateMapDataControlArg(bundle* b, const _MapDataControlImpl& dc, _DataControlRequestType requestType, const Tizen::Base::Collection::IList* pList); diff --git a/src/app/inc/FApp_AppControlManager.h b/src/app/inc/FApp_AppControlManager.h index dba96f6..c651314 100644 --- a/src/app/inc/FApp_AppControlManager.h +++ b/src/app/inc/FApp_AppControlManager.h @@ -112,7 +112,7 @@ public: virtual void OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int res); - virtual void OnAppControlEventReceivedN(int reqId, int res, const Tizen::Base::Collection::IMap* pArgs, int prop); + virtual void OnAppControlPluginEventReceivedN(int reqId, int res, const AppId& appId, const Tizen::Base::String& oId, const Tizen::Base::Collection::IMap* pArgs, int prop); virtual void OnAppControlEventReceivedN(int reqId, const AppId& appId, const Tizen::Base::String& operationId); @@ -128,22 +128,29 @@ public: void FinishAppControl(int reqId, int res, Tizen::Base::Collection::IMap* pArg); + void FinishAppControl(int reqId, int res, const AppId& appId, const Tizen::Base::String& oId, Tizen::Base::Collection::IMap* pArg, int prop = 0); + result LaunchApp(const AppId& appId, _AppArg* pArg, int req = -1); int Launch(const AppId& appId, _AppArg* pArg, int req = -1); int Launch(const AppId& appId, _AppArg* pArg, AppSvcResFn pCb, void* pData, int req); - int Launch(const _AppMessageImpl& msg, AppSvcResFn pCb, void* pData); - - result LaunchAppImplicit(_AppArg* pArg, int req); + int Launch(const _AppMessageImpl& msg, AppSvcResFn pCb, void* pData, int req = -1); + /** + * Launch with pkgname.(osp-app-service : AppService.cpp) + */ result LaunchPkg(const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data); + /** + * Launch with pkgname.(osp-uifw : FUiCtrl_EditCopyPasteManager.cpp) + */ result LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data); - int LaunchPkg(_AppMessageImpl& msg, const AppId& appId, const Tizen::Base::String& opId, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, AppSvcResFn pCb, void* data); - + /** + * Launch with pkgname.(osp-app-controls) + */ int LaunchPkg(_AppMessageImpl& msg, AppSvcResFn pCb, void* data); int Launch(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data); @@ -179,7 +186,7 @@ private: private: _AppControlEvent __appControlEvent; - _RequestManagerT<_LaunchInfo> __launchManager; + _RequestManagerT<_DataControlInfo> __launchManager; _RequestManagerT<_InProcessInfo> __inAppManager; _RequestManagerT<_ResultInfo> __resultManager; diff --git a/src/app/inc/FApp_AppMessageImpl.h b/src/app/inc/FApp_AppMessageImpl.h index aa97815..6875d4d 100644 --- a/src/app/inc/FApp_AppMessageImpl.h +++ b/src/app/inc/FApp_AppMessageImpl.h @@ -52,6 +52,8 @@ public: _AppMessageImpl(const Tizen::Base::String& appId, const Tizen::Base::String& oId, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, const Tizen::Base::Collection::IMap* pMap); + explicit _AppMessageImpl(const bundle* pBundle); + virtual ~_AppMessageImpl(void); _AppMessageImpl(const _AppMessageImpl& rhs); diff --git a/src/app/inc/FApp_IAppControlSysEventListener.h b/src/app/inc/FApp_IAppControlSysEventListener.h index 5165a2a..9bded34 100644 --- a/src/app/inc/FApp_IAppControlSysEventListener.h +++ b/src/app/inc/FApp_IAppControlSysEventListener.h @@ -46,7 +46,7 @@ public: virtual void OnAppControlEventReceivedN(int reqId, _AppArg* pArg, int res) = 0; - virtual void OnAppControlEventReceivedN(int reqId, int res, const Tizen::Base::Collection::IMap* pArgs, int prop) = 0; + virtual void OnAppControlPluginEventReceivedN(int reqId, int res, const AppId& appId, const Tizen::Base::String& oId, const Tizen::Base::Collection::IMap* pArgs, int prop) = 0; virtual void OnAppControlEventReceivedN(int reqId, const AppId& appId, const Tizen::Base::String& operationId) = 0; }; // _IAppControlSysEventListener diff --git a/src/app/inc/FApp_LaunchInfo.h b/src/app/inc/FApp_LaunchInfo.h index 96493e8..7d9cfc0 100644 --- a/src/app/inc/FApp_LaunchInfo.h +++ b/src/app/inc/FApp_LaunchInfo.h @@ -46,14 +46,14 @@ typedef result (*LaunchCbType)(void* data, _AppArg* pArg, _AppArg* pResArg, serv //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// _LaunchInfo handles the launch request from this process +// _DataControlInfo handles the launch request from this process //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const long LAUNCH_INFO_MAGIC = 0x494C; -class _LaunchInfo +class _DataControlInfo { public: - _LaunchInfo(_AppArg* pArg, LaunchCbType pCb, void* pData, int prop) + _DataControlInfo(_AppArg* pArg, LaunchCbType pCb, void* pData, int prop) : magic(LAUNCH_INFO_MAGIC) , reqId(-1) , pArg(pArg) @@ -63,11 +63,11 @@ public: { } - ~_LaunchInfo(void); + ~_DataControlInfo(void); private: - _LaunchInfo(const _LaunchInfo& rhs); - _LaunchInfo& operator =(const _LaunchInfo& rhs); + _DataControlInfo(const _DataControlInfo& rhs); + _DataControlInfo& operator =(const _DataControlInfo& rhs); public: const long magic; @@ -76,7 +76,7 @@ public: const LaunchCbType launchCb; void* pUserData; const int property; -}; // _LaunchInfo +}; // _DataControlInfo //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -96,6 +96,16 @@ public: { } + // implicit process info + _InProcessInfo(bool legacy, _IAppControlPluginProvider* pProvider, Tizen::Base::Runtime::IEventListener* pListener) + : reqId(-1) + , property(0) + , pProvider(pProvider) + , pListener(pListener) + , isLegacy(legacy) + { + } + ~_InProcessInfo(void); private: diff --git a/src/app/inc/FApp_RequestManagerT.h b/src/app/inc/FApp_RequestManagerT.h index 34391e0..1661874 100644 --- a/src/app/inc/FApp_RequestManagerT.h +++ b/src/app/inc/FApp_RequestManagerT.h @@ -56,6 +56,8 @@ public: T* FindItem(int reqId) const; + void Dump(void) const; + private: _RequestManagerT(const T& rhs); -- 2.7.4