fix appcontrol result behavior from service callee
[platform/framework/native/appfw.git] / src / app / inc / FApp_AppControlManager.h
old mode 100755 (executable)
new mode 100644 (file)
index adce2a7..bc151ea
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
 #include <app_service.h>
 
 #include <FOspConfig.h>
-#include <FBaseColIListT.h>
-#include <FBaseColIList.h>
+#include <FBaseColArrayListT.h>
 #include <FBaseObject.h>
-#include <FBaseString.h>
 #include <FBaseRtIEventListener.h>
-#include <FAppAppManager.h>
-#include <FAppIAppControlEventListener.h>
+#include <FAppTypes.h>
 #include <FBaseSysLog.h>
 
 #include "FApp_Types.h"
 #include "FApp_AppManagerEvent.h"
 #include "FApp_IAppManagerServiceEventListener.h"
 #include "FApp_RequestManagerT.h"
+#include "FApp_IAppControlResponseEventListener.h"
+#include "FApp_LaunchInfo.h"
 
 namespace Tizen { namespace Base
 {
 class String;
-namespace Runtime
-{
-class _LibraryImpl;
-}
 namespace Collection
 {
 class IMap;
+class IList;
 }
 }}
 namespace Tizen { namespace Io
@@ -70,126 +65,20 @@ class _AppControlEventArg;
 class _IAppManagerEventListener;
 class _AppManagerEventArg;
 class _AppMessageImpl;
-
-typedef result (*LaunchCbType)(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop);
+class _AppControlResponseEvent;
+class IAppControlEventListener;
+class IAppControlResponseListener;
 
 typedef void (*AppSvcResFn)(void* b, int requestCode, service_result_e res, void* data);
 
 
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// _LaunchInfo handles the launch request from this process
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-const long LAUNCH_INFO_MAGIC = 0x494C;
-
-class _LaunchInfo
-{
-public:
-       _LaunchInfo(_AppArg* pArg, LaunchCbType pCb, void* pData, int prop)
-               : magic(LAUNCH_INFO_MAGIC)
-               , reqId(-1)
-               , pArg(pArg)
-               , launchCb(pCb)
-               , pUserData(pData)
-               , property(prop)
-       {
-       }
-
-       ~_LaunchInfo(void);
-
-private:
-       _LaunchInfo(const _LaunchInfo& rhs);
-       _LaunchInfo& operator =(const _LaunchInfo& rhs);
-
-public:
-       const long      magic;
-       int reqId;
-       _AppArg* pArg;
-       const LaunchCbType launchCb;
-       void* pUserData;
-       const int property;
-}; // _LaunchInfo
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// _InAppRequestManager manges In-process AppControl request
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-struct _InProcessInfo
-{
-public:
-       _InProcessInfo(const Tizen::Base::String& aId, const Tizen::Base::String& oId, int prop, bool legacy, Tizen::Base::Runtime::_LibraryImpl& lib, Tizen::Base::Runtime::IEventListener* pListener)
-               : reqId(-1)
-               , providerId(aId)
-               , operationId(oId)
-               , property(prop)
-               , pLib(&lib)
-               , pListener(pListener)
-               , isLegacy(legacy)
-       {
-       }
-
-       ~_InProcessInfo(void);
-
-private:
-       _InProcessInfo(const _InProcessInfo& rhs);
-       _InProcessInfo& operator =(const _InProcessInfo& rhs);
-
-public:
-       int reqId;
-       const Tizen::Base::String providerId;
-       const Tizen::Base::String operationId;
-       const int property;
-       Tizen::Base::Runtime::_LibraryImpl* pLib;       // non-empty
-       Tizen::Base::Runtime::IEventListener* pListener;
-       bool isLegacy;
-}; // _InProcessInfo
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// _RequestManager manges out-of-process launch request and handles the return arguments
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-class _ResultInfo
-{
-public:
-       _ResultInfo(_AppArg& arg)
-               : reqId(-1)
-               , arg(arg)
-       {
-       }
-
-       ~_ResultInfo(void)
-       {
-       }
-
-private:
-       _ResultInfo(const _ResultInfo& rhs);
-       _ResultInfo& operator =(const _ResultInfo& rhs);
-
-public:
-       int reqId;
-       _AppArg& arg;
-}; // _ResultInfo
-
-// partial specialization
-template<> inline void _RequestManagerT<_ResultInfo>::RemoveItem(int reqId)
-{
-       // 1st request is launch request itself and do not remove it ever.
-       if (reqId == 0)
-       {
-               return;
-       }
-
-       _ResultInfo* pItem = FindItem(reqId);
-       if (pItem)
-       {
-               __requestList.Remove(reqId);
-               delete pItem;
-       }
-}
+const int RESPONSE_EVENT_REQID_MAGIC = 65536;
 
 
 class _OSP_EXPORT_ _AppControlManager
        : public Tizen::Base::Object
        , public _IAppControlSysEventListener
+       , public _IAppControlResponseEventListener
        , virtual public Tizen::Base::Runtime::IEventListener
 {
 public:
@@ -227,41 +116,60 @@ public:
 
        virtual void OnAppControlEventReceivedN(int reqId, _AppArg* pAppArg, int res);
 
-       virtual void OnAppControlEventReceivedN(int reqId, int res, const Tizen::Base::Collection::IMap* pArgs);
+       virtual void OnAppControlEventReceivedN(int reqId, int res, const Tizen::Base::Collection::IMap* pArgs, int prop);
 
        virtual void OnAppControlEventReceivedN(int reqId, const AppId& appId, const Tizen::Base::String& operationId);
 
        _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)
-       {
-               __resultManager.RemoveItem(reqId);
-       }
+       _OSP_LOCAL_ void RemoveResultRequest(int reqId);
 
        const _AppArg* FindResultRequest(int reqId) const;
 
-       void FinishAppControl(int reqId, int res, const Tizen::Base::Collection::IMap* pArg);
+       void FinishAppControl(int reqId, int res, Tizen::Base::Collection::IMap* pArg);
 
        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, const AppId& aId, const Tizen::Base::String& oId, const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, AppSvcResFn pCb, void* pData);
+
        result LaunchAppImplicit(_AppArg* pArg, int req);
 
        result LaunchPkg(const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data);
 
        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);
+
        int Launch(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data);
-       result LaunchAppWithCondition(const AppId& appId, const Tizen::Base::String& executableName, const Tizen::Base::String& condition, Tizen::Base::Collection::IList* pArgs);
+       
+       result LaunchAppWithCondition(const AppId& appId, const Tizen::Base::String& condition, Tizen::Base::Collection::IList* pArgs);
 
        result SendAppControlStartResponse(int req, const char* pValue, const char* pOp);
 
-       static bool IsAllowedAppControl(const wchar_t aTable[][2][64], int count, const Tizen::Base::String& aId, const Tizen::Base::String& oId);
+       static bool IsAllowedAppControl(const char aTable[][2][96], int count, const Tizen::Base::String& aId, const Tizen::Base::String& oId);
+
+       static AppId GetAliasAppId(const AppId& appId);
 
        static result GetMimeFromExt(const Tizen::Base::String& ext, Tizen::Base::String& out);
 
+       void RemoveLaunchRequest(int req);
+
+       virtual void OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg);
+
+       static AppCtrlResult ConvertAppControlResultCode(int res);
+
+       static void InvokeAppControlCompleteListener(IAppControlResponseListener& listener, const AppId& appId, const Tizen::Base::String& op, AppCtrlResult res, const Tizen::Base::Collection::IMap* pExtraData, bool noRaise);
+
+       static void InvokeLegacyAppControlCompleteListener(IAppControlEventListener& listener, const AppId& appId, const Tizen::Base::String& op, const Tizen::Base::Collection::IList* pList, bool noRaise);
+
 private:
        _OSP_LOCAL_ _AppControlManager(void);
 
@@ -273,18 +181,16 @@ private:
 
        _OSP_LOCAL_ int AddLaunchRequest(_AppArg* pArg, LaunchCbType pCb, void* data, int prop = -1);
 
-       _OSP_LOCAL_ void RemoveLaunchRequest(int req);
-
 private:
        _AppControlEvent __appControlEvent;
        _RequestManagerT<_LaunchInfo> __launchManager;
        _RequestManagerT<_InProcessInfo> __inAppManager;
        _RequestManagerT<_ResultInfo> __resultManager;
+       Tizen::Base::Collection::ArrayListT<void*> __listenerList;
 
-       //friend class AppManager;
+       Tizen::Base::Collection::HashMapT<int, _AppControlResponseEvent*> __appControlResponseEventContainer;
+       Tizen::Base::Collection::ArrayListT<int> __appControlResponseEventList;
        friend class _AppControlImpl;
-       //friend class _SqlDataControlImpl;
-       //friend class _MapDataControlImpl;
        friend class _DataControlProviderManagerImpl;
        friend class _AppControlProviderManagerImpl;
        friend class Tizen::Io::_DataControlResultSetImpl;