#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;
, _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*
result
_AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener)
{
+ SysLog(NID_APP, "Enter");
result r = E_SYSTEM;
if (_property & _APPCONTROL_PROPERTY_SLP)
{
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)
{
SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
}
+ SysLog(NID_APP, "Exit");
return r;
}
_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.");
result
_AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pListener)
{
+ SysLog(NID_APP, "Enter");
result r = E_SUCCESS;
_AppArg* pArg = new (std::nothrow) _AppArg;
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)
{
+ SysLog(NID_APP, "Enter");
result r = E_SUCCESS;
_AppArg* pArg = new (std::nothrow) _AppArg;
_AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _property);
req = reqObj.GetRequestNumber();
+ if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+ {
+ _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+ if (pAppControlResponseEvent != null)
+ {
+ r = pAppControlResponseEvent->Construct();
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+ r = pAppControlResponseEvent->AddListener(*this, true);
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+ IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+ if (pResponseEventContainer != null)
+ {
+ pResponseEventContainer->Add(req, pAppControlResponseEvent);
+ __appControlResponseEventList.Add(req);
+ SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+ }
+ }
+ }
+
_processId = pImpl->Launch(_path, pArg, req);
if (_processId < 0)
{
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;
}
// [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;
_AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _APPCONTROL_PROPERTY_NONE);
req = reqObj.GetRequestNumber();
+ if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+ {
+ _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+ if (pAppControlResponseEvent != null)
+ {
+ r = pAppControlResponseEvent->Construct();
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+ r = pAppControlResponseEvent->AddListener(*pImpl, true);
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+ IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+ if (pResponseEventContainer != null)
+ {
+ pResponseEventContainer->Add(req, pAppControlResponseEvent);
+ SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+ }
+ }
+ }
r = pImpl->LaunchAppImplicit(pArg, req);
SysTryCatch(NID_APP, r == E_SUCCESS, reqObj.Invalidate(), r, "[%s] Propagating." , GetErrorMessage(r));
}
r = pImpl->LaunchAppImplicit(pArg, -1);
delete pArg;
}
+ SysLog(NID_APP, "Exit");
// [FIXME] launch registration is not working correctly
}
result
-_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
{
SysLog(NID_APP, "Result value %d", res);
if (prop & _APPCONTROL_PROPERTY_ALIAS)
{
- _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+ const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
if (pEntry)
{
String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
if (!tmp.IsEmpty())
{
- SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
+ SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
provider = tmp;
}
}
result
-_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
{
- SysLog(NID_APP, "Result value %d", res);
+ SysLog(NID_APP, "Result value : %d, property : 0x%x", res, prop);
SysTryReturnResult(NID_APP, data && pResArg && pArg, E_SYSTEM, "Invalid result (callback, result, arg) = (0x%x, 0x%x, 0x%x).",
data, pResArg,
if (prop & _APPCONTROL_PROPERTY_ALIAS)
{
- _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
- pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
+ const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+ pEntry = _AppControlRegistry::GetInstance()->GetReverseRuntimeAliasEntry(provider, oId);
if (pEntry)
{
provider = pEntry->provider;
oId = pEntry->operation;
- SysLog(NID_APP, "Legacy AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
+ SysLog(NID_APP, "Original AppControl name (%ls, %ls).", provider.GetPointer(), oId.GetPointer());
}
}
String tmp = _AppControlRegistry::GetInstance()->GetReverseAliasAppId(provider);
if (!tmp.IsEmpty())
{
- SysLog(NID_APP, "AppId change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
+ SysLog(NID_APP, "App change (%ls -> %ls).", provider.GetPointer(), tmp.GetPointer());
provider = tmp;
}
std::unique_ptr<HashMap> pMap(pResArg->GetArgMapN());
- AppCtrlResult ret = APP_CTRL_RESULT_FAILED;
- // to prevent enum overflow;
- int resCode = res;
- switch(resCode)
- {
- case SERVICE_RESULT_SUCCEEDED:
- ret = APP_CTRL_RESULT_SUCCEEDED;
- break;
- case SERVICE_RESULT_FAILED:
- ret = APP_CTRL_RESULT_CANCELED;
- break;
- case SERVICE_RESULT_CANCELED:
- ret = APP_CTRL_RESULT_ABORTED;
- break;
- case APPSVC_OSP_RES_FAIL:
- ret = APP_CTRL_RESULT_FAILED;
- break;
- case APPSVC_OSP_RES_TERMINATE:
- ret = APP_CTRL_RESULT_TERMINATED;
- break;
- default:
- ret = APP_CTRL_RESULT_FAILED;
- break;
- }
+ AppCtrlResult ret = _AppControlManager::ConvertAppControlResultCode(res);
SysLog(NID_APP, "Result code : 0x%x.", ret);
// proper callback invokation
- pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+ _AppControlResponseEvent* pResponseEvent = null;
+ _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(reqId, pResponseEvent);
+
+ if (pResponseEvent != null)
+ {
+ _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, provider, oId, E_SUCCESS, ret, pMap.get(), reqId);
+ pResponseEvent->Fire(*pResponseEventArg);
+ SysLog(NID_APP, "OnAppControlCompleteResponseReceived, pResponseEvent is Fired");
+ }
+ else
+ {
+ pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+ SysLog(NID_APP, "OnAppControlCompleteResponseReceived, Called");
+ }
return E_SUCCESS;
}
result
_AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* pListener)
{
+ SysLog(NID_APP, "Enter");
_InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
_reqId = req;
+ SysLog(NID_APP, "Exit");
return E_SUCCESS;
CATCH:
result
_AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener)
{
+ SysLog(NID_APP, "Enter");
_InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
{
req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
}
+
+ if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+ {
+ _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+ if (pAppControlResponseEvent != null)
+ {
+ r = pAppControlResponseEvent->Construct();
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+ r = pAppControlResponseEvent->AddListener(*this, true);
+ SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+ IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = _AppControlManager::GetInstance()->GetAppControlResponseEventContainer();
+ if (pResponseEventContainer != null)
+ {
+ int responseEventRequestId = RESPONSE_EVENT_REQID_MAGIC + req;
+ pResponseEventContainer->Add(responseEventRequestId, pAppControlResponseEvent);
+ __appControlResponseEventList.Add(responseEventRequestId);
+ SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", responseEventRequestId);
+ }
+ }
+ }
}
r = InvokeStartAppControl(*pLib, req, _provider, _opId, pUriData, pMimeType, pDataList);
}
_reqId = req;
+ SysLog(NID_APP, "Exit");
return E_SUCCESS;
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());
}
const AppId& appId = GetAppId();
SysTryReturn(NID_APP, !appId.IsEmpty(), null, E_SYSTEM, "[E_SYSTEM] Empty appId.");
- SysLog(NID_APP, "Acquiring category for appId %ls.", appId.GetPointer());
+ SysLog(NID_APP, "Acquiring category for app %ls.", appId.GetPointer());
std::unique_ptr<PackageAppInfo> pAppInfo(_PackageManagerImpl::GetInstance()->GetPackageAppInfoN(appId));
SysTryReturn(NID_APP, pAppInfo.get() != null, null, E_SYSTEM, "[E_SYSTEM] Getting PackageAppInfo failed.");
_AppControlManager::GetInstance()->__listenerList.Add(pListener);
}
+void
+_AppControlImpl::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg)
+{
+ const _AppControlResponseEventArg* pEventArg = dynamic_cast<const _AppControlResponseEventArg*>(arg);
+
+ if (pEventArg != null)
+ {
+ IAppControlResponseListener* pResponseListener = pEventArg->GetListener();
+
+ if(pResponseListener != null)
+ {
+ if(pEventArg->GetType() == _APPCONTROL_RESPONSETYPE_COMPLETE)
+ {
+ pResponseListener->OnAppControlCompleteResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData());
+ SysLog(NID_APP, "OnAppControlCompleteResponseReceived called");
+
+ _AppControlResponseEvent* pResponseEvent = null;
+ _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);
+ _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->Remove(pEventArg->GetRequestId());
+ delete pResponseEvent;
+ SysLog(NID_APP, "pResponseEvent gets deleted, reqId(%d)", pEventArg->GetRequestId());
+ }
+ else
+ {
+ SysLog(NID_APP, "Unexpected AppControlResponseType(%d)", pEventArg->GetType());
+ }
+ }
+ else
+ {
+ SysLog(NID_APP, "Invalid ResponseListener");
+ }
+ }
+ else
+ {
+ SysLog(NID_APP, "Invalid AppControl arguments : arg(0x%x)", &arg);
+ }
+
+}
}} //Tizen::App