2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FApp_ServiceAppImpl.cpp
20 * @brief This is the implementation for the _ServiceAppImpl class.
24 #include <linux/limits.h>
26 #include <FAppAppRegistry.h>
27 #include <FBaseErrors.h>
28 #include <FBaseSysLog.h>
30 #include <FBaseRt_LibraryImpl.h>
32 #include "FApp_AppInfo.h"
33 #include "FApp_AppImpl.h"
34 #include "FApp_ServiceAppImpl.h"
35 #include "FAppPkg_PackageManagerImpl.h"
36 #include "FApp_AppManagerImpl.h"
37 #include "FApp_TemplateUtil.h"
38 #include "FApp_IAppEventListener.h"
40 using namespace Tizen::App::Package;
41 using namespace Tizen::Base;
42 using namespace Tizen::Base::Collection;
43 using namespace Tizen::Base::Runtime;
44 using namespace Tizen::System;
46 const wchar_t USE_UI_KEY[] = L"UseUi";
47 const wchar_t USE_UI_VAL_TRUE[] = L"True";
48 const wchar_t LIFE_DURATION_KEY[] = L"LifeDuration";
49 const int LIFE_DURATION_MSEC_MAX = 30000;
51 static const RequestId HANDLER_REQUEST_ALARMID = 2;
53 namespace Tizen { namespace App
56 static const wchar_t* ALARM_PLUGIN_LIBRARY_PATH = L"/opt/apps/aospd00043/lib/libosp-cond-alarm.so";
57 typedef void (*OnAlarmForLaunch)(int alarmId);
59 _ServiceAppImpl* _ServiceAppImpl::__pServiceAppImpl = null;
62 _ServiceAppImpl::_ServiceAppImpl(ServiceApp* pServiceApp)
63 : __pAppImpl(_AppImpl::GetInstance())
64 , __pServiceApp(pServiceApp)
65 , __pAppTerminatingInternalEventListener(null)
66 , __pLifeDurationTimer(null)
68 , __pauseLifeDurationTimer(false)
70 __pServiceAppImpl = this;
71 SysTryReturnVoidResult(NID_APP, __pAppImpl, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
75 _ServiceAppImpl::~_ServiceAppImpl(void)
77 __pServiceAppImpl = null;
78 if( __pLifeDurationTimer )
80 __pLifeDurationTimer->Cancel();
81 delete __pLifeDurationTimer;
87 _ServiceAppImpl::OnCreate(void)
89 SysLog(NID_APP, "Platform creation event.");
91 _AppInfo::SetAppState(INITIALIZING);
98 _ServiceAppImpl::OnService(service_s* service, bool initial)
100 SysLog(NID_APP, "Service requested.");
101 char* pOperation = NULL;
102 int errVal = service_get_operation(service, &pOperation);
103 result r = E_SUCCESS;
105 if ( (errVal == SERVICE_ERROR_NONE) && (!strcmp(pOperation, "osp.appsvc.operation.ALARM")) )
107 char* pAlarmId = NULL;
109 errVal = service_get_extra_data(service, SERVICE_DATA_ALARM_ID, &pAlarmId);
110 if (errVal == SERVICE_ERROR_NONE)
112 int alarmId = atoi(pAlarmId);
114 SysLog(NID_SYS, "Start to load external lib");
116 OnAlarmForLaunch pOnAlarmForLaunch = null;
117 r = lib.Construct(ALARM_PLUGIN_LIBRARY_PATH);
121 SysLog(NID_SYS, "Open alarm condition library");
122 pOnAlarmForLaunch = (OnAlarmForLaunch)lib.GetProcAddress(L"OnAlarmForLaunch");
123 if(pOnAlarmForLaunch != null)
125 SysLog(NID_SYS, "Function is found");
126 pOnAlarmForLaunch(alarmId);
127 SysLog(NID_SYS, "Requested to check current alarm id to AlarmConditionHandler %d", alarmId);
131 SysLog(NID_SYS, "Fail to find alarm function");
136 SysLog(NID_SYS, "Fail to open alarm condition library");
151 if( __lifeDuration > 0 && __pauseLifeDurationTimer == false)
153 SetLifeDurationTimer(__lifeDuration);
158 _ServiceAppImpl::OnTerminate(void)
160 SysLog(NID_APP, "Termination event 0x%x state", _AppInfo::GetAppState());
162 if (_AppInfo::GetAppState() == TERMINATED)
167 _AppInfo::SetAppState(TERMINATING);
169 if (OnServiceAppImplTerminating(__pAppImpl->IsForcedTermination()) != true)
171 SysLog(NID_APP, "[E_SYSTEM] The Termination of application failed.");
174 _AppInfo::SetAppState(TERMINATED);
179 _ServiceAppImpl::OnResume(void)
181 SysLog(NID_APP, "System resume event on 0x%x state", _AppInfo::GetAppState());
186 _ServiceAppImpl::OnPause(void)
188 SysLog(NID_APP, "System pause event on 0x%x state", _AppInfo::GetAppState());
193 _ServiceAppImpl::OnDeviceOrientationChanged(app_device_orientation_e orientation)
195 SysLog(NID_APP, "System device orientation changed event on 0x%x state", _AppInfo::GetAppState());
200 _ServiceAppImpl::OnWindowHandleRequest(void)
206 _ServiceAppImpl::GetInstance(void)
208 return __pServiceAppImpl;
213 _ServiceAppImpl::GetServiceAppInstance(void)
215 return __pServiceApp;
219 _ServiceAppImpl::OnAppInitializing(void)
221 const String& packageId = _AppInfo::GetPackageId();
222 const String& exeName = _AppInfo::GetAppExecutableName();
224 HashMapT<String, _AppFeatureInfoImpl*>* pInfo = _PackageManagerImpl::GetInstance()->GetPackageAppFeatureMapN(packageId, exeName);
228 _AppFeatureInfoImpl* pFeature = null;
230 result r = pInfo->GetValue(USE_UI_KEY, pFeature);
234 const String& val = pFeature->GetValue();
235 if (val == USE_UI_VAL_TRUE)
237 SysLog(NID_APP, "Using remote ui on service application.");
239 _LibraryImpl& lib = _AppManagerImpl::GetInstance()->GetUiLibraryImpl();
240 result (*pInit)(void) = null;
242 pInit = reinterpret_cast<result (*)()>(lib.GetProcAddress(L"InitializeUiFramework"));
246 SysLog(NID_APP, "[%s] UI initialized.", GetErrorMessage(r));
251 r = pInfo->GetValue(LIFE_DURATION_KEY, pFeature);
254 const String& val = pFeature->GetValue();
255 r = Integer::Parse(val, __lifeDuration);
258 __lifeDuration = ( __lifeDuration > LIFE_DURATION_MSEC_MAX ) ? LIFE_DURATION_MSEC_MAX : __lifeDuration;
259 SysLog(NID_APP, "LifeDuration is (%d)", __lifeDuration);
263 _DeleteCollectionMapValue<String, _AppFeatureInfoImpl>(*pInfo);
267 SysTryReturn(NID_APP, __pServiceApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting ServiceApp instance failed.");
268 return __pServiceApp->OnAppInitializing(*(AppRegistry::GetInstance()));
272 _ServiceAppImpl::OnAppInitialized(void)
274 SysTryReturn(NID_APP, __pServiceApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting ServiceApp instance failed.");
275 return __pServiceApp->OnAppInitialized();
279 _ServiceAppImpl::OnServiceAppImplTerminating(bool forcedTermination)
281 SysTryReturn(NID_APP, __pServiceApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting ServiceApp instance failed.");
283 if( __pAppTerminatingInternalEventListener)
285 __pAppTerminatingInternalEventListener->OnApplicationTerminated(L"", 0);
287 return __pServiceApp->OnAppTerminating(*(AppRegistry::GetInstance()), forcedTermination);
291 _ServiceAppImpl::SetLifeDurationTimer(int lifeDuration)
293 if( lifeDuration <= 0)
298 if( __pLifeDurationTimer == null)
300 __pLifeDurationTimer = new Timer;
301 __pLifeDurationTimer->Construct(*this);
302 SysLog(NID_APP, "Life duration timer is constructed.");
306 __pLifeDurationTimer->Cancel();
307 SysLog(NID_APP, "Life duration timer is cancelled.", lifeDuration );
310 if( __pauseLifeDurationTimer == false)
312 __pLifeDurationTimer->Start(lifeDuration);
313 SysLog(NID_APP, "Life duration timer is started with timeout.(%d)", lifeDuration );
318 _ServiceAppImpl::OnTimerExpired(Timer& timer)
320 SysLog(NID_APP, "Life duration timer is expired, so terminating the application.");
322 App::GetInstance()->Terminate();
326 _ServiceAppImpl::SetAppTerminatingInternalEventListener(_IAppEventListener* pListener)
328 __pAppTerminatingInternalEventListener = pListener;
332 _ServiceAppImpl::PauseLifeDurationTimer(void)
334 __pauseLifeDurationTimer = true;
335 if( __pLifeDurationTimer)
337 __pLifeDurationTimer->Cancel();
338 SysLog(NID_APP, "Life duration timer is paused." );
343 _ServiceAppImpl::ResumeLifeDurationTimer(void)
345 __pauseLifeDurationTimer = false;
346 // SetLifeDurationTimer(__lifeDuration);
347 SysLog(NID_APP, "Life duration timer will be resumed." );