*
*/
-
-
-
#define _BSD_SOURCE /*localtime_r requires */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
-#include<dbus/dbus.h>
#include<glib.h>
#include"alarm.h"
#include"alarm-internal.h"
#define WAKEUP_ALARM_APP_ID "org.tizen.alarm.ALARM" /*alarm ui
application's alarm's dbus_service name instead of 21 value */
+#define DST_TIME_DIFF 1
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;
/*
* 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.
*/
alarm->pid = __alarm_info->pid;
alarm->__alarm_info = __alarm_info;
- ALARM_MGR_LOG_PRINT("%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)) {
+ 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);
+ }
+ 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);
}
}
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) {
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;
- int wday;
+ 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);
- wday = duetime_tm.tm_wday;
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);
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)
duetime_tm.tm_year = start->year - 1900;
duetime_tm.tm_mon = start->month - 1;
duetime_tm.tm_mday = start->day;
+ duetime_tm.tm_isdst = -1;
due_time = mktime(&duetime_tm);
/* due_time = mktime(&duetime_tm); */
}
+
+ if (due_time - current_time < 10)
+ due_time += alarm_info->mode.u_interval.interval;
+
localtime_r(&due_time, &duetime_tm);
start->year = duetime_tm.tm_year + 1900;
time_t due_time = 0;
time_t current_time = 0;
struct tm duetime_tm;
- int wday;
alarm_info_t *alarm_info = &__alarm_info->alarm_info;
alarm_date_t *start = &alarm_info->start;
time(¤t_time);
localtime_r(¤t_time, &duetime_tm);
- wday = duetime_tm.tm_wday;
duetime_tm.tm_hour = start->hour;
duetime_tm.tm_min = start->min;
duetime_tm.tm_sec = start->sec;
time_t due_time = 0;
time_t current_time = 0;
struct tm duetime_tm;
- int wday;
alarm_info_t *alarm_info = &__alarm_info->alarm_info;
alarm_date_t *start = &alarm_info->start;
time(¤t_time);
localtime_r(¤t_time, &duetime_tm);
- wday = duetime_tm.tm_wday;
duetime_tm.tm_hour = start->hour;
duetime_tm.tm_min = start->min;
duetime_tm.tm_sec = start->sec;
time_t due_time = 0;
time_t current_time = 0;
struct tm duetime_tm;
+ 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;
duetime_tm.tm_hour = start->hour;
duetime_tm.tm_min = start->min;
duetime_tm.tm_sec = start->sec;
+ current_dst = duetime_tm.tm_isdst;
- if (__alarm_info->start != 0) {
+ duetime_tm.tm_isdst = -1;
- if (__alarm_info->start >= current_time) /*case 1*/ {
+ if (__alarm_info->start != 0) {
+ 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 (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. 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);
+ 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;
- /* 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 next_week = 0;
int interval = 1;
/*this week */
if (day == 7) {
day = 0;
- next_week = 1;
}
- 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;
- next_week = 1;
}
-
}
+
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)
{
-
+ int is_dst=0;
time_t current_time = 0;
time_t due_time = 0;
+ struct tm *cur_tm = NULL ;
+ struct tm *due_tm = NULL ;
alarm_info_t *alarm_info = &__alarm_info->alarm_info;
alarm_mode_t *mode = &alarm_info->mode;
time(¤t_time);
+ cur_tm = localtime(¤t_time);
+ if (cur_tm && cur_tm->tm_isdst > 0)
+ is_dst = 1;
ALARM_MGR_LOG_PRINT("mode->repeat is %d\n", mode->repeat);
return 0;
}
- ALARM_MGR_LOG_PRINT("due_time %d\n", due_time);
+ if (mode->repeat != ALARM_REPEAT_MODE_WEEKLY && mode->repeat != ALARM_REPEAT_MODE_ONCE) {
+ due_tm = localtime(&due_time);
+ if (is_dst==0 && due_tm && due_tm->tm_isdst==1){
+ ALARM_MGR_LOG_PRINT("DST alarm found, enable\n");
+ due_tm->tm_hour = due_tm->tm_hour - DST_TIME_DIFF;
+ } else if (is_dst==1 && due_tm && due_tm->tm_isdst==0){
+ ALARM_MGR_LOG_PRINT("DST alarm found. disable\n");
+ due_tm->tm_hour = due_tm->tm_hour + DST_TIME_DIFF;
+ }
+
+ if (due_tm)
+ due_time = mktime(due_tm);
+ }
+
+ 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");
__alarm_info->due_time = due_time;
return due_time;
-
}
static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time)
double interval = 0;
- ALARM_MGR_LOG_PRINT("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*/ {
+ 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);
+ 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;
}
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;
-
- ALARM_MGR_LOG_PRINT("%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*/ {
- 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;
-}
-#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