2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FApp_AppImpl.cpp
19 * @brief This is the implementation for the _AppImpl class.
22 #include <unique_ptr.h>
24 #include <notification/notification.h>
25 #include <appsvc/appsvc.h>
29 #include <FBaseInteger.h>
30 #include <FBaseColArrayList.h>
31 #include <FBaseColHashMap.h>
32 #include <FBaseRtThread.h>
33 #include <FAppAppRegistry.h>
34 #include <FAppAppControl.h>
35 #include <FAppDataControlProviderManager.h>
36 #include <FAppIAppCheckPointEventListener.h>
37 #include <FAppISqlDataControlProviderEventListener.h>
38 #include <FAppIMapDataControlProviderEventListener.h>
39 #include <FAppIAppControlProviderEventListener.h>
40 #include <FAppIAppLaunchConditionEventListener.h>
42 #include <FBaseSysLog.h>
44 #include <FBase_StringConverter.h>
45 #include <FIo_RegistryImpl.h>
46 #include <FSys_EnvironmentImpl.h>
47 #include <FSys_PowerManagerImpl.h>
49 #include <FSys_AlarmManager.h>
51 #include "FApp_IAppManager.h"
52 #include "FApp_AppManagerProxy.h"
53 #include "FApp_AppImpl.h"
54 #include "FApp_AppInfo.h"
55 #include "FApp_AppControlManager.h"
56 #include "FApp_AppArg.h"
57 #include "FApp_IAppImpl.h"
58 #include "FApp_AppResourceImpl.h"
59 #include <FSys_SettingInfoImpl.h>
61 using namespace Tizen::Base;
62 using namespace Tizen::Base::Collection;
63 using namespace Tizen::Base::Runtime;
64 using namespace Tizen::Io;
65 using namespace Tizen::System;
70 const int HEARTBEAT_WAIT_COUNT = 3;
71 const wchar_t SERVICE_APPID[] = L"aospd00043.osp-app-service";
72 const char SELECTOR_RESPONSE_KEY[] = "__APP_SVC_START_INFO__";
73 const wchar_t FILE_SCHEME_WITH_DELIMITER[] = L"file://";
74 #ifndef VCONFKEY_APPSERVICE_STATUS
75 #define VCONFKEY_APPSERVICE_STATUS "memory/appservice/status"
80 namespace Tizen { namespace App
83 _AppImpl* _AppImpl::__pAppImpl = null;
84 bool _AppImpl::__isTerminationRequested = false;
86 static const char TIZEN_APPCONTROL_DATA_MULTI_WINDOW[] = "http://tizen.org/appcontrol/data/multiwindow";
89 static const int _DATACONTROL_PACKET_INDEX_APPID = 0;
90 static const int _DATACONTROL_PACKET_INDEX_REQUESTTYPE = 1;
91 static const int _DATACONTROL_PACKET_INDEX_REQID = 2;
92 static const int _DATACONTROL_PACKET_INDEX_PROVIDERID = 3;
94 static const int _DATACONTROL_PACKET_INDEX_DATAID = 0;
95 static const int _DATACONTROL_PACKET_INDEX_COLUMNCOUNT = 1;
96 static const int _DATACONTROL_PACKET_INDEX_DELETEWHERE = 1;
97 static const int _DATACONTROL_PACKET_INDEX_MAPKEY = 1;
98 static const int _DATACONTROL_PACKET_INDEX_COLUMNLIST = 2;
99 static const int _DATACONTROL_PACKET_INDEX_INSERTMAP = 2;
100 static const int _DATACONTROL_PACKET_INDEX_UPDATEMAP = 2;
104 void operator()(char* pValue)
114 _AppImpl::_AppImpl(App* pApp)
115 : __pCheckpointEventListener(null)
116 , __pSqlDataControlProviderEventListener(null)
117 , __pMapDataControlProviderEventListener(null)
118 , __pAppControlProviderEventListener(null)
119 , __pAppControlProviderInternalEventListener(null)
120 , __pAppLaunchConditionEventListener(null)
123 , __pRequestHandler(&_AppImpl::HandleAppRequest)
124 , __pLegacyRequestHandler(&_AppImpl::HandleDummyAppRequest)
125 , __forcedTermination(false)
132 _AppImpl::Construct(const IList* pArgs)
134 SysTryReturnResult(NID_APP, pArgs != null, E_INVALID_ARG, "pArguments must not be null.");
135 SysAssertf(__pApp != null, "Getting App instance failed.");
137 result r = __appUserEvent.Construct();
138 SysTryLog(NID_APP, !IsFailed(r), "[%s] User event handler failure.", GetErrorMessage(r));
140 __appUserEvent.AddListener(*this);
142 _AppInfo::SetAppState(INITIALIZING);
144 r = _SettingInfoImpl::AddSettingEventListenerForInternal(*this);
145 SysTryLog(NID_APP, !IsFailed(r), "[%s] failed to add setting event listener.", GetErrorMessage(r));
151 _AppImpl::Execute(_IAppImpl* pIAppImpl)
153 SysLogTag(NID_APP, "LAUNCH","[%ls:<Initialize Application>:start]", _AppInfo::GetAppExecutableName().GetPointer());
154 result r = E_SUCCESS;
155 int eflResult = APP_ERROR_NONE;
158 _IAppManager* pAppManager = null;
160 _AppImpl* pAppImpl = _AppImpl::GetInstance();
161 SysTryReturnResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
162 pAppImpl->__pIAppImpl = pIAppImpl;
164 // handle legacy version handling
165 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
167 pAppImpl->SetLegacyRequestHandler();
170 app_event_callback_s state_handler;
171 memset(&state_handler, 0, sizeof(app_event_callback_s));
173 state_handler.create = &OnCreate;
174 state_handler.service = &OnService;
175 state_handler.terminate = &OnTerminate;
176 state_handler.pause = &OnPause;
177 state_handler.resume = &OnResume;
178 state_handler.device_orientation = NULL;
180 state_handler.low_memory = &OnLowMemory;
181 state_handler.low_battery = NULL;
182 state_handler.language_changed = NULL;
183 state_handler.region_format_changed = NULL;
185 _Aul::SetPowerOffNotiListener(OnPowerOffNotiReceived, this);
186 // if (pAppManager != null)
188 // r = pAppManager->RegisterApplication(_AppInfo::GetPackageId(), _AppInfo::GetAppExecutableName(), _AppInfo::GetAppType() , _AppInfo::GetProcessId());
189 // SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Application registration failed.", GetErrorMessage(r));
192 appinfo_get_argv(&argc, &pArgv);
193 eflResult = app_efl_main(&argc, &pArgv, &state_handler, this);
194 SysTryLog(NID_APP, eflResult == APP_ERROR_NONE, "app_efl_main failed with error (%d): Unknown", eflResult);
196 pAppManager = _AppManagerProxy::GetService();
198 if (pAppManager != null)
200 pAppManager->UnregisterApplication(_AppInfo::GetProcessId());
203 // clear outstanding ongoing notification
204 notification_delete_all_by_type(appinfo_get_appid(), NOTIFICATION_TYPE_ONGOING);
211 _AppImpl::OnCreate(void* user_data)
213 SysLog(NID_APP, "Platform creation event.");
215 _AppImpl* pAppImpl = static_cast<_AppImpl*>(user_data);
216 if (pAppImpl == null)
218 _AppInfo::SetAppState(TERMINATED);
219 SysLogException(NID_APP, E_INIT_FAILED, "[E_INIT_FAILED] Invalid platform state.");
223 _AppInfo::SetAppState(INITIALIZING);
225 if (!ConfirmAppService())
227 _AppInfo::SetAppState(TERMINATED);
228 SysLogException(NID_APP, E_INIT_FAILED, "[E_INIT_FAILED] Osp AppService is not running.");
232 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnAppInitializing>:start]", _AppInfo::GetAppExecutableName().GetPointer());
233 if (!pAppImpl->__pIAppImpl->OnAppInitializing())
235 _AppInfo::SetAppState(TERMINATED);
236 SysLogException(NID_APP, E_INIT_FAILED, "[E_INIT_FAILED] The initialization of your application failed.");
239 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnAppInitializing>:done]", _AppInfo::GetAppExecutableName().GetPointer());
241 SysLogTag(NID_APP, "LAUNCH","[%ls:<RegisterApplication>:start]", _AppInfo::GetAppExecutableName().GetPointer());
242 _IAppManager* pAppManager = _AppManagerProxy::GetService();
244 if (pAppManager != null)
246 result r = pAppManager->RegisterApplication(_AppInfo::GetApplicationId(), static_cast<_AppType>(_AppInfo::GetAppType()), _AppInfo::GetProcessId());
247 SysTryLog(NID_APP, !IsFailed(r), "[%s] Application registration failed.", GetErrorMessage(r));
249 SysLogTag(NID_APP, "LAUNCH","[%ls:<RegisterApplication>:done]", _AppInfo::GetAppExecutableName().GetPointer());
250 // hide splash window
252 _PowerManagerImpl::InitBatteryEvent();
259 _AppImpl::OnService(service_s* service, void* user_data)
261 _AppImpl* pAppImpl = _AppImpl::GetInstance();
262 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
263 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
265 // ugly code for app selector event handling
266 bundle* pBundle = _AppArg::GetBundleFromSvc(service);
269 const char* pValue = appsvc_get_data(pBundle, SELECTOR_RESPONSE_KEY);
272 const int req = _AppArg::GetRequestIdFromBundle(pBundle);
274 const char* pOperation = appsvc_get_operation(pBundle);
276 SysLog(NID_APP, "App selector response [%s, %s], req(%d).", pValue, pOperation, req);
278 //_AppArg::Print(pBundle);
279 _AppControlManager::GetInstance()->SendAppControlStartResponse(req, pValue, pOperation);
284 //_AppArg::Print(pBundle);
286 _AppHandler handler = _APP_HANDLER_NONE;
287 pAppImpl->RegisterAppRequest(service, req, handler);
289 bool initialLaunch = false;
292 // (1) AppControl / DataControl provider listener
293 // (2) OnAppInitialized()
294 // (3) OnResume() (OnForeground()) (UiApp only)
295 // (4) OnUserEventReceivedN()
298 // (1) AppControl / DataControl provider listener
299 // (2) OnResume() (OnForeground()) (UiApp only)
300 // (3) OnUserEventReceivedN()
302 if (_AppInfo::GetAppState() == INITIALIZING)
304 initialLaunch = true;
306 unsigned int winId = 0;
307 service_get_window(service, &winId);
310 _AppInfo::SetParentWindowHandle(winId);
311 SysLog(NID_APP, "Saving window handle 0x%x.", winId);
314 // set an appinfo value for multi-window mode
316 int errVal = service_get_extra_data(service, TIZEN_APPCONTROL_DATA_MULTI_WINDOW, &pBuf);
317 if (errVal == SERVICE_ERROR_NONE)
319 if (!strcmp(pBuf, "on"))
321 _AppInfo::SetMultiWindow(true);
327 SysLog(NID_APP, "It is failed to get multi-window value: %d", errVal);
330 // call for callbacks
331 // ptr to member function
332 SysLogTag(NID_APP, "LAUNCH","[%ls:<RequestHandler and OnAppInitialized>:start]", _AppInfo::GetAppExecutableName().GetPointer());
333 (pAppImpl->*pAppImpl->__pRequestHandler)(service, req, handler);
335 if (!pAppImpl->__pIAppImpl->OnAppInitialized())
337 _AppInfo::SetAppState(TERMINATING);
338 SysLog(NID_APP, "[E_INIT_FAILED] The Initialization of your application failed.");
342 SysLogTag(NID_APP, "LAUNCH","[%ls:<RequestHandler and OnAppInitialized>:done]", _AppInfo::GetAppExecutableName().GetPointer());
344 _AppInfo::SetAppState(RUNNING);
346 SysLogTag(NID_APP, "LAUNCH","[%ls:<Initialize Application>:done]", _AppInfo::GetAppExecutableName().GetPointer());
352 // call for callbacks
353 // ptr to member function
354 (pAppImpl->*pAppImpl->__pRequestHandler)(service, req, handler);
356 std::unique_ptr<char[], charDeleter> pOperation(null);
359 int errVal = service_get_operation(service, &pBuf);
360 pOperation.reset(pBuf);
362 if((errVal == SERVICE_ERROR_NONE) && (!strcmp((const char*)pOperation.get(), "osp.operation.ALARM")))
364 std::unique_ptr<char[], charDeleter> pAlarmId(null);
367 errVal = service_get_extra_data(service, SERVICE_DATA_ALARM_ID, &pBuf);
368 pAlarmId.reset(pBuf);
369 SysTryReturnVoidResult(NID_SYS, errVal == SERVICE_ERROR_NONE, E_SYSTEM, "It is failed to get reserved alarm id.");
370 int alarmId = atoi((const char*)pAlarmId.get());
372 _AlarmManager* pAlarmManager = _AlarmManager::GetInstance();
373 pAlarmManager->OnAlarmExpired(alarmId);
379 pAppImpl->__pIAppImpl->OnService(service, initialLaunch);
381 // ptr to member function
382 (pAppImpl->*pAppImpl->__pLegacyRequestHandler)(service, req, handler);
387 _AppImpl::OnTerminate(void* user_data)
389 SysLog(NID_APP, "Termination event 0x%x state", _AppInfo::GetAppState());
391 _AppImpl* pAppImpl = _AppImpl::GetInstance();
392 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
393 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
395 result r = _SettingInfoImpl::RemoveSettingEventListenerForInternal(*pAppImpl);
396 SysTryLog(NID_APP, !IsFailed(r), "[%s] failed to remove setting event listener.", GetErrorMessage(r));
398 __isTerminationRequested = true;
399 pAppImpl->__pIAppImpl->OnTerminate();
404 _AppImpl::OnResume(void* user_data)
406 SysLog(NID_APP, "System resume event on 0x%x state", _AppInfo::GetAppState());
407 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnResume>:start]", _AppInfo::GetAppExecutableName().GetPointer());
409 _AppImpl* pAppImpl = _AppImpl::GetInstance();
410 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
411 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
412 pAppImpl->__pIAppImpl->OnResume();
413 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnResume>:done]", _AppInfo::GetAppExecutableName().GetPointer());
418 _AppImpl::OnPause(void* user_data)
420 SysLog(NID_APP, "System pause event on 0x%x state", _AppInfo::GetAppState());
421 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnPause>:start]", _AppInfo::GetAppExecutableName().GetPointer());
423 _AppImpl* pAppImpl = _AppImpl::GetInstance();
424 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
425 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
426 pAppImpl->__pIAppImpl->OnPause();
427 pAppImpl->OnAppCheckpoint();
428 SysLogTag(NID_APP, "LAUNCH","[%ls:<OnPause>:done]", _AppInfo::GetAppExecutableName().GetPointer());
432 _AppImpl::~_AppImpl(void)
439 _AppImpl::GetInstance(void)
446 _AppImpl::GetAppInstance(void)
453 _AppImpl::GetAppArgumentListN(void) const
455 ArrayList* pList = null;
456 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(0);
460 pList = pArg->GetArgListN(0);
465 pList = new (std::nothrow) ArrayList();
466 SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
467 String* pData = new (std::nothrow) String(LEGACY_LAUNCH_REASON_NORMAL);
468 SysTryReturn(NID_APP, pData != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
469 String* pData2 = new (std::nothrow) String(LEGACY_OPERATION_MAIN);
470 SysTryReturn(NID_APP, pData2 != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
482 _AppImpl::Terminate(void)
484 result r = E_SUCCESS;
486 SysLog(NID_APP, "Terminate() is called by application itself");
488 __isTerminationRequested = true;
496 _AppImpl::OnAppInitializing(void)
503 _AppImpl::OnAppWillTerminate(void)
505 SysTryReturn(NID_APP, __pApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
507 return __pApp->OnAppWillTerminate();
512 _AppImpl::RegisterAppRequest(service_s* service, int& req, _AppHandler& handler)
514 _AppControlManager* pManager = _AppControlManager::GetInstance();
515 SysTryReturnResult(NID_APP, pManager != null, E_SYSTEM, "Wrong system state.");
517 result r = pManager->RegisterRequest(service, req, handler);
518 SysTryReturn(NID_APP, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
520 int providerType = _AppInfo::GetAppHandlerType();
521 providerType |= (_APP_HANDLER_LAUNCH_NORMAL | _APP_HANDLER_LAUNCH_COND);
523 SysTryLog(NID_APP, (handler & providerType) != 0, "Request 0x%x received for 0x%x.", handler,
524 _AppInfo::GetAppHandlerType());
530 _AppImpl::HandleAppRequest(service_s* service, int req, _AppHandler handler)
532 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(req);
533 SysTryReturnResult(NID_APP, pArg != null, E_SYSTEM, "No argument found for %d.", req);
539 case _APP_HANDLER_DATACONTROL:
540 SysLog(NID_APP, "Handling DataControl request");
542 OnDataControlRequestReceived(*pArg, static_cast< RequestId >(req));
544 //_AppControlManager::GetInstance()->RemoveResultRequest(req);
547 case _APP_HANDLER_LAUNCH_COND:
548 SysLog(NID_APP, "Handling conditional launch request");
550 OnConditionRequestReceived(*pArg, static_cast< RequestId >(req));
554 SysLog(NID_APP, "Handling AppControl request");
556 OnAppControlRequestReceived(*pArg, static_cast< RequestId >(req));
565 _AppImpl::HandleLegacyAppRequest(service_s* service, int req, _AppHandler handler)
567 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(0);
568 SysTryReturnResult(NID_APP, pArg != null, E_SYSTEM, "No argument found for %d.", req);
574 case _APP_HANDLER_LAUNCH_NORMAL:
575 SysLog(NID_APP, "Handling normal launch request");
576 OnUserEventReceivedN(AppLaunchRequestId, pArg->GetArgListN(req), true);
578 // [TODO] request handle memory cleanup confirm
579 _AppControlManager::GetInstance()->RemoveResultRequest(req);
582 case _APP_HANDLER_LAUNCH_COND:
583 SysLog(NID_APP, "Handling conditional launch request");
585 OnUserEventReceivedN(AppLaunchRequestId, pArg->GetArgListN(req), true);
587 // [TODO] request handle memory cleanup confirm
588 _AppControlManager::GetInstance()->RemoveResultRequest(req);
600 _AppImpl::HandleDummyAppRequest(service_s* service, int req, _AppHandler handler)
602 SysLog(NID_APP, "Dummy handler");
609 _AppImpl::SetLegacyRequestHandler(void)
611 SysLog(NID_APP, "Setting request handler for legacy application.");
613 __pRequestHandler = &_AppImpl::HandleDummyAppRequest;
614 __pLegacyRequestHandler = &_AppImpl::HandleLegacyAppRequest;
621 _AppImpl::OnLowMemory(void* user_data)
623 _AppImpl* pAppImpl = _AppImpl::GetInstance();
625 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
626 SysTryReturnVoidResult(NID_APP, pAppImpl->__pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
628 if (_AppInfo::GetAppState() == RUNNING)
630 pAppImpl->__pApp->OnLowMemory();
636 _AppImpl::OnBatteryLevelChanged(BatteryLevel batteryLevel)
638 SysTryReturnVoidResult(NID_APP, __pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
640 __pApp->OnBatteryLevelChanged(batteryLevel);
644 _AppImpl::SendUserEvent(RequestId requestId, const IList* pArgs, bool isPublic)
646 _AppUserEventArg* pArg = new (std::nothrow) _AppUserEventArg(requestId, pArgs, isPublic);
647 SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "User event creation failure for %d.", requestId);
649 result r = __appUserEvent.FireAsync(*pArg);
656 _AppImpl::OnUserEventReceivedN(RequestId requestId, IList* pArgs, bool isPublic)
658 SysTryReturnVoidResult(NID_APP, __pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
662 __pApp->OnUserEventReceivedN(requestId, pArgs);
668 case _APP_EVENT_TERMINATE:
669 SysLog(NID_APP, "App terminate is requested.");
672 case _APP_EVENT_RAISE:
673 SysLog(NID_APP, "App raise is requested.");
677 SysLog(NID_APP, "Unknown event : 0x%x.", requestId);
685 _AppImpl::OnAppControlRequestReceived(const _AppArg& arg, RequestId reqId)
687 IAppControlProviderEventListener* pAppControlProviderEventListener = null;
689 const String internalOperation = arg.GetValue(OSP_K_APPCONTROL_INTERNAL_OPERATION);
690 if( !internalOperation.IsEmpty() )
692 SysLog(NID_APP, "internalOperation:%ls", internalOperation.GetPointer() );
693 pAppControlProviderEventListener = __pAppControlProviderInternalEventListener;
697 pAppControlProviderEventListener = __pAppControlProviderEventListener;
700 if( pAppControlProviderEventListener == null)
702 SysLog(NID_APP, "No AppControl provider event listener set for request %d.", reqId);
706 const char* pAppId = appinfo_get_appid();
708 const char* p = appsvc_get_operation(arg.GetBundle());
709 String operationId = (p) ? String(p) : TIZEN_OPERATION_MAIN;
710 if (operationId == L"http://tizen.org/appcontrol/operation/default")
712 operationId = TIZEN_OPERATION_MAIN;
715 SysLog(NID_APP, "AppControl (%s, %ls).", pAppId, operationId.GetPointer());
719 const String* pUri = null;
720 const String* pMime = null;
721 p = appsvc_get_uri(arg.GetBundle());
727 // SLP deals with the URI as plain /opt/.../a.jpg.
728 uri.Insert(FILE_SCHEME_WITH_DELIMITER, 0);
732 SysLog(NID_APP, "Delivered uri is [%ls].", pUri->GetPointer());
735 p = appsvc_get_mime(arg.GetBundle());
742 std::unique_ptr<HashMap> pMap(arg.GetArgMapN());
744 pAppControlProviderEventListener->OnAppControlRequestReceived(reqId, operationId, pUri, pMime, pMap.get());
746 SysLog(NID_APP, "AppControl (%s, %ls) invocation finished.", pAppId, operationId.GetPointer());
751 _AppImpl::OnDataControlRequestReceived(const _AppArg& arg, RequestId reqId)
754 ISqlDataControlProviderEventListener* pSqlListener = null;
755 IMapDataControlProviderEventListener* pMapListener = null;
756 ArrayList* pColumnList = null;
757 HashMap* pInsertMap = null;
758 HashMap* pUpdateMap = null;
763 String* pDataId = null;
765 String* pColumnCount = null;
766 String* pColumn = null;
767 String* pValue = null;
768 String* pWhere = null;
769 String* pOrder = null;
770 String* pErrorMsg = null;
772 String* pCount = null;
773 String* pTmpPath = null;
774 String empty(L"NULL");
777 _DataControlRequestType requestType = _DATACONTROL_REQUEST_TYPE_UNDEFINED;
780 int countPerPage = 0;
783 result r = E_SUCCESS;
784 result res = E_SUCCESS;
785 ArrayList* pList = null;
787 String* pNewValue = null;
788 String* pOldValue = null;
790 SysLog(NID_APP, "[DC_PROV_RECV] Data control request is received.");
791 //arg.Print(); // request info
794 appId = arg.GetCallerAppId();
796 reqType = arg.GetValue(OSP_K_DATACONTROL_REQUEST_TYPE);
797 Integer::Parse(reqType, type);
798 requestType = static_cast< _DataControlRequestType >(type);
800 version = arg.GetValue(OSP_K_DATACONTROL_PROTOCOL_VERSION);
801 callerReqId = arg.GetValue(OSP_K_REQUEST_ID);
802 providerId = arg.GetValue(OSP_K_DATACONTROL_PROVIDER);
804 // list-based request
805 pList = _AppArg::GetListN(arg.GetBundle(), OSP_K_ARG);
806 SysTryCatch(NID_APP, pList, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
808 pDataId = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_DATAID));// request list[0]: data ID
809 SysTryCatch(NID_APP, pDataId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
811 if (requestType >= _DATACONTROL_REQUEST_TYPE_SQL_QUERY && requestType <= _DATACONTROL_REQUEST_TYPE_SQL_DELETE)
813 pSqlListener = __pSqlDataControlProviderEventListener;
814 SysTryCatch(NID_APP, pSqlListener != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
816 else if (requestType >= _DATACONTROL_REQUEST_TYPE_MAP_QUERY && requestType <= _DATACONTROL_REQUEST_TYPE_MAP_DELETE)
818 pKey = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_MAPKEY)); // request list[1]
819 SysTryCatch(NID_APP, pKey, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
821 pMapListener = __pMapDataControlProviderEventListener;
822 SysTryCatch(NID_APP, pMapListener != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
826 SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] invalid request");
832 case _DATACONTROL_REQUEST_TYPE_SQL_QUERY:
833 SysLog(NID_APP, "[DC_PROV_RECV] SqlDataControl SELECT");
835 // request list[1]: selected column count
836 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
837 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
839 if (pColumnCount->Equals(empty) == true)
845 Integer::Parse(*pColumnCount, columnCount);
846 pColumnList = new (std::nothrow) ArrayList();
847 SysTryReturnVoidResult(NID_APP, pColumnList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
848 pColumnList->Construct();
849 SysLog(NID_APP, "[DC_PROV_RECV] selected column count: %d", columnCount);
852 while (i < columnCount) // request list[2]: column list
854 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNLIST + i));
855 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
857 pColumnList->Add(*(new String(*pColumn)));
858 SysLog(NID_APP, "[DC_PROV_RECV] column[%d]: %ls", i, pColumn->GetPointer());
863 i += _DATACONTROL_PACKET_INDEX_COLUMNLIST;
864 pWhere = dynamic_cast< String* >(pList->GetAt(i)); // request list: where clause
865 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
867 if (pWhere->Equals(empty) == true)
873 SysLog(NID_APP, "[DC_PROV_RECV] pWhere: %ls", pWhere->GetPointer());
877 pOrder = dynamic_cast< String* >(pList->GetAt(i)); // request list: order clause
878 SysTryCatch(NID_APP, pOrder, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
880 if (pOrder->Equals(empty) == true)
886 SysLog(NID_APP, "[DC_PROV_RECV] pOrder: %ls", pOrder->GetPointer());
890 pNo = dynamic_cast <String*>(pList->GetAt(i)); // request list: page number
891 SysTryCatch(NID_APP, pNo, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
892 Integer::Parse(*pNo, pageNo);
895 pCount = dynamic_cast <String*>(pList->GetAt(i)); // request list: count per page
896 SysTryCatch(NID_APP, pCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
897 Integer::Parse(*pCount, countPerPage);
899 pSqlListener->OnSqlDataControlSelectRequestReceived(reqId, providerId, *pDataId, pColumnList,
902 SysSecureLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, pColumnList: 0x%0x, pWhere: 0x%x, pOrder: 0x%x, pageNo: %d, countPerPage: %d",
903 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
904 pDataId->GetPointer(), pColumnList, pWhere, pOrder, pageNo, countPerPage);
906 case _DATACONTROL_REQUEST_TYPE_SQL_INSERT:
907 SysLog(NID_APP, "[DC_PROV_RECV] SqlDataControl INSERT");
909 // request list[1]: inserted column count
910 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
911 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
913 Integer::Parse(*pColumnCount, columnCount);
914 SysLog(NID_APP, "[DC_PROV_RECV] inserted column count: %d", columnCount);
916 pInsertMap = new (std::nothrow) HashMap();
917 SysTryReturnVoidResult(NID_APP, pInsertMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
918 pInsertMap->Construct();
920 SysLog(NID_APP, "[DC_PROV_RECV] version: %ls", version.GetPointer());
921 if (version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3")
923 pTmpPath = dynamic_cast< String* >(pList->GetAt(2)); // request list[2]: path
924 SysTryCatch(NID_APP, pTmpPath != null, , E_SYSTEM, "[E_SYSTEM] invalid request");
925 SysLog(NID_APP, "[DC_PROV_RECV] request: %ls", pTmpPath->GetPointer());
928 r = request.Construct(*pTmpPath, "r");
929 SysTryCatch(NID_APP, !IsFailed(r), , E_SYSTEM, "[%s] Failed to open request (%ls).",
930 GetErrorMessage(r), pTmpPath->GetPointer());
932 for (i = 0; i < columnCount; ++i) // column-value pairs
935 int ret = request.Read(&length, sizeof(int));
936 SysTryCatch(NID_APP, ret > 0, , E_SYSTEM, "[%s] Failed to receive request.",
937 GetErrorMessage(GetLastResult()));
939 char* pColumn = new (std::nothrow) char[length + 1];
940 ret = request.Read(pColumn, length);
941 SysTryCatch(NID_APP, ret > 0, delete pColumn, E_SYSTEM, "[%s] Failed to receive request.",
942 GetErrorMessage(GetLastResult()));
943 pColumn[length] = '\0';
944 SysLog(NID_APP, "[DC_PROV_RECV] column[%d]: %s", i, pColumn);
946 ret = request.Read(&length, sizeof(int));
947 SysTryCatch(NID_APP, ret > 0, delete pColumn, E_SYSTEM, "[%s] Failed to receive request.",
948 GetErrorMessage(GetLastResult()));
950 char* pValue = new (std::nothrow) char[length + 1];
951 ret = request.Read(pValue, length);
954 SysLogException(NID_APP, E_SYSTEM, "[%s] Failed to receive request.", GetErrorMessage(GetLastResult()));
958 pValue[length] = '\0';
959 SysLog(NID_APP, "[DC_PROV_RECV] value[%d]: %s", i, pValue);
961 pInsertMap->Add(new (std::nothrow) String(pColumn), new (std::nothrow) String(pValue));
970 while (i < columnCount * 2) // request list: column-value pairs
972 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_INSERTMAP + i++));
973 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
974 SysLog(NID_APP, "[DC_PROV_RECV] column[%d]: %ls", index, pColumn->GetPointer());
976 pValue = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_INSERTMAP + i++));
977 SysTryCatch(NID_APP, pValue != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
978 SysLog(NID_APP, "[DC_PROV_RECV] value[%d]: %ls", index, pValue->GetPointer());
980 pInsertMap->Add(new (std::nothrow) String(*pColumn), new (std::nothrow) String(*pValue));
987 r = File::Remove(*pTmpPath);
988 SysTryLog(NID_APP, !IsFailed(r), "Failed to remove result: %ls", pTmpPath->GetPointer());
991 pSqlListener->OnSqlDataControlInsertRequestReceived(reqId, providerId, *pDataId, *pInsertMap);
993 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, pInsertMap: 0x%x",
994 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
995 pDataId->GetPointer(), pInsertMap);
997 case _DATACONTROL_REQUEST_TYPE_SQL_UPDATE:
998 SysLog(NID_APP, "[DC_PROV_RECV] SqlDataControl UPDATE");
1000 // request list[1]: updated column count
1001 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
1002 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1004 Integer::Parse(*pColumnCount, columnCount);
1005 SysLog(NID_APP, "[DC_PROV_RECV] updated column count: %d", columnCount);
1007 pUpdateMap = new (std::nothrow) HashMap();
1008 SysTryReturnVoidResult(NID_APP, pUpdateMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
1009 pUpdateMap->Construct();
1011 SysLog(NID_APP, "[DC_PROV_RECV] version: %ls", version.GetPointer());
1012 if (version == L"ver_2.1.0.2" || version == L"ver_2.1.0.3")
1014 pTmpPath = dynamic_cast< String* >(pList->GetAt(2)); // request list[2]: path
1015 SysTryCatch(NID_APP, pTmpPath != null, , E_SYSTEM, "[E_SYSTEM] invalid request");
1016 SysLog(NID_APP, "[DC_PROV_RECV] request: %ls", pTmpPath->GetPointer());
1019 r = request.Construct(*pTmpPath, "r");
1020 SysTryCatch(NID_APP, !IsFailed(r), , E_SYSTEM, "[%s] Failed to open request (%ls).",
1021 GetErrorMessage(r), pTmpPath->GetPointer());
1023 for (i = 0; i < columnCount; ++i) // column-value pairs
1026 int ret = request.Read(&length, sizeof(int));
1027 SysTryCatch(NID_APP, ret > 0, , E_SYSTEM, "[%s] Failed to receive request.",
1028 GetErrorMessage(GetLastResult()));
1030 char* pColumn = new (std::nothrow) char[length + 1];
1031 ret = request.Read(pColumn, length);
1032 SysTryCatch(NID_APP, ret > 0, delete pColumn, E_SYSTEM, "[%s] Failed to receive request.",
1033 GetErrorMessage(GetLastResult()));
1034 pColumn[length] = '\0';
1035 SysLog(NID_APP, "[DC_PROV_RECV] column[%d]: %s", i, pColumn);
1037 ret = request.Read(&length, sizeof(int));
1038 SysTryCatch(NID_APP, ret > 0, delete pColumn, E_SYSTEM, "[%s] Failed to receive request.",
1039 GetErrorMessage(GetLastResult()));
1041 char* pValue = new (std::nothrow) char[length + 1];
1042 ret = request.Read(pValue, length);
1045 SysLogException(NID_APP, E_SYSTEM, "[%s] Failed to receive request.", GetErrorMessage(GetLastResult()));
1049 pValue[length] = '\0';
1050 SysLog(NID_APP, "[DC_PROV_RECV] value[%d]: %s", i, pValue);
1052 pUpdateMap->Add(new (std::nothrow) String(pColumn), new (std::nothrow) String(pValue));
1057 // request list: where clause
1058 pWhere = dynamic_cast< String* >(pList->GetAt(3));
1059 SysTryCatch(NID_APP, pWhere != null, , E_SYSTEM, "[E_SYSTEM] invalid request");
1065 while (i < columnCount * 2) // request list: column-value pairs
1067 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i++));
1068 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1069 SysLog(NID_APP, "[DC_PROV_RECV] column[%d]: %ls", index, pColumn->GetPointer());
1071 pValue = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i++));
1072 SysTryCatch(NID_APP, pValue != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1073 SysLog(NID_APP, "[DC_PROV_RECV] value[%d]: %ls", index, pValue->GetPointer());
1075 pUpdateMap->Add(new (std::nothrow) String(*pColumn), new (std::nothrow) String(*pValue));
1079 // request list: where clause
1080 pWhere = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i));
1081 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1084 if (pWhere->Equals(empty) == true)
1090 SysLog(NID_APP, "[DC_PROV_RECV] pWhere: %ls", pWhere->GetPointer());
1095 r = File::Remove(*pTmpPath);
1096 SysTryLog(NID_APP, !IsFailed(r), "Failed to remove result: %ls", pTmpPath->GetPointer());
1099 pSqlListener->OnSqlDataControlUpdateRequestReceived(reqId, providerId, *pDataId, *pUpdateMap, pWhere);
1101 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, pUpdateMap: 0x%x, pWhere: 0x%x",
1102 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1103 pDataId->GetPointer(), pUpdateMap, pWhere);
1105 case _DATACONTROL_REQUEST_TYPE_SQL_DELETE:
1106 SysLog(NID_APP, "[DC_PROV_RECV] SqlDataControl DELETE");
1108 // request list[1]: where clause
1109 pWhere = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_DELETEWHERE));
1110 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1112 if (pWhere->Equals(empty) == true)
1118 SysLog(NID_APP, "[DC_PROV_RECV] pWhere: %ls", pWhere->GetPointer());
1121 pSqlListener->OnSqlDataControlDeleteRequestReceived(reqId, providerId, *pDataId, pWhere);
1123 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, pWhere: 0x%x",
1124 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1125 pDataId->GetPointer(), pWhere);
1127 case _DATACONTROL_REQUEST_TYPE_MAP_QUERY:
1128 SysLog(NID_APP, "[DC_PROV_RECV] MapDataControl GetValue");
1130 pNo = dynamic_cast <String*>(pList->GetAt(2)); // request list[2]
1131 SysTryCatch(NID_APP, pNo, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1132 Integer::Parse(*pNo, pageNo);
1134 pCount = dynamic_cast <String*>(pList->GetAt(3)); // request list[3]
1135 SysTryCatch(NID_APP, pCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1136 Integer::Parse(*pCount, countPerPage);
1138 pMapListener->OnMapDataControlGetValueRequestReceived(reqId, providerId, *pDataId, *pKey);
1140 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, key: %ls, pageNo: %d, countPerPage: %d",
1141 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1142 pDataId->GetPointer(), pKey->GetPointer(), pageNo, countPerPage);
1144 case _DATACONTROL_REQUEST_TYPE_MAP_INSERT:
1145 SysLog(NID_APP, "[DC_PROV_RECV] MapDataControl AddValue");
1147 pValue = dynamic_cast <String*>(pList->GetAt(2)); // request list[2]
1148 SysTryCatch(NID_APP, pValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1150 pMapListener->OnMapDataControlAddValueRequestReceived(reqId, providerId, *pDataId, *pKey, *pValue);
1152 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, key: %ls, value: %ls",
1153 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1154 pDataId->GetPointer(), pKey->GetPointer(), pValue->GetPointer());
1156 case _DATACONTROL_REQUEST_TYPE_MAP_UPDATE:
1157 SysLog(NID_APP, "[DC_PROV_RECV] MapDataControl SetValue");
1159 pOldValue = dynamic_cast <String*>(pList->GetAt(2)); // request list[2]
1160 SysTryCatch(NID_APP, pOldValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1162 pNewValue = dynamic_cast <String*>(pList->GetAt(3)); // request list[3]
1163 SysTryCatch(NID_APP, pNewValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1165 pMapListener->OnMapDataControlSetValueRequestReceived(reqId, providerId, *pDataId, *pKey, *pOldValue, *pNewValue);
1167 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, key: %ls, oldValue: %ls, newValue: %ls",
1168 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1169 pDataId->GetPointer(), pKey->GetPointer(), pOldValue->GetPointer(), pNewValue->GetPointer());
1171 case _DATACONTROL_REQUEST_TYPE_MAP_DELETE:
1172 SysLog(NID_APP, "[DC_PROV_RECV] MapDataControl RemoveValue");
1174 pValue = dynamic_cast <String*>(pList->GetAt(2)); // request list[2]
1175 SysTryCatch(NID_APP, pValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1177 pMapListener->OnMapDataControlRemoveValueRequestReceived(reqId, providerId, *pDataId, *pKey, *pValue);
1179 SysLog(NID_APP, "[DC_PROV_RECV] caller app: %ls, requestType: %d, caller req: %ls, provider: %ls, data: %ls, key: %ls, value: %ls",
1180 appId.GetPointer(), requestType, callerReqId.GetPointer(), providerId.GetPointer(),
1181 pDataId->GetPointer(), pKey->GetPointer(), pValue->GetPointer());
1184 SysTryCatch(NID_APP, false, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
1190 pColumnList->RemoveAll(true);
1196 pInsertMap->RemoveAll(true);
1202 pUpdateMap->RemoveAll(true);
1211 pColumnList->RemoveAll(true);
1217 pInsertMap->RemoveAll(true);
1223 pUpdateMap->RemoveAll(true);
1229 pErrorMsg = new (std::nothrow) String("[E_SYSTEM] A system error has occurred.");
1231 else if (r == E_OUT_OF_MEMORY)
1233 pErrorMsg = new (std::nothrow) String("[E_OUT_OF_MEMORY] The memory was insufficient.");
1235 SysTryReturnVoidResult(NID_APP, pErrorMsg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory was insufficient.");
1237 res = DataControlProviderManager::GetInstance()->SendDataControlError(reqId, *pErrorMsg);
1246 _AppImpl::OnConditionRequestReceived(const _AppArg& arg, RequestId reqId)
1248 if (__pAppLaunchConditionEventListener == null)
1250 SysLog(NID_APP, "No App launch condition event listener");
1254 String condition = arg.GetValue(OSP_K_COND);
1255 //Object* pExtraData = null;//TODO: retrieve NFC extra data.
1256 HashMap* pExtraData = arg.GetArgMapN();
1257 ArrayList* pList = arg.GetArgListN();
1259 __pAppLaunchConditionEventListener->OnAppLaunchConditionMetN(condition, pExtraData, pList);
1264 _AppImpl::GetWindowHandle(void) const
1266 SysTryReturn(NID_APP, __pIAppImpl != null, -1, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
1268 return __pIAppImpl->OnWindowHandleRequest();
1273 _AppImpl::RaiseWindow(void)
1275 SysTryReturnVoidResult(NID_APP, __pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
1277 __pIAppImpl->OnFrameRaiseRequested();
1282 _AppImpl::OnAppCheckpoint(void)
1284 if (__pCheckpointEventListener)
1286 __pCheckpointEventListener->OnAppCheckpointing(*(AppRegistry::GetInstance()));
1292 _AppImpl::ConfirmAppService(void)
1294 if (_AppInfo::GetApplicationId() == SERVICE_APPID)
1301 long interval = 100;
1305 int res = vconf_get_int(VCONFKEY_APPSERVICE_STATUS, &value);
1311 if (count >= HEARTBEAT_WAIT_COUNT)
1316 SysLog(NID_APP, "Waiting for app service %dth time(%d msec).", count, interval);
1318 Thread::Sleep(interval);
1326 _AppImpl::SetListener(_AppEvent appEvent, IEventListener* pListener)
1330 case _APP_EVENT_CHECKPOINT:
1331 SysTryReturnResult(NID_APP, __pCheckpointEventListener == null, E_OBJ_ALREADY_EXIST, "Checkpoint listener is already set.");
1334 case _APP_EVENT_CLEAR_LISTENER:
1335 __pCheckpointEventListener = dynamic_cast <IAppCheckpointEventListener*>(pListener);
1347 _AppImpl::SetSqlDataControlProviderEventListener(ISqlDataControlProviderEventListener* pListener)
1349 __pSqlDataControlProviderEventListener = pListener;
1350 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1351 tmpAppHandlerType |= _APP_HANDLER_DATACONTROL;
1352 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1358 _AppImpl::SetMapDataControlProviderEventListener(IMapDataControlProviderEventListener* pListener)
1360 __pMapDataControlProviderEventListener = pListener;
1361 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1362 tmpAppHandlerType |= _APP_HANDLER_DATACONTROL;
1363 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1369 _AppImpl::SetAppControlProviderEventListener(IAppControlProviderEventListener* pListener)
1371 __pAppControlProviderEventListener = pListener;
1372 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1373 tmpAppHandlerType |= _APP_HANDLER_APPCONTROL;
1374 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1379 _AppImpl::SetAppControlProviderInternalEventListener(IAppControlProviderEventListener* pListener)
1381 __pAppControlProviderInternalEventListener = pListener;
1382 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1383 tmpAppHandlerType |= _APP_HANDLER_APPCONTROL;
1384 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1390 _AppImpl::SetAppLaunchConditionEventListener(IAppLaunchConditionEventListener* pListener)
1392 __pAppLaunchConditionEventListener = pListener;
1393 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1394 tmpAppHandlerType |= _APP_HANDLER_LAUNCH_COND;
1395 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1402 _AppImpl::IsTerminationRequested(void)
1404 return __isTerminationRequested;
1407 typedef void (*cbForVconf)(keynode_t* node, void *pData);
1410 _AppImpl::OnPowerOffNotiReceived(void* node, void* user_data)
1413 if (!vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &value))
1415 if (value == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || value == VCONFKEY_SYSMAN_POWER_OFF_RESTART)
1417 SysLog(NID_APP, "Application is being terminated by power off.");
1419 if (vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, (cbForVconf)_AppImpl::OnPowerOffNotiReceived))
1421 SysLog(NID_APP, "Fail to ignore vconf for key(%s)", VCONFKEY_SYSMAN_POWER_OFF_STATUS);
1424 _AppImpl* pAppImpl = _AppImpl::GetInstance();
1425 if (pAppImpl != null)
1427 pAppImpl->__forcedTermination = true;
1436 _AppImpl::OnSettingChanged(String& key)
1438 if (key == L"http://tizen.org/setting/locale.language")
1440 _AppInfo::UpdatePackageInfo(true);
1441 _AppResourceImpl::Reinitialize();
1442 SysLog(NID_APP, "Reinitialized resources due to locale change.");
1447 _AppImpl::IsForcedTermination(void)
1449 return __forcedTermination;