Update for handling callback of threads
authorJaesung Ku <jaesung.ku@samsung.com>
Thu, 11 Apr 2013 07:27:53 +0000 (16:27 +0900)
committerJaesung Ku <jaesung.ku@samsung.com>
Thu, 11 Apr 2013 09:30:15 +0000 (18:30 +0900)
Change-Id: I7c2f46bb027ce99fa35009db6317e66d13c5b61c
Signed-off-by: Jaesung Ku <jaesung.ku@samsung.com>
13 files changed:
src/app/CMakeLists.txt [changed mode: 0644->0755]
src/app/FApp_AppControlEventArg.h [changed mode: 0644->0755]
src/app/FApp_AppControlImpl.cpp
src/app/FApp_AppControlManager.cpp [changed mode: 0644->0755]
src/app/FApp_AppControlResponseEvent.cpp [new file with mode: 0755]
src/app/FApp_MapDataControlImpl.cpp [changed mode: 0644->0755]
src/app/FApp_MapDataControlImpl.h [changed mode: 0644->0755]
src/app/FApp_SqlDataControlImpl.cpp [changed mode: 0644->0755]
src/app/FApp_SqlDataControlImpl.h [changed mode: 0644->0755]
src/app/inc/FApp_AppControlImpl.h [changed mode: 0644->0755]
src/app/inc/FApp_AppControlManager.h [changed mode: 0644->0755]
src/app/inc/FApp_AppControlResponseEvent.h [new file with mode: 0755]
src/app/inc/FApp_IAppControlResponseEventListener.h [new file with mode: 0755]

old mode 100644 (file)
new mode 100755 (executable)
index c6cfd4a..0a04640
@@ -8,6 +8,7 @@ INCLUDE_DIRECTORIES (
        ${CMAKE_SOURCE_DIR}/src/io/inc
        ${CMAKE_SOURCE_DIR}/src/system/inc
        ${CMAKE_SOURCE_DIR}/src/security/inc
+       ${CMAKE_SOURCE_DIR}/src/base/runtime
        inc
        )
 
@@ -64,6 +65,7 @@ SET (${this_target}_SOURCE_FILES
        FAppAppSetting.cpp
        FApp_AppSettingImpl.cpp
        FApp_LongevityManager.cpp
+       FApp_AppControlResponseEvent.cpp
        )
 
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SINGLETON_CLEANUP -fvisibility=hidden")
old mode 100644 (file)
new mode 100755 (executable)
index ec1212f..ef46fae
@@ -37,6 +37,16 @@ namespace Tizen { namespace App
 {
 
 class _AppArg;
+class IAppControlResponseListener;
+
+/**
+ * @enum       AppControlResposeType
+ */
+enum _AppControlResponseType
+{
+       _APPCONTROL_RESPONSETYPE_START,
+       _APPCONTROL_RESPONSETYPE_COMPLETE
+};
 
 /**
  * @class              _AppControlEventArg
@@ -162,6 +172,87 @@ private:
        Tizen::Base::String __operationId;
 }; // _AppControlStartEventArg
 
+/**
+ * @class              _AppControlResponseEventArg
+ * @brief
+ */
+class _AppControlResponseEventArg
+       : public Tizen::Base::Object
+       , public Tizen::Base::Runtime::IEventArg
+{
+public:
+       _AppControlResponseEventArg(IAppControlResponseListener* pResponseListener, _AppControlResponseType type, const AppId& appId, const Tizen::Base::String& operationId, result res, AppCtrlResult appControlResult, const Tizen::Base::Collection::IMap* pExtraData, int reqId)
+               : __pResponseListener(pResponseListener)
+               , __type(type)
+               , __appId(appId)
+               , __operationId(operationId)
+               , __res(res)
+               , __appControlResult(appControlResult)
+               , __pExtraData(pExtraData)
+               , __reqId(reqId)
+       {
+       }
+
+       virtual ~_AppControlResponseEventArg(void)
+       {
+       }
+
+       IAppControlResponseListener* GetListener(void) const
+       {
+               return __pResponseListener;
+       }
+
+       _AppControlResponseType GetType(void) const
+       {
+               return __type;
+       }
+
+       const AppId& GetAppId(void) const
+       {
+               return __appId;
+       }
+
+       const Tizen::Base::String& GetOperationId(void) const
+       {
+               return __operationId;
+       }
+
+       result GetResult(void) const
+       {
+               return __res;
+       }
+
+       AppCtrlResult GetAppControlResult(void) const
+       {
+               return __appControlResult;
+       }
+
+       const Tizen::Base::Collection::IMap* GetExtraData(void) const
+       {
+               return __pExtraData;
+       }
+
+       int GetRequestId(void) const
+       {
+               return __reqId;
+       }
+
+private:
+       _AppControlResponseEventArg(const _AppControlResponseEventArg& rhs);
+
+       _AppControlResponseEventArg& operator =(const _AppControlResponseEventArg& rhs);
+
+private:
+       IAppControlResponseListener* __pResponseListener;
+       _AppControlResponseType __type;
+       const AppId& __appId;
+       const Tizen::Base::String& __operationId;
+       result __res;
+       AppCtrlResult __appControlResult;
+       const Tizen::Base::Collection::IMap* __pExtraData;
+       int __reqId;
+}; // _AppControlEventArg
+
 } } // Tizen::App
 
 #endif // _FAPP_INTERNAL_APP_CONTROL_EVENT_ARG_H_
index 080a101..c6b2d16 100755 (executable)
@@ -46,6 +46,9 @@
 #include "FApp_AppInfo.h"
 #include "FAppPkg_PackageManagerImpl.h"
 #include "FApp_Aul.h"
+#include "FApp_AppControlEventArg.h"
+#include "FApp_AppControlResponseEvent.h"
+#include "FBaseRt_ThreadImpl.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
@@ -73,10 +76,33 @@ _AppControlImpl::_AppControlImpl(const AppControl& value)
        , _property(_APPCONTROL_PROPERTY_NONE)
        , _processId(_REQ_ID_INVALID)
 {
+       __appControlResponseEventList.Construct();
 }
 
 _AppControlImpl::~_AppControlImpl(void)
 {
+       IEnumeratorT<int>* pEnum = __appControlResponseEventList.GetEnumeratorN();
+       IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = null;
+       if(pEnum != null)
+       {
+               pResponseEventContainer = _AppControlManager::GetInstance()->GetAppControlResponseEventContainer();
+       }
+
+       while(pEnum->MoveNext() == E_SUCCESS)
+       {
+               int reqId;
+               pEnum->GetCurrent(reqId);
+               if (pResponseEventContainer != null)
+               {
+                       _AppControlResponseEvent* pResponseEvent = null;
+                       pResponseEventContainer->GetValue(reqId, pResponseEvent);
+                       delete pResponseEvent;
+
+                       pResponseEventContainer->Remove(reqId);
+                       SysLog(NID_APP, "pResponseEvent gets deleted. reqId(%d)", reqId);
+               }
+       }
+       delete pEnum;
 }
 
 AppControl*
@@ -151,6 +177,7 @@ _AppControlImpl::GetInstance(AppControl& ac)
 result
 _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SYSTEM;
 
        if (_property & _APPCONTROL_PROPERTY_SLP)
@@ -165,6 +192,7 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
        {
                SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -172,6 +200,7 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
 result
 _AppControlImpl::Start(const String* pUriData, const String* pDataType, const IMap* pExtraData, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SYSTEM;
 
        if (_property & _APPCONTROL_PROPERTY_SLP)
@@ -186,6 +215,7 @@ _AppControlImpl::Start(const String* pUriData, const String* pDataType, const IM
        {
                SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] Invalid AppControl type(property %d)", _property);
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -194,6 +224,7 @@ result
 _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPattern, const String* pDataType, const String* pCategory, const IMap* pExtraData, IAppControlResponseListener* pListener)
 {
        // [FIXME] valid argument size checking required
+       SysLog(NID_APP, "Enter");
 
        std::unique_ptr<bundle, BundleDeleter> pBundle(bundle_create());
        SysTryReturnResult(NID_APP, pBundle.get(), E_OUT_OF_MEMORY, "Bundle creation failure.");
@@ -241,6 +272,7 @@ _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPatte
 result
 _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -272,6 +304,7 @@ _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pLis
                delete pArg;
                SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer());
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -279,6 +312,7 @@ _AppControlImpl::StartOsp(const IList* pDataList, IAppControlEventListener* pLis
 result
 _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -294,6 +328,27 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _property);
                req = reqObj.GetRequestNumber();
 
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*this, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       pResponseEventContainer->Add(req, pAppControlResponseEvent);
+                                       __appControlResponseEventList.Add(req);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+                               }
+                       }
+               }
+
                _processId = pImpl->Launch(_path, pArg, req);           
                if (_processId < 0)
                {
@@ -309,6 +364,7 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
                delete pArg;
                SysTryReturnResult(NID_APP, _processId >= 0, GetLastResult(), "Launching(%ls) is failed", _path.GetPointer());
        }
+       SysLog(NID_APP, "Exit");
 
        return r;
 }
@@ -316,6 +372,7 @@ _AppControlImpl::StartOsp(const String* pUriData, const String* pMimeType, const
 result
 _AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -343,6 +400,7 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IList* pDataList, IAppCont
        }
 
        // [FIXME] launch registration is not working correctly
+       SysLog(NID_APP, "Exit");
 
 CATCH:
        return r;
@@ -351,6 +409,7 @@ CATCH:
 result
 _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        result r = E_SUCCESS;
 
        _AppArg* pArg = new (std::nothrow) _AppArg;
@@ -368,6 +427,26 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlRe
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pImpl, pArg, AppControlCb, pListener, _APPCONTROL_PROPERTY_NONE);
                req = reqObj.GetRequestNumber();
 
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*pImpl, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = pImpl->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       pResponseEventContainer->Add(req, pAppControlResponseEvent);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", req);
+                               }
+                       }
+               }
                r = pImpl->LaunchAppImplicit(pArg, req);
                SysTryCatch(NID_APP, r == E_SUCCESS, reqObj.Invalidate(), r, "[%s] Propagating." , GetErrorMessage(r));
        }
@@ -376,6 +455,7 @@ _AppControlImpl::StartImplicit(bundle* pBundle, const IMap* pData, IAppControlRe
                r = pImpl->LaunchAppImplicit(pArg, -1);
                delete pArg;
        }
+       SysLog(NID_APP, "Exit");
 
        // [FIXME] launch registration is not working correctly
 
@@ -385,7 +465,7 @@ CATCH:
 }
 
 result
-_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
 {
        SysLog(NID_APP, "Result value %d", res);
 
@@ -450,7 +530,7 @@ _AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg,
 }
 
 result
-_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId)
 {
        SysLog(NID_APP, "Result value %d", res);
 
@@ -533,7 +613,20 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
        SysLog(NID_APP, "Result code : 0x%x.", ret);
 
        // proper callback invokation
-       pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+       _AppControlResponseEvent* pResponseEvent = null;
+       _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(reqId, pResponseEvent);
+
+       if (pResponseEvent != null)
+       {
+               _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, provider, oId, E_SUCCESS, ret, pMap.get(), reqId);
+               pResponseEvent->Fire(*pResponseEventArg);
+               SysLog(NID_APP, "OnAppControlCompleteResponseReceived, pResponseEvent is Fired");
+       }
+       else
+       {
+               pListener->OnAppControlCompleteResponseReceived(provider, oId, ret, pMap.get());
+               SysLog(NID_APP, "OnAppControlCompleteResponseReceived, Called");
+       }
 
        return E_SUCCESS;
 }
@@ -541,6 +634,7 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
 result
 _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
@@ -583,6 +677,7 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p
 
        _reqId = req;
 
+       SysLog(NID_APP, "Exit");
        return E_SUCCESS;
 
 CATCH:
@@ -604,6 +699,7 @@ CATCH:
 result
 _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, const IMap* pDataList, IAppControlResponseListener* pListener)
 {
+       SysLog(NID_APP, "Enter");
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
@@ -627,6 +723,29 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
                {
                        req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
                }
+
+               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               {
+                       _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
+
+                       if (pAppControlResponseEvent != null)
+                       {
+                               r = pAppControlResponseEvent->Construct();
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::Construct() is failed", GetErrorMessage(r));
+
+                               r = pAppControlResponseEvent->AddListener(*this, true);
+                               SysTryLog(NID_APP, r == E_SUCCESS, "[%s]_AppControlResponseEvent::AddListener() is failed", GetErrorMessage(r));
+
+                               IMapT<int, _AppControlResponseEvent*>* pResponseEventContainer = _AppControlManager::GetInstance()->GetAppControlResponseEventContainer();
+                               if (pResponseEventContainer != null)
+                               {
+                                       int responseEventRequestId = RESPONSE_EVENT_REQID_MAGIC + req;
+                                       pResponseEventContainer->Add(responseEventRequestId, pAppControlResponseEvent);
+                                       __appControlResponseEventList.Add(responseEventRequestId);
+                                       SysLog(NID_APP, "pResponseEvent gets added. reqId(%d)", responseEventRequestId);
+                               }
+                       }
+               }
        }
        r = InvokeStartAppControl(*pLib, req, _provider, _opId, pUriData, pMimeType, pDataList);
 
@@ -646,6 +765,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
        }
 
        _reqId = req;
+       SysLog(NID_APP, "Exit");
 
        return E_SUCCESS;
 
@@ -856,4 +976,42 @@ _AppControlImpl::StopAppControlResponseListener(IAppControlResponseListener* pLi
        _AppControlManager::GetInstance()->__listenerList.Add(pListener);
 }
 
+void
+_AppControlImpl::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg)
+{
+       const _AppControlResponseEventArg* pEventArg = dynamic_cast<const _AppControlResponseEventArg*>(arg);
+
+       if (pEventArg != null)
+       {
+               IAppControlResponseListener* pResponseListener = pEventArg->GetListener();
+
+               if(pResponseListener != null)
+               {
+                       if(pEventArg->GetType() == _APPCONTROL_RESPONSETYPE_COMPLETE)
+                       {
+                               pResponseListener->OnAppControlCompleteResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData());
+                               SysLog(NID_APP, "OnAppControlCompleteResponseReceived called");
+
+                               _AppControlResponseEvent* pResponseEvent = null;
+                               _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);
+                               _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->Remove(pEventArg->GetRequestId());
+                               delete pResponseEvent;
+                               SysLog(NID_APP, "pResponseEvent gets deleted, reqId(%d)", pEventArg->GetRequestId());
+                       }
+                       else
+                       {
+                               SysLog(NID_APP, "Unexpected AppControlResponseType(%d)", pEventArg->GetType());
+                       }
+               }
+               else
+               {
+                       SysLog(NID_APP, "Invalid ResponseListener");
+               }
+       }
+       else
+       {
+               SysLog(NID_APP, "Invalid AppControl arguments : arg(0x%x)", &arg);
+       }
+
+}
 }}    //Tizen::App
old mode 100644 (file)
new mode 100755 (executable)
index efeb4b0..ef6c706
@@ -67,6 +67,7 @@
 #include "FAppPkg_PackageInfoImpl.h"
 #include "FApp_AppMessageImpl.h"
 #include "FApp_AppManagerImpl.h"
+#include "FApp_AppControlResponseEvent.h"
 
 using namespace Tizen::App::Package;
 using namespace Tizen::Base;
@@ -103,12 +104,36 @@ _AppControlManager::_AppControlManager(void)
        __appControlEvent.Construct();
        __appControlEvent.AddListener(*dynamic_cast<_IAppControlSysEventListener*>(this));
        __listenerList.Construct();
+       __pAppControlResponseEventContainer = new (std::nothrow)HashMapT<int, _AppControlResponseEvent*>;
+       __pAppControlResponseEventContainer->Construct();
+       __appControlResponseEventList.Construct();
 }
 
 _AppControlManager::~_AppControlManager(void)
 {
        SysLog(NID_APP, "");
        __appControlEvent.RemoveListener(*dynamic_cast<_IAppControlSysEventListener*>(this));
+       IEnumeratorT<int>* pEnum = __appControlResponseEventList.GetEnumeratorN();
+
+       if (pEnum != null)
+       {
+               while(pEnum->MoveNext() == E_SUCCESS)
+               {
+                       int reqId;
+                       pEnum->GetCurrent(reqId);
+                       if (__pAppControlResponseEventContainer != null)
+                       {
+                               _AppControlResponseEvent* pResponseEvent = null;
+                               __pAppControlResponseEventContainer->GetValue(reqId, pResponseEvent);
+                               delete pResponseEvent;
+
+                               __pAppControlResponseEventContainer->Remove(reqId);
+                               SysLog(NID_APP, "pResponseEvent gets deleted. reqId(%d)", reqId);
+                       }
+               }
+       }
+       delete __pAppControlResponseEventContainer;
+       delete pEnum;
 }
 
 _AppControlManager*
@@ -157,7 +182,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int
 
                        if (pInfo->pUserData && (!__listenerList.Contains(pInfo->pUserData)))
                        {
-                               (*pInfo->launchCb)(pInfo->pUserData, pInfo->pArg, pAppArg, static_cast<service_result_e>(res), pInfo->property);
+                               (*pInfo->launchCb)(pInfo->pUserData, pInfo->pArg, pAppArg, static_cast<service_result_e>(res), pInfo->property, reqId);
                        }
                }
                else
@@ -195,7 +220,26 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, const AppId& appId, co
                        r = E_OPERATION_CANCELED;
                }
                SysLog(NID_APP, "Invoking callback 0x%x.", pListener);
-               pListener->OnAppControlStartResponseReceived(actualAppId, operationId, r);
+
+               _AppControlResponseEvent* pResponseEvent = null;
+               __pAppControlResponseEventContainer->GetValue(reqId, pResponseEvent);
+               SysLog(NID_APP, "StartResponseReceived Request Id(%d), ResponseEvent 0x%x.", reqId, pResponseEvent);
+               if (pResponseEvent != null)
+               {
+                       String oId(operationId);
+                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_START, actualAppId, oId, r, APP_CTRL_RESULT_SUCCEEDED, null, reqId);
+
+                       if (pResponseEventArg != null)
+                       {
+                               pResponseEvent->Fire(*pResponseEventArg);
+                               SysLog(NID_APP, "pResponseEvent is Fired");
+                       }
+               }
+               else
+               {
+                       pListener->OnAppControlStartResponseReceived(actualAppId, operationId, r);
+                       SysLog(NID_APP, "OnAppControlStartResponseReceived called directly");
+               }
        }
        else
        {
@@ -255,8 +299,24 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
                        IAppControlResponseListener* pListener = dynamic_cast<IAppControlResponseListener*>(pInfo->pListener);
                        if (pListener && (!__listenerList.Contains(pInfo->pListener)))
                        {
-                               SysLog(NID_APP, "OSP_AC OnAppControlCompleteResponseReceived");
-                               pListener->OnAppControlCompleteResponseReceived(aId, oId, static_cast<AppCtrlResult>(res), pArgs);
+                               _AppControlResponseEvent* pResponseEvent = null;
+                               int responseEventRequestId = RESPONSE_EVENT_REQID_MAGIC + reqId;
+                               __pAppControlResponseEventContainer->GetValue(responseEventRequestId, pResponseEvent);
+
+                               if (pResponseEvent != null)
+                               {
+                                       _AppControlResponseEventArg* pResponseEventArg = new (std::nothrow) _AppControlResponseEventArg(pListener, _APPCONTROL_RESPONSETYPE_COMPLETE, aId, oId, E_SUCCESS, static_cast<AppCtrlResult>(res), pArgs, responseEventRequestId);
+                                       if (pResponseEventArg != null)
+                                       {
+                                               pResponseEvent->Fire(*pResponseEventArg);
+                                               SysLog(NID_APP, "pResponseEvent is Fired");
+                                       }
+                               }
+                               else
+                               {
+                                       pListener->OnAppControlCompleteResponseReceived(aId, oId, static_cast<AppCtrlResult>(res), pArgs);
+                                       SysLog(NID_APP, "OnAppControlCompleteResponseReceived called directly");
+                               }
                        }
                        else
                        {
@@ -292,6 +352,13 @@ _AppControlManager::SendAppControlEvent(IEventArg& arg)
        return __appControlEvent.FireAsync(arg);
 }
 
+Tizen::Base::Collection::IMapT<int,_AppControlResponseEvent*>*
+_AppControlManager::GetAppControlResponseEventContainer(void)
+{
+       return __pAppControlResponseEventContainer;
+}
+
+
 // generic launch callback
 static void
 LaunchResultCb(bundle* b, int request_code, appsvc_result_val res, void* data)
@@ -742,10 +809,12 @@ _AppControlManager::LaunchAppImplicit(_AppArg* pArg, int req)
 void
 _AppControlManager::FinishAppControl(int reqId, int res, const IMap* pMap)
 {
+       SysLog(NID_APP, "Enter.");
        _NativeAppControlEventArg* pArg = new (std::nothrow) _NativeAppControlEventArg(reqId, res, pMap);
        SysTryReturnVoidResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Return argument allocation failure.");
 
        SendAppControlEvent(*pArg);
+       SysLog(NID_APP, "Exit.");
 }
 
 const _AppArg*
@@ -823,6 +892,45 @@ _AppControlManager::IsAllowedAppControl(const wchar_t aTable[][2][64], int count
        return false;
 }
 
+void
+_AppControlManager::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_START)
+                       {
+                               pResponseListener->OnAppControlStartResponseReceived(pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetResult());
+                               SysLog(NID_APP, "OnAppControlStartResponseReceived called");
+                       }
+                       else
+                       {
+                               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, "Invalid ResponseListener");
+               }
+       }
+       else
+       {
+               SysLog(NID_APP, "Invalid AppControl arguments : arg(0x%x)", &arg);
+       }
+}
 
 AppId
 _AppControlManager::GetAliasAppId(const AppId& appId)
diff --git a/src/app/FApp_AppControlResponseEvent.cpp b/src/app/FApp_AppControlResponseEvent.cpp
new file mode 100755 (executable)
index 0000000..d2116a5
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// Open Service Platform
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+/**
+ * @file        FApp_AppControlResponseEvent.cpp
+ * @brief      This is the implementation for the _AppControlResponseEvent.cpp class.
+ */
+
+#include <FBaseSysLog.h>
+
+#include "FApp_AppControlResponseEvent.h"
+#include "FApp_IAppControlResponseEventListener.h"
+
+using namespace Tizen::Base;
+using namespace Tizen::Base::Runtime;
+
+namespace Tizen { namespace App
+{
+
+void
+_AppControlResponseEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
+{
+       _IAppControlResponseEventListener* pListener = dynamic_cast<_IAppControlResponseEventListener*>(&listener);
+
+       if (pListener)
+       {
+               pListener->OnAppControlResponseEventReceivedN(&arg);
+       }
+       else
+       {
+               SysLog(NID_APP, "Invalid AppControl listener : listener(0x%x), arg(0x%x)", pListener, &arg);
+       }
+}
+
+} } // Tizen::App
old mode 100644 (file)
new mode 100755 (executable)
index 5382812..261520f
@@ -278,7 +278,7 @@ CATCH:
 }
 
 result
-_MapDataControlImpl::MapDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_MapDataControlImpl::MapDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int option)
 {
        ArrayList* pResultList = null;
        String* pResult = null;
old mode 100644 (file)
new mode 100755 (executable)
index fa34f57..c2da524
@@ -71,7 +71,7 @@ public:
 
        result SetMapDataControlResponseListener(IMapDataControlResponseListener* pListener);
 
-       static result MapDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop);
+       static result MapDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int option);
 
 private:
        _MapDataControlImpl(void);
old mode 100644 (file)
new mode 100755 (executable)
index 2da0dec..69daf60
@@ -326,7 +326,7 @@ CATCH:
 }
 
 result
-_SqlDataControlImpl::SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop)
+_SqlDataControlImpl::SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int option)
 {
        ArrayList* pResultList = null;
        String* pResult = null;
old mode 100644 (file)
new mode 100755 (executable)
index 87590d4..a5d3cf6
@@ -71,7 +71,7 @@ public:
 
        result SetSqlDataControlResponseListener(ISqlDataControlResponseListener* pListener);
 
-       static result SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop);
+       static result SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int option);
 
 private:
        _SqlDataControlImpl(void);
old mode 100644 (file)
new mode 100755 (executable)
index b7d7dd3..24c7494
 #include <FAppTypes.h>
 #include <FOspConfig.h>
 #include <FAppAppControl.h>
+#include <FBaseColArrayListT.h>
 
 #include "FApp_AppManagerImpl.h"
+#include "FApp_IAppControlResponseEventListener.h"
 
 namespace Tizen { namespace Base { class String; } }
 namespace Tizen { namespace Base { namespace Collection { class IList; } } }
@@ -57,6 +59,8 @@ enum _AppControlProperty
 
 class _OSP_EXPORT_ _AppControlImpl
        : public Tizen::Base::Object
+       , public Tizen::App::_IAppControlResponseEventListener
+       , virtual public Tizen::Base::Runtime::IEventListener
 {
 public:
        /**
@@ -232,6 +236,7 @@ public:
                _property |= prop;
        }
 
+       virtual void OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg);
 private:
        _AppControlImpl(const AppControl& value);
 
@@ -261,9 +266,11 @@ private:
 
        static result InvokeStartAppControl(Tizen::Base::Runtime::_LibraryImpl& lib, 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);
+       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);
+       static result AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId);
+
+       Tizen::Base::Collection::ArrayListT<int> __appControlResponseEventList;
 
 protected:
        const AppControl& _appControl;
old mode 100644 (file)
new mode 100755 (executable)
index 75f94ac..3084a37
@@ -41,6 +41,7 @@
 #include "FApp_AppManagerEvent.h"
 #include "FApp_IAppManagerServiceEventListener.h"
 #include "FApp_RequestManagerT.h"
+#include "FApp_IAppControlResponseEventListener.h"
 
 namespace Tizen { namespace Base
 {
@@ -70,8 +71,9 @@ class _AppControlEventArg;
 class _IAppManagerEventListener;
 class _AppManagerEventArg;
 class _AppMessageImpl;
+class _AppControlResponseEvent;
 
-typedef result (*LaunchCbType)(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop);
+typedef result (*LaunchCbType)(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId);
 
 typedef void (*AppSvcResFn)(void* b, int requestCode, service_result_e res, void* data);
 
@@ -80,6 +82,7 @@ typedef void (*AppSvcResFn)(void* b, int requestCode, service_result_e res, void
 // _LaunchInfo handles the launch request from this process
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 const long LAUNCH_INFO_MAGIC = 0x494C;
+const int RESPONSE_EVENT_REQID_MAGIC = 65536;
 
 class _LaunchInfo
 {
@@ -190,6 +193,7 @@ template<> inline void _RequestManagerT<_ResultInfo>::RemoveItem(int reqId)
 class _OSP_EXPORT_ _AppControlManager
        : public Tizen::Base::Object
        , public _IAppControlSysEventListener
+       , public _IAppControlResponseEventListener
        , virtual public Tizen::Base::Runtime::IEventListener
 {
 public:
@@ -233,6 +237,7 @@ public:
 
        _OSP_LOCAL_ result SendAppControlEvent(Tizen::Base::Runtime::IEventArg& arg);
 
+       _OSP_LOCAL_ Tizen::Base::Collection::IMapT<int,_AppControlResponseEvent*>* GetAppControlResponseEventContainer(void);
        _OSP_LOCAL_ result RegisterRequest(service_s* service, int& req, _AppHandler& handler);
 
        _OSP_LOCAL_ void RemoveResultRequest(int reqId)
@@ -269,6 +274,7 @@ public:
        void RemoveLaunchRequest(int req);
 
        int GetLaunchRequestCount(void);
+       virtual void OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg);
 
 private:
        _OSP_LOCAL_ _AppControlManager(void);
@@ -288,6 +294,8 @@ private:
        _RequestManagerT<_ResultInfo> __resultManager;
        Tizen::Base::Collection::ArrayListT<void*> __listenerList;
 
+       Tizen::Base::Collection::HashMapT<int, _AppControlResponseEvent*>* __pAppControlResponseEventContainer;
+       Tizen::Base::Collection::ArrayListT<int> __appControlResponseEventList;
        //friend class AppManager;
        friend class _AppControlImpl;
        //friend class _SqlDataControlImpl;
diff --git a/src/app/inc/FApp_AppControlResponseEvent.h b/src/app/inc/FApp_AppControlResponseEvent.h
new file mode 100755 (executable)
index 0000000..f72d36c
--- /dev/null
@@ -0,0 +1,53 @@
+//
+// Open Service Platform
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+/**
+ * @file       FApp_AppControlEvent.h
+ * @brief      This is the header file of _AppControlEvent
+ */
+
+#ifndef _FAPP_INTERNAL_APP_CONTROL_RESPONSE_EVENT_H_
+#define _FAPP_INTERNAL_APP_CONTROL_RESPONSE_EVENT_H_
+
+#include <FOspConfig.h>
+#include <FAppTypes.h>
+#include <FBaseRt_Event.h>
+
+namespace Tizen { namespace App
+{
+
+/**
+* @class       _AppControlResponseEvent
+* @brief               This class contains application control response event
+* @since               1.0
+*/
+class _AppControlResponseEvent
+       : public Tizen::Base::Runtime::_Event
+{
+public:
+       result Construct(void)
+       {
+               return _Event::Initialize();
+       }
+
+protected:
+       void FireImpl(Tizen::Base::Runtime::IEventListener& lstener, const Tizen::Base::Runtime::IEventArg& arg);
+}; // _AppControlResponseEvent
+
+} } // Tizen::App
+
+#endif //_FAPP_INTERNAL_APP_CONTROL_RESPONSE_EVENT_H_
\ No newline at end of file
diff --git a/src/app/inc/FApp_IAppControlResponseEventListener.h b/src/app/inc/FApp_IAppControlResponseEventListener.h
new file mode 100755 (executable)
index 0000000..b2a3e2d
--- /dev/null
@@ -0,0 +1,52 @@
+//
+// Open Service Platform
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+/**
+ * @file       FApp_IAppControlSysEventListener.h
+ * @brief      This is the header file of the _IAppControlSysEventListener class.
+ */
+
+#ifndef _FAPP_INTERNAL_IAPP_CONTROL_RESPONSE_EVENT_LISTENER_H_
+#define _FAPP_INTERNAL_IAPP_CONTROL_RESPONSE_EVENT_LISTENER_H_
+
+#include <FOspConfig.h>
+#include <FAppTypes.h>
+#include <FBaseRtIEventListener.h>
+
+namespace Tizen { namespace Base { namespace Collection { class IMap; } } }
+
+namespace Tizen { namespace App
+{
+
+/**
+ * @class       _IAppControlResponseEventListener
+ * @brief
+ * @since 2.1
+ */
+class _IAppControlResponseEventListener
+       : virtual public Tizen::Base::Runtime::IEventListener
+{
+public:
+       virtual ~_IAppControlResponseEventListener(void) {}
+
+       virtual void OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg) = 0;
+
+}; // _IAppControlResponseEventListener
+
+} } // Tizen::App
+
+#endif //_FAPP_INTERNAL_IAPP_CONTROL_RESPONSE_EVENT_LISTENER_H_
\ No newline at end of file