Add to check the invalid provider
authorSunwook Bae <sunwook45.bae@samsung.com>
Tue, 30 Apr 2013 10:56:55 +0000 (19:56 +0900)
committerSunwook Bae <sunwook45.bae@samsung.com>
Thu, 2 May 2013 01:17:04 +0000 (10:17 +0900)
Change-Id: I03faac77fbda4462880272dd2868c2779561eb24
Signed-off-by: Sunwook Bae <sunwook45.bae@samsung.com>
src/app/FApp_AppControlManager.cpp
src/app/FApp_DataControlManager.cpp
src/app/FApp_DataControlManager.h
src/app/FApp_MapDataControlImpl.cpp
src/app/FApp_MapDataControlImpl.h
src/app/FApp_SqlDataControlImpl.cpp
src/app/inc/FApp_AppControlManager.h
src/app/inc/FApp_RequestManagerT.h

index 35fc45b..e9a3837 100755 (executable)
@@ -872,11 +872,6 @@ _AppControlManager::RemoveLaunchRequest(int req)
 {
        __launchManager.RemoveItem(req);
 }
-int
-_AppControlManager::GetLaunchRequestCount(void)
-{
-       return __launchManager.GetCount();
-}
 
 result
 _AppControlManager::RegisterRequest(service_s* service, int& req, _AppHandler& handler)
index 41d4450..efb211c 100644 (file)
@@ -91,6 +91,12 @@ _DataControlManager::GetInstance(void)
        return __pDataControlManagerInstance;
 }
 
+int
+_DataControlManager::GetRequestCount(void) const
+{
+       return __pDataControlRequestList->GetCount();
+}
+
 result
 _DataControlManager::AddRequestInfo(Integer* pReqId, _DataControlRequestInfo* pReqInfo)
 {
@@ -118,6 +124,12 @@ _DataControlManager::RemoveRequestInfo(Integer& reqId)
        __pDataControlRequestList->Remove(reqId);
 }
 
+void
+_DataControlManager::RemoveAllRequests(void)
+{
+       __pDataControlRequestList->RemoveAll();
+}
+
 int
 _DataControlManager::GetUniqueId(void)
 {
index 9b81811..7928c63 100644 (file)
@@ -65,8 +65,12 @@ public:
 
        _DataControlRequestInfo* GetRequestInfo(Tizen::Base::Integer& reqId);
 
+       int GetRequestCount(void) const;
+
        void RemoveRequestInfo(Tizen::Base::Integer& reqId);
 
+       void RemoveAllRequests(void);
+
        int GetUniqueId(void);
 
 private:
index 32c589b..27df400 100755 (executable)
@@ -20,7 +20,6 @@
  */
 
 #include <typeinfo>
-#include <new>
 #include <unique_ptr.h>
 
 #include <appsvc/appsvc.h>
@@ -51,6 +50,7 @@ namespace Tizen { namespace App
 {
 
 static const int MAX_REQUEST_COUNT = 128;
+static const int REQUEST_THRESHOLD = 100;
 static const int _MAX_ARGUMENT_SIZE = 16384; // 16KB
 
 class _MapDataControlEventArg
@@ -130,9 +130,7 @@ _MapDataControlEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
 
 // private
 _MapDataControlImpl::_MapDataControlImpl(void)
-       : __appId(L"")
-       , __providerId(L"")
-       , __access(_DATACONTROL_ACCESS_UNDEFINED)
+       : __access(_DATACONTROL_ACCESS_UNDEFINED)
        , __pPreviousListener(null)
        , __pMapDataControlEvent(null)
 {
@@ -163,12 +161,25 @@ _MapDataControlImpl::StartMapDataControl(int type, const IList* pDataList, int*
        result r = E_SUCCESS;
 
        int req = -1;
-       _AppControlManager* pAppManagerImpl = _AppControlManager::GetInstance();
+       _DataControlManager* pDcMgr = _DataControlManager::GetInstance();
 
        // Check the request count of DataControl operation
-       int count = pAppManagerImpl->GetLaunchRequestCount();
+       int count = pDcMgr->GetRequestCount();
        SysLog(NID_APP, "Current launch request count: %d", count);
 
+       if (count > REQUEST_THRESHOLD)
+       {
+               _AppManagerImpl* pImpl = _AppManagerImpl::GetInstance();
+
+               // Clear the request queue if the provider is terminated
+               if (!pImpl->IsRunning(__appId))
+               {
+                       SysLog(NID_APP, "The request queue is cleared due to the invalid provider.");
+
+                       pDcMgr->RemoveAllRequests();
+               }
+       }
+
        SysTryReturnResult(NID_APP, count < MAX_REQUEST_COUNT, E_MAX_EXCEEDED, "The number of requests has exceeded the maximum limit.");
 
        _AppArg* pArg = new(std::nothrow) _AppArg; // XXX: pArg will be released in _AppManagerImpl::LaunchApp().
@@ -176,6 +187,8 @@ _MapDataControlImpl::StartMapDataControl(int type, const IList* pDataList, int*
 
        pArg->Construct(*this, static_cast <_DataControlRequestType>(type), pDataList);
 
+       _AppControlManager* pAppManagerImpl = _AppControlManager::GetInstance();
+
        if (__pMapDataControlEvent)
        {
                // reqId is system-wide id because the bundle is system-wide.
@@ -314,13 +327,19 @@ _MapDataControlImpl::MapDataControlCallback(void* data, _AppArg* pArg, _AppArg*
 
                _DataControlManager* pDcMgr = static_cast< _DataControlManager* >(data);
                _DataControlRequestInfo* pReqInfo = pDcMgr->GetRequestInfo(key);
-               SysTryCatch(NID_APP, pReqInfo != null, r = E_SYSTEM, E_SYSTEM,
-                               "[E_SYSTEM] Failed to get request info");
+               if (pReqInfo == null)
+               {
+                       SysLog(NID_APP, "No request info of reqId %d", reqId);
+                       return E_SUCCESS;
+               }
 
                _MapDataControlEvent* pMapDataControlEvent = dynamic_cast< _MapDataControlEvent* >(pReqInfo->GetEvent());
                SysTryCatch(NID_APP, pMapDataControlEvent != null, r = E_SYSTEM, E_SYSTEM,
                                "[E_SYSTEM] invalid request info");
 
+               // Remove the request from the queue
+               SysLog(NID_APP, "Remove the request, req: %d", reqId);
+
                pDcMgr->RemoveRequestInfo(key);
 
                if (pMapDataControlEvent != null && typeid(pMapDataControlEvent) == typeid(_MapDataControlEvent*))
@@ -489,10 +508,6 @@ _MapDataControlImpl::MapDataControlCallback(void* data, _AppArg* pArg, _AppArg*
        SysTryCatch(NID_APP, p, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid bundle");
        launchReqId = atoi(p);
 
-       // Remove the request count
-       SysLog(NID_APP, "Remove a launch request: req: %d", launchReqId);
-       _AppControlManager::GetInstance()->RemoveLaunchRequest(launchReqId);
-
        return E_SUCCESS;
 
 CATCH:
index 7bc168d..6b1bf3c 100755 (executable)
@@ -30,7 +30,7 @@
 #include <FBaseString.h>
 #include <FBaseRtEvent.h>
 
-#include "FApp_AppControlManager.h"
+#include "FApp_AppManagerImpl.h"
 
 namespace Tizen { namespace Base
 {
index 1fc35c0..40f2003 100755 (executable)
@@ -20,7 +20,6 @@
  */
 
 #include <typeinfo>
-#include <new>
 #include <unique_ptr.h>
 
 #include <appsvc/appsvc.h>
@@ -60,6 +59,7 @@ namespace Tizen { namespace App
 {
 
 static const int MAX_REQUEST_COUNT = 128;
+static const int REQUEST_THRESHOLD = 100;
 static const int _MAX_ARGUMENT_SIZE = 16384; // 16KB
 static const int _MAX_REQUEST_ARGUMENT_SIZE = 1048576; // 1MB
 static const char* _DATACONTROL_REQUEST_DIR = "/tmp/osp/DataControlRequest/\0";
@@ -139,9 +139,7 @@ _SqlDataControlEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
 
 // private
 _SqlDataControlImpl::_SqlDataControlImpl(void)
-       : __appId(L"")
-       , __providerId(L"")
-       , __access(_DATACONTROL_ACCESS_UNDEFINED)
+       : __access(_DATACONTROL_ACCESS_UNDEFINED)
        , __pPreviousListener(null)
        , __pSqlDataControlEvent(null)
 {
@@ -172,12 +170,25 @@ _SqlDataControlImpl::StartSqlDataControl(int type, const IList* pDataList, int*
        result r = E_SUCCESS;
 
        int req = -1;
-       _AppControlManager* pAppManagerImpl = _AppControlManager::GetInstance();
+       _DataControlManager* pDcMgr = _DataControlManager::GetInstance();
 
        // Check the request count of DataControl operation
-       int count = pAppManagerImpl->GetLaunchRequestCount();
+       int count = pDcMgr->GetRequestCount();
        SysLog(NID_APP, "Current launch request count: %d", count);
 
+       if (count > REQUEST_THRESHOLD)
+       {
+               _AppManagerImpl* pImpl = _AppManagerImpl::GetInstance();
+
+               // Clear the request queue if the provider is terminated
+               if (!pImpl->IsRunning(__appId))
+               {
+                       SysLog(NID_APP, "The request queue is cleared due to the invalid provider.");
+
+                       pDcMgr->RemoveAllRequests();
+               }
+       }
+
        SysTryReturnResult(NID_APP, count < MAX_REQUEST_COUNT, E_MAX_EXCEEDED, "The number of requests has exceeded the maximum limit.");
 
        _AppArg* pArg = new (std::nothrow) _AppArg;  // XXX: pArg will be released in _AppManagerImpl::LaunchApp().
@@ -185,6 +196,8 @@ _SqlDataControlImpl::StartSqlDataControl(int type, const IList* pDataList, int*
 
        pArg->Construct(*this, static_cast <_DataControlRequestType>(type), pDataList);
 
+       _AppControlManager* pAppManagerImpl = _AppControlManager::GetInstance();
+
        if (__pSqlDataControlEvent)
        {
                // reqId is system-wide id because the bundle is system-wide.
@@ -192,7 +205,6 @@ _SqlDataControlImpl::StartSqlDataControl(int type, const IList* pDataList, int*
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pAppManagerImpl, pArg, SqlDataControlCallback, __pSqlDataControlEvent, -1);
                req = reqObj.GetRequestNumber();
 #else
-               _DataControlManager* pDcMgr = _DataControlManager::GetInstance();
                _AppControlManager::_RequestGuard reqObj = _AppControlManager::_RequestGuard(*pAppManagerImpl, pArg, SqlDataControlCallback, pDcMgr, -1);
                req = reqObj.GetRequestNumber();
 #endif
@@ -364,13 +376,19 @@ _SqlDataControlImpl::SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg*
 
                _DataControlManager* pDcMgr = static_cast< _DataControlManager* >(data);
                _DataControlRequestInfo* pReqInfo = pDcMgr->GetRequestInfo(key);
-               SysTryCatch(NID_APP, pReqInfo != null, r = E_SYSTEM, E_SYSTEM,
-                               "[E_SYSTEM] Failed to get request info");
+               if (pReqInfo == null)
+               {
+                       SysLog(NID_APP, "No request info of reqId %d", reqId);
+                       return E_SUCCESS;
+               }
 
                _SqlDataControlEvent* pSqlDataControlEvent = dynamic_cast< _SqlDataControlEvent* >(pReqInfo->GetEvent());
                SysTryCatch(NID_APP, pSqlDataControlEvent != null, r = E_SYSTEM, E_SYSTEM,
                                "[E_SYSTEM] invalid request info");
 
+               // Remove the request from the queue
+               SysLog(NID_APP, "Remove the request, req: %d", reqId);
+
                pDcMgr->RemoveRequestInfo(key);
 
                if (pSqlDataControlEvent != null && typeid(pSqlDataControlEvent) == typeid(_SqlDataControlEvent*))
@@ -497,10 +515,6 @@ _SqlDataControlImpl::SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg*
        SysTryCatch(NID_APP, p, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid bundle");
        launchReqId = atoi(p);
 
-       // Remove the request count
-       SysLog(NID_APP, "Remove a launch request: req: %d", launchReqId);
-       _AppControlManager::GetInstance()->RemoveLaunchRequest(launchReqId);
-
        return E_SUCCESS;
 
 CATCH:
index 1b415e6..8761a35 100755 (executable)
@@ -278,7 +278,6 @@ public:
 
        void RemoveLaunchRequest(int req);
 
-       int GetLaunchRequestCount(void);
        virtual void OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::IEventArg* arg);
 
        static AppCtrlResult ConvertAppControlResultCode(int res);
index 4f92982..7e3edc1 100644 (file)
@@ -150,11 +150,6 @@ public:
                return (r == E_SUCCESS) ? pItem : null;
        }
 
-       int GetCount(void) const
-       {
-               return __requestList.GetCount();
-       }
-
 private:
        _RequestManagerT(const T& rhs);