//
-// Open Service Platform
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the License);
#include <appsvc/appsvc.h>
+#include <FBaseColHashMap.h>
+#include <FBaseSysLog.h>
#include <FAppAppControl.h>
#include <FAppAppManager.h>
#include <FAppPkgPackageAppInfo.h>
#include <FAppIAppControlEventListener.h>
#include <FAppIAppControlResponseListener.h>
-#include <FBaseColHashMap.h>
-#include <FBaseSysLog.h>
-
-#include <FBaseRt_LibraryImpl.h>
-#include <FIo_DirectoryImpl.h>
#include "FApp_AppControlImpl.h"
#include "FApp_AppControlManager.h"
+#include "FApp_IAppControlPluginProvider.h"
#include "FApp_AppArg.h"
-#include "FApp_AppImpl.h"
#include "FApp_AppControlRegistry.h"
#include "FApp_AppMessageImpl.h"
#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;
{
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";
-const char TIZEN_APPCONTROL_DATA_LEGACY[] = "http://tizen.org/appcontrol/data/legacyresult";
-
_AppControlImpl::_AppControlImpl(const AppControl& value)
: _appControl(value)
, _reqId(_REQ_ID_INVALID)
, _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*
-_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.");
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)
return ac.__pAppControlImpl;
}
-result
-_AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener)
+_IAppControlPluginProvider*
+_AppControlImpl::GetAppControlPluginProvider(const String& path)
{
- 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);
- }
-
- return r;
-}
+ _LibraryImpl lib;
+ lib.Construct(path, _LIBRARY_OPTION);
-result
-_AppControlImpl::Start(const String* pUriData, const String* pDataType, const IMap* pExtraData, IAppControlResponseListener* pListener)
-{
- result r = E_SYSTEM;
+ APP_CONTROL_PROVIDER_GET_FN pProvider = reinterpret_cast<APP_CONTROL_PROVIDER_GET_FN>(lib.GetProcAddress(L"GetAppControlProviderPlugin"));
- if (_property & _APPCONTROL_PROPERTY_SLP)
- {
- r = StartNative(pUriData, pDataType, pExtraData, pListener);
- }
- else if (_property & _APPCONTROL_PROPERTY_OSP)
- {
- r = StartOsp(pUriData, pDataType, pExtraData, pListener);
- }
- else
+ if (!pProvider)
{
- SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
+ SysLogException(NID_APP, E_SYSTEM, "Cannot load plugin properly for %ls.", path.GetPointer());
+ return null;
}
- return r;
+ return (*pProvider)();
}
+
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.");
return StartImplicit(pBundle.get(), pExtraData, pListener);
}
-result
-_AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pListener)
-{
- 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());
- }
-
- 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)
{
- 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();
+ SysLog(NID_APP, "Enter");
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, _property);
- req = reqObj.GetRequestNumber();
-
- _processId = pImpl->Launch(_path, pArg, req);
- if (_processId < 0)
+ _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(isLegacy, pProvider, pListener);
+ if (pItem)
{
- reqObj.Invalidate();
- r = GetLastResult();
- SysLog(NID_APP, "[%s]Launching(%ls) is failed" , GetErrorMessage(r), _path.GetPointer());
- return r;
+ req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
}
}
- else
- {
- _processId = pImpl->Launch(_path, pArg);
- delete pArg;
- SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer());
- }
-
- return r;
-}
-
-result
-_AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener)
-{
- 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);
+ result r = InvokeStartAppControl(pProvider, req, L"", msg);
- _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
+ if (pListener == null)
{
- r = pImpl->LaunchAppImplicit(pArg, -1);
- delete pArg;
+ pProvider->Release();
}
- // [FIXME] launch registration is not working correctly
-
-CATCH:
- return r;
-}
-
-result
-_AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener)
-{
- 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;
-
- if (pListener)
+ // after acquring request number, pLib should be managed from the list, not CATCH
+ if (IsFailed(r))
{
- _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _APPCONTROL_PROPERTY_NONE);
- req = reqObj.GetRequestNumber();
+ _AppControlManager::GetInstance()->__inAppManager.RemoveItem(req);
+ SysLog(NID_APP, "[%s] A system error has occurred.", GetErrorMessage(r));
- 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;
+ return r;
}
- // [FIXME] launch registration is not working correctly
-
-CATCH:
-
- return r;
+ SysLog(NID_APP, "Exit %d", req);
+ return E_SUCCESS;
}
+
result
-_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener)
{
- 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<IAppControlEventListener*>(data);
- SysTryReturnResult(NID_APP, typeid(pListener) == typeid(IAppControlEventListener*), E_SYSTEM, "Invalid result callback");
+ _AppMessageImpl msg(pBundle);
+ msg.AddData(pDataList);
- 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)
- {
- _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
- pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
- if (pEntry)
- {
- provider = pEntry->provider;
- oId = pEntry->operation;
-
- SysLog(NID_APP, "Legacy AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
- }
- }
-
- if (prop & _APPCONTROL_PROPERTY_APPID_CHANGE)
- {
- String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
- if (!tmp.IsEmpty())
- {
- SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
-
- provider = tmp;
- }
- }
-
- std::unique_ptr<HashMap> pMap(pResArg->GetArgMapN());
-
- ArrayList list(SingleObjectDeleter);
- _AppArg::FillLegacyAppControlResult(list, res, pMap.get(), provider);
-
- // proper callback invokation
- pListener->OnAppControlCompleted(provider, oId, &list);
-
- return E_SUCCESS;
+ return StartImplicit(msg, pListener, true);
}
+
result
-_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener)
{
- SysLog(NID_APP, "Result value %d", res);
+ _AppMessageImpl msg(pBundle);
+ _AppArg::AddStrMap(msg.GetBundle(), pData);
- 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<IAppControlResponseListener*>(data);
- SysTryReturnResult(NID_APP, 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)
- {
- _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
- pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
- if (pEntry)
- {
- provider = pEntry->provider;
- oId = pEntry->operation;
-
- SysLog(NID_APP, "Legacy AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
- }
- }
-
- if (prop & _APPCONTROL_PROPERTY_APPID_CHANGE)
- {
- String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
- if (!tmp.IsEmpty())
- {
- SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
-
- provider = tmp;
- }
- }
-
- 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;
- }
-
- SysLog(NID_APP, "Result code : 0x%x.", ret);
-
- // proper callback invokation
- pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
-
- 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);
SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
int req = _REQ_ID_INVALID;
- _LibraryImpl* pLib = null;
-
- pLib = new (std::nothrow) _LibraryImpl;
- SysTryReturnResult(NID_APP, pLib != null, E_OUT_OF_MEMORY, "Failed to allocate libraryimpl.");
- unsigned long option = _LIBRARY_LOAD_OPTION_LAZY;
- option |= _LIBRARY_LOAD_OPTION_NODELETE;
-
- result r = pLib->Construct(_path, option);
- SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating.", GetErrorMessage(r));
+ _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
+ SysTryReturnResult(NID_APP, pProvider != null, E_OBJ_NOT_FOUND, "Propagating.");
if (pListener)
{
- _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_provider, _opId, _property, true, *pLib, pListener);
+ _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_appId, _opId, _property, true, pProvider, pListener);
if (pItem)
{
req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
}
}
- r = InvokeStartAppControl(*pLib, req, _provider, _opId, pDataList);
+
+ result r = InvokeStartAppControl(pProvider, req, _appId, _opId, pDataList);
if (pListener == null)
{
- delete pLib;
+ pProvider->Release();
}
// after acquring request number, pLib should be managed from the list, not CATCH
if (IsFailed(r))
{
- SetLastResult(E_SYSTEM);
_AppControlManager::GetInstance()->__inAppManager.RemoveItem(req);
- SysLog(NID_APP, "[E_SYSTEM] A system error has occurred with %s.", GetErrorMessage(r));
+ SysLog(NID_APP, "[%s] A system error has occurred.", GetErrorMessage(r));
- return E_SYSTEM;
+ return r;
}
_reqId = req;
+ SysLog(NID_APP, "Exit %d", req);
return E_SUCCESS;
-
-CATCH:
- delete pLib;
-
- switch (r)
- {
- case E_LIBRARY_NOT_FOUND:
- r = E_OBJ_NOT_FOUND;
- break;
- default:
- r = E_SYSTEM;
- break;
- }
-
- return r;
}
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);
SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
int req = _REQ_ID_INVALID;
- _LibraryImpl* pLib = null;
-
- pLib = new (std::nothrow) _LibraryImpl;
- SysTryReturnResult(NID_APP, pLib != null, E_OUT_OF_MEMORY, "Failed to allocate libraryimpl.");
-
- unsigned long option = _LIBRARY_LOAD_OPTION_LAZY;
- option |= _LIBRARY_LOAD_OPTION_NODELETE;
-
- result r = pLib->Construct(_path, option);
+ result r = E_SUCCESS;
- SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating.", GetErrorMessage(r));
+ _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
+ SysTryReturnResult(NID_APP, pProvider != null, E_OBJ_NOT_FOUND, "Propagating.");
if (pListener)
{
- _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_provider, _opId, _property, false, *pLib, pListener);
+ _InProcessInfo* pItem = new (std::nothrow) _InProcessInfo(_appId, _opId, _property, false, pProvider, pListener);
if (pItem)
{
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, null, null, pDataList);
+ r = InvokeStartAppControl(pProvider, req, _appId, _opId, pUriData, pMimeType, pDataList);
if (pListener == null)
{
- delete pLib;
+ pProvider->Release();
}
// after acquring request number, pLib should be managed from the list, not CATCH
if (IsFailed(r))
{
- SetLastResult(E_SYSTEM);
_AppControlManager::GetInstance()->__inAppManager.RemoveItem(req);
- SysLog(NID_APP, "[E_SYSTEM] A system error has occurred with %s.", GetErrorMessage(r));
+ SysLog(NID_APP, "[%s] A system error has occurred.", GetErrorMessage(r));
- return E_SYSTEM;
+ return r;
}
_reqId = req;
+ SysLog(NID_APP, "Exit %d", req);
return E_SUCCESS;
-
-CATCH:
- delete pLib;
-
- switch (r)
- {
- case E_LIBRARY_NOT_FOUND:
- r = E_OBJ_NOT_FOUND;
- break;
- default:
- r = E_SYSTEM;
- break;
- }
-
- return r;
}
result
-_AppControlImpl::InvokeStartAppControl(_LibraryImpl& lib, int req, const String& appId, const String& oId, const IList* pList)
+_AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const String& oId, const IList* pList)
{
SysLog(NID_APP, "Legacy stuff for converting argument");
pMap = ↦
}
- return InvokeStartAppControl(lib, req, appId, oId, null, null, pMap);
+ return InvokeStartAppControl(pProvider, req, appId, oId, null, null, pMap);
+}
+
+
+result
+_AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const String& oId, const String* pUri, const String* pMime, const IMap* pMap)
+{
+ _AppMessageImpl msg(appId, oId, pUri, pMime, pMap);
+
+ return InvokeStartAppControl(pProvider, req, appId, msg);
}
result
-_AppControlImpl::InvokeStartAppControl(_LibraryImpl& lib, int req, const String& appId, const String& oId, const String* pUri, const String* pMime, const IMap* pMap)
+_AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const _AppMessageImpl& message)
{
- result (*pFunc)(int req, const String&, const String&, const String*, const String*, const IMap*) = null;
+ SysTryReturnResult(NID_APP, pProvider != null, E_SYSTEM, "Wrong AppControl provider plugin for %ls(%d).", appId.GetPointer(), req);
- pFunc =
- reinterpret_cast<result (*)(int, const String&, const String&, const String*, const String*, const IMap*)>(lib.GetProcAddress(L"StartAppControl"));
- SysTryReturnResult(NID_APP, pFunc != null, E_OBJ_NOT_FOUND, "Entry \"StartAppControl\" not found for %ls", appId.GetPointer());
- return (*pFunc)(req, appId, oId, pUri, pMime, pMap);
+ return pProvider->StartAppControlPlugin(req, appId, message, null);
}
+
static bool
IsValidAppControl(const String& appcontrolID)
{
|| (appcontrolID == L"tizen.memo")
|| (appcontrolID == L"tizen.contacts")
|| (appcontrolID == L"tizen.calendar")
- || (appcontrolID == L"tizen.events")
+ || (appcontrolID == L"tizen.todo")
|| (appcontrolID == L"tizen.email")
|| (appcontrolID == L"tizen.settings")
|| (appcontrolID == L"tizen.messages")
const String appcontrolID(GetAppControlProviderId());
SysTryReturnResult(NID_APP, IsValidAppControl(appcontrolID), E_INVALID_OPERATION, "Invalid appcontrolID(%ls)", appcontrolID.GetPointer());
- if (_property & _APPCONTROL_PROPERTY_SLP)
- {
- SysTryReturnResult(NID_APP, _reqId != _REQ_ID_INVALID, E_INVALID_OPERATION, "Invalid request ID .");
+ result (*pStop)(int req) = null;
+ if (_reqId != _REQ_ID_INVALID)
+ {
_InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
SysTryReturnResult(NID_APP, pInfo != null, E_INVALID_OPERATION, "Request ID %d is not found.", _reqId);
-
- result (*pStop)(int req) = null;
- pStop = reinterpret_cast<result (*)(int)>(pInfo->pLib->GetProcAddress(L"TerminateAppControl"));
- SysTryReturnResult(NID_APP, pStop != null, E_SYSTEM, "No TerminateAppControl() function.");
-
- (*pStop)(_reqId);
-
+
+ if (pInfo->pProvider)
+ {
+ pInfo->pProvider->StopAppControlPlugin(_reqId);
+ }
+
_AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId);
-
+
_reqId = _REQ_ID_INVALID;
}
- else if (_property & _APPCONTROL_PROPERTY_OSP)
+ else
{
- _Aul::TerminateApplicationByPid(_processId);
+ _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
+ if (pProvider)
+ {
+ pProvider->StopAppControlPlugin(-1);
+ SysLog(NID_APP, "Request is stopped.");
+
+ pProvider->Release();
+ }
}
return E_SUCCESS;
String
_AppControlImpl::GetAppName(void)
{
- if ((_property & _APPCONTROL_PROPERTY_OSP) && _appName.IsEmpty())
+ if (_appName.IsEmpty())
{
- const AppId& appId = _path;
+ AppId appId = GetAppId();
+ AppId aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
+ if (!aliasAppId.IsEmpty())
+ {
+ appId = aliasAppId;
+ }
std::unique_ptr<PackageAppInfo> pInfo(_PackageManagerImpl::GetInstance()->GetPackageAppInfoN(appId));
-
if (pInfo.get())
{
+ SysLog(NID_APP, "PackageInfo of appId(%ls) exists", appId.GetPointer());
const String& name = pInfo->GetAppName();
if (name == L"_AppControl")
{
if (pNewInfo.get())
{
- _appName = pNewInfo->GetAppName();
+ _appName = pNewInfo->GetAppDisplayName();
}
else
{
}
else
{
- _appName = pInfo->GetAppName();
+ _appName = pInfo->GetAppDisplayName();
}
- SysLog(NID_APP, "Initializing AppName(%ls) for %ls.", _appName.GetPointer(), appId.GetPointer());
+ }
+ else
+ {
+ SysLog(NID_APP, "PackageInfo of appId(%ls) does not exist", appId.GetPointer());
}
}
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&
IList*
_AppControlImpl::GetCategoryListN(void) const
{
- const AppId& appId = GetAppId();
+ 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());
+ AppId aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
+ if (!aliasAppId.IsEmpty())
+ {
+ appId = aliasAppId;
+ }
+
+ 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.");
void
_AppControlImpl::StopAppControlResponseListener(IAppControlResponseListener* pListener)
{
- _AppControlManager::GetInstance()->__listenerList.Add(pListener);
+ _AppControlManager::GetInstance()->StopAppControlResponseListener(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)
+ {
+ _AppControlManager::InvokeAppControlCompleteListener(*pResponseListener, pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData(), pEventArg->IsSubMode());
+
+ _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