Alarm refactoring : remove IPC between appfw and app-service
authordavid_kim31 <david_kim31@samsung.com>
Tue, 19 Mar 2013 07:25:06 +0000 (16:25 +0900)
committerdavid_kim31 <david_kim31@samsung.com>
Tue, 19 Mar 2013 11:16:07 +0000 (20:16 +0900)
Change-Id: I71a4f44bdf8f0c61ddb8714f23870f49e41475a8
Signed-off-by: david_kim31 <david_kim31@samsung.com>
src/app/FApp_AppImpl.cpp [changed mode: 0755->0644]
src/appfw/CMakeLists.txt [changed mode: 0755->0644]
src/system/FSys_AlarmManager.cpp
src/system/inc/FSys_AlarmManager.h [moved from src/system/FSys_AlarmManager.h with 75% similarity]

old mode 100755 (executable)
new mode 100644 (file)
index 8e7f45d..0ae69f0
@@ -45,6 +45,7 @@
 #include <FSys_EnvironmentImpl.h>
 #include <FSys_PowerManagerImpl.h>
 #include <FApp_Aul.h>
+#include <FSys_AlarmManager.h>
 
 #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);
old mode 100755 (executable)
new mode 100644 (file)
index cc9d420..a8674c1
@@ -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" )
 
index 17589eb..e7ac796 100644 (file)
  */
 
 #include <unique_ptr.h>
+#include <appfw/app.h>
+#include <alarm.h>
+#include <appsvc/appsvc.h>
 
 #include <FBaseSysLog.h>
 #include <FSysSystemTime.h>
 
 #include <FBase_NativeError.h>
-#include <FIo_AppServiceIpcMessages.h>
+#include <FAppApp.h>
+#include <FBase_StringConverter.h>
 
-#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<char[]> 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_ptr<IEnumerator>pValueEnum(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_ptr<IEnumerator>pAlarmEnum(__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<IoService_Request> 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<DateTime*>(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<IoService_Request> 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<IEnumerator> 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
similarity index 75%
rename from src/system/FSys_AlarmManager.h
rename to src/system/inc/FSys_AlarmManager.h
index 6ab79b1..d049db9 100644 (file)
 #ifndef _FSYSTEM_INTERNAL_ALARM_MANAGER_H_
 #define _FSYSTEM_INTERNAL_ALARM_MANAGER_H_
 
-#include <FIo_IpcClient.h>
+#include <FBaseColMultiHashMap.h>
 #include <FSys_AlarmImpl.h>
-#include <FSys_ICommunicationDispatcherListener.h>
 
 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;
 };