From: david_kim31 Date: Tue, 19 Mar 2013 07:25:06 +0000 (+0900) Subject: Alarm refactoring : remove IPC between appfw and app-service X-Git-Tag: accepted/tizen_2.1/20130425.034849~256^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ec6ce59a269530b1eb7255f7250ddb81f32d79be;p=framework%2Fosp%2Fappfw.git Alarm refactoring : remove IPC between appfw and app-service Change-Id: I71a4f44bdf8f0c61ddb8714f23870f49e41475a8 Signed-off-by: david_kim31 --- diff --git a/src/app/FApp_AppImpl.cpp b/src/app/FApp_AppImpl.cpp old mode 100755 new mode 100644 index 8e7f45d..0ae69f0 --- a/src/app/FApp_AppImpl.cpp +++ b/src/app/FApp_AppImpl.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include "FApp_IAppManager.h" #include "FApp_AppManagerProxy.h" @@ -316,6 +317,36 @@ _AppImpl::OnService(service_s* service, void* user_data) // call for callbacks // ptr to member function (pAppImpl->*pAppImpl->__pRequestHandler)(service, req, handler); + + char* pOperation; + + int errVal = service_get_operation(service, &pOperation); + + if((errVal == SERVICE_ERROR_NONE) && (!strcmp(pOperation, "osp.appsvc.operation.ALARM"))) + { + char* pAlarmId = null; + + errVal = service_get_extra_data(service, SERVICE_DATA_ALARM_ID, &pAlarmId); + SysTryReturnVoidResult(NID_SYS, errVal == SERVICE_ERROR_NONE, E_SYSTEM, "It is failed to get reserved alarm id."); + int alarmId = atoi(pAlarmId); + + _AlarmManager* pAlarmManager = _AlarmManager::GetInstance(); + pAlarmManager->OnAlarmExpired(alarmId); + + if(pAlarmId != null) + { + free(pAlarmId); + } + + free(pOperation); + + return; + } + + if(pOperation) + { + free(pOperation); + } } pAppImpl->__pIAppImpl->OnService(service, initialLaunch); diff --git a/src/appfw/CMakeLists.txt b/src/appfw/CMakeLists.txt old mode 100755 new mode 100644 index cc9d420..a8674c1 --- a/src/appfw/CMakeLists.txt +++ b/src/appfw/CMakeLists.txt @@ -79,6 +79,7 @@ TARGET_LINK_LIBRARIES(${this_target} "-lxml2" ) TARGET_LINK_LIBRARIES(${this_target} "-lz" ) #TARGET_LINK_LIBRARIES(${this_target} "-ldukgenerator" ) #TARGET_LINK_LIBRARIES(${this_target} "-lcryptsvc" ) +TARGET_LINK_LIBRARIES(${this_target} "-lalarm" ) TARGET_LINK_LIBRARIES(${this_target} "-L/usr/lib -ldrm-service-core-intel") TARGET_LINK_LIBRARIES(${this_target} "-lecore" ) diff --git a/src/system/FSys_AlarmManager.cpp b/src/system/FSys_AlarmManager.cpp index 17589eb..e7ac796 100644 --- a/src/system/FSys_AlarmManager.cpp +++ b/src/system/FSys_AlarmManager.cpp @@ -21,15 +21,18 @@ */ #include +#include +#include +#include #include #include #include -#include +#include +#include -#include "FSys_AlarmManager.h" -#include "FSys_CommunicationDispatcherClient.h" +#include "inc/FSys_AlarmManager.h" using namespace Tizen::Base; using namespace Tizen::Base::Runtime; @@ -38,35 +41,27 @@ using namespace Tizen::Io; namespace Tizen { namespace System { +static const long _SECOND_OF_MINUTE = 60; -static const wchar_t* _ALARM_SERVICE_ID = L"osp.alarm.service"; -static const wchar_t* _ALARM_SET_SINGLEALARM = L"osp.alarm.set.singlealarm"; -static const wchar_t* _ALARM_SET_REPEATEDALARM = L"osp.alarm.set.repeatedalarm"; -static const wchar_t* _ALARM_CANCEL = L"osp.alarm.cancel"; -static const wchar_t* _ALARM_EXPIRED_EVENT = L"osp.alarm.expired.callback"; -static const wchar_t* _ALARM_RESULT_OK = L"osp.alarm.result.ok"; - -const int _ALARM_SERVICE_IPC_MESSAGE_SERVICE_ID = 0; -const int _ALARM_SERVICE_IPC_MESSAGE_COMMAND_ID = 1; -const int _ALARM_SERVICE_RESPONSE_DATA = 2; -const int _ALARM_SERVICE_ALARM_ID = 3; - - _AlarmManager* _AlarmManager::pAlarmManager = null; +_AlarmManager* _AlarmManager::pAlarmManager = null; _AlarmManager::_AlarmManager() -: __pIpcClient(null) + : __pAlarmHashMap(null) { result r = E_SUCCESS; - static String ALARM_SERVICE_ID(_ALARM_SERVICE_ID); __alarmList.Construct(); - _CommunicationDispatcherClient* pCommunicationDispatcherClient = _CommunicationDispatcherClient::GetInstance(); - SysTryCatch(NID_SYS, pCommunicationDispatcherClient != null, r = E_SYSTEM, r, "It is It is It is failed to get CommunicationDispatcherClient."); + if (!__pAlarmHashMap) + { + __pAlarmHashMap = new (std::nothrow) MultiHashMap(); + SysTryCatch(NID_SYS, __pAlarmHashMap != null, r = E_SYSTEM, E_SYSTEM, "__pAlarmHashMap should not be null"); - r = pCommunicationDispatcherClient->RegisterCommunicationListener(ALARM_SERVICE_ID, *this); - SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is It is It is failed to register on CommunicationDispatcherClient."); + r = __pAlarmHashMap->Construct(); + SysTryCatch(NID_SYS, r == E_SUCCESS, r= E_SYSTEM, E_SYSTEM, "[%s] Propagated.", GetErrorMessage(r)); + } - __pIpcClient = pCommunicationDispatcherClient->GetIpcClient(); + //Checks for any alarm existence + alarm_cancel_all(); CATCH: SetLastResult(r); @@ -74,6 +69,11 @@ CATCH: _AlarmManager::~_AlarmManager() { + delete __pAlarmHashMap; + __pAlarmHashMap = null; + + //Cancel all the alarms before exiting + alarm_cancel_all(); } _AlarmManager* @@ -86,6 +86,247 @@ _AlarmManager::GetInstance(void) return pAlarmManager; } +int +_AlarmManager::ReserveAlarm(Tizen::Base::String appId, Tizen::Base::DateTime startTime, int period) +{ + int reservedAlarmId = -1; + result r = E_SUCCESS; + + int ret = 0; + service_h service; + + SysLog(NID_SYS, "Reserve time is %d/%d/%d %d:%d:%d", startTime.GetYear(), startTime.GetMonth(), startTime.GetDay(), startTime.GetHour(), startTime.GetMinute(), startTime.GetSecond()); + + bundle* pBundle = null; + alarm_entry_t* pAlarmInfo; + alarm_date_t expireTime = {0,}; + + std::unique_ptr pId(_StringConverter::CopyToCharArrayN(appId)); + + pBundle = bundle_create(); + SysTryCatch(NID_SYS, pBundle != null, r = E_SYSTEM, r, "It is failed to create bundle"); + + ret = appsvc_set_operation(pBundle,"osp.appsvc.operation.ALARM"); + SysTryCatch(NID_SYS, ret == SERVICE_ERROR_NONE, r = E_SYSTEM, r, "It is failed to set operation"); + + ret = appsvc_set_appid(pBundle, (const char*)(pId.get())); + SysTryCatch(NID_SYS, ret == SERVICE_ERROR_NONE, r = E_SYSTEM, r, "It is failed to set appid for %ls", appId.GetPointer()); + + pAlarmInfo = alarmmgr_create_alarm(); + SysTryCatch(NID_SYS, pAlarmInfo != null, r = E_SYSTEM, r, "It is failed to create alarm entry"); + + expireTime.year = startTime.GetYear(); + expireTime.month = startTime.GetMonth(); + expireTime.day = startTime.GetDay(); + expireTime.hour = startTime.GetHour(); + expireTime.min = startTime.GetMinute(); + expireTime.sec = startTime.GetSecond(); + + ret = alarmmgr_set_time(pAlarmInfo, expireTime); + SysTryCatch(NID_SYS, ret == ALARMMGR_RESULT_SUCCESS, r = E_SYSTEM, r, "It is failed to set new alarm time"); + + if(period > 0) + { + ret = alarmmgr_set_repeat_mode(pAlarmInfo, ALARM_REPEAT_MODE_REPEAT, period * _SECOND_OF_MINUTE); + SysTryCatch(NID_SYS, ret == ALARMMGR_RESULT_SUCCESS, r = E_SYSTEM, r, "It is failed to set repeat mode"); + } + + ret = alarmmgr_set_type(pAlarmInfo, 0x04/*ALARM_TYPE_NOLAUNCH*/); + SysTryCatch(NID_SYS, ret == ALARMMGR_RESULT_SUCCESS, r = E_SYSTEM, r, "It is failed to set repeat mode"); + + ret = alarmmgr_add_alarm_appsvc_with_localtime(pAlarmInfo,(void *)pBundle, &reservedAlarmId); + SysTryCatch(NID_SYS, ret == ALARMMGR_RESULT_SUCCESS, r = E_SYSTEM, r, "Alarm creation failed!!! Alrmgr error code is %d", ret); + +CATCH: + if(r == E_SYSTEM) + { + reservedAlarmId = -1; + } + if(pAlarmInfo != null) + { + alarmmgr_free_alarm(pAlarmInfo); + } + + if(pBundle != null) + { + bundle_free(pBundle); + } + + return reservedAlarmId; +} + +result +_AlarmManager::AddAlarmList(int alarmId, int period, String appId, DateTime* endTime) +{ + result r = E_SUCCESS; + + SysTryReturnResult(NID_SYS, __pAlarmHashMap != null, E_SYSTEM, "Alarm list does not initialized"); + SysLog(NID_SYS, "New Alarm Id is added (%d, %d, %ls)", alarmId, period, appId.GetPointer()); + + Integer* reservedAlarmId = null; + Integer* alarmPeriod = null; + String* alarmAppId = null; + + Integer* reverseAlarmId = null; + String* reverseAppId = null; + + reservedAlarmId = new (std::nothrow) Integer(alarmId); + SysTryCatch(NID_SYS, reservedAlarmId != null, r = E_SYSTEM, E_SYSTEM, "reservedAlarmId should not be null"); + + alarmPeriod = new (std::nothrow) Integer(period); + SysTryCatch(NID_SYS, alarmPeriod != null, r = E_SYSTEM, E_SYSTEM, "alarmPeriod should not be null"); + + alarmAppId = new (std::nothrow) String(appId); + SysTryCatch(NID_SYS, alarmAppId != null, r = E_SYSTEM, E_SYSTEM, "alarmAppId should not be null"); + + //Forward + r = __pAlarmHashMap->Add(*reservedAlarmId, *alarmAppId); + SysTryCatch(NID_SYS, r == E_SUCCESS, r, r, "Fail to add new alarm app id on the alarm list"); + + r = __pAlarmHashMap->Add(*reservedAlarmId, *alarmPeriod); + SysTryCatch(NID_SYS, r == E_SUCCESS, r, r, "Fail to add new alarm period on the alarm list"); + + if(endTime != null) + { + DateTime* alarmEndTime = new DateTime(*endTime); + + SysLog(NID_SYS, "Endtime is exist %d:%d:%d", alarmEndTime->GetHour(), alarmEndTime->GetMinute(), alarmEndTime->GetSecond()); + r = __pAlarmHashMap->Add(*reservedAlarmId, *alarmEndTime); + SysTryCatch(NID_SYS, r == E_SUCCESS, r, r, "Fail to add new alarm endtime on the alarm list"); + } + + //Reverse + reverseAlarmId = new (std::nothrow) Integer(alarmId); + SysTryCatch(NID_SYS, reverseAlarmId != null, r = E_SYSTEM, E_SYSTEM, "reverseAlarmId should not be null"); + + reverseAppId = new (std::nothrow) String(appId); + SysTryCatch(NID_SYS, reverseAppId != null, r = E_SYSTEM, E_SYSTEM, "reverseAppId should not be null"); + + r = __pAlarmHashMap->Add(*reverseAppId, *reverseAlarmId); + SysTryCatch(NID_SYS, r == E_SUCCESS, r, r, "Fail to add new alarm on the alarm list"); + +CATCH: + if(r != E_SUCCESS) + { + if(reservedAlarmId != null) + { + __pAlarmHashMap->Remove(*reservedAlarmId, false); + delete reservedAlarmId; + } + + if(alarmPeriod != null) + { + delete alarmPeriod; + } + + if(alarmAppId != null) + { + delete alarmAppId; + } + + if(reverseAppId != null) + { + __pAlarmHashMap->Remove(*reverseAppId, false); + delete reverseAppId; + } + + if(reverseAlarmId != null) + { + delete reverseAlarmId; + } + } + return r; +} + +result +_AlarmManager::RemoveAlarmList(int alarmId) +{ + result r = E_SUCCESS; + Integer requiredAlarmId(alarmId); + std::unique_ptrpValueEnum(null); + + SysTryReturnResult(NID_SYS, __pAlarmHashMap != null, E_SYSTEM, "Alarm list does not initialized"); + + alarm_cancel(alarmId); + SysLog(NID_SYS, "AlarmId %d disarms the timer.", alarmId); + + pValueEnum.reset(__pAlarmHashMap->GetValuesN(requiredAlarmId)); + + if(pValueEnum != null) + { + SysLog(NID_SYS, "Reserved Alarms are exist"); + String* alarmAppId = null; + r = pValueEnum->MoveNext(); + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "Reserved Alarm List is not valid."); + alarmAppId = static_cast< String* >(pValueEnum->GetCurrent()); + + if(alarmAppId != null) + { + SysLog(NID_SYS, "Alarm AppId is %S", alarmAppId->GetPointer()); + std::unique_ptrpAlarmEnum(__pAlarmHashMap->GetValuesN(*alarmAppId)); + if(pAlarmEnum != null) + { + while(pAlarmEnum->MoveNext() == E_SUCCESS) + { + Integer* reverseAlarmId = static_cast< Integer* >(pAlarmEnum->GetCurrent()); + if(reverseAlarmId != null) + { + SysLog(NID_SYS, "Reserved Alarm is %d", reverseAlarmId->ToInt()); + if(reverseAlarmId->ToInt() == alarmId) + { + SysLog(NID_SYS, "Remove reservedAlarmId for reverse look-up"); + __pAlarmHashMap->Remove(*alarmAppId, *reverseAlarmId); + delete reverseAlarmId; + break; + } + } + } + } + + int count = 0; + __pAlarmHashMap->GetCount(*alarmAppId, count); + if(count == 0) + { + SysLog(NID_SYS, "There is no reserved alarm for AppId:%S", alarmAppId->GetPointer()); + __pAlarmHashMap->Remove(*alarmAppId, true); + } + } + } + r = __pAlarmHashMap->Remove(requiredAlarmId, true); + + return r; +} + +result +_AlarmManager::RemoveAlarmList(String appId) +{ + result r = E_SUCCESS; + Integer requiredAlarmId; + IEnumerator *pValueEnum = null; + + SysTryReturnResult(NID_SYS, __pAlarmHashMap != null, E_SYSTEM, "Alarm list does not initialized"); + pValueEnum = __pAlarmHashMap->GetValuesN(appId); + + if(pValueEnum != null) + { + SysLog(NID_SYS, "Reserved Alarms are exist for AppId:%S", appId.GetPointer()); + while(pValueEnum->MoveNext() == E_SUCCESS) + { + Integer* reverseAlarmId = static_cast< Integer* >(pValueEnum->GetCurrent()); + if(reverseAlarmId != null) + { + SysLog(NID_SYS, "Reserved AlarmId is %d", reverseAlarmId->ToInt()); + alarm_cancel(reverseAlarmId->ToInt()); + __pAlarmHashMap->Remove(*reverseAlarmId, true); + } + } + delete pValueEnum; + } + r = __pAlarmHashMap->Remove(appId, true); + + return r; +} + result _AlarmManager::RegisterAlarm(_AlarmImpl* pAlarmImpl) { @@ -100,131 +341,72 @@ _AlarmManager::RegisterAlarm(_AlarmImpl* pAlarmImpl) String startTimeStr; String periodStr; String endTimeStr; + String appId; int period = pAlarmImpl->GetPeriod(); - String serviceId = _ALARM_SERVICE_ID; - String commandId = _ALARM_SET_SINGLEALARM; - if(period > 0) //If period is 0, alarm is operated as Single alarm. - { - commandId = _ALARM_SET_REPEATEDALARM; - } - DateTime currentTime; DateTime startTime = pAlarmImpl->GetStartTime(); const DateTime* pEndTime = pAlarmImpl->GetEndTime(); - //Status check - SysTryReturnResult(NID_SYS, __pIpcClient != null, E_INVALID_STATE, "This instance has not been constructed as yet."); - //Argument check r = SystemTime::GetCurrentTime(WALL_TIME, currentTime); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is It is failed to get current time"); - SysTryReturnResult(NID_SYS, DateTime::Compare(currentTime, startTime) < 0, E_INVALID_ARG, "Designated start time has to be greater then current time"); + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get current time."); + SysTryReturnResult(NID_SYS, DateTime::Compare(currentTime, startTime) < 0, E_INVALID_ARG, "Designated start time has to be greater than current time."); SysTryReturnResult(NID_SYS, period > -1, E_INVALID_ARG, "Period has to greater then -1"); if(pEndTime != null) { - SysTryReturnResult(NID_SYS, DateTime::Compare(startTime, *pEndTime) < 0, E_INVALID_ARG, "Designated end time is less then start time"); + SysTryReturnResult(NID_SYS, DateTime::Compare(startTime, *pEndTime) < 0, E_INVALID_ARG, "Designated end time is less then start time."); } //End Alarm validation check - //IPC data construction - r = requestMessage.Construct(); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to create request instance."); - r = responseMessage.Construct(); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to create response instance."); - - r = requestMessage.Add(serviceId); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to add service id."); - r = requestMessage.Add(commandId); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to add command id."); - startTimeStr = startTime.ToString(); - r = requestMessage.Add(startTimeStr); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to add start time value."); - periodStr.Append(period); - r = requestMessage.Add(periodStr); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to add period value."); - - if(pEndTime != null) - { - endTimeStr = pEndTime->ToString(); - r = requestMessage.Add(endTimeStr); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to add end time value."); - } - - std::unique_ptr pRequest(new (std::nothrow) IoService_Request(requestMessage, &responseMessage)); + Tizen::App::App* pApp = Tizen::App::App::GetInstance(); + SysTryReturnResult(NID_SYS, pApp != null, E_SYSTEM, "[%s] A system error has been occurred. App::GetInstance() failed.", GetErrorMessage(E_SYSTEM)); + appId = pApp->GetAppId(); - //IPC data delivery - r = __pIpcClient->SendRequest(pRequest.get()); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is It is failed to send ipc message."); - SysLog(NID_SYS, "Alarm reqeust is deliverted to osp-app-service successfully."); + String* result = null; + int reservedAlarmId = 0; - //IPC data response check + SysLog(NID_SYS, "Alarm setting request"); - String* pResult = (String*)responseMessage.GetAt(_ALARM_SERVICE_RESPONSE_DATA); - SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "There is no result."); - SysTryReturnResult(NID_SYS, *pResult == _ALARM_RESULT_OK, E_SYSTEM, "It is It is failed to register alarm. [%ls]", pResult->GetPointer()); + reservedAlarmId = ReserveAlarm(appId, startTime, period); + SysTryReturnResult(NID_SYS, reservedAlarmId != -1, E_SYSTEM, "It is failed to register alarm."); - String* pAlarmId = (String*)responseMessage.GetAt(_ALARM_SERVICE_ALARM_ID); - SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "There is no alarmId."); - SysLog(NID_SYS, "Reserved alarm id is %ls from osp-app-service.", pAlarmId->GetPointer()); + SysLog(NID_SYS, "Reserved AppId %ls, alarmId: %d", appId.GetPointer(), reservedAlarmId); - int registeredAlarmId = 0; - Integer::Parse(*pAlarmId, registeredAlarmId); + if(pEndTime == null) + { + r = AddAlarmList(reservedAlarmId, period, appId, null); + } + else + { + r = AddAlarmList(reservedAlarmId, period, appId, const_cast(pEndTime)); + } + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to add new alarm on the alarm list."); - pAlarmImpl->__alarmId.value = registeredAlarmId; + pAlarmImpl->__alarmId.value = reservedAlarmId; r = __alarmList.Add(&(pAlarmImpl->__alarmId), pAlarmImpl); + return r; } result _AlarmManager::UnregisterAlarm(_AlarmImpl* pAlarmImpl) { + SysLog(NID_SYS, "Alarm Cancel request"); + result r = E_SUCCESS; SysTryReturnResult(NID_SYS, pAlarmImpl != null, E_INVALID_ARG, "There is no alarmImpl."); Integer alarmId(pAlarmImpl->__alarmId.value); SysTryReturnResult(NID_SYS, __alarmList.ContainsKey(alarmId) == true, E_OBJ_NOT_FOUND, "There is no registered alarm."); - r = __alarmList.Remove(alarmId); - - ArrayList requestMessage; - ArrayList responseMessage; - String serviceId(_ALARM_SERVICE_ID); - String commandId(_ALARM_CANCEL); - - //Status check - SysTryReturnResult(NID_SYS, __pIpcClient != null, E_INVALID_STATE, "This instance has not been constructed as yet."); - - //IPC data construction - r = requestMessage.Construct(); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to create request instance"); - r = responseMessage.Construct(); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to create response instance"); - - r = requestMessage.Add(serviceId); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to add service id"); - r = requestMessage.Add(commandId); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to add command id"); - - String alarmIdStr; - alarmIdStr.Append(alarmId.value); - - r = requestMessage.Add(alarmIdStr); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to add alarm id value"); - //IPC data delivery - std::unique_ptr pRequest(new (std::nothrow) IoService_Request(requestMessage, &responseMessage)); - - r = __pIpcClient->SendRequest(pRequest.get()); - SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to send ipc message."); - SysLog(NID_SYS, "Alarm cancel reqeust is deliverted to osp-app-service successfully"); + r = __alarmList.Remove(alarmId); + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to remove reserved alarmImpl instance."); - //IPC data response check - String* pResult = (String*)responseMessage.GetAt(_ALARM_SERVICE_RESPONSE_DATA); - - SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response"); - SysTryReturnResult(NID_SYS, *pResult == _ALARM_RESULT_OK, E_SYSTEM, "It is failed to cancel alarm"); + r = RemoveAlarmList(alarmId.ToInt()); + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to remove reserved alarm list."); return r; } @@ -238,42 +420,90 @@ _AlarmManager::UpdateAlarm(_AlarmImpl* pAlarmImpl) Integer alarmId(pAlarmImpl->__alarmId.value); SysTryReturnResult(NID_SYS, __alarmList.ContainsKey(alarmId) == true, E_OBJ_NOT_FOUND, "There is no registered alarm."); - UnregisterAlarm(pAlarmImpl); - RegisterAlarm(pAlarmImpl); + r = UnregisterAlarm(pAlarmImpl); + SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to unregister reserved alarm list."); + + r = RegisterAlarm(pAlarmImpl); return r; } void -_AlarmManager::OnDataReceived(const Tizen::Base::Collection::ArrayList& data) +_AlarmManager::OnAlarmExpired(int alarmId) { - SysLog(NID_SYS, "IPC message is delivered."); - String alarmIdStr; - - String* pServiceId = (String*) data.GetAt(_ALARM_SERVICE_IPC_MESSAGE_SERVICE_ID); - String* pCommandId = (String*) data.GetAt(_ALARM_SERVICE_IPC_MESSAGE_COMMAND_ID); - String* pData = (String*) data.GetAt(_ALARM_SERVICE_RESPONSE_DATA); + result r = E_SUCCESS; + String* pAppId = null; + Integer* pPeriod = null; + std::unique_ptr pValueEnum(null); + Integer reservedAlarmId(alarmId); + DateTime* endTime = null; - SysLog(NID_SYS, "IPC message is delivered."); - String serviceId(_ALARM_SERVICE_ID); - String commandId(_ALARM_EXPIRED_EVENT); + SysTryReturnVoidResult(NID_SYS, __pAlarmHashMap != null, E_SYSTEM, "Alarm list does not initialized"); + pValueEnum.reset(__pAlarmHashMap->GetValuesN(reservedAlarmId)); - SysTryReturnVoidResult(NID_SYS, pServiceId != null && pCommandId != null && pData != null, E_SYSTEM, "There is no device data."); + SysLog(NID_SYS, "Alarm expire event is delivered. alarm id is %d", alarmId); - if(*pServiceId == serviceId && *pCommandId == commandId) + if(pValueEnum != null) { - SysLog(NID_SYS, "Alarm expire event is delivered."); - int alarmId = 0; - Integer::Parse(*pData, alarmId); + String alarmAppId; + SysLog(NID_SYS, "Matching Alarm Id is %d \n", alarmId); + r = pValueEnum->MoveNext(); + SysTryReturnVoidResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "Alarm enum value is not valid."); + pAppId = static_cast< String* >(pValueEnum->GetCurrent()); + alarmAppId.Append(*pAppId); + r = pValueEnum->MoveNext(); + pPeriod = static_cast< Integer* >(pValueEnum->GetCurrent()); + SysTryReturnVoidResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "Alarm enum value is not valid."); + + if(pValueEnum->MoveNext() == E_SUCCESS) + { + endTime = static_cast< DateTime* >(pValueEnum->GetCurrent()); + } - Integer reservedAlarmId(alarmId); + SysLog(NID_SYS, "Reserved Alarm AppId:%ls, Period:%d\n", pAppId->GetPointer(), pPeriod->ToInt()); - _AlarmImpl* pAlarmImpl = (_AlarmImpl*)__alarmList.GetValue(reservedAlarmId); - if(pAlarmImpl != null) + if (pPeriod->ToInt() > 0) + { + if(endTime != null) + { + DateTime currentTime; + SystemTime::GetCurrentTime(WALL_TIME, currentTime); + SysLog(NID_SYS, "Current time: %d:%d:%d", currentTime.GetHour(), currentTime.GetMinute(), currentTime.GetSecond()); + currentTime.AddMinutes(pPeriod->ToInt()); + SysLog(NID_SYS, "Next time: %d:%d:%d", currentTime.GetHour(), currentTime.GetMinute(), currentTime.GetSecond()); + SysLog(NID_SYS, "Endtime is exist %d:%d:%d", endTime->GetHour(), endTime->GetMinute(), endTime->GetSecond()); + + if (currentTime.CompareTo(*endTime) >= 0) + { + SysLog(NID_SYS, "Next time is greater then end time."); + RemoveAlarmList(alarmId); + pValueEnum->Reset(); + } + } + } + else if (pPeriod->ToInt() == 0) { - SysLog(NID_SYS, "Reserved Alarm[%d] is found.", alarmId); - pAlarmImpl->OnAlarmExpired(alarmId); + RemoveAlarmList(alarmId); } + else + { + pValueEnum->Reset(); + } + } + + _AlarmImpl* pAlarmImpl = (_AlarmImpl*)__alarmList.GetValue(reservedAlarmId); + if(pAlarmImpl != null) + { + SysLog(NID_SYS, "Reserved Alarm[%d] is found.", alarmId); + pAlarmImpl->OnAlarmExpired(alarmId); } + + if(__pAlarmHashMap->ContainsKey(reservedAlarmId) == false) + { + r = __alarmList.Remove(reservedAlarmId); + SetLastResult(r); + } + + return; } } } // Tizen::System diff --git a/src/system/FSys_AlarmManager.h b/src/system/inc/FSys_AlarmManager.h similarity index 75% rename from src/system/FSys_AlarmManager.h rename to src/system/inc/FSys_AlarmManager.h index 6ab79b1..d049db9 100644 --- a/src/system/FSys_AlarmManager.h +++ b/src/system/inc/FSys_AlarmManager.h @@ -23,15 +23,13 @@ #ifndef _FSYSTEM_INTERNAL_ALARM_MANAGER_H_ #define _FSYSTEM_INTERNAL_ALARM_MANAGER_H_ -#include +#include #include -#include namespace Tizen { namespace System { class _AlarmManager - : public Tizen::System::_ICommunicationDispatcherListener { private: _AlarmManager(); @@ -41,14 +39,20 @@ public: result RegisterAlarm(_AlarmImpl* pAlarmImpl); result UnregisterAlarm(_AlarmImpl* pAlarmImpl); result UpdateAlarm(_AlarmImpl* pAlarmImpl); - void OnDataReceived(const Tizen::Base::Collection::ArrayList& data); + void OnAlarmExpired(int alarmId); public: static _AlarmManager* GetInstance(void); private: + int ReserveAlarm(Tizen::Base::String appId, Tizen::Base::DateTime startTime, int period); + result AddAlarmList(int alarmId, int period, Tizen::Base::String appId, Tizen::Base::DateTime* endTime); + result RemoveAlarmList(int alarmId); + result RemoveAlarmList(Tizen::Base::String appId); + +private: Tizen::Base::Collection::HashMap __alarmList; - Tizen::Io::_IpcClient* __pIpcClient; + Tizen::Base::Collection::MultiHashMap* __pAlarmHashMap; static _AlarmManager* pAlarmManager; };