Add alarm update API
[platform/core/api/alarm.git] / src / alarm.c
index 8f7bbd4..ca08093 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
+#include <sys/time.h>
 
 #include <bundle.h>
 #include <alarm.h>
@@ -735,3 +736,162 @@ int alarm_schedule_service_once_at_date(app_control_h app_control, struct tm *da
        alarmmgr_free_alarm(alarm_info);
        return ALARM_ERROR_NONE;
 }
+
+int alarm_update_delay(int alarm_id, int delay)
+{
+       alarm_date_t internal_time;
+       alarm_entry_t *alarm_info;
+       int result;
+       struct timeval current_time;
+       struct tm date;
+
+       if (delay < 0 || alarm_id < 0) {
+               LOGE("INVALID_PARAMETER(0x%08x)", ALARM_ERROR_INVALID_PARAMETER);
+               return ALARM_ERROR_INVALID_PARAMETER;
+       }
+
+       gettimeofday(&current_time, NULL);
+       if (current_time.tv_usec > 500 * 1000)
+               current_time.tv_sec += (delay + 1);
+       else
+               current_time.tv_sec += delay;
+
+       localtime_r(&current_time.tv_sec, &date);
+
+       internal_time.year = date.tm_year + 1900;
+       internal_time.month = date.tm_mon + 1;
+       internal_time.day = date.tm_mday;
+
+       internal_time.hour = date.tm_hour;
+       internal_time.min = date.tm_min;
+       internal_time.sec = date.tm_sec;
+
+       alarm_info = alarmmgr_create_alarm();
+       if (alarm_info == NULL) {
+               LOGE("OUT_OF_MEMORY(0x%08x)", ALARM_ERROR_OUT_OF_MEMORY);
+               return ALARM_ERROR_OUT_OF_MEMORY;
+       }
+
+       result = alarmmgr_set_time(alarm_info, internal_time);
+       if (result < 0) {
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                       ALARM_UPDATE_FLAG_TIME);
+       alarmmgr_free_alarm(alarm_info);
+
+       return convert_error_code_to_alarm(__FUNCTION__, result);
+}
+
+int alarm_update_date(int alarm_id, struct tm *date)
+{
+       alarm_date_t internal_time;
+       alarm_entry_t *alarm_info;
+       int result;
+
+       if (date == NULL || alarm_id < 0) {
+               LOGE("INVALID_PARAMETER(0x%08x)", ALARM_ERROR_INVALID_PARAMETER);
+               return ALARM_ERROR_INVALID_PARAMETER;
+       }
+
+       alarm_info = alarmmgr_create_alarm();
+       if (alarm_info == NULL) {
+               LOGE("OUT_OF_MEMORY(0x%08x)", ALARM_ERROR_OUT_OF_MEMORY);
+               return ALARM_ERROR_OUT_OF_MEMORY;
+       }
+
+       internal_time.year = date->tm_year + 1900;
+       internal_time.month = date->tm_mon + 1;
+       internal_time.day = date->tm_mday;
+
+       internal_time.hour = date->tm_hour;
+       internal_time.min = date->tm_min;
+       internal_time.sec = date->tm_sec;
+
+       result = alarmmgr_set_time(alarm_info, internal_time);
+       if (result < 0) {
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                       ALARM_UPDATE_FLAG_TIME);
+       alarmmgr_free_alarm(alarm_info);
+
+       return convert_error_code_to_alarm(__FUNCTION__, result);
+}
+
+int alarm_update_period(int alarm_id, int period)
+{
+       alarm_entry_t *alarm_info;
+       int result;
+
+       if (period < 0 || alarm_id < 0) {
+               LOGE("INVALID_PARAMETER(0x%08x)", ALARM_ERROR_INVALID_PARAMETER);
+               return ALARM_ERROR_INVALID_PARAMETER;
+       }
+
+       alarm_info = alarmmgr_create_alarm();
+       if (alarm_info == NULL) {
+               LOGE("OUT_OF_MEMORY(0x%08x)", ALARM_ERROR_OUT_OF_MEMORY);
+               return ALARM_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (period == 0) {
+               result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                               ALARM_UPDATE_FLAG_CLEAR_PERIOD);
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_set_repeat_mode(alarm_info,
+                       ALARM_REPEAT_MODE_REPEAT, period);
+       if (result < 0) {
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                       ALARM_UPDATE_FLAG_PERIOD);
+       alarmmgr_free_alarm(alarm_info);
+
+       return convert_error_code_to_alarm(__FUNCTION__, result);
+}
+
+int alarm_update_week_flag(int alarm_id, int week_flag)
+{
+       alarm_entry_t *alarm_info;
+       int result;
+
+       if (week_flag < 0 || alarm_id < 0) {
+               LOGE("INVALID_PARAMETER(0x%08x)", ALARM_ERROR_INVALID_PARAMETER);
+               return ALARM_ERROR_INVALID_PARAMETER;
+       }
+
+       alarm_info = alarmmgr_create_alarm();
+       if (alarm_info == NULL) {
+               LOGE("OUT_OF_MEMORY(0x%08x)", ALARM_ERROR_OUT_OF_MEMORY);
+               return ALARM_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (week_flag == 0) {
+               result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                               ALARM_UPDATE_FLAG_CLEAR_WEEK_FLAG);
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_WEEKLY, week_flag);
+       if (result < 0) {
+               alarmmgr_free_alarm(alarm_info);
+               return convert_error_code_to_alarm(__FUNCTION__, result);
+       }
+
+       result = alarmmgr_update_alarm(alarm_id, alarm_info,
+                       ALARM_UPDATE_FLAG_WEEK);
+       alarmmgr_free_alarm(alarm_info);
+
+       return convert_error_code_to_alarm(__FUNCTION__, result);
+}