X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=alarm-manager-schedule.c;h=2e3f5e6264efef9942d737f1cc8064c82a8482ac;hb=3e3f595e5bea0c7c53f40925862b0ca1a59f743e;hp=34475c8bc491b24e1434a2b259e90047f17fabc1;hpb=84f1747eede6a42a0ae333f21c315def813b8a8e;p=framework%2Fappfw%2Falarm-manager.git diff --git a/alarm-manager-schedule.c b/alarm-manager-schedule.c index 34475c8..2e3f5e6 100644 --- a/alarm-manager-schedule.c +++ b/alarm-manager-schedule.c @@ -20,9 +20,6 @@ * */ - - - #define _BSD_SOURCE /*localtime_r requires */ #include #include @@ -31,7 +28,6 @@ #include #include -#include #include #include"alarm.h" @@ -43,37 +39,17 @@ extern __alarm_server_context_t alarm_context; extern GSList *g_scheduled_alarm_list; -#ifdef __ALARM_BOOT -extern bool enable_power_on_alarm; -#endif - -static void __free_scheduled_alarm(gpointer data, gpointer user_data); static time_t __alarm_next_duetime_once(__alarm_info_t *__alarm_info); static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info); static time_t __alarm_next_duetime_annually(__alarm_info_t *__alarm_info); static time_t __alarm_next_duetime_monthly(__alarm_info_t *__alarm_info); static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info); static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time); -#ifdef __ALARM_BOOT -/*alarm boot*/ -static bool __find_next_alarm_to_be_scheduled_power_on(time_t *min_due_time); -bool _alarm_find_mintime_power_on(time_t *min_time); -#endif bool _alarm_schedule(void); -static void __free_scheduled_alarm(gpointer data, gpointer user_data) -{ - if (data != NULL) { - g_free(data); - } -} - bool _clear_scheduled_alarm_list() { - - g_slist_foreach(g_scheduled_alarm_list, __free_scheduled_alarm, NULL); - g_slist_free(g_scheduled_alarm_list); - + g_slist_free_full(g_scheduled_alarm_list, g_free); g_scheduled_alarm_list = NULL; return true; @@ -91,9 +67,9 @@ bool _add_to_scheduled_alarm_list(__alarm_info_t *__alarm_info) /* * 20080328. Sewook Park(sewook7.park@samsung.com) * When multiple alarms are expired at same time, dbus rpc call for alarm - * ui should be invoked first.(Ui conflicting manager cannot manage the - * different kinds of alarm popups(wake up alarm/org alarm) correctly, - * when they are displayed at same time)So when arranging the schedule + * ui should be invoked first.(Ui conflicting manager cannot manage the + * different kinds of alarm popups(wake up alarm/org alarm) correctly, + * when they are displayed at same time)So when arranging the schedule * alarm list, wake up alarm element is located ahead. */ @@ -114,41 +90,30 @@ bool _add_to_scheduled_alarm_list(__alarm_info_t *__alarm_info) alarm->__alarm_info = __alarm_info; SECURE_LOGD("%s :alarm->pid =%d, app_service_name=%s(%u)\n", - __FUNCTION__, alarm->pid, - g_quark_to_string(alarm-> - __alarm_info->quark_app_service_name), - alarm->__alarm_info->quark_app_service_name); - - if (alarm->__alarm_info->quark_app_service_name != - g_quark_from_string(WAKEUP_ALARM_APP_ID)) { - g_scheduled_alarm_list = - g_slist_append(g_scheduled_alarm_list, alarm); - return true; - } else { - for (iter = g_scheduled_alarm_list; iter != NULL; - iter = g_slist_next(iter)) { + __FUNCTION__, alarm->pid, + g_quark_to_string(alarm->__alarm_info->quark_app_service_name), + alarm->__alarm_info->quark_app_service_name); + + if (alarm->__alarm_info->quark_app_service_name != g_quark_from_string(WAKEUP_ALARM_APP_ID)) { + g_scheduled_alarm_list = g_slist_append(g_scheduled_alarm_list, alarm); + } + else { + for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) { count++; entry = iter->data; - if (entry->__alarm_info->quark_app_service_name != - g_quark_from_string(WAKEUP_ALARM_APP_ID)) { + if (entry->__alarm_info->quark_app_service_name != g_quark_from_string(WAKEUP_ALARM_APP_ID)) { prior = true; break; } } if (!prior) { - g_scheduled_alarm_list = - g_slist_append(g_scheduled_alarm_list, alarm); - ALARM_MGR_LOG_PRINT( - "appended : prior is %d\tcount is %d\n", prior, - count); - } else { - g_scheduled_alarm_list = - g_slist_insert(g_scheduled_alarm_list, alarm, - count - 1); - ALARM_MGR_LOG_PRINT( - "appended : prior is %d\tcount is %d\n", prior, - count); + g_scheduled_alarm_list = g_slist_append(g_scheduled_alarm_list, alarm); + ALARM_MGR_LOG_PRINT("appended : prior is %d\tcount is %d\n", prior, count); + } + else { + g_scheduled_alarm_list = g_slist_insert(g_scheduled_alarm_list, alarm, count - 1); + ALARM_MGR_LOG_PRINT("appended : prior is %d\tcount is %d\n", prior, count); } } @@ -161,17 +126,14 @@ bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id) GSList *iter = NULL; __scheduled_alarm_t *alarm = NULL; - for (iter = g_scheduled_alarm_list; iter != NULL; - iter = g_slist_next(iter)) { + for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) { alarm = iter->data; if (alarm->alarm_id == alarm_id) { - g_scheduled_alarm_list = - g_slist_remove(g_scheduled_alarm_list, iter->data); - /*g_free(iter->data); */ + g_scheduled_alarm_list = g_slist_remove(g_scheduled_alarm_list, iter->data); + g_free(alarm); result = true; break; } - } if (g_slist_length(g_scheduled_alarm_list) == 0) { @@ -184,18 +146,25 @@ bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id) static time_t __alarm_next_duetime_once(__alarm_info_t *__alarm_info) { time_t due_time = 0; + time_t due_time_tmp = 0; time_t current_time = 0; struct tm duetime_tm; + struct tm tmp_tm; + int current_dst = 0; alarm_info_t *alarm_info = &__alarm_info->alarm_info; alarm_date_t *start = &alarm_info->start; + tzset(); time(¤t_time); localtime_r(¤t_time, &duetime_tm); duetime_tm.tm_hour = start->hour; duetime_tm.tm_min = start->min; duetime_tm.tm_sec = start->sec; + current_dst = duetime_tm.tm_isdst; + duetime_tm.tm_isdst = -1; + if (start->year == 0 && start->month == 0 && start->day == 0) /*any date */ { due_time = mktime(&duetime_tm); @@ -209,8 +178,33 @@ static time_t __alarm_next_duetime_once(__alarm_info_t *__alarm_info) due_time = mktime(&duetime_tm); } - return due_time; + if (due_time <= current_time) { + ALARM_MGR_EXCEPTION_PRINT("duetime is less than or equal to current time. current_dst = %d", current_dst); + duetime_tm.tm_isdst = 0; // DST off + due_time_tmp = mktime(&duetime_tm); + localtime_r(&due_time_tmp, &tmp_tm); + + ALARM_MGR_LOG_PRINT("%d:%d:%d. duetime = %d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, due_time); + if (tmp_tm.tm_hour == start->hour && tmp_tm.tm_min == start->min && tmp_tm.tm_sec == start->sec ) { + due_time = due_time_tmp; + ALARM_MGR_EXCEPTION_PRINT("due_time = %d",due_time); + } + } + else { + localtime_r(&due_time, &tmp_tm); + ALARM_MGR_LOG_PRINT("%d:%d:%d. current_dst = %d, duetime_dst = %d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, current_dst, tmp_tm.tm_isdst); + + if (current_dst == 1 && tmp_tm.tm_isdst == 1 && tmp_tm.tm_hour == start->hour + 1) { + // When the calculated duetime is forwarded 1hour due to DST, Adds 23hours. + due_time += 60 * 60 * 23; + localtime_r(&due_time, &duetime_tm); + ALARM_MGR_EXCEPTION_PRINT("due_time = %d",due_time); + } + } + + ALARM_MGR_EXCEPTION_PRINT("Final due_time = %d, %s",due_time, ctime(&due_time)); + return due_time; } static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info) @@ -336,12 +330,14 @@ static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info) struct tm tmp_tm; int wday; int current_dst = 0; + struct tm before_tm; + struct tm after_tm; alarm_info_t *alarm_info = &__alarm_info->alarm_info; alarm_date_t *start = &alarm_info->start; - alarm_mode_t *mode = &alarm_info->mode; + tzset(); time(¤t_time); localtime_r(¤t_time, &duetime_tm); wday = duetime_tm.tm_wday; @@ -349,46 +345,62 @@ static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info) duetime_tm.tm_min = start->min; duetime_tm.tm_sec = start->sec; current_dst = duetime_tm.tm_isdst; + duetime_tm.tm_isdst = -1; if (__alarm_info->start != 0) { - - if (__alarm_info->start >= current_time) /*case 1*/ { + if (__alarm_info->start >= current_time) { duetime_tm.tm_year = start->year - 1900; duetime_tm.tm_mon = start->month - 1; duetime_tm.tm_mday = start->day; - } else /*case 3*/ { - /*don't need to be set */ } } - /*case 4 */ due_time = mktime(&duetime_tm); + localtime_r(&due_time, &tmp_tm); + ALARM_MGR_EXCEPTION_PRINT("%d:%d:%d. duetime = %d, isdst = %d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, due_time, tmp_tm.tm_isdst); - if( current_dst == 1 && due_time < current_time) { + if (due_time <= current_time) { + ALARM_MGR_EXCEPTION_PRINT("duetime is less than or equal to current time. current_dst = %d", current_dst); duetime_tm.tm_isdst = 0; + due_time = mktime(&duetime_tm); localtime_r(&due_time, &tmp_tm); - SECURE_LOGD("%d %d %d : %d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, due_time); - if( tmp_tm.tm_hour != start->hour || tmp_tm.tm_min != start->min || tmp_tm.tm_sec != start->sec ) { + + SECURE_LOGD("%d:%d:%d. duetime = %d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, due_time); + if (tmp_tm.tm_hour != start->hour || tmp_tm.tm_min != start->min || tmp_tm.tm_sec != start->sec ) { duetime_tm.tm_hour = start->hour; duetime_tm.tm_min = start->min; duetime_tm.tm_sec = start->sec; duetime_tm.tm_isdst = -1; due_time = mktime(&duetime_tm); - SECURE_LOGD("%d",due_time); + ALARM_MGR_EXCEPTION_PRINT("due_time = %d",due_time); } } + else { + if (current_dst == 1 && tmp_tm.tm_isdst == 1 && tmp_tm.tm_hour == start->hour + 1) { + // When the calculated duetime is forwarded 1hour due to DST, Adds 23hours. + due_time += 60 * 60 * 23; + localtime_r(&due_time, &duetime_tm); + ALARM_MGR_EXCEPTION_PRINT("due_time = %d",due_time); + } + } + + // Gets the dst before calculating the duedate as interval + localtime_r(&due_time, &before_tm); + SECURE_LOGD("before_dst = %d", before_tm.tm_isdst); + wday = duetime_tm.tm_wday; - SECURE_LOGD("current_time(%d) due_time(%d)", current_time, due_time); - /* CQ defect(72810) : only one time alarm function is not working + ALARM_MGR_EXCEPTION_PRINT("current_time(%d) due_time(%d)", current_time, due_time); + + /* CQ defect(72810) : only one time alarm function is not working under all recurrence_disabled. */ - if (due_time > current_time && mode->u_interval.day_of_week == 0) + if (due_time > current_time && mode->u_interval.day_of_week == 0) { return due_time; + } - if (current_time >= due_time - || !(mode->u_interval.day_of_week & 1 << wday)) { + if (current_time >= due_time || !(mode->u_interval.day_of_week & 1 << wday)) { int day = wday + 1; int interval = 1; /*this week */ @@ -397,22 +409,32 @@ static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info) day = 0; } - while (!(mode->u_interval.day_of_week & 1 << day) - && interval < 8) { + while (!(mode->u_interval.day_of_week & 1 << day) && interval < 8) { day += 1; interval += 1; if (day == 7) { day = 0; } - } + ALARM_MGR_LOG_PRINT("interval : %d\n", interval); due_time += 60 * 60 * 24 * interval; } - return due_time; + // Gets the dst after calculating the duedate as interval + localtime_r(&due_time, &after_tm); + SECURE_LOGD("after_dst = %d", after_tm.tm_isdst); + + // Revise the duetime as difference in tm_isdst + if (before_tm.tm_isdst == 1 && after_tm.tm_isdst == 0) { + due_time += 60 * 60; // Add an hour + } else if (before_tm.tm_isdst == 0 && after_tm.tm_isdst == 1) { + due_time -= 60 * 60; // Subtract an hour + } + ALARM_MGR_EXCEPTION_PRINT("Final due_time = %d", due_time); + return due_time; } time_t _alarm_next_duetime(__alarm_info_t *__alarm_info) @@ -449,7 +471,7 @@ time_t _alarm_next_duetime(__alarm_info_t *__alarm_info) return 0; } - if (mode->repeat != ALARM_REPEAT_MODE_WEEKLY) { + if (mode->repeat != ALARM_REPEAT_MODE_WEEKLY && mode->repeat != ALARM_REPEAT_MODE_ONCE) { due_tm = localtime(&due_time); if (is_dst==0 && due_tm->tm_isdst==1){ ALARM_MGR_LOG_PRINT("DST alarm found, enable\n"); @@ -458,10 +480,10 @@ time_t _alarm_next_duetime(__alarm_info_t *__alarm_info) ALARM_MGR_LOG_PRINT("DST alarm found. disable\n"); due_tm->tm_hour = due_tm->tm_hour + DST_TIME_DIFF; } - due_time = mktime(due_tm); + due_time = mktime(due_tm); } - ALARM_MGR_LOG_PRINT("due_time %d\n", due_time); + ALARM_MGR_EXCEPTION_PRINT("alarm_id: %d, next duetime: %d", __alarm_info->alarm_id, due_time); if (__alarm_info->end != 0 && __alarm_info->end < due_time) { ALARM_MGR_LOG_PRINT("due time > end time"); @@ -471,7 +493,6 @@ time_t _alarm_next_duetime(__alarm_info_t *__alarm_info) __alarm_info->due_time = due_time; return due_time; - } static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time) @@ -493,89 +514,14 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time) SECURE_LOGD("alarm[%d] with duetime(%u) at current(%u) pid: (%d)\n", entry->alarm_id, due_time, current_time, entry->pid); - if (due_time == 0) /*0 means this alarm - has been disabled*/ { - continue; - } - - interval = difftime(due_time, current_time); - - if (interval <= 0) /*2008.08.06 when the alarm expires, - it may makes an error.*/ { - ALARM_MGR_LOG_PRINT("this may be error.. alarm[%d]\n", - entry->alarm_id); - continue; - } - - interval = difftime(due_time, min_time); - - if ((interval < 0) || min_time == -1) { - min_time = due_time; - } - - } - - *min_due_time = min_time; - return true; -} - -#ifdef __ALARM_BOOT -/*alarm boot*/ -static bool __find_next_alarm_to_be_scheduled_power_on(time_t *min_due_time) -{ - time_t current_time; - time_t min_time = -1; - time_t due_time; - struct tm duetime_tm; - __alarm_info_t *entry = NULL; - struct tm *temp_info; - GSList *iter = NULL; - - time(¤t_time); - - tzset(); /*for portability tzset() need to be called - before locatime_r,refer manpage localtime_r*/ - temp_info = localtime_r(¤t_time, &duetime_tm); - - if (temp_info != NULL) - ALARM_MGR_LOG_PRINT - ("__find_next_alarm_to_be_scheduled_power_on " - ": %d %d %d %d %d\n", temp_info->tm_year, - temp_info->tm_mon, temp_info->tm_mday, temp_info->tm_hour, - temp_info->tm_min); - - for (iter = alarm_context.alarms; iter != NULL; - iter = g_slist_next(iter)) { - entry = iter->data; - due_time = entry->due_time; - - double interval = 0; - - SECURE_LOGD("%s\n", g_quark_to_string( - entry->quark_dst_service_name)); - - /*if(entry->quark_dst_service_name != g_quark_from_string - (WAKEUP_ALARM_APP_ID)) continue; */ - - if (strcmp - (g_quark_to_string(entry->quark_dst_service_name), - WAKEUP_ALARM_APP_ID) != 0) - continue; - - ALARM_MGR_LOG_PRINT( - "alarm[%d] with duetime(%u) at current(%u)\n", - entry->alarm_id, due_time, current_time); - if (due_time == 0) /* 0 means this alarm has - been disabled*/ { + if (due_time == 0) /*0 means this alarm has been disabled*/ { continue; } interval = difftime(due_time, current_time); - if (interval <= 0) /*2008.08.06 when the alarm expires, - it may makes an error.*/ { - ALARM_MGR_LOG_PRINT("this may be error.. alarm[%d]\n", - entry->alarm_id); + if (interval <= 0) /*2008.08.06 when the alarm expires, it may makes an error.*/ { + ALARM_MGR_EXCEPTION_PRINT("The duetime of alarm(%d) is OVER.", entry->alarm_id); continue; } @@ -590,60 +536,29 @@ static bool __find_next_alarm_to_be_scheduled_power_on(time_t *min_due_time) *min_due_time = min_time; return true; } -#endif bool _alarm_schedule() { - time_t current_time; - time_t due_time; - time_t min_time; - GSList *iter; + time_t due_time = 0; + time_t min_time = 0; + GSList *iter = NULL; __alarm_info_t *entry = NULL; - int min = -1; - - time(¤t_time); - - min_time = 0; - __find_next_alarm_to_be_scheduled(&min_time); if (min_time == -1) { - ALARM_MGR_LOG_PRINT("[alarm-server][schedule]: There is no " - "alarm to be scheduled..\n"); + ALARM_MGR_LOG_PRINT("[alarm-server][schedule]: There is no alarm to be scheduled."); } else { - for (iter = alarm_context.alarms; iter != NULL; - iter = g_slist_next(iter)) { + for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = iter->data; due_time = entry->due_time; if (due_time == min_time) { _add_to_scheduled_alarm_list(entry); } - - } - - _alarm_set_timer(&alarm_context, alarm_context.timer, min_time, - min); - - } - - return true; -} - -#ifdef __ALARM_BOOT -/*alarm boot*/ -bool _alarm_find_mintime_power_on(time_t *min_time) -{ - - __find_next_alarm_to_be_scheduled_power_on(min_time); - - if ((*min_time) == -1) { - ALARM_MGR_LOG_PRINT("[alarm-server][schedule]: There is no " - "alarm boot to be scheduled..\n"); - return false; + } + _alarm_set_timer(&alarm_context, alarm_context.timer, min_time); } return true; } -#endif