use explicit template initialization
[platform/framework/native/appfw.git] / src / app / FApp_ServiceAppImpl.cpp
index 48f19bf..dd80c88 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -26,6 +25,7 @@
 #include <FAppAppRegistry.h>
 #include <FBaseErrors.h>
 #include <FBaseSysLog.h>
+#include <FAppPkgPackageInfo.h>
 
 #include <FBaseRt_LibraryImpl.h>
 
@@ -33,6 +33,7 @@
 #include "FApp_AppImpl.h"
 #include "FApp_ServiceAppImpl.h"
 #include "FAppPkg_PackageManagerImpl.h"
+#include "FAppPkg_PackageInfoImpl.h"
 #include "FApp_AppManagerImpl.h"
 #include "FApp_TemplateUtil.h"
 #include "FApp_IAppEventListener.h"
@@ -47,13 +48,14 @@ const wchar_t USE_UI_KEY[] = L"UseUi";
 const wchar_t USE_UI_VAL_TRUE[] = L"True";
 const wchar_t LIFE_DURATION_KEY[] = L"LifeDuration";
 const int LIFE_DURATION_MSEC_MAX = 30000;
+const int LIFE_DURATION_MSEC_MAX_PLATFORM = 60000*3;
 
 static const RequestId  HANDLER_REQUEST_ALARMID = 2;
 
 namespace Tizen { namespace App
 {
 
-static const wchar_t* ALARM_PLUGIN_LIBRARY_PATH = L"/opt/apps/aospd00043/lib/libosp-cond-alarm.so";
+static const wchar_t* ALARM_PLUGIN_LIBRARY_PATH = L"/opt/usr/apps/aospd00043/lib/libosp-cond-alarm.so";
 typedef void (*OnAlarmForLaunch)(int alarmId);
 
 _ServiceAppImpl* _ServiceAppImpl::__pServiceAppImpl = null;
@@ -62,9 +64,10 @@ _ServiceAppImpl* _ServiceAppImpl::__pServiceAppImpl = null;
 _ServiceAppImpl::_ServiceAppImpl(ServiceApp* pServiceApp)
        : __pAppImpl(_AppImpl::GetInstance())
        , __pServiceApp(pServiceApp)
-       , __pLifeDurationEventListener(null)
+       , __pAppTerminatingInternalEventListener(null)
        , __pLifeDurationTimer(null)
        , __lifeDuration(0)
+       , __pauseLifeDurationTimer(false)
 {
        __pServiceAppImpl = this;
        SysTryReturnVoidResult(NID_APP, __pAppImpl, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
@@ -99,57 +102,62 @@ _ServiceAppImpl::OnService(service_s* service, bool initial)
        SysLog(NID_APP, "Service requested.");
        char* pOperation = NULL;
        int errVal = service_get_operation(service, &pOperation);
-       result r = E_SUCCESS;
 
        if ( (errVal == SERVICE_ERROR_NONE) && (!strcmp(pOperation, "osp.appsvc.operation.ALARM")) )
        {
-               char* pAlarmId = NULL;
+               OnAlarmOperation(service);
+       }
 
-               errVal = service_get_extra_data(service, SERVICE_DATA_ALARM_ID, &pAlarmId);
-               if (errVal == SERVICE_ERROR_NONE)
-               {
-                       int alarmId = atoi(pAlarmId);
+       if (pOperation)
+       {
+               free(pOperation);
+       }
+
+       if( __lifeDuration > 0 && __pauseLifeDurationTimer == false)
+       {
+               SetLifeDurationTimer(__lifeDuration);
+       }
+}
 
-                       SysLog(NID_SYS, "Start to load external lib");
-                       Library lib;
-                       OnAlarmForLaunch pOnAlarmForLaunch = null;
-                       r = lib.Construct(ALARM_PLUGIN_LIBRARY_PATH);
+void
+_ServiceAppImpl::OnAlarmOperation(service_s* service)
+{
+       char* pAlarmId = NULL;
 
-                       if(r == E_SUCCESS)
+       int errVal = service_get_extra_data(service, SERVICE_DATA_ALARM_ID, &pAlarmId);
+       if (errVal == SERVICE_ERROR_NONE)
+       {
+               int alarmId = atoi(pAlarmId);
+
+               SysLog(NID_SYS, "Start to load external lib");
+               Library lib;
+               OnAlarmForLaunch pOnAlarmForLaunch = null;
+               result r = lib.Construct(ALARM_PLUGIN_LIBRARY_PATH);
+
+               if(r == E_SUCCESS)
+               {
+                       SysLog(NID_SYS, "Open alarm condition library");
+                       pOnAlarmForLaunch = (OnAlarmForLaunch)lib.GetProcAddress(L"OnAlarmForLaunch");
+                       if(pOnAlarmForLaunch != null)
                        {
-                               SysLog(NID_SYS, "Open alarm condition library");
-                               pOnAlarmForLaunch = (OnAlarmForLaunch)lib.GetProcAddress(L"OnAlarmForLaunch");
-                               if(pOnAlarmForLaunch != null)
-                               {
-                                       SysLog(NID_SYS, "Function is found");
-                                       pOnAlarmForLaunch(alarmId);
-                                       SysLog(NID_SYS, "Requested to check current alarm id to AlarmConditionHandler %d", alarmId);
-                               }
-                               else
-                               {
-                                       SysLog(NID_SYS, "Fail to find alarm function");
-                               }
+                               SysLog(NID_SYS, "Function is found");
+                               pOnAlarmForLaunch(alarmId);
+                               SysLog(NID_SYS, "Requested to check current alarm id to AlarmConditionHandler %d", alarmId);
                        }
                        else
                        {
-                               SysLog(NID_SYS, "Fail to open alarm condition library");
+                               SysLog(NID_SYS, "Fail to find alarm function");
                        }
                }
-
-               if (pAlarmId)
+               else
                {
-                       free(pAlarmId);
+                       SysLog(NID_SYS, "Fail to open alarm condition library");
                }
        }
 
-       if (pOperation)
-       {
-               free(pOperation);
-       }
-
-       if( __lifeDuration > 0)
+       if (pAlarmId)
        {
-               SetLifeDurationTimer(__lifeDuration);
+               free(pAlarmId);
        }
 }
 
@@ -188,19 +196,20 @@ _ServiceAppImpl::OnPause(void)
 }
 
 
-void
-_ServiceAppImpl::OnDeviceOrientationChanged(app_device_orientation_e orientation)
+long
+_ServiceAppImpl::OnWindowHandleRequest(void)
 {
-       SysLog(NID_APP, "System device orientation changed event on 0x%x state", _AppInfo::GetAppState());
+       return -1;
 }
 
 
-long
-_ServiceAppImpl::OnWindowHandleRequest(void)
+result
+_ServiceAppImpl::OnFrameRaiseRequested(void)
 {
-       return -1;
+       return E_SUCCESS;
 }
 
+
 _ServiceAppImpl*
 _ServiceAppImpl::GetInstance(void)
 {
@@ -214,6 +223,7 @@ _ServiceAppImpl::GetServiceAppInstance(void)
        return __pServiceApp;
 }
 
+
 bool
 _ServiceAppImpl::OnAppInitializing(void)
 {
@@ -254,8 +264,7 @@ _ServiceAppImpl::OnAppInitializing(void)
                        r = Integer::Parse(val, __lifeDuration);
                        if( r == E_SUCCESS )
                        {
-                               __lifeDuration = ( __lifeDuration > LIFE_DURATION_MSEC_MAX ) ? LIFE_DURATION_MSEC_MAX : __lifeDuration;
-                               SysLog(NID_APP, "LifeDuration is (%d)", __lifeDuration);
+                               SysLog(NID_APP, "LifeDuration is (%d) millis.", __lifeDuration);
                        }
                }
 
@@ -278,6 +287,11 @@ bool
 _ServiceAppImpl::OnServiceAppImplTerminating(bool forcedTermination)
 {
        SysTryReturn(NID_APP, __pServiceApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting ServiceApp instance failed.");
+
+       if( __pAppTerminatingInternalEventListener)
+       {
+               __pAppTerminatingInternalEventListener->OnApplicationTerminated(L"", 0);
+       }
        return __pServiceApp->OnAppTerminating(*(AppRegistry::GetInstance()), forcedTermination);
 }
 
@@ -298,28 +312,87 @@ _ServiceAppImpl::SetLifeDurationTimer(int lifeDuration)
        else
        {
                __pLifeDurationTimer->Cancel();
-               SysLog(NID_APP, "Life duration timer is cancelled.", lifeDuration );
        }
-       __pLifeDurationTimer->Start(__lifeDuration);
-       SysLog(NID_APP, "Life duration timer is started with timeout.(%d)", lifeDuration );
+
+       if( __pauseLifeDurationTimer == false)
+       {
+               bool isPlatformPrivilege = (GetPrivilegeLevel() == _API_VISIBILITY_PARTNER_MANUFACTURER)? true : false;
+               const int maxTimeOut = (isPlatformPrivilege == true)? LIFE_DURATION_MSEC_MAX_PLATFORM : LIFE_DURATION_MSEC_MAX;
+
+               const int timeout = (__lifeDuration > maxTimeOut) ? maxTimeOut : __lifeDuration;
+               __pLifeDurationTimer->Start(timeout);
+               SysLog(NID_APP, "Life duration timer is started (%d millis)", timeout );
+       }
 }
 
 void
 _ServiceAppImpl::OnTimerExpired(Timer& timer)
 {
-       SysLog(NID_APP, "Life duration timer is expired, so terminating the application.");
        timer.Cancel();
-       if( __pLifeDurationEventListener)
+       if( __pAppTerminatingInternalEventListener || __lifeDuration != 1800000 ) //Fixme: Remove this workaround code after all LifeDuration value of pre-loaded apps are fixed.
+       {
+               SysLog(NID_APP, "Life duration timer is expired, so terminating the application.");
+               App::GetInstance()->Terminate();
+       }
+       else
+       {
+               SysLog(NID_APP, "Life duration timer is ignored.");
+       }
+}
+
+void
+_ServiceAppImpl::SetAppTerminatingInternalEventListener(_IAppEventListener* pListener)
+{
+       __pAppTerminatingInternalEventListener = pListener;
+}
+
+void
+_ServiceAppImpl::PauseLifeDurationTimer(void)
+{
+       __pauseLifeDurationTimer = true;
+       if( __pLifeDurationTimer)
        {
-               __pLifeDurationEventListener->OnApplicationTerminated(L"", 0);
+               __pLifeDurationTimer->Cancel();
+               SysLog(NID_APP, "Life duration timer is paused." );
        }
-       App::GetInstance()->Terminate();
 }
 
 void
-_ServiceAppImpl::SetLifeDurationEventListener(_IAppEventListener* pListener)
+_ServiceAppImpl::ResumeLifeDurationTimer(void)
+{
+       __pauseLifeDurationTimer = false;
+       SysLog(NID_APP, "Life duration timer will be resumed." );
+}
+
+void
+_ServiceAppImpl::ResetLifeDurationTimer(void)
+{
+       SetLifeDurationTimer(__lifeDuration);
+}
+
+int
+_ServiceAppImpl::GetPrivilegeLevel(void)
 {
-       __pLifeDurationEventListener = pListener;
+       static int visibility = _API_VISIBILITY_NONE;
+       if( visibility == _API_VISIBILITY_NONE)
+       {
+               const AppId appId = _AppInfo::GetApplicationId();
+
+               _PackageManagerImpl* pPkg = _PackageManagerImpl::GetInstance();
+               SysTryReturn(NID_APP, pPkg != null, _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid PackageManager instance.");
+
+               String pkgId = _PackageManagerImpl::GetPackageIdByAppId(appId);
+               SysTryReturn(NID_APP, !pkgId.IsEmpty(), _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid appId(%ls).", appId.GetPointer() );
+
+               std::unique_ptr<PackageInfo> pPkgInfo (pPkg->GetPackageInfoN(pkgId) );
+               SysTryReturn(NID_APP, pPkgInfo != null, _API_VISIBILITY_PUBLIC, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+               const _PackageInfoImpl* pPkgInfoImpl = _PackageInfoImpl::GetInstance(pPkgInfo.get());
+               SysTryReturn(NID_APP, pPkgInfoImpl != null, _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid PackageInfo instance.");
+
+               visibility = pPkgInfoImpl->GetApiVisibility();
+       }
+       return visibility;
 }
 
 } } //Tizen::App