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_AppImpl.cpp
20 * @brief This is the implementation for the _AppImpl class.
23 #include <unique_ptr.h>
25 #include <notification/notification.h>
26 #include <appsvc/appsvc.h>
28 #include <FBaseInteger.h>
29 #include <FBaseColArrayList.h>
30 #include <FBaseColHashMap.h>
31 #include <FBaseRtThread.h>
32 #include <FAppAppRegistry.h>
33 #include <FAppAppControl.h>
34 #include <FAppDataControlProviderManager.h>
35 #include <FAppIAppCheckPointEventListener.h>
36 #include <FAppISqlDataControlProviderEventListener.h>
37 #include <FAppIMapDataControlProviderEventListener.h>
38 #include <FAppIAppControlProviderEventListener.h>
39 #include <FAppIAppLaunchConditionEventListener.h>
42 #include <FBaseSysLog.h>
43 #include <FIo_RegistryImpl.h>
44 #include <FSys_EnvironmentImpl.h>
45 #include <FSys_PowerManagerImpl.h>
48 #include "FApp_IAppManager.h"
49 #include "FApp_AppManagerProxy.h"
50 #include "FApp_AppImpl.h"
51 #include "FApp_AppInfo.h"
52 #include "FApp_AppControlManager.h"
53 #include "FApp_AppArg.h"
54 #include "FApp_IAppImpl.h"
55 #include "FApp_AppResourceImpl.h"
57 using namespace Tizen::Base;
58 using namespace Tizen::Base::Collection;
59 using namespace Tizen::Base::Runtime;
60 using namespace Tizen::Io;
61 using namespace Tizen::System;
66 const int HEARTBEAT_WAIT_COUNT = 20;
67 const char HEARBEAT_PATH[] = "/tmp/osp-initialized";
68 const wchar_t SERVICE_APPID[] = L"aospd00043.osp-app-service";
69 const char SELECTOR_RESPONSE_KEY[] = "__APP_SVC_START_INFO__";
73 namespace Tizen { namespace App
76 _AppImpl* _AppImpl::__pAppImpl = null;
77 bool _AppImpl::__isTerminationRequested = false;
78 static const int _DATACONTROL_PACKET_INDEX_APPID = 0;
79 static const int _DATACONTROL_PACKET_INDEX_REQUESTTYPE = 1;
80 static const int _DATACONTROL_PACKET_INDEX_REQID = 2;
81 static const int _DATACONTROL_PACKET_INDEX_PROVIDERID = 3;
82 static const int _DATACONTROL_PACKET_INDEX_DATAID = 4;
83 static const int _DATACONTROL_PACKET_INDEX_COLUMNCOUNT = 5;
84 static const int _DATACONTROL_PACKET_INDEX_DELETEWHERE = 5;
85 static const int _DATACONTROL_PACKET_INDEX_COLUMNLIST = 6;
86 static const int _DATACONTROL_PACKET_INDEX_INSERTMAP = 6;
87 static const int _DATACONTROL_PACKET_INDEX_UPDATEMAP = 6;
89 _AppImpl::_AppImpl(App* pApp)
90 : __pCheckpointEventListener(null)
91 , __pSqlDataControlProviderEventListener(null)
92 , __pMapDataControlProviderEventListener(null)
93 , __pAppControlProviderEventListener(null)
94 , __pAppControlProviderInternalEventListener(null)
95 , __pAppLaunchConditionEventListener(null)
98 , __pRequestHandler(&_AppImpl::HandleAppRequest)
99 , __pLegacyRequestHandler(&_AppImpl::HandleDummyAppRequest)
106 _AppImpl::Construct(const IList* pArgs)
108 SysTryReturnResult(NID_APP, pArgs != null, E_INVALID_ARG, "pArguments must not be null.");
109 SysAssertf(__pApp != null, "Getting App instance failed.");
111 result r = __appUserEvent.Construct();
112 SysTryLog(NID_APP, !IsFailed(r), "[%s] User event handler failure.", GetErrorMessage(r));
114 __appUserEvent.AddListener(*this);
116 _AppInfo::SetAppState(INITIALIZING);
123 _AppImpl::Execute(_IAppImpl* pIAppImpl)
125 result r = E_SUCCESS;
126 int eflResult = APP_ERROR_NONE;
127 int argc = _AppInfo::GetArgc();
128 char** pArgv = _AppInfo::GetArgv();
129 _IAppManager* pAppManager = null;
131 _AppImpl* pAppImpl = _AppImpl::GetInstance();
132 SysTryReturnResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
133 pAppImpl->__pIAppImpl = pIAppImpl;
135 // handle legacy version handling
136 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
138 pAppImpl->SetLegacyRequestHandler();
141 // clear previous notification
142 // [INFO] behavior change : platform does not clear previous notification
143 notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_NOTI);
145 app_event_callback_s state_handler;
146 memset(&state_handler, 0, sizeof(app_event_callback_s));
148 state_handler.create = &OnCreate;
149 state_handler.service = &OnService;
150 state_handler.terminate = &OnTerminate;
151 state_handler.pause = &OnPause;
152 state_handler.resume = &OnResume;
153 state_handler.device_orientation = &OnDeviceOrientationChanged;
155 state_handler.low_memory = &OnLowMemory;
156 state_handler.low_battery = &OnLowBattery;
157 state_handler.language_changed = &OnLanguageChanged;
158 state_handler.region_format_changed = &OnRegionFormatChanged;
160 _Aul::SetPowerOffNotiListener(OnPowerOffNotiReceived, this);
161 // if (pAppManager != null)
163 // r = pAppManager->RegisterApplication(_AppInfo::GetPackageId(), _AppInfo::GetAppExecutableName(), _AppInfo::GetAppType() , _AppInfo::GetProcessId());
164 // SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Application registration failed.", GetErrorMessage(r));
167 eflResult = app_efl_main(&argc, &pArgv, &state_handler, this);
169 SysTryLog(NID_APP, eflResult == APP_ERROR_NONE, "app_efl_main failed with error (%d): Unknown", eflResult);
171 // clear outstanding ongoing notification
172 notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_ONGOING);
175 pAppManager = _AppManagerProxy::GetService();
177 if (pAppManager != null)
179 pAppManager->UnregisterApplication(_AppInfo::GetProcessId());
187 _AppImpl::OnCreate(void* user_data)
189 SysLog(NID_APP, "Platform creation event.");
191 _AppInfo::SetAppState(INITIALIZING);
193 _PowerManagerImpl::InitBatteryEvent();
200 _AppImpl::OnService(service_s* service, void* user_data)
202 _AppImpl* pAppImpl = _AppImpl::GetInstance();
203 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
204 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
206 // ugly code for app selector event handling
207 bundle* pBundle = _AppArg::GetBundleFromSvc(service);
210 const char* pValue = appsvc_get_data(pBundle, SELECTOR_RESPONSE_KEY);
213 const int req = _AppArg::GetRequestIdFromBundle(pBundle);
215 const char* pOperation = appsvc_get_operation(pBundle);
217 SysLog(NID_APP, "App selector response [%s, %s], req(%d).", pValue, pOperation, req);
219 //_AppArg::Print(pBundle);
220 _AppControlManager::GetInstance()->SendAppControlStartResponse(req, pValue, pOperation);
226 _AppHandler handler = _APP_HANDLER_NONE;
227 pAppImpl->RegisterAppRequest(service, req, handler);
229 bool initialLaunch = false;
232 // (1) OnAppInitializing()
233 // (2) OnAppInitialized()
234 // (3) AppControl / DataControl provider listener
235 // (4) OnResume() (OnForeground()) (UiApp only)
236 // (5) OnUserEventReceivedN()
239 // (1) AppControl / DataControl provider listener
240 // (2) OnResume() (OnForeground()) (UiApp only)
241 // (3) OnUserEventReceivedN()
243 if (_AppInfo::GetAppState() == INITIALIZING)
245 initialLaunch = true;
247 unsigned int winId = 0;
248 service_get_window(service, &winId);
251 _AppInfo::GetAppInfo()->SetParentWindowHandle(winId);
252 SysLog(NID_APP, "Saving window handle 0x%x.", winId);
255 if (!ConfirmAppService())
257 _AppInfo::SetAppState(TERMINATED);
258 SysLogException(NID_APP, E_INIT_FAILED, "[E_INIT_FAILED] Osp AppService is not running.");
263 if (!pAppImpl->__pIAppImpl->OnAppInitializing())
265 _AppInfo::SetAppState(TERMINATED);
266 SysLogException(NID_APP, E_INIT_FAILED, "[E_INIT_FAILED] The initialization of your application failed.");
271 _IAppManager* pAppManager = _AppManagerProxy::GetService();
273 if (pAppManager != null)
275 result r = pAppManager->RegisterApplication(_AppInfo::GetPackageId(), _AppInfo::GetAppExecutableName(), _AppInfo::GetAppType() , _AppInfo::GetProcessId());
276 SysTryReturnVoidResult(NID_APP, !IsFailed(r), r, "[%s] Application registration failed.", GetErrorMessage(r));
279 // hide splash window
281 // call for callbacks
282 // ptr to member function
283 (pAppImpl->*pAppImpl->__pRequestHandler)(service, req, handler);
285 if (!pAppImpl->__pIAppImpl->OnAppInitialized())
287 _AppInfo::SetAppState(TERMINATING);
288 SysLog(NID_APP, "[E_INIT_FAILED] The Initialization of your application failed.");
293 _AppInfo::SetAppState(RUNNING);
299 // call for callbacks
300 // ptr to member function
301 (pAppImpl->*pAppImpl->__pRequestHandler)(service, req, handler);
304 pAppImpl->__pIAppImpl->OnService(service, initialLaunch);
306 // ptr to member function
307 (pAppImpl->*pAppImpl->__pLegacyRequestHandler)(service, req, handler);
312 _AppImpl::OnTerminate(void* user_data)
314 SysLog(NID_APP, "Termination event 0x%x state", _AppInfo::GetAppState());
316 _AppImpl* pAppImpl = _AppImpl::GetInstance();
317 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
318 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
320 __isTerminationRequested = true;
321 pAppImpl->__pIAppImpl->OnTerminate();
326 _AppImpl::OnResume(void* user_data)
328 SysLog(NID_APP, "System resume event on 0x%x state", _AppInfo::GetAppState());
330 _AppImpl* pAppImpl = _AppImpl::GetInstance();
331 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
332 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
333 pAppImpl->__pIAppImpl->OnResume();
338 _AppImpl::OnPause(void* user_data)
340 SysLog(NID_APP, "System pause event on 0x%x state", _AppInfo::GetAppState());
342 _AppImpl* pAppImpl = _AppImpl::GetInstance();
343 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
344 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
345 pAppImpl->__pIAppImpl->OnPause();
346 pAppImpl->OnAppCheckpoint();
351 _AppImpl::OnDeviceOrientationChanged(app_device_orientation_e orientation, void* user_data)
353 _AppImpl* pAppImpl = _AppImpl::GetInstance();
354 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
355 SysTryReturnVoidResult(NID_APP, pAppImpl->__pIAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
357 const AppState state = _AppInfo::GetAppState();
358 SysTryReturnVoidResult(NID_APP, state == INITIALIZING || state == RUNNING, E_INVALID_STATE, "[E_INVALID_STATE] Invalid application state : %d.", state);
360 pAppImpl->__pIAppImpl->OnDeviceOrientationChanged(orientation);
364 _AppImpl::~_AppImpl(void)
371 _AppImpl::GetInstance(void)
378 _AppImpl::GetAppInstance(void)
385 _AppImpl::GetAppArgumentListN(void) const
387 ArrayList* pList = null;
388 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(0);
392 pList = pArg->GetArgListN(0);
397 pList = new (std::nothrow) ArrayList();
398 SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
399 String* pData = new (std::nothrow) String(LEGACY_LAUNCH_REASON_NORMAL);
400 SysTryReturn(NID_APP, pData != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
401 String* pData2 = new (std::nothrow) String(L"osp.operation.MAIN");
402 SysTryReturn(NID_APP, pData2 != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
414 _AppImpl::Terminate(void)
416 result r = E_SUCCESS;
418 __isTerminationRequested = true;
426 _AppImpl::OnAppInitializing(void)
433 _AppImpl::OnAppWillTerminate(void)
435 SysTryReturn(NID_APP, __pApp != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
437 return __pApp->OnAppWillTerminate();
442 _AppImpl::RegisterAppRequest(service_s* service, int& req, _AppHandler& handler)
444 _AppControlManager* pManager = _AppControlManager::GetInstance();
445 SysTryReturnResult(NID_APP, pManager != null, E_SYSTEM, "Wrong system state.");
447 result r = pManager->RegisterRequest(service, req, handler);
448 SysTryReturn(NID_APP, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
450 int providerType = _AppInfo::GetAppHandlerType();
451 providerType |= (_APP_HANDLER_LAUNCH_NORMAL | _APP_HANDLER_LAUNCH_COND);
453 SysTryLog(NID_APP, (handler & providerType) != 0, "Request 0x%x received for 0x%x.", handler,
454 _AppInfo::GetAppHandlerType());
460 _AppImpl::HandleAppRequest(service_s* service, int req, _AppHandler handler)
462 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(req);
463 SysTryReturnResult(NID_APP, pArg != null, E_SYSTEM, "No argument found for %d.", req);
469 case _APP_HANDLER_DATACONTROL:
470 SysLog(NID_APP, "Handling DataControl request");
472 OnDataControlRequestReceived(*pArg, static_cast< RequestId >(req));
474 _AppControlManager::GetInstance()->RemoveResultRequest(req);
477 case _APP_HANDLER_LAUNCH_COND:
478 SysLog(NID_APP, "Handling conditional launch request");
480 OnConditionRequestReceived(*pArg, static_cast< RequestId >(req));
484 SysLog(NID_APP, "Handling AppControl request");
486 OnAppControlRequestReceived(*pArg, static_cast< RequestId >(req));
495 _AppImpl::HandleLegacyAppRequest(service_s* service, int req, _AppHandler handler)
497 const _AppArg* pArg = _AppControlManager::GetInstance()->FindResultRequest(0);
498 SysTryReturnResult(NID_APP, pArg != null, E_SYSTEM, "No argument found for %d.", req);
504 case _APP_HANDLER_LAUNCH_NORMAL:
505 SysLog(NID_APP, "Handling normal launch request");
506 OnUserEventReceivedN(AppLaunchRequestId, pArg->GetArgListN(req));
508 // [TODO] request handle memory cleanup confirm
509 _AppControlManager::GetInstance()->RemoveResultRequest(req);
512 case _APP_HANDLER_LAUNCH_COND:
513 SysLog(NID_APP, "Handling conditional launch request");
515 OnUserEventReceivedN(AppLaunchRequestId, pArg->GetArgListN(req));
517 // [TODO] request handle memory cleanup confirm
518 _AppControlManager::GetInstance()->RemoveResultRequest(req);
530 _AppImpl::HandleDummyAppRequest(service_s* service, int req, _AppHandler handler)
532 SysLog(NID_APP, "Dummy handler");
539 _AppImpl::SetLegacyRequestHandler(void)
541 SysLog(NID_APP, "Setting request handler for legacy application.");
543 __pRequestHandler = &_AppImpl::HandleDummyAppRequest;
544 __pLegacyRequestHandler = &_AppImpl::HandleLegacyAppRequest;
551 _AppImpl::OnLowMemory(void* user_data)
553 _AppImpl* pAppImpl = _AppImpl::GetInstance();
555 SysTryReturnVoidResult(NID_APP, pAppImpl != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
556 SysTryReturnVoidResult(NID_APP, pAppImpl->__pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
558 if (_AppInfo::GetAppState() == RUNNING)
560 pAppImpl->__pApp->OnLowMemory();
566 _AppImpl::OnLowBattery(void* user_data)
568 // Osp doesn't implement this callback.
572 _AppImpl::OnBatteryLevelChanged(BatteryLevel batteryLevel)
574 SysTryReturnVoidResult(NID_APP, __pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
576 __pApp->OnBatteryLevelChanged(batteryLevel);
580 _AppImpl::OnLanguageChanged(void* user_data)
583 _AppInfo::UpdatePackageInfo(true);
584 _AppResourceImpl::GetInstance()->Reinitialize();
588 _AppImpl::OnRegionFormatChanged(void* user_data)
590 // Osp doesn't implement this callback.
595 _AppImpl::SendUserEvent(RequestId requestId, const IList* pArgs)
597 _AppUserEventArg* pArg = new (std::nothrow) _AppUserEventArg(requestId, pArgs);
598 SysTryReturnResult(NID_APP, pArg != null, E_OUT_OF_MEMORY, "User event creation failure for %d.", requestId);
600 result r = __appUserEvent.FireAsync(*pArg);
607 _AppImpl::OnUserEventReceivedN(RequestId requestId, IList* pArgs)
609 SysTryReturnVoidResult(NID_APP, __pApp != null, E_INVALID_STATE, "[E_INVALID_STATE] Getting internal instance failed.");
611 __pApp->OnUserEventReceivedN(requestId, pArgs);
616 _AppImpl::OnAppControlRequestReceived(const _AppArg& arg, RequestId reqId)
618 const String& internalOperation = arg.GetValue(OSP_K_APPCONTROL_INTERNAL_OPERATION);
619 bool isInternalOperation = ( __pAppControlProviderInternalEventListener != null && internalOperation.IsEmpty() == false);
621 if (__pAppControlProviderEventListener == null && isInternalOperation == false)
623 SysLog(NID_APP, "No AppControl provider event listener set for request %d.", reqId);
627 const String& appId = _AppInfo::GetApplicationId();
629 const char* p = appsvc_get_operation(arg.GetBundle());
630 String operationId = (p) ? String(p) : TIZEN_OPERATION_MAIN;
631 if (operationId == L"http://tizen.org/appcontrol/operation/default")
633 operationId = TIZEN_OPERATION_MAIN;
636 SysLog(NID_APP, "AppControl (%ls, %ls).", appId.GetPointer(), operationId.GetPointer());
640 const String* pUri = null;
641 const String* pMime = null;
642 p = appsvc_get_uri(arg.GetBundle());
648 SysLog(NID_APP, "Delivered uri is [%ls].", pUri->GetPointer());
651 p = appsvc_get_mime(arg.GetBundle());
658 std::unique_ptr<HashMap> pMap(arg.GetArgMapN());
660 if( isInternalOperation )
662 __pAppControlProviderInternalEventListener->OnAppControlRequestReceived(reqId, operationId, pUri, pMime, pMap.get());
666 __pAppControlProviderEventListener->OnAppControlRequestReceived(reqId, operationId, pUri, pMime, pMap.get());
669 SysLog(NID_APP, "AppControl (%ls, %ls) invocation finished.", appId.GetPointer(), operationId.GetPointer());
674 _AppImpl::OnDataControlRequestReceived(const _AppArg& arg, RequestId reqId)
677 ISqlDataControlProviderEventListener* pSqlListener = null;
678 IMapDataControlProviderEventListener* pMapListener = null;
679 ArrayList* pColumnList = null;
680 HashMap* pInsertMap = null;
681 HashMap* pUpdateMap = null;
682 String* pAppId = null;
683 String* pRequestType = null;
684 String* pProviderId = null;
685 String* pDataId = null;
686 String* pReqId = null;
687 String* pColumnCount = null;
688 String* pColumn = null;
689 String* pValue = null;
690 String* pWhere = null;
691 String* pOrder = null;
692 String* pErrorMsg = null;
694 String* pCount = null;
695 String empty(L"NULL");
697 _DataControlResultSetImpl* pResultSetImpl = null;
698 String* pResult = null;
699 String* pObject = null;
700 String* pTempObject = null;
701 String* pTempFilePath = null;
705 _DataControlRequestType requestType = _DATACONTROL_REQUEST_TYPE_UNDEFINED;
708 int countPerPage = 0;
711 //ArrayList* pResultArgList = null;
712 result r = E_SUCCESS;
713 result res = E_SUCCESS;
714 ArrayList* pList = null;
716 String* pNewValue = null;
717 String* pOldValue = null;
719 String* pResultCount = null;
720 String* pResultValue = null;
723 SysLog(NID_APP, "[DC_PROVIDER] Data control request is received.");
726 pList = arg.GetArgListN(0);
727 SysTryCatch(NID_APP, pList, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
730 pAppId = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_APPID)); // key(0)
731 SysTryCatch(NID_APP, pAppId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
733 pRequestType = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_REQUESTTYPE)); // key(1)
734 SysTryCatch(NID_APP, pRequestType, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
735 Integer::Parse(*pRequestType, type);
736 requestType = static_cast< _DataControlRequestType >(type);
738 pReqId = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_REQID)); // key(2)
739 SysTryCatch(NID_APP, pReqId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
741 pProviderId = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_PROVIDERID)); // key(3)
742 SysTryCatch(NID_APP, pProviderId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
745 pDataId = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_DATAID));// list(0): data ID
746 SysTryCatch(NID_APP, pDataId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
748 if (requestType >= _DATACONTROL_REQUEST_TYPE_SQL_QUERY && requestType <= _DATACONTROL_REQUEST_TYPE_SQL_DELETE)
750 pSqlListener = __pSqlDataControlProviderEventListener;
751 SysTryCatch(NID_APP, pSqlListener != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
753 else if (requestType >= _DATACONTROL_REQUEST_TYPE_MAP_QUERY && requestType <= _DATACONTROL_REQUEST_TYPE_MAP_DELETE)
755 pKey = dynamic_cast< String* >(pList->GetAt(5)); // list[1]
756 SysTryCatch(NID_APP, pKey, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
758 pMapListener = __pMapDataControlProviderEventListener;
759 SysTryCatch(NID_APP, pMapListener != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
763 SysLogException(NID_APP, E_SYSTEM, "[E_SYSTEM] invalid request");
769 case _DATACONTROL_REQUEST_TYPE_SQL_QUERY:
770 SysLog(NID_APP, "[DC_PROVIDER] SqlDataControl SELECT");
772 // list(1): selected column count
773 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
774 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
776 if (pColumnCount->Equals(empty) == true)
782 Integer::Parse(*pColumnCount, columnCount);
783 pColumnList = new (std::nothrow) ArrayList();
784 SysTryReturnVoidResult(NID_APP, pColumnList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
785 pColumnList->Construct();
786 SysLog(NID_APP, "[DC_PROVIDER] selected column count: %d", columnCount);
789 while (i < columnCount) // list(2): column list
791 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNLIST + i));
792 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
794 pColumnList->Add(*(new String(*pColumn)));
795 SysLog(NID_APP, "[DC_PROVIDER] column[%d]: %ls", i, pColumn->GetPointer());
800 i += _DATACONTROL_PACKET_INDEX_COLUMNLIST;
801 pWhere = dynamic_cast< String* >(pList->GetAt(i)); // list(3): where clause
802 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
804 if (pWhere->Equals(empty) == true)
810 SysLog(NID_APP, "[DC_PROVIDER] pWhere: %ls", pWhere->GetPointer());
814 pOrder = dynamic_cast< String* >(pList->GetAt(i)); // list(4): order clause
815 SysTryCatch(NID_APP, pOrder, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
817 if (pOrder->Equals(empty) == true)
823 SysLog(NID_APP, "[DC_PROVIDER] pOrder: %ls", pOrder->GetPointer());
827 pNo = dynamic_cast <String*>(pList->GetAt(i)); // list(5): page number
828 SysTryCatch(NID_APP, pNo, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
829 Integer::Parse(*pNo, pageNo);
832 pCount = dynamic_cast <String*>(pList->GetAt(i)); // list(6): count per page
833 SysTryCatch(NID_APP, pCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
834 Integer::Parse(*pCount, countPerPage);
836 pSqlListener->OnSqlDataControlSelectRequestReceived(reqId, *pProviderId, *pDataId, pColumnList,
839 SysLog(NID_APP, "[DC_PROVIDER] caller appId: %ls, requestType: %d, reqId: %ls, providerId: %ls, dataId: %ls, pColumnList: 0x%0x, pWhere: 0x%x, pOrder: 0x%x, pageNo: %d, countPerPage: %d",
840 pAppId->GetPointer(), requestType, pReqId->GetPointer(), pProviderId->GetPointer(),
841 pDataId->GetPointer(), pColumnList, pWhere, pOrder, pageNo, countPerPage);
843 case _DATACONTROL_REQUEST_TYPE_SQL_INSERT:
844 SysLog(NID_APP, "[DC_PROVIDER] SqlDataControl INSERT");
846 // list(1): insert column count
847 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
848 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
850 Integer::Parse(*pColumnCount, columnCount);
851 SysLog(NID_APP, "[DC_PROVIDER] inserted column count: %d", columnCount);
853 pInsertMap = new (std::nothrow) HashMap();
854 SysTryReturnVoidResult(NID_APP, pInsertMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
855 pInsertMap->Construct();
859 while (i < columnCount * 2) // list(2): column-value pairs
861 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_INSERTMAP + i++));
862 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
863 SysLog(NID_APP, "[DC_PROVIDER] column[%d]: %ls", index, pColumn->GetPointer());
865 pValue = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_INSERTMAP + i++));
866 SysTryCatch(NID_APP, pValue != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
867 SysLog(NID_APP, "[DC_PROVIDER] value[%d]: %ls", index, pValue->GetPointer());
869 pInsertMap->Add(*(new String(*pColumn)), *(new String(*pValue)));
873 pSqlListener->OnSqlDataControlInsertRequestReceived(reqId, *pProviderId, *pDataId, *pInsertMap);
875 SysLog(NID_APP, "[DC_PROVIDER] caller appId: %ls, requestType: %d, reqId: %ls, providerId: %ls, dataId: %ls, pInsertMap: 0x%x",
876 pAppId->GetPointer(), requestType, pReqId->GetPointer(), pProviderId->GetPointer(),
877 pDataId->GetPointer(), pInsertMap);
879 case _DATACONTROL_REQUEST_TYPE_SQL_UPDATE:
880 SysLog(NID_APP, "[DC_PROVIDER] SqlDataControl UPDATE");
882 // list(1): updated column count
883 pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
884 SysTryCatch(NID_APP, pColumnCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
886 Integer::Parse(*pColumnCount, columnCount);
887 SysLog(NID_APP, "[DC_PROVIDER] updated column count: %d", columnCount);
889 pUpdateMap = new (std::nothrow) HashMap();
890 SysTryReturnVoidResult(NID_APP, pUpdateMap, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
891 pUpdateMap->Construct();
895 while (i < columnCount * 2) // list(2): column-value pairs
897 pColumn = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i++));
898 SysTryCatch(NID_APP, pColumn != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
899 SysLog(NID_APP, "[DC_PROVIDER] column[%d]: %ls", index, pColumn->GetPointer());
901 pValue = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i++));
902 SysTryCatch(NID_APP, pValue != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
903 SysLog(NID_APP, "[DC_PROVIDER] value[%d]: %ls", index, pValue->GetPointer());
905 pUpdateMap->Add(*(new String(*pColumn)), *(new String(*pValue)));
909 // list(3): where clause
910 pWhere = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_UPDATEMAP + i));
911 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
913 if (pWhere->Equals(empty) == true)
919 SysLog(NID_APP, "[DC_PROVIDER] pWhere: %ls", pWhere->GetPointer());
922 pSqlListener->OnSqlDataControlUpdateRequestReceived(reqId, *pProviderId, *pDataId, *pUpdateMap, pWhere);
924 SysLog(NID_APP, "[DC_PROVIDER] caller appId: %ls, requestType: %d, reqId: %ls, providerId: %ls, dataId: %ls, pUpdateMap: 0x%x, pWhere: 0x%x",
925 pAppId->GetPointer(), requestType, pReqId->GetPointer(), pProviderId->GetPointer(),
926 pDataId->GetPointer(), pUpdateMap, pWhere);
928 case _DATACONTROL_REQUEST_TYPE_SQL_DELETE:
929 SysLog(NID_APP, "[DC_PROVIDER] SqlDataControl DELETE");
931 // list(1): where clause
932 pWhere = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_DELETEWHERE));
933 SysTryCatch(NID_APP, pWhere, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
935 if (pWhere->Equals(empty) == true)
941 SysLog(NID_APP, "[DC_PROVIDER] pWhere: %ls", pWhere->GetPointer());
944 pSqlListener->OnSqlDataControlDeleteRequestReceived(reqId, *pProviderId, *pDataId, pWhere);
946 SysLog(NID_APP, "[DC_PROVIDER] caller appId: %ls, requestType: %d, reqId: %ls, providerId: %ls, dataId: %ls, pWhere: 0x%x",
947 pAppId->GetPointer(), requestType, pReqId->GetPointer(), pProviderId->GetPointer(),
948 pDataId->GetPointer(), pWhere);
950 case _DATACONTROL_REQUEST_TYPE_MAP_QUERY:
951 pNo = dynamic_cast <String*>(pList->GetAt(6)); // list[2]
952 SysTryCatch(NID_APP, pNo, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
953 Integer::Parse(*pNo, pageNo);
955 pCount = dynamic_cast <String*>(pList->GetAt(7)); //list[3]
956 SysTryCatch(NID_APP, pCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
957 Integer::Parse(*pCount, countPerPage);
959 pMapListener->OnMapDataControlGetValueRequestReceived(reqId, *pProviderId, *pDataId, *pKey);
961 case _DATACONTROL_REQUEST_TYPE_MAP_INSERT:
962 pValue = dynamic_cast <String*>(pList->GetAt(6)); // list[2]
963 SysTryCatch(NID_APP, pValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
965 pMapListener->OnMapDataControlAddValueRequestReceived(reqId, *pProviderId, *pDataId, *pKey, *pValue);
967 case _DATACONTROL_REQUEST_TYPE_MAP_UPDATE:
968 pOldValue = dynamic_cast <String*>(pList->GetAt(6)); // list[2]
969 SysTryCatch(NID_APP, pOldValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
971 pNewValue = dynamic_cast <String*>(pList->GetAt(7)); // list[3]
972 SysTryCatch(NID_APP, pNewValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
974 pMapListener->OnMapDataControlSetValueRequestReceived(reqId, *pProviderId, *pDataId, *pKey, *pOldValue, *pNewValue);
976 case _DATACONTROL_REQUEST_TYPE_MAP_DELETE:
977 pValue = dynamic_cast <String*>(pList->GetAt(6)); // list[2]
978 SysTryCatch(NID_APP, pValue, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
980 pMapListener->OnMapDataControlRemoveValueRequestReceived(reqId, *pProviderId, *pDataId, *pKey, *pValue);
983 SysTryCatch(NID_APP, false, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid request");
987 if (requestType >= _DATACONTROL_REQUEST_TYPE_MAP_QUERY && requestType <= _DATACONTROL_REQUEST_TYPE_MAP_DELETE)
989 SysLog(NID_APP, "caller appId: %ls, requestType: %d, reqId: %ls, providerId: %ls, dataId: %ls, key: %ls",
990 pAppId->GetPointer(), requestType, pReqId->GetPointer(), pProviderId->GetPointer(),
991 pDataId->GetPointer(), pKey->GetPointer());
996 pColumnList->RemoveAll(true);
1002 pInsertMap->RemoveAll(true);
1008 pUpdateMap->RemoveAll(true);
1017 pErrorMsg = new (std::nothrow) String("[E_SYSTEM] A system error has occurred.");
1019 else if (r == E_OUT_OF_MEMORY)
1021 pErrorMsg = new (std::nothrow) String("[E_OUT_OF_MEMORY] The memory was insufficient.");
1023 SysTryReturnVoidResult(NID_APP, pErrorMsg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory was insufficient.");
1025 res = DataControlProviderManager::GetInstance()->SendDataControlError(reqId, *pErrorMsg);
1029 pColumnList->RemoveAll(true);
1035 pInsertMap->RemoveAll(true);
1041 pUpdateMap->RemoveAll(true);
1052 _AppImpl::OnConditionRequestReceived(const _AppArg& arg, RequestId reqId)
1054 if (__pAppLaunchConditionEventListener == null)
1056 SysLog(NID_APP, "No App launch condition event listener");
1060 String condition = arg.GetValue(OSP_K_COND);
1061 Object* pExtraData = null;//TODO: retrieve NFC extra data.
1062 ArrayList* pList = arg.GetArgListN();
1064 __pAppLaunchConditionEventListener->OnAppLaunchConditionMetN(condition, pExtraData, pList);
1069 _AppImpl::GetWindowHandle(void) const
1071 SysTryReturn(NID_APP, __pIAppImpl != null, -1, E_INVALID_STATE, "[E_INVALID_STATE] Getting App instance failed.");
1073 return __pIAppImpl->OnWindowHandleRequest();
1078 _AppImpl::OnAppCheckpoint(void)
1080 if (__pCheckpointEventListener)
1082 __pCheckpointEventListener->OnAppCheckpointing(*(AppRegistry::GetInstance()));
1088 _AppImpl::ConfirmAppService(void)
1091 long interval = 100;
1092 const String tmpFile = HEARBEAT_PATH;
1094 if (_AppInfo::GetApplicationId() == SERVICE_APPID)
1101 if (File::IsFileExist(tmpFile))
1106 if (count >= HEARTBEAT_WAIT_COUNT)
1111 SysLog(NID_APP, "Waiting for app service %dth time(%d msec).", count, interval);
1113 Thread::Sleep(interval);
1120 _AppImpl::SetListener(_AppEvent appEvent, IEventListener* pListener)
1125 SysTryReturnResult(NID_APP, __pCheckpointEventListener == null, E_OBJ_ALREADY_EXIST, "Checkpoint listener is already set.");
1128 case AE_CLEAR_LISTENER:
1129 __pCheckpointEventListener = dynamic_cast <IAppCheckpointEventListener*>(pListener);
1141 _AppImpl::SetSqlDataControlProviderEventListener(ISqlDataControlProviderEventListener* pListener)
1143 __pSqlDataControlProviderEventListener = pListener;
1144 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1145 tmpAppHandlerType |= _APP_HANDLER_DATACONTROL;
1146 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1152 _AppImpl::SetMapDataControlProviderEventListener(IMapDataControlProviderEventListener* pListener)
1154 __pMapDataControlProviderEventListener = pListener;
1155 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1156 tmpAppHandlerType |= _APP_HANDLER_DATACONTROL;
1157 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1163 _AppImpl::SetAppControlProviderEventListener(IAppControlProviderEventListener* pListener)
1165 __pAppControlProviderEventListener = pListener;
1166 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1167 tmpAppHandlerType |= _APP_HANDLER_APPCONTROL;
1168 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1173 _AppImpl::SetAppControlProviderInternalEventListener(IAppControlProviderEventListener* pListener)
1175 __pAppControlProviderInternalEventListener = pListener;
1176 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1177 tmpAppHandlerType |= _APP_HANDLER_APPCONTROL;
1178 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1184 _AppImpl::SetAppLaunchConditionEventListener(IAppLaunchConditionEventListener* pListener)
1186 __pAppLaunchConditionEventListener = pListener;
1187 int tmpAppHandlerType = _AppInfo::GetAppHandlerType();
1188 tmpAppHandlerType |= _APP_HANDLER_LAUNCH_COND;
1189 _AppInfo::SetAppHandlerType(tmpAppHandlerType);
1196 _AppImpl::IsTerminationRequested(void)
1198 return __isTerminationRequested;
1202 _AppImpl::OnPowerOffNotiReceived(void* user_data)
1204 SysLog(NID_APP, "Application is being terminated by power off.");