N_SE-53194 : fix AppControl::Stop() without listener
authorYoung Ik Cho <youngik.cho@samsung.com>
Fri, 27 Sep 2013 07:02:59 +0000 (16:02 +0900)
committerYoung Ik Cho <youngik.cho@samsung.com>
Fri, 27 Sep 2013 07:02:59 +0000 (16:02 +0900)
Change-Id: I5c7b9c237acc29628597ab8df096e26e3588f856
Signed-off-by: Young Ik Cho <youngik.cho@samsung.com>
src/app/FApp_AppControlImpl.cpp
src/app/inc/FApp_AppControlImpl.h

index d3a1953..376b58e 100644 (file)
@@ -33,7 +33,6 @@
 #include <FAppIAppControlEventListener.h>
 #include <FAppIAppControlResponseListener.h>
 
-#include <FBaseRt_LibraryImpl.h>
 #include <FIo_DirectoryImpl.h>
 
 #include "FApp_AppControlImpl.h"
@@ -622,10 +621,7 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p
        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 = pLib->Construct(_path, _LIBRARY_OPTION);
        SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating.", GetErrorMessage(r));
 
        if (pListener)
@@ -654,7 +650,7 @@ _AppControlImpl::StartNative(const IList* pDataList, IAppControlEventListener* p
 
        _reqId = req;
 
-       SysLog(NID_APP, "Exit");
+       SysLog(NID_APP, "Exit %d", req);
        return E_SUCCESS;
 
 CATCH:
@@ -686,10 +682,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
        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 = pLib->Construct(_path, _LIBRARY_OPTION);
 
        SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating.", GetErrorMessage(r));
 
@@ -741,7 +734,7 @@ _AppControlImpl::StartNative(const String* pUriData, const String* pMimeType, co
        }
 
        _reqId = req;
-       SysLog(NID_APP, "Exit");
+       SysLog(NID_APP, "Exit %d", req);
 
        return E_SUCCESS;
 
@@ -848,21 +841,35 @@ _AppControlImpl::Stop(void)
        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 .");
-
-               _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);
-               
-               _AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId);
-               
-               _reqId = _REQ_ID_INVALID;
+
+               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);
+
+                       pStop = reinterpret_cast<result (*)(int)>(pInfo->pLib->GetProcAddress(L"TerminateAppControl"));
+                       SysTryReturnResult(NID_APP, pStop != null, E_SYSTEM, "No TerminateAppControl() function.");
+
+                       (*pStop)(_reqId);
+
+                       _AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId);
+
+                       _reqId = _REQ_ID_INVALID;
+               }
+               else
+               {
+                       _LibraryImpl lib;
+                       result r = lib.Construct(_path, _LIBRARY_OPTION);
+                       if (r == E_SUCCESS)
+                       {
+                               pStop = reinterpret_cast<result (*)(int)>(lib.GetProcAddress(L"TerminateAppControl"));
+                               SysTryReturnResult(NID_APP, pStop != null, E_SYSTEM, "No TerminateAppControl() function.");
+
+                               (*pStop)(_reqId);
+                       }
+               }
        }
        else if (_property & _APPCONTROL_PROPERTY_OSP)
        {
index 2094d8b..abee74d 100644 (file)
@@ -30,6 +30,8 @@
 #include <FAppAppControl.h>
 #include <FBaseColArrayListT.h>
 
+#include <FBaseRt_LibraryImpl.h>
+
 #include "FApp_AppManagerImpl.h"
 #include "FApp_IAppControlResponseEventListener.h"
 
@@ -274,6 +276,8 @@ private:
        static result AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, service_result_e res, int prop, int reqId);
 
 protected:
+       static const unsigned long _LIBRARY_OPTION = Tizen::Base::Runtime::_LIBRARY_LOAD_OPTION_LAZY | Tizen::Base::Runtime::_LIBRARY_LOAD_OPTION_NODELETE;
+
        const AppControl& _appControl;
 
        Tizen::Base::String _path;