Fix alarm defect for applaunch based logic.
[platform/framework/native/appfw.git] / src / system / FSys_AlarmManager.cpp
index 06f8457..bf61df0 100644 (file)
 
 #include <FBaseSysLog.h>
 #include <FSysSystemTime.h>
+#include <FAppApp.h>
+#include <FBaseColArrayList.h>
 
 #include <FBase_NativeError.h>
-#include <FAppApp.h>
 #include <FBase_StringConverter.h>
 
 #include "inc/FSys_AlarmManager.h"
@@ -85,6 +86,29 @@ _AlarmManager::~_AlarmManager()
        alarm_cancel_all();
 }
 
+int alarm_callback(alarm_id_t alarmId, void *user_param)
+{
+       _AlarmManager* pAlarmManager = _AlarmManager::GetInstance();
+       pAlarmManager->OnAlarmExpired((int)alarmId);
+        return 0;
+}
+
+result
+_AlarmManager::Construct(void)
+{
+       int errorCode;
+       Tizen::App::App* pApp = null;
+       pApp = Tizen::App::App::GetInstance();
+       String appId = pApp->GetAppId();
+       std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
+
+       errorCode = alarmmgr_init(pAppId.get());
+       SysTryReturnResult(NID_SYS, errorCode == ALARMMGR_RESULT_SUCCESS, E_SYSTEM, "It is failed to init alarmmgr. error [%d]", errorCode);
+       errorCode = alarmmgr_set_cb(alarm_callback, null);
+       SysTryReturnResult(NID_SYS, errorCode == ALARMMGR_RESULT_SUCCESS, E_SYSTEM, "It is failed to set cb to alarmmgr. error [%d]", errorCode);
+       return E_SUCCESS;
+}
+
 _AlarmManager*
 _AlarmManager::GetInstance(void)
 {
@@ -99,11 +123,13 @@ _AlarmManager::GetInstance(void)
 void
 _AlarmManager::InitSingleton(void)
 {
-       _AlarmManager* pAlarmManager = new (std::nothrow) _AlarmManager();
+       result r = E_SUCCESS;
+       std::unique_ptr<_AlarmManager> pAlarmManager(new (std::nothrow) _AlarmManager());
        SysTryReturnVoidResult(NID_SYS, pAlarmManager, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.",
                                                   GetErrorMessage(E_OUT_OF_MEMORY));
-
-       __pAlarmManager = pAlarmManager;
+       r = pAlarmManager->Construct();
+       SysTryReturnVoidResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to construct alarm manager.");
+       __pAlarmManager = pAlarmManager.release();
        std::atexit(DestroySingleton);
 }
 
@@ -162,7 +188,7 @@ _AlarmManager::ReserveAlarm(Tizen::Base::String appId, Tizen::Base::DateTime sta
        ret = alarmmgr_set_type(pAlarmInfo, 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);
+       ret = alarmmgr_add_alarm_with_localtime(pAlarmInfo, null, &reservedAlarmId);
        SysTryCatch(NID_SYS, ret == ALARMMGR_RESULT_SUCCESS, r = E_SYSTEM, r, "Alarm creation failed!!! Alrmgr error code is %d", ret);
 
 CATCH:
@@ -461,23 +487,17 @@ result
 _AlarmManager::UpdateAlarm(_AlarmImpl* pAlarmImpl)
 {
        result r = E_SUCCESS;
-       int ret = 0;
        Integer alarmId;
-       SysTryCatch(NID_SYS, pAlarmImpl != null, r = E_INVALID_ARG, r, "There is no alarmImpl.");
-
-       ret = pthread_mutex_lock(&__lock);
-       SysTryCatch(NID_SYS, ret == 0, r = E_SYSTEM, r, "It is failed to lock mutex.");
+       SysTryReturnResult(NID_SYS, pAlarmImpl != null, E_SYSTEM, "There is no alarmImpl.");
 
        alarmId.value = pAlarmImpl->__alarmId.value;
-       SysTryCatch(NID_SYS, __alarmList.ContainsKey(alarmId) == true, r = E_OBJ_NOT_FOUND, r, "There is no registered alarm.");
+       SysTryReturnResult(NID_SYS, __alarmList.ContainsKey(alarmId) == true, E_SYSTEM, "There is no registered alarm.");
 
        r = UnregisterAlarm(pAlarmImpl);
-       SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to unregister reserved alarm list.");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to unregister reserved alarm list.");
 
        r = RegisterAlarm(pAlarmImpl);
-CATCH:
-       ret = pthread_mutex_unlock(&__lock);
-       SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It is failed to unlock mutex.");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to register alarm.");
        return r;
 }
 
@@ -495,6 +515,10 @@ _AlarmManager::OnAlarmExpired(int alarmId)
        _AlarmImpl* pAlarmImpl = null;
 
        SysTryCatch(NID_SYS, __pAlarmHashMap != null, r = E_SYSTEM, r, "Alarm list does not initialized");
+
+       ret = pthread_mutex_lock(&__lock);
+       SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "It is failed to lock mutex.");
+
        pValueEnum.reset(__pAlarmHashMap->GetValuesN(reservedAlarmId));
 
        SysLog(NID_SYS, "Alarm expire event is delivered. alarm id is %d", alarmId);
@@ -507,10 +531,8 @@ _AlarmManager::OnAlarmExpired(int alarmId)
 
        if(pValueEnum != null)
        {
-               ret = pthread_mutex_lock(&__lock);
-               SysTryCatch(NID_SYS, ret == 0, r = E_SYSTEM, r, "It is failed to lock mutex.");
-
                SysLog(NID_SYS, "Matching Alarm Id is %d \n", alarmId);
+
                r = pValueEnum->MoveNext();
                SysTryCatch(NID_SYS,  r == E_SUCCESS, r = E_SYSTEM, r, "Alarm enum value is not valid.");
                pAppId = static_cast< String* >(pValueEnum->GetCurrent());
@@ -565,9 +587,10 @@ _AlarmManager::OnAlarmExpired(int alarmId)
                        pValueEnum->Reset();
                }
 
-               ret = pthread_mutex_unlock(&__lock);
        }
 
+       ret = pthread_mutex_unlock(&__lock);
+
        if(pAlarmImpl != null)
        {
                pAlarmImpl->OnAlarmExpired(alarmId);
@@ -582,6 +605,8 @@ _AlarmManager::OnAlarmExpired(int alarmId)
                SetLastResult(r);
        }
 
+       return;
+
 CATCH:
        ret = pthread_mutex_unlock(&__lock);
        SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "It is failed to unlock mutex.");