//
-// Open Service Platform
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the License);
#include <FAppAppRegistry.h>
#include <FBaseErrors.h>
#include <FBaseSysLog.h>
+#include <FAppPkgPackageInfo.h>
#include <FBaseRt_LibraryImpl.h>
#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"
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;
_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.");
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);
}
}
}
-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)
{
return __pServiceApp;
}
+
bool
_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);
}
}
_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);
}
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