4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Venkatesha Sarpangala <sarpangala.v@samsung.com>, Jayoun Lee <airjany@samsung.com>,
7 * Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
25 #define _BSD_SOURCE /*for localtime_r*/
36 #include<dbus/dbus-glib-lowlevel.h>
38 #if !GLIB_CHECK_VERSION (2, 31, 0)
39 #include <glib/gmacros.h>
43 /*#include "global-gconf.h"*/
45 #include"alarm-internal.h"
47 /*#include"limo-event-delivery.h"*/
52 #include <security-server.h>
55 #include <vconf-keys.h>
57 #define SIG_TIMER 0x32
58 #define WAKEUP_ALARM_APP_ID "org.tizen.alarm.ALARM"
59 /* alarm ui application's alarm's dbus_service name instead of 21
60 (alarm application's app_id) value */
61 #define WAKEUP_ALARMBOOTING_APP_ID "org.tizen.alarmboot.ui.ALARM"
62 /*alrmbooting ui application's dbus_service name instead of 121(alarmbooting
63 application's app_id) value */
65 #include "tapi_misc_ext.h"
67 #include "tapi_misc_data.h"
68 #include "tapi_power.h"
73 __alarm_server_context_t alarm_context;
74 bool g_dummy_timer_is_set = FALSE;
76 GSList *g_scheduled_alarm_list = NULL;
78 GSList *g_expired_alarm_list = NULL;
80 #ifndef RTC_WKALM_BOOT_SET
81 #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
85 bool enable_power_on_alarm;
87 time_t ab_due_time = -1;
88 bool poweron_alarm_expired = false;
91 /* 2008. 6. 3 sewook7.park
92 When the alarm becoms sleeping mode, alarm timer is not expired.
93 So using RTC, phone is awaken before alarm rings.
95 #define __WAKEUP_USING_RTC__
96 #ifdef __WAKEUP_USING_RTC__
98 #include <linux/rtc.h>
99 #include <sys/ioctl.h>
102 static const char default_rtc[] = "/dev/rtc1";
103 static const char power_rtc[] = "/dev/rtc0";
105 #endif /*__WAKEUP_USING_RTC__*/
107 static bool __alarm_add_to_list(__alarm_info_t *__alarm_info,
108 alarm_id_t *alarm_id);
109 static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
110 __alarm_info_t *__alarm_info,
112 static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id,
114 static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
115 __alarm_info_t *__alarm_info);
116 static bool __alarm_update_due_time_of_all_items_in_list(double diff_time);
117 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
118 int pid, char *app_service_name, char *app_service_name_mod,
119 const char *dst_service_name, const char *dst_service_name_mod, int *error_code);
120 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
121 int pid, char *bundle_data, int *error_code);
123 static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code);
124 static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
125 alarm_info_t *alarm_info, int *error_code);
126 static bool __alarm_power_on(int app_id, bool on_off, int *error_code);
127 static bool __alarm_power_off(int app_id, int *error_code);
128 static bool __alarm_check_next_duetime(int app_id, int *error_code);
129 static void __alarm_send_noti_to_application(const char *app_service_name,
130 alarm_id_t alarm_id);
131 static void __alarm_expired();
132 static gboolean __alarm_handler_idle();
133 static void __alarm_handler(int sigNum, siginfo_t *pSigInfo, void *pUContext);
134 static void __clean_registry();
135 static bool __alarm_manager_reset();
136 static void __on_system_time_changed(keynode_t *node, void *data);
137 static void __on_system_time_external_changed(keynode_t *node, void *data);
138 static void __initialize_timer();
139 static void __initialize_alarm_list();
140 static void __initialize_scheduled_alarm_lsit();
141 static void __hibernation_leave_callback();
142 static bool __initialize_noti();
144 static bool __initialize_dbus();
145 static bool __initialize_db();
146 static void __initialize();
147 static bool __check_false_alarm();
148 static DBusHandlerResult __alarm_server_filter(DBusConnection *connection,
149 DBusMessage *message,
152 static void __rtc_set()
154 #ifdef __WAKEUP_USING_RTC__
156 const char *rtc = default_rtc;
157 const char *rtc0 = power_rtc;
159 struct rtc_time rtc_tm;
160 struct rtc_wkalrm rtc_wk;
163 #ifdef _SIMUL /*if build is simulator, we don't need to set
164 RTC because RTC does not work in simulator.*/
165 ALARM_MGR_EXCEPTION_PRINT("because it is simulator's mode, "
166 "we don't set RTC.\n");
170 fd = open(rtc, O_RDONLY);
172 fd = open(rtc0, O_RDONLY);
174 ALARM_MGR_EXCEPTION_PRINT("RTC open failed.\n");
179 /* Read the RTC time/date */
180 int retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
182 ALARM_MGR_EXCEPTION_PRINT("RTC_RD_TIME ioctl failed");
187 ALARM_MGR_LOG_PRINT("\n\nCurrent RTC date/time is %d-%d-%d, "
188 "%02d:%02d:%02d.\n", rtc_tm.tm_mday, rtc_tm.tm_mon + 1,
189 rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min,
192 ALARM_MGR_LOG_PRINT("alarm_context.c_due_time is %d\n", \
193 alarm_context.c_due_time);
195 if (alarm_context.c_due_time != -1) {
196 time_t due_time = alarm_context.c_due_time;
197 gmtime_r(&due_time, &due_tm);
199 rtc_tm.tm_mday = due_tm.tm_mday;
200 rtc_tm.tm_mon = due_tm.tm_mon;
201 rtc_tm.tm_year = due_tm.tm_year;
202 rtc_tm.tm_hour = due_tm.tm_hour;
203 rtc_tm.tm_min = due_tm.tm_min;
204 rtc_tm.tm_sec = due_tm.tm_sec;
205 memcpy(&rtc_wk.time, &rtc_tm, sizeof(rtc_tm));
209 ALARM_MGR_LOG_PRINT("\n\nSetted RTC Alarm date/time is "
210 "%d-%d-%d, %02d:%02d:%02d.\n", rtc_tm.tm_mday,
211 rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
212 rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
214 retval = ioctl(fd, RTC_WKALM_SET, &rtc_wk);
216 if (errno == ENOTTY) {
217 ALARM_MGR_EXCEPTION_PRINT("\nAlarm IRQs not"
220 ALARM_MGR_EXCEPTION_PRINT("RTC_ALM_SET ioctl");
224 ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is setted");
226 /* Enable alarm interrupts */
227 retval = ioctl(fd, RTC_AIE_ON, 0);
229 ALARM_MGR_EXCEPTION_PRINT("RTC_AIE_ON ioctl failed");
233 ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is on");
235 ALARM_MGR_LOG_PRINT("[alarm-server]alarm_context.c_due_time is"
236 "less than 10 sec. RTC alarm does not need to be set\n");
240 #endif /* __WAKEUP_USING_RTC__ */
243 int _set_rtc_time(time_t _time)
249 struct rtc_time rtc_tm = { 0, };
250 const char *rtc0 = power_rtc;
251 const char *rtc1 = default_rtc;
252 struct tm time_r = { 0, };
254 fd0 = open(rtc0, O_RDONLY);
255 fd1 = open(rtc1, O_RDONLY);
258 ALARM_MGR_LOG_PRINT("error to open /dev/rtc0.");
263 ALARM_MGR_LOG_PRINT("error to open /dev/rtc1.");
267 memset(&rtc_tm, 0, sizeof(struct rtc_time));
270 (void) gmtime_r(&_time, &time_r);
272 /* Write the RTC time/date 2008:05:21 19:20:00 */
275 rtc_tm.tm_mday = time_r.tm_mday;
276 rtc_tm.tm_mon = time_r.tm_mon;
277 rtc_tm.tm_year = time_r.tm_year;
278 rtc_tm.tm_hour = time_r.tm_hour;
279 rtc_tm.tm_min = time_r.tm_min;
280 rtc_tm.tm_sec = time_r.tm_sec;
283 retval0 = ioctl(fd0, RTC_SET_TIME, &rtc_tm);
288 ALARM_MGR_LOG_PRINT("error to ioctl fd0.");
295 retval1 = ioctl(fd1, RTC_SET_TIME, &rtc_tm);
300 ALARM_MGR_LOG_PRINT("error to ioctl fd1.");
308 bool __alarm_clean_list()
312 for (iter = alarm_context.alarms; iter != NULL;
313 iter = g_slist_next(iter)) {
317 g_slist_free(alarm_context.alarms);
321 static bool __alarm_add_to_list(__alarm_info_t *__alarm_info,
322 alarm_id_t *alarm_id)
325 bool unique_id = false;
326 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
327 __alarm_info_t *entry = NULL;
331 /* FIXME: alarm id must be unique. */
332 __alarm_info->alarm_id = (int)(void *)__alarm_info;
333 ALARM_MGR_LOG_PRINT("__alarm_info->alarm_id is %d", \
334 __alarm_info->alarm_id);
336 while (unique_id == false) {
339 for (iter = alarm_context.alarms; iter != NULL;
340 iter = g_slist_next(iter)) {
342 if (entry->alarm_id == __alarm_info->alarm_id) {
343 __alarm_info->alarm_id++;
351 ALARM_MGR_LOG_PRINT("[alarm-server]: before add\n");
352 for (iter = alarm_context.alarms; iter != NULL;
353 iter = g_slist_next(iter)) {
355 /*ALARM_MGR_LOG_PRINT("[alarm-server]: alarm_id(%d)\n",
359 alarm_context.alarms =
360 g_slist_append(alarm_context.alarms, __alarm_info);
362 ALARM_MGR_LOG_PRINT("[alarm-server]: after add\n");
363 for (iter = alarm_context.alarms; iter != NULL;
364 iter = g_slist_next(iter)) {
366 ALARM_MGR_LOG_PRINT("[alarm-server]: alarm_id(%d)\n",
370 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
371 _save_alarms(__alarm_info);
374 *alarm_id = __alarm_info->alarm_id;
379 static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
380 __alarm_info_t *__alarm_info,
384 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
386 __alarm_info_t *entry = NULL;
388 for (iter = alarm_context.alarms; iter != NULL;
389 iter = g_slist_next(iter)) {
391 if (entry->alarm_id == alarm_id) {
394 __alarm_info->quark_app_unique_name =
395 entry->quark_app_unique_name;
396 __alarm_info->quark_dst_service_name =
397 entry->quark_dst_service_name;
398 memcpy(entry, __alarm_info, sizeof(__alarm_info_t));
406 *error_code = ERR_ALARM_INVALID_ID;
410 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
411 _update_alarms(__alarm_info);
417 static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id,
422 alarm_info_t *alarm_info = NULL;
425 __alarm_info_t *entry = NULL;
428 ALARM_MGR_LOG_PRINT("[alarm-server]: before del : alarm id(%d)\n",
431 for (iter = alarm_context.alarms; iter != NULL;
432 iter = g_slist_next(iter)) {
434 if (entry->alarm_id == alarm_id) {
435 alarm_info = &entry->alarm_info;
437 ALARM_MGR_LOG_PRINT("[alarm-server]: "
438 "__alarm_remove_from_list : alarm id(%d)\n",
441 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
442 _delete_alarms(alarm_id);
445 alarm_context.alarms =
446 g_slist_remove(alarm_context.alarms, iter->data);
453 ALARM_MGR_LOG_PRINT("[alarm-server]: after del\n");
457 *error_code = ERR_ALARM_INVALID_ID;
464 static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
465 __alarm_info_t *__alarm_info)
467 alarm_date_t *start = &alarm_info->start;
468 alarm_date_t *end = &alarm_info->end;
470 struct tm alarm_tm = { 0, };
472 if (start->year != 0) {
473 alarm_tm.tm_year = start->year - 1900;
474 alarm_tm.tm_mon = start->month - 1;
475 alarm_tm.tm_mday = start->day;
477 alarm_tm.tm_hour = 0;
481 __alarm_info->start = mktime(&alarm_tm);
483 __alarm_info->start = 0;
486 if (end->year != 0) {
487 alarm_tm.tm_year = end->year - 1900;
488 alarm_tm.tm_mon = end->month - 1;
489 alarm_tm.tm_mday = end->day;
491 alarm_tm.tm_hour = 23;
492 alarm_tm.tm_min = 59;
493 alarm_tm.tm_sec = 59;
495 __alarm_info->end = mktime(&alarm_tm);
497 __alarm_info->end = 0;
504 static bool alarm_get_tz_info(int *gmt_idx, int *dst)
506 GConfValue *value1 = NULL;
507 GConfValue *value2 = NULL;
508 GConfClient* gConfClient = NULL;
511 gConfClient = gconf_client_get_default();
514 value1 = gconf_client_get(gConfClient, SETTINGS_CLOCKTIMEZONE,
517 ALARM_MGR_LOG_PRINT("__on_system_time_changed:
518 gconf_client_get() failed:
519 error:[%s]\n", err->message);
523 *gmt_idx = gconf_value_get_int(value1);
524 ALARM_MGR_LOG_PRINT("gconf return gmt_idx =%d\n ", *gmt_idx);
526 value2 = gconf_client_get(gConfClient,
527 SETTINGS_DAYLIGHTSTATUS, &err);
529 ALARM_MGR_LOG_PRINT("__on_system_time_changed:
530 gconf_client_get() failed: error:[%s]\n", err->message);
535 *dst = gconf_value_get_int(value2);
536 ALARM_MGR_LOG_PRINT("gconf return dst =%d\n ", *dst);
538 if(gConfClient != NULL) {
539 g_object_unref(gConfClient);
544 ALARM_MGR_LOG_PRINT("check the gconf setting failed!!!!! \n ");
547 gconf_value_free(value1);
551 gconf_value_free(value2);
559 static bool __alarm_update_due_time_of_all_items_in_list(double diff_time)
562 time_t min_time = -1;
565 __alarm_info_t *entry = NULL;
566 struct tm *p_time = NULL ;
567 struct tm due_time_result ;
568 struct tm fixed_time = { 0, };
570 for (iter = alarm_context.alarms; iter != NULL;
571 iter = g_slist_next(iter)) {
573 alarm_info_t *alarm_info = &(entry->alarm_info);
574 if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) {
575 /*diff_time ó¸® */
577 entry->due_time += diff_time;
579 alarm_date_t *start = &alarm_info->start; /**< start
581 alarm_date_t *end = &alarm_info->end;;
582 /**< end time of the alarm */
585 p_time = localtime_r(&entry->due_time, &due_time_result);
586 if (p_time != NULL) {
587 start->year = p_time->tm_year + 1900;
588 start->month = p_time->tm_mon + 1;
589 start->day = p_time->tm_mday;
590 start->hour = p_time->tm_hour;
591 start->min = p_time->tm_min;
592 start->sec = p_time->tm_sec;
594 end->year = p_time->tm_year + 1900;
595 end->month = p_time->tm_mon + 1;
596 end->day = p_time->tm_mday;
599 memset(&fixed_time, 0, sizeof(fixed_time));
600 fixed_time.tm_year = p_time->tm_year;
601 fixed_time.tm_mon = p_time->tm_mon;
602 fixed_time.tm_mday = p_time->tm_mday;
603 fixed_time.tm_hour = 0;
604 fixed_time.tm_min = 0;
605 fixed_time.tm_sec = 0;
607 entry->start = mktime(&fixed_time);
609 fixed_time.tm_hour = 23;
610 fixed_time.tm_min = 59;
611 fixed_time.tm_sec = 59;
613 entry->end = mktime(&fixed_time);
615 ALARM_MGR_LOG_PRINT("alarm_info->alarm_type is "
616 "ALARM_TYPE_RELATIVE\n");
618 _update_alarms(entry);
621 _alarm_next_duetime(entry);
622 ALARM_MGR_LOG_PRINT("entry->due_time is %d\n", entry->due_time);
627 for (iter = alarm_context.alarms; iter != NULL;
628 iter = g_slist_next(iter)) {
630 due_time = entry->due_time;
634 ALARM_MGR_LOG_PRINT("alarm[%d] with duetime(%u) at "
635 "current(%u)\n", entry->alarm_id, due_time, current_time);
636 if (due_time == 0) { /* 0 means this alarm has been
641 interval = difftime(due_time, current_time);
644 ALARM_MGR_LOG_PRINT("this may be error.. alarm[%d]\n", \
649 interval = difftime(due_time, min_time);
651 if ((interval < 0) || min_time == -1) {
657 alarm_context.c_due_time = min_time;
662 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
663 int pid,char *bundle_data, int *error_code){
668 char due_time_r[100] = { 0 };
669 char proc_file[512] = { 0 };
670 char process_name[512] = { 0 };
671 char app_name[512] = { 0 };
673 char *proc_name_ptr = NULL;
678 __alarm_info_t *__alarm_info = NULL;
680 __alarm_info = malloc(sizeof(__alarm_info_t));
681 if (__alarm_info == NULL) {
682 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid=%d, malloc "
683 "failed. it seems to be OOM\n", pid);
684 *error_code = -1; /* -1 means that system
685 failed internally. */
688 __alarm_info->pid = pid;
689 __alarm_info->alarm_id = -1;
692 /* we should consider to check whether pid is running or Not
694 memset(process_name, '\0', 512);
695 memset(proc_file, '\0', 512);
696 snprintf(proc_file, 512, "/proc/%d/cmdline", pid);
698 fd = open(proc_file, O_RDONLY);
699 if (fd < 0) { /* failure */
700 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid(%d) seems to be "
701 "killed, so we failed to get proc file(%s) and do not create "
702 "alarm_info\n", pid, proc_file);
703 *error_code = -1; /*-1 means that system failed
708 ret = read(fd, process_name, 512);
712 ALARM_MGR_EXCEPTION_PRINT("Unable to get application name\n");
717 while (process_name[i] != '\0') {
718 if (process_name[i] == ' ') {
719 process_name[i] = '\0';
725 word = strtok_r(process_name, "/", &proc_name_ptr);
726 while (word != NULL) {
727 memset(app_name, 0, 512);
728 snprintf(app_name, 512, "%s", word);
729 word = strtok_r(NULL, "/", &proc_name_ptr);
731 __alarm_info->quark_app_unique_name =
732 g_quark_from_string(app_name);
735 __alarm_info->quark_bundle=g_quark_from_string(bundle_data);
736 __alarm_info->quark_app_service_name = g_quark_from_string("null");
737 __alarm_info->quark_dst_service_name = g_quark_from_string("null");
738 __alarm_info->quark_app_service_name_mod = g_quark_from_string("null");
739 __alarm_info->quark_dst_service_name_mod = g_quark_from_string("null");
741 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
742 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
746 if (alarm_context.c_due_time < current_time) {
747 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
748 "(%d) is less than current time(%d)", alarm_context.c_due_time,
750 alarm_context.c_due_time = -1;
753 due_time = _alarm_next_duetime(__alarm_info);
754 if (__alarm_add_to_list(__alarm_info, alarm_id) == false) {
761 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: "
762 "due_time is 0, alarm(%d) \n", *alarm_id);
764 } else if (current_time == due_time) {
765 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: "
766 "current_time(%d) is same as due_time(%d)", current_time,
769 }else if (difftime(due_time, current_time) < 0){
770 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list\n", due_time, current_time);
773 localtime_r(&due_time, &ts_ret);
774 strftime(due_time_r, 30, "%c", &ts_ret);
775 ALARM_MGR_LOG_PRINT("[alarm-server]:Create a new alarm: "
776 "alarm(%d) due_time(%s)", *alarm_id,
780 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), "
781 "due_time(%d)", alarm_context.c_due_time, due_time);
783 if (alarm_context.c_due_time == -1
784 || due_time < alarm_context.c_due_time) {
785 _clear_scheduled_alarm_list();
786 _add_to_scheduled_alarm_list(__alarm_info);
787 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time,
789 alarm_context.c_due_time = due_time;
791 } else if (due_time == alarm_context.c_due_time) {
792 _add_to_scheduled_alarm_list(__alarm_info);
800 if (enable_power_on_alarm) {
801 __alarm_power_on(0, enable_power_on_alarm, NULL);
809 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
810 int pid, char *app_service_name, char *app_service_name_mod,
811 const char *dst_service_name,const char *dst_service_name_mod, int *error_code)
816 char proc_file[256] = { 0 };
817 char process_name[512] = { 0 };
818 char app_name[256] = { 0 };
820 char *proc_name_ptr = NULL;
822 __alarm_info_t *__alarm_info = NULL;
824 __alarm_info = malloc(sizeof(__alarm_info_t));
825 if (__alarm_info == NULL) {
826 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid=%d, malloc "
827 "failed. it seems to be OOM\n", pid);
828 *error_code = -1; /* -1 means that system
829 failed internally. */
832 __alarm_info->pid = pid;
833 __alarm_info->alarm_id = -1;
835 /* we should consider to check whether pid is running or Not
837 memset(process_name, '\0', 512);
838 memset(proc_file, '\0', 256);
839 snprintf(proc_file, 256, "/proc/%d/cmdline", pid);
844 fd = open(proc_file, O_RDONLY);
845 if (fd < 0) { /* failure */
846 __alarm_info->quark_app_unique_name =
847 g_quark_from_string("unknown");
848 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid(%d) seems to be "
849 "killed, so we failed to get proc file(%s) and do not create "
850 "alarm_info\n", pid, proc_file);
851 *error_code = -1; /*-1 means that system failed
856 ret = read(fd, process_name, 512);
858 *error_code = -1; /*-1 means that system failed
865 while (process_name[i] != '\0') {
866 if (process_name[i] == ' ') {
867 process_name[i] = '\0';
872 /* if (readlink(proc_file, process_name, 256)!=-1) */
875 word = strtok_r(process_name, "/", &proc_name_ptr);
876 while (word != NULL) {
877 memset(app_name, 0, 256);
878 snprintf(app_name, 256, "%s", word);
879 word = strtok_r(NULL, "/", &proc_name_ptr);
881 __alarm_info->quark_app_unique_name =
882 g_quark_from_string(app_name);
885 __alarm_info->quark_app_service_name =
886 g_quark_from_string(app_service_name);
887 __alarm_info->quark_app_service_name_mod =
888 g_quark_from_string(app_service_name_mod);
889 __alarm_info->quark_dst_service_name =
890 g_quark_from_string(dst_service_name);
891 __alarm_info->quark_dst_service_name_mod =
892 g_quark_from_string(dst_service_name_mod);
893 __alarm_info->quark_bundle = g_quark_from_string("null");
896 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
897 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
901 ALARM_MGR_LOG_PRINT("[alarm-server]:pid=%d, app_unique_name=%s, "
902 "app_service_name=%s,dst_service_name=%s, c_due_time=%d", \
903 pid, g_quark_to_string(__alarm_info->quark_app_unique_name), \
904 g_quark_to_string(__alarm_info->quark_app_service_name), \
905 g_quark_to_string(__alarm_info->quark_dst_service_name), \
906 alarm_context.c_due_time);
908 if (alarm_context.c_due_time < current_time) {
909 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
910 "(%d) is less than current time(%d)", alarm_context.c_due_time,
912 alarm_context.c_due_time = -1;
915 due_time = _alarm_next_duetime(__alarm_info);
916 if (__alarm_add_to_list(__alarm_info, alarm_id) == false) {
922 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: "
923 "due_time is 0, alarm(%d) \n", *alarm_id);
925 } else if (current_time == due_time) {
926 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: "
927 "current_time(%d) is same as due_time(%d)", current_time,
930 }else if (difftime(due_time, current_time) < 0){
931 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list\n", due_time, current_time);
934 char due_time_r[100] = { 0 };
936 localtime_r(&due_time, &ts_ret);
937 strftime(due_time_r, 30, "%c", &ts_ret);
938 ALARM_MGR_LOG_PRINT("[alarm-server]:Create a new alarm: "
939 "alarm(%d) due_time(%s)", *alarm_id,
943 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), "
944 "due_time(%d)", alarm_context.c_due_time, due_time);
946 if (alarm_context.c_due_time == -1
947 || due_time < alarm_context.c_due_time) {
948 _clear_scheduled_alarm_list();
949 _add_to_scheduled_alarm_list(__alarm_info);
950 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time,
952 alarm_context.c_due_time = due_time;
954 } else if (due_time == alarm_context.c_due_time) {
955 _add_to_scheduled_alarm_list(__alarm_info);
963 if (enable_power_on_alarm) {
964 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID) in a
965 * platform with app-server.because __alarm_power_on(..) fuction don't
966 * use first parameter internally, we set this value to 0(zero)
968 __alarm_power_on(0, enable_power_on_alarm, NULL);
974 static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
975 alarm_info_t *alarm_info, int *error_code)
980 __alarm_info_t *__alarm_info = NULL;
983 __alarm_info = malloc(sizeof(__alarm_info_t));
984 if (__alarm_info == NULL) {
985 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid=%d, "
986 "malloc failed. it seems to be OOM\n", pid);
987 *error_code = -1; /*-1 means that system failed
992 __alarm_info->pid = pid;
993 __alarm_info->alarm_id = alarm_id;
995 /* we should consider to check whether pid is running or Not
998 __alarm_info->quark_app_service_name =
999 g_quark_from_string(app_service_name);
1000 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1001 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1003 time(¤t_time);
1005 if (alarm_context.c_due_time < current_time) {
1006 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
1007 "(%d) is less than current time(%d)", alarm_context.c_due_time,
1009 alarm_context.c_due_time = -1;
1012 due_time = _alarm_next_duetime(__alarm_info);
1013 if (!__alarm_update_in_list(pid, alarm_id, __alarm_info, error_code)) {
1015 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: requested alarm_id "
1016 "(%d) does not exist. so this value is invalid id.", alarm_id);
1019 /* ALARM_MGR_LOG_PRINT("[alarm-server]:request_pid=%d, alarm_id=%d,
1020 * app_unique_name=%s, app_service_name=%s, dst_service_name=%s,
1021 * c_due_time=%d", pid, alarm_id, g_quark_to_string
1022 * (__alarm_info->quark_app_unique_name), g_quark_to_string
1023 * (__alarm_info->quark_app_service_name), g_quark_to_string
1024 * (__alarm_info->quark_dst_service_name), alarm_context.c_due_time);
1027 result = _remove_from_scheduled_alarm_list(pid, alarm_id);
1029 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1030 /*there is no scheduled alarm */
1031 _alarm_disable_timer(alarm_context);
1034 ALARM_MGR_LOG_PRINT("[alarm-server]:Update alarm: alarm(%d)\n",
1041 if (enable_power_on_alarm) {
1042 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID) in
1043 * a platform with app-server.because __alarm_power_on(..) fuction don't
1044 * use first parameter internally, we set this value to 0(zero)
1046 __alarm_power_on(0, enable_power_on_alarm, NULL);
1050 if (due_time == 0) {
1051 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
1058 if (due_time == 0) {
1059 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
1060 "due_time is 0, alarm(%d)\n", alarm_id);
1063 } else if (current_time == due_time) {
1064 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
1065 "current_time(%d) is same as due_time(%d)", current_time,
1069 }else if (difftime(due_time, current_time)< 0){
1070 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list\n", due_time, current_time);
1074 char due_time_r[100] = { 0 };
1076 localtime_r(&due_time, &ts_ret);
1077 strftime(due_time_r, 30, "%c", &ts_ret);
1078 ALARM_MGR_LOG_PRINT("[alarm-server]:Update alarm: alarm(%d) "
1079 "due_time(%s)\n", alarm_id, due_time_r);
1082 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), "
1083 "due_time(%d)", alarm_context.c_due_time, due_time);
1085 if (alarm_context.c_due_time == -1
1086 || due_time < alarm_context.c_due_time) {
1087 _clear_scheduled_alarm_list();
1088 _add_to_scheduled_alarm_list(__alarm_info);
1089 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time,
1091 alarm_context.c_due_time = due_time;
1092 ALARM_MGR_LOG_PRINT("[alarm-server1]:alarm_context.c_due_time "
1093 "(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1094 } else if (due_time == alarm_context.c_due_time) {
1095 _add_to_scheduled_alarm_list(__alarm_info);
1096 ALARM_MGR_LOG_PRINT("[alarm-server2]:alarm_context.c_due_time "
1097 "(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1104 if (enable_power_on_alarm) {
1105 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID)
1106 * in a platform with app-server.because __alarm_power_on(..) fuction
1107 * don't use first parameter internally, we set this value to 0(zero)
1109 __alarm_power_on(0, enable_power_on_alarm, NULL);
1117 static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code)
1119 bool result = false;
1121 ALARM_MGR_LOG_PRINT("[alarm-server]:delete alarm: alarm(%d) pid(%d)\n",\
1123 result = _remove_from_scheduled_alarm_list(pid, alarm_id);
1125 if (!__alarm_remove_from_list(pid, alarm_id, error_code)) {
1127 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:delete alarm: "
1128 "alarm(%d) pid(%d) has failed with error_code(%d)\n",
1129 alarm_id, pid, *error_code);
1133 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1134 _alarm_disable_timer(alarm_context);
1142 if (enable_power_on_alarm) {
1143 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID) in a
1144 * platform with app-server.because __alarm_power_on(..) fuction don't
1145 * use first parameter internally, we set this value to 0(zero)
1147 __alarm_power_on(0, enable_power_on_alarm, NULL);
1154 static bool __alarm_power_on(int app_id, bool on_off, int *error_code)
1157 time_t min_time = 0;
1158 time_t current_time = 0;
1159 struct rtc_time rtc_tm = { 0, };
1160 struct tm min_time_r = { 0, };
1164 enable_power_on_alarm = on_off;
1165 /*_update_power_on(on_off); */ /*currently its empty*/
1167 fd = open(power_rtc, O_RDONLY);
1169 ALARM_MGR_EXCEPTION_PRINT("cannot open /dev/rtc0\n");
1173 if (on_off == true) {
1174 if (_alarm_find_mintime_power_on(&min_time) == true) {
1176 ab_due_time = min_time;
1178 min_time = min_time - 60;
1180 time(¤t_time);
1182 if (min_time <= current_time)
1183 min_time = current_time + 5;
1185 gmtime_r(&min_time, &min_time_r);
1187 ALARM_MGR_LOG_PRINT("__alarm_power_on : %d %d %d %d "
1189 min_time_r.tm_year,\
1191 min_time_r.tm_mday,\
1192 min_time_r.tm_hour,\
1194 ALARM_MGR_LOG_PRINT("__alarm_power_on : %d %d %d %d "
1196 min_time_r.tm_year,\
1198 min_time_r.tm_mday,\
1199 min_time_r.tm_hour,\
1202 rtc_tm.tm_mday = min_time_r.tm_mday;
1203 rtc_tm.tm_mon = min_time_r.tm_mon;
1204 rtc_tm.tm_year = min_time_r.tm_year;
1205 rtc_tm.tm_hour = min_time_r.tm_hour;
1206 rtc_tm.tm_min = min_time_r.tm_min;
1207 rtc_tm.tm_sec = min_time_r.tm_sec;
1208 /*set_info.time_zone = 0; */
1209 /*set_info.u_interval.day_of_week = 0; */
1211 /*ALARM_MGR_LOG_PRINT("####__alarm_power_on : %d %d
1212 %d %d %d\n",set_info.year,set_info.month,set_info.day,
1213 set_info.hour,set_info.minute); */
1215 ALARM_MGR_LOG_PRINT("due_time : %d \n", ab_due_time);
1217 ALARM_MGR_LOG_PRINT("\n\nSetted RTC Alarm date/time is "
1218 "%d-%d-%d, %02d:%02d:%02d.\n",
1219 rtc_tm.tm_mday, rtc_tm.tm_mon + 1,
1220 rtc_tm.tm_year + 1900, rtc_tm.tm_hour,
1221 rtc_tm.tm_min, rtc_tm.tm_sec);
1223 retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
1225 if (errno == ENOTTY) {
1226 ALARM_MGR_EXCEPTION_PRINT(
1227 "\n...Alarm IRQs not supported.\n");
1229 ALARM_MGR_EXCEPTION_PRINT("RTC_ALM_SET ioctl");
1233 ALARM_MGR_LOG_PRINT("[alarm-server]RTC "
1234 "alarm(POWER ON) is setted");
1236 /* Enable alarm interrupts */
1237 retval = ioctl(fd, RTC_AIE_ON, 0);
1239 ALARM_MGR_EXCEPTION_PRINT(
1240 "RTC_AIE_ON ioctl failed");
1244 ALARM_MGR_LOG_PRINT("[alarm-server]RTC(POWER ON) "
1248 retval = ioctl(fd, RTC_AIE_OFF, 0);
1250 ALARM_MGR_LOG_PRINT("__alarm_power_on : off\n");
1251 retval = ioctl(fd, RTC_AIE_OFF, 0);
1255 #endif /* #ifdef __ALARM_BOOT */
1260 static bool __alarm_power_off(int app_id, int *error_code)
1264 #endif /* #ifdef __ALARM_BOOT */
1268 static bool __alarm_check_next_duetime(int app_id, int *error_code)
1271 time_t current_time;
1274 time(¤t_time);
1276 interval = ab_due_time - current_time;
1278 ALARM_MGR_LOG_PRINT("due_time : %d / current_time %d\n", ab_due_time,
1281 if (interval > 0 && interval <= 60)
1285 #else /* #ifdef __ALARM_BOOT */
1290 static void __alarm_send_noti_to_application(const char *app_service_name,
1291 alarm_id_t alarm_id)
1295 char service_name[MAX_SERVICE_NAME_LEN];
1296 char object_name[MAX_SERVICE_NAME_LEN];
1298 DBusMessage *message;
1299 DBusMessageIter iter;
1301 if (app_service_name == NULL || strlen(app_service_name) == 0) {
1302 ALARM_MGR_EXCEPTION_PRINT("This alarm destination is "
1306 memset(service_name, 0, MAX_SERVICE_NAME_LEN);
1307 memcpy(service_name, app_service_name, strlen(app_service_name));
1309 snprintf(object_name, MAX_SERVICE_NAME_LEN,
1310 "/org/tizen/alarm/client");
1312 ALARM_MGR_LOG_PRINT("[alarm server][send expired_alarm(alarm_id=%d)to"
1313 "app_service_name(%s), object_name(%s), interface_name(%s)]\n",\
1314 alarm_id, service_name, object_name, "org.tizen.alarm.client");
1316 message = dbus_message_new_method_call(service_name,
1318 "org.tizen.alarm.client",
1320 if (message == NULL) {
1321 ALARM_MGR_EXCEPTION_PRINT("[alarm server] "
1322 "dbus_message_new_method_call faild. maybe OOM!.\n");
1323 ALARM_MGR_EXCEPTION_PRINT("[alarm server] so we cannot "
1324 "send expired alarm to %s\n", service_name);
1328 dbus_message_set_no_reply(message, TRUE);
1329 /* if(service_name[0]==':') */
1330 /* we don't need auto activation in a case that
1331 destination_app_service_name starts with a charactor like (:) */
1332 dbus_message_set_auto_start(message, FALSE);
1334 dbus_message_iter_init_append(message, &iter);
1335 if (!dbus_message_iter_append_basic
1336 (&iter, DBUS_TYPE_INT32, &alarm_id)) {
1337 dbus_message_unref(message);
1338 ALARM_MGR_EXCEPTION_PRINT("[alarm server] "
1339 "dbus_message_iter_append_basic faild. maybe OOM!.\n");
1343 dbus_connection_send(dbus_g_connection_get_connection
1344 (alarm_context.bus), message, NULL);
1345 dbus_connection_flush(dbus_g_connection_get_connection
1346 (alarm_context.bus));
1347 dbus_message_unref(message);
1351 static void __alarm_expired()
1353 const char *destination_app_service_name = NULL;
1354 alarm_id_t alarm_id = -1;
1356 __alarm_info_t *__alarm_info = NULL;
1357 char alarm_id_val[32]={0,};
1362 ALARM_MGR_LOG_PRINT("[alarm-server]: Enter \n");
1364 time_t current_time;
1367 time(¤t_time);
1369 interval = difftime(alarm_context.c_due_time, current_time);
1370 ALARM_MGR_LOG_PRINT("[alarm-server]: c_due_time(%d), "
1371 "current_time(%d), interval(%d)\n", alarm_context.c_due_time,
1372 current_time, interval);
1374 if (alarm_context.c_due_time > current_time) {
1375 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds future\n",
1376 alarm_context.c_due_time - current_time);
1379 // 3 seconds is maximum permitted delay from timer expire to this function
1380 if (alarm_context.c_due_time + 3 < current_time) {
1381 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds past\n",
1382 current_time - alarm_context.c_due_time);
1386 GSList *iter = NULL;
1387 __scheduled_alarm_t *alarm = NULL;
1389 for (iter = g_scheduled_alarm_list; iter != NULL;
1390 iter = g_slist_next(iter)) {
1392 alarm_id = alarm->alarm_id;
1394 __alarm_info = alarm->__alarm_info;
1396 app_pid = __alarm_info->pid;
1399 (g_quark_to_string(__alarm_info->quark_bundle),
1402 b_len = strlen(g_quark_to_string(__alarm_info->quark_bundle));
1404 b = bundle_decode((bundle_raw *)g_quark_to_string(__alarm_info->quark_bundle), b_len);
1408 ALARM_MGR_EXCEPTION_PRINT("Error!!!..Unable to decode the bundle!!\n");
1412 snprintf(alarm_id_val,31,"%d",alarm_id);
1414 if (bundle_add(b,"http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)){
1415 ALARM_MGR_EXCEPTION_PRINT("Unable to add alarm id to the bundle\n");
1419 appid = appsvc_get_appid(b);
1420 if( (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid))
1422 ALARM_MGR_EXCEPTION_PRINT("This alarm is ignored\n");
1426 if ( appsvc_run_service(b, 0, NULL, NULL) < 0)
1428 ALARM_MGR_EXCEPTION_PRINT("Unable to run app svc\n");
1432 ALARM_MGR_LOG_PRINT("Successfuly ran app svc\n");
1443 (g_quark_to_string(__alarm_info->quark_dst_service_name),
1445 ALARM_MGR_LOG_PRINT("[alarm-server]:destination is "
1446 "null, so we send expired alarm to %s(%u)\n",\
1448 __alarm_info->quark_app_service_name),
1449 __alarm_info->quark_app_service_name);
1450 destination_app_service_name = g_quark_to_string(
1451 __alarm_info->quark_app_service_name_mod);
1453 ALARM_MGR_LOG_PRINT("[alarm-server]:destination "
1456 __alarm_info->quark_dst_service_name),
1457 __alarm_info->quark_dst_service_name);
1458 destination_app_service_name = g_quark_to_string(
1459 __alarm_info->quark_dst_service_name_mod);
1463 /* orginally this code had if(__alarm_info->app_id==21) in a
1464 platform with app-server. */
1465 /*if(__alarm_info->quark_dst_service_name ==
1466 g_quark_from_string (WAKEUP_ALARM_APP_ID)) */
1468 (g_quark_to_string(__alarm_info->quark_dst_service_name),
1469 WAKEUP_ALARM_APP_ID) == 0) {
1471 fd = open(power_rtc, O_RDONLY);
1473 ALARM_MGR_LOG_PRINT("cannot open /dev/rtc0\n");
1475 ioctl(fd, RTC_AIE_OFF, 0);
1482 * we should consider a situation that
1483 * destination_app_service_name is owner_name like (:xxxx) and
1484 * application's pid which registered this alarm was killed.In that case,
1485 * we don't need to send the expire event because the process was killed.
1486 * this causes needless message to be sent.
1488 ALARM_MGR_LOG_PRINT("[alarm-server]: "
1489 "destination_app_service_name :%s, app_pid=%d\n",
1490 destination_app_service_name, app_pid);
1491 /* the following is a code that checks the above situation.
1492 please verify this code. */
1494 if (dbus_bus_name_has_owner(
1495 dbus_g_connection_get_connection(alarm_context.bus),
1496 destination_app_service_name, NULL) == FALSE) {
1497 __expired_alarm_t *expire_info;
1498 char appid[MAX_SERVICE_NAME_LEN] = { 0, };
1499 char alarm_id_str[32] = { 0, };
1501 if (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) {
1502 __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL);
1506 expire_info = malloc(sizeof(__expired_alarm_t));
1507 if (G_UNLIKELY(NULL == expire_info)){
1508 ALARM_MGR_ASSERT_PRINT("[alarm-server]:Malloc failed!Can't notify alarm expiry info\n");
1511 memset(expire_info, '\0', MAX_SERVICE_NAME_LEN);
1512 strncpy(expire_info->service_name,
1513 destination_app_service_name,
1514 MAX_SERVICE_NAME_LEN-1);
1515 expire_info->alarm_id = alarm_id;
1516 g_expired_alarm_list =
1517 g_slist_append(g_expired_alarm_list, expire_info);
1521 (g_quark_to_string(__alarm_info->quark_dst_service_name),
1523 strncpy(appid,g_quark_to_string(__alarm_info->quark_app_service_name),strlen(g_quark_to_string(__alarm_info->quark_app_service_name))-6);
1527 strncpy(appid,g_quark_to_string(__alarm_info->quark_dst_service_name),strlen(g_quark_to_string(__alarm_info->quark_dst_service_name))-6);
1530 snprintf(alarm_id_str, 31, "%d", alarm_id);
1532 ALARM_MGR_LOG_PRINT("before aul_launch appid(%s) "
1533 "alarm_id_str(%s)\n", appid, alarm_id_str);
1536 kb = bundle_create();
1537 bundle_add(kb, "__ALARM_MGR_ID", alarm_id_str);
1538 aul_launch_app(appid, kb);
1541 ALARM_MGR_LOG_PRINT(
1542 "before alarm_send_noti_to_application\n");
1543 __alarm_send_noti_to_application(
1544 destination_app_service_name, alarm_id);
1547 ALARM_MGR_LOG_PRINT("after __alarm_send_noti_to_application\n");
1549 /* if( !(__alarm_info->alarm_info.alarm_type
1550 & ALARM_TYPE_VOLATILE) ) {
1551 __alarm_remove_from_list(__alarm_info->pid,
1555 if (__alarm_info->alarm_info.mode.repeat
1556 == ALARM_REPEAT_MODE_ONCE) {
1557 /* _alarm_next_duetime(__alarm_info);*/
1558 /* _update_alarms(__alarm_info);*/
1559 __alarm_remove_from_list(__alarm_info->pid, alarm_id,
1563 _alarm_next_duetime(__alarm_info);
1564 /* _update_alarms(__alarm_info);*/
1570 _clear_scheduled_alarm_list();
1571 alarm_context.c_due_time = -1;
1573 ALARM_MGR_LOG_PRINT("[alarm-server]: Leave \n");
1576 static gboolean __alarm_handler_idle()
1578 if (g_dummy_timer_is_set == true) {
1579 ALARM_MGR_LOG_PRINT("dummy alarm timer has expired\n");
1581 ALARM_MGR_LOG_PRINT("__alarm_handler \n");
1582 ALARM_MGR_LOG_PRINT("__alarm_handler \n");
1594 if (enable_power_on_alarm) {
1595 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID)
1596 *in a platform with app-server.because __alarm_power_on(..) fuction
1597 *don't use first parameter internally, we set this value to 0(zero)
1599 __alarm_power_on(0, enable_power_on_alarm, NULL);
1602 pm_unlock_state(LCD_OFF, PM_SLEEP_MARGIN);
1607 static void __alarm_handler(int sigNum, siginfo_t *pSigInfo, void *pUContext)
1610 pm_lock_state(LCD_OFF, STAY_CUR_STATE, 0);
1612 /* we moved __alarm_expired() function to __alarm_handler_idle GSource
1613 because of signal safety. */
1614 g_idle_add_full(G_PRIORITY_HIGH_IDLE, __alarm_handler_idle, NULL, NULL);
1617 static void __clean_registry()
1620 /*TODO:remove all db entries */
1623 static bool __alarm_manager_reset()
1626 _alarm_disable_timer(alarm_context);
1628 __alarm_clean_list();
1630 _clear_scheduled_alarm_list();
1636 static void __on_system_time_changed(keynode_t *node, void *data)
1642 _alarm_disable_timer(alarm_context);
1645 _time = vconf_keynode_get_int(node);
1647 vconf_get_int(VCONFKEY_SYSTEM_TIMECHANGE, (int *)&_time);
1651 diff_time = difftime(_time, before);
1655 ALARM_MGR_EXCEPTION_PRINT("New time is %s, diff_time is %f\n", ctime(&_time), diff_time);
1657 ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed\n");
1658 ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n",
1659 alarm_context.c_due_time);
1663 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time);
1665 __alarm_update_due_time_of_all_items_in_list(diff_time);
1667 ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n",
1668 alarm_context.c_due_time);
1669 _clear_scheduled_alarm_list();
1674 if (enable_power_on_alarm) {
1675 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_
1676 APP_ID) in a platform with app-server. because _alarm_power_
1677 on(..) fuction don't use first parameter internally, we set
1678 this value to 0(zero)
1680 __alarm_power_on(0, enable_power_on_alarm, NULL);
1686 static void __on_system_time_external_changed(keynode_t *node, void *data)
1689 time_t cur_time = 0;
1691 _alarm_disable_timer(alarm_context);
1694 diff_time = vconf_keynode_get_dbl(node);
1696 vconf_get_dbl(VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, &diff_time);
1702 ALARM_MGR_EXCEPTION_PRINT("diff_time is %f, New time is %s\n", diff_time, ctime(&cur_time));
1704 ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed externally\n");
1705 ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n",
1706 alarm_context.c_due_time);
1708 // set rtc time only because the linux time is set externally
1709 _set_rtc_time(cur_time);
1711 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time);
1713 __alarm_update_due_time_of_all_items_in_list(diff_time);
1715 ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n",
1716 alarm_context.c_due_time);
1717 _clear_scheduled_alarm_list();
1722 if (enable_power_on_alarm) {
1723 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_
1724 APP_ID) in a platform with app-server. because _alarm_power_
1725 on(..) fuction don't use first parameter internally, we set
1726 this value to 0(zero)
1728 __alarm_power_on(0, enable_power_on_alarm, NULL);
1734 static void __on_time_zone_changed(keynode_t *node, void *data)
1736 double diff_time = 0;
1738 _alarm_disable_timer(alarm_context);
1742 ALARM_MGR_LOG_PRINT("[alarm-server] time zone has been changed\n");
1743 ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n", alarm_context.c_due_time);
1745 __alarm_update_due_time_of_all_items_in_list(diff_time);
1747 ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n", alarm_context.c_due_time);
1748 _clear_scheduled_alarm_list();
1753 if (enable_power_on_alarm) {
1754 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_
1755 APP_ID) in a platform with app-server. because _alarm_power_
1756 on(..) fuction don't use first parameter internally, we set
1757 this value to 0(zero)
1759 __alarm_power_on(0, enable_power_on_alarm, NULL);
1766 gboolean alarm_manager_alarm_set_rtc_time(void *pObject, int pid,
1767 int year, int mon, int day,
1768 int hour, int min, int sec, char *e_cookie,
1770 guchar *cookie = NULL;
1773 gboolean result = true;
1776 const char *rtc = power_rtc;
1778 struct rtc_time rtc_tm = {0,};
1779 struct rtc_wkalrm rtc_wk;
1780 struct tm *alarm_tm = NULL;
1781 struct tm due_tm = {0,};
1785 *return_code = ALARMMGR_RESULT_SUCCESS;
1788 cookie = g_base64_decode(e_cookie, &size);
1792 *return_code = ERR_ALARM_NO_PERMISSION;
1793 ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!\n");
1797 call_gid = security_server_get_gid("alarm");
1799 ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
1801 retval = security_server_check_privilege((const char *)cookie, call_gid);
1803 if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
1804 ALARM_MGR_EXCEPTION_PRINT(
1805 "%s", "access has been denied\n");
1807 ALARM_MGR_EXCEPTION_PRINT("Error has occurred in security_server_check_privilege()\n");
1809 *return_code = ERR_ALARM_NO_PERMISSION;
1813 /*extract day of the week, day in the year &
1814 daylight saving time from system*/
1817 alarm_tm = localtime(&ctime);
1819 alarm_tm->tm_year = year;
1820 alarm_tm->tm_mon = mon;
1821 alarm_tm->tm_mday = day;
1822 alarm_tm->tm_hour = hour;
1823 alarm_tm->tm_min = min;
1824 alarm_tm->tm_sec = sec;
1826 /*convert to calendar time representation*/
1827 time_t rtc_time = mktime(alarm_tm);
1829 /*convert to Coordinated Universal Time (UTC)*/
1830 gmtime_r(&rtc_time, &due_tm);
1832 fd = open(rtc, O_RDONLY);
1834 ALARM_MGR_EXCEPTION_PRINT("RTC open failed.\n");
1836 *return_code = ERR_ALARM_SYSTEM_FAIL;
1840 /* Read the RTC time/date */
1841 retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
1843 ALARM_MGR_EXCEPTION_PRINT("RTC_RD_TIME ioctl failed");
1846 *return_code = ERR_ALARM_SYSTEM_FAIL;
1850 rtc_tm.tm_mday = due_tm.tm_mday;
1851 rtc_tm.tm_mon = due_tm.tm_mon;
1852 rtc_tm.tm_year = due_tm.tm_year;
1853 rtc_tm.tm_hour = due_tm.tm_hour;
1854 rtc_tm.tm_min = due_tm.tm_min;
1855 rtc_tm.tm_sec = due_tm.tm_sec;
1857 memcpy(&rtc_wk.time, &rtc_tm, sizeof(rtc_tm));
1862 retval = ioctl(fd, RTC_WKALM_BOOT_SET, &rtc_wk);
1864 if (errno == ENOTTY) {
1865 ALARM_MGR_EXCEPTION_PRINT("\nAlarm IRQs not"
1868 ALARM_MGR_EXCEPTION_PRINT("RTC_ALM_SET ioctl");
1871 *return_code = ERR_ALARM_SYSTEM_FAIL;
1874 ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is setted");
1875 /* Enable alarm interrupts */
1876 retval = ioctl(fd, RTC_AIE_ON, 0);
1878 ALARM_MGR_EXCEPTION_PRINT("RTC_AIE_ON ioctl failed");
1880 *return_code = ERR_ALARM_SYSTEM_FAIL;
1895 gboolean alarm_manager_alarm_create_appsvc(void *pObject, int pid,
1897 int start_month, int start_day,
1898 int start_hour, int start_min,
1899 int start_sec, int end_year, int end_month,
1900 int end_day, int mode_day_of_week,
1901 int mode_repeat, int alarm_type,
1903 char *bundle_data, char *e_cookie,
1904 int *alarm_id, int *return_code)
1906 alarm_info_t alarm_info;
1907 guchar *cookie = NULL;
1911 gboolean result = true;
1913 alarm_info.start.year = start_year;
1914 alarm_info.start.month = start_month;
1915 alarm_info.start.day = start_day;
1916 alarm_info.start.hour = start_hour;
1917 alarm_info.start.min = start_min;
1918 alarm_info.start.sec = start_sec;
1920 alarm_info.end.year = end_year;
1921 alarm_info.end.month = end_month;
1922 alarm_info.end.day = end_day;
1924 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
1925 alarm_info.mode.repeat = mode_repeat;
1927 alarm_info.alarm_type = alarm_type;
1928 alarm_info.reserved_info = reserved_info;
1932 cookie = g_base64_decode(e_cookie, &size);
1936 ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!\n");
1940 call_gid = security_server_get_gid("alarm");
1942 ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
1944 retval = security_server_check_privilege((const char *)cookie, call_gid);
1946 if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
1947 ALARM_MGR_EXCEPTION_PRINT(
1948 "%s", "access has been denied\n");
1950 ALARM_MGR_EXCEPTION_PRINT("Error has occurred in security_server_check_privilege()\n");
1955 result = __alarm_create_appsvc(&alarm_info, alarm_id, pid,
1956 bundle_data, return_code);
1957 if (false == result)
1959 ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm!\n");
1971 gboolean alarm_manager_alarm_create(void *pObject, int pid,
1972 char *app_service_name, char *app_service_name_mod, int start_year,
1973 int start_month, int start_day,
1974 int start_hour, int start_min,
1975 int start_sec, int end_year, int end_month,
1976 int end_day, int mode_day_of_week,
1977 int mode_repeat, int alarm_type,
1979 char *reserved_service_name, char *reserved_service_name_mod, char *e_cookie,
1980 int *alarm_id, int *return_code)
1982 alarm_info_t alarm_info;
1988 alarm_info.start.year = start_year;
1989 alarm_info.start.month = start_month;
1990 alarm_info.start.day = start_day;
1991 alarm_info.start.hour = start_hour;
1992 alarm_info.start.min = start_min;
1993 alarm_info.start.sec = start_sec;
1995 alarm_info.end.year = end_year;
1996 alarm_info.end.month = end_month;
1997 alarm_info.end.day = end_day;
1999 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2000 alarm_info.mode.repeat = mode_repeat;
2002 alarm_info.alarm_type = alarm_type;
2003 alarm_info.reserved_info = reserved_info;
2007 cookie = g_base64_decode(e_cookie, &size);
2008 call_gid = security_server_get_gid("alarm");
2010 ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
2012 retval = security_server_check_privilege((const char *)cookie, call_gid);
2014 if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
2015 ALARM_MGR_EXCEPTION_PRINT(
2016 "%s", "access has been denied\n");
2018 ALARM_MGR_EXCEPTION_PRINT("%s", "Error has occurred\n");
2024 /* return valule and return_code should be checked */
2025 __alarm_create(&alarm_info, alarm_id, pid, app_service_name,app_service_name_mod,
2026 reserved_service_name, reserved_service_name_mod, return_code);
2034 gboolean alarm_manager_alarm_delete(void *pObject, int pid, alarm_id_t alarm_id,
2035 char *e_cookie, int *return_code)
2042 cookie = g_base64_decode(e_cookie, &size);
2043 call_gid = security_server_get_gid("alarm");
2045 ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
2047 retval = security_server_check_privilege((const char *)cookie, call_gid);
2049 if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
2050 ALARM_MGR_EXCEPTION_PRINT("%s",
2051 "access has been denied\n");
2053 ALARM_MGR_EXCEPTION_PRINT("%s", "Error has occurred\n");
2059 __alarm_delete(pid, alarm_id, return_code);
2067 gboolean alarm_manager_alarm_power_on(void *pObject, int pid, bool on_off,
2071 return __alarm_power_on(pid, on_off, return_code);
2074 gboolean alarm_manager_alarm_power_off(void *pObject, int pid, int *return_code)
2077 return __alarm_power_off(pid, return_code);
2080 bool alarm_manager_alarm_check_next_duetime(void *pObject, int pid,
2083 return __alarm_check_next_duetime(pid, return_code);
2086 gboolean alarm_manager_alarm_update(void *pObject, int pid,
2087 char *app_service_name, alarm_id_t alarm_id,
2088 int start_year, int start_month,
2089 int start_day, int start_hour,
2090 int start_min, int start_sec, int end_year,
2091 int end_month, int end_day,
2092 int mode_day_of_week, int mode_repeat,
2093 int alarm_type, int reserved_info,
2096 alarm_info_t alarm_info;
2097 alarm_info.start.year = start_year;
2098 alarm_info.start.month = start_month;
2099 alarm_info.start.day = start_day;
2100 alarm_info.start.hour = start_hour;
2101 alarm_info.start.min = start_min;
2102 alarm_info.start.sec = start_sec;
2104 alarm_info.end.year = end_year;
2105 alarm_info.end.month = end_month;
2106 alarm_info.end.day = end_day;
2108 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2109 alarm_info.mode.repeat = mode_repeat;
2111 alarm_info.alarm_type = alarm_type;
2112 alarm_info.reserved_info = reserved_info;
2116 __alarm_update(pid, app_service_name, alarm_id, &alarm_info,
2122 gboolean alarm_manager_alarm_get_number_of_ids(void *pObject, int pid,
2126 GSList *gs_iter = NULL;
2127 GQuark quark_app_unique_name; /* the fullpath of pid(pid) is
2128 converted to quark value. */
2129 char proc_file[256] = { 0 };
2130 char process_name[512] = { 0 };
2131 char app_name[256] = { 0 };
2133 __alarm_info_t *entry = NULL;
2134 char *proc_name_ptr = NULL;
2139 /* we should consider to check whether pid is running or Not
2141 memset(process_name, '\0', 512);
2142 memset(proc_file, '\0', 256);
2143 snprintf(proc_file, 256, "/proc/%d/cmdline", pid);
2148 fd = open(proc_file, O_RDONLY);
2149 if (fd < 0) { /* failure */
2150 quark_app_unique_name = g_quark_from_string("unknown");
2151 memcpy(app_name, "unknown", strlen("unknown") + 1);
2153 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid(%d) seems to be "
2154 "killed, so we failed to get proc file(%s) \n",
2156 *return_code = -1; /* -1 means that system
2157 failed internally. */
2160 ret = read(fd, process_name, 512);
2162 *return_code = -1; /* -1 means that system
2163 failed internally. */
2168 while (process_name[i] != '\0') {
2169 if (process_name[i] == ' ') {
2170 process_name[i] = '\0';
2175 /*if (readlink(proc_file, process_name, 256)!=-1) */
2178 word = strtok_r(process_name, "/", &proc_name_ptr);
2179 while (word != NULL) {
2180 memset(app_name, 0, 256);
2181 snprintf(app_name, 256, "%s", word);
2182 word = strtok_r(NULL, "/", &proc_name_ptr);
2184 quark_app_unique_name = g_quark_from_string(app_name);
2187 ALARM_MGR_LOG_PRINT("called for app(pid:%d, name=%s)\n",
2190 for (gs_iter = alarm_context.alarms; gs_iter != NULL;
2191 gs_iter = g_slist_next(gs_iter)) {
2192 entry = gs_iter->data;
2193 ALARM_MGR_LOG_PRINT("alarm_manager_alarm_get_number_of_ids(): "
2194 "app_name=%s,quark_app_unique_name=%s\n",
2195 app_name, g_quark_to_string(entry->quark_app_unique_name));
2198 g_quark_to_string(entry->quark_app_unique_name)) == 0
2199 && strcmp(app_name, "unknown") != 0) {
2201 ALARM_MGR_LOG_PRINT("inc number of alarms of app "
2202 "(pid:%d, name:%s) is %d\n",
2203 pid, app_name, *num_of_ids);
2207 ALARM_MGR_LOG_PRINT("number of alarms of app(pid:%d, name:%s) is %d\n",
2208 pid, app_name, *num_of_ids);
2212 gboolean alarm_manager_alarm_get_list_of_ids(void *pObject, int pid,
2213 int max_number_of_ids,
2214 GArray **arr, int *num_of_ids,
2217 GSList *gs_iter = NULL;
2218 GQuark quark_app_unique_name; /* the fullpath of pid(pid) is converted
2220 char proc_file[256] = { 0 };
2221 char process_name[512] = { 0 };
2222 char app_name[256] = { 0 };
2224 __alarm_info_t *entry = NULL;
2226 char *proc_name_ptr = NULL;
2230 GArray *garray = NULL;
2234 garray = g_array_new(false, true, sizeof(alarm_id_t));
2236 /* we should check that there is a resource leak.
2237 * Now we don't have free code for g_array_new().
2239 if (max_number_of_ids <= 0) {
2241 ALARM_MGR_EXCEPTION_PRINT("called for pid(%d), but "
2242 "max_number_of_ids(%d) is less than 0.\n",
2243 pid, max_number_of_ids);
2247 /* we should consider to check whether pid is running or Not
2249 memset(process_name, '\0', 512);
2250 memset(proc_file, '\0', 256);
2251 snprintf(proc_file, 256, "/proc/%d/cmdline", pid);
2253 fd = open(proc_file, O_RDONLY);
2254 if (fd < 0) { /* failure */
2255 quark_app_unique_name = g_quark_from_string("unknown");
2256 memcpy(app_name, "unknown", strlen("unknown") + 1);
2258 ALARM_MGR_EXCEPTION_PRINT("Caution!! app_pid(%d) seems to be "
2259 "killed, so we failed to get proc file(%s)\n", pid, proc_file);
2261 /* -1 means that system failed internally. */
2264 ret = read(fd, process_name, 512);
2267 /* -1 means that system failed internally. */
2272 while (process_name[i] != '\0') {
2273 if (process_name[i] == ' ') {
2274 process_name[i] = '\0';
2279 /* if (readlink(proc_file, process_name, 256)!=-1) */
2282 word = strtok_r(process_name, "/", &proc_name_ptr);
2283 while (word != NULL) {
2284 memset(app_name, 0, 256);
2285 snprintf(app_name, 256, "%s", word);
2286 word = strtok_r(NULL, "/", &proc_name_ptr);
2288 quark_app_unique_name = g_quark_from_string(app_name);
2291 ALARM_MGR_LOG_PRINT("called for app(pid:%d, name=%s)\n",
2294 for (gs_iter = alarm_context.alarms; gs_iter != NULL;
2295 gs_iter = g_slist_next(gs_iter)) {
2296 entry = gs_iter->data;
2299 g_quark_to_string(entry->quark_app_unique_name)) == 0
2300 && strcmp(app_name, "unknown") != 0) {
2301 g_array_append_val(garray, entry->alarm_id);
2305 *num_of_ids = index;
2312 gboolean alarm_manager_alarm_get_appsvc_info(void *pObject, int pid, alarm_id_t alarm_id,
2313 char *e_cookie, gchar **b_data, int *return_code)
2317 GSList *gs_iter = NULL;
2318 __alarm_info_t *entry = NULL;
2320 guchar *cookie = NULL;
2325 ALARM_MGR_LOG_PRINT("called for pid(%d) and alarm_id(%d)\n", pid,
2328 cookie = g_base64_decode(e_cookie, &size);
2332 *return_code = ERR_ALARM_SYSTEM_FAIL;
2333 ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!\n");
2336 call_gid = security_server_get_gid("alarm");
2338 ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
2340 retval = security_server_check_privilege((const char *)cookie, call_gid);
2342 if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
2343 ALARM_MGR_EXCEPTION_PRINT(
2344 "%s", "access has been denied\n");
2346 ALARM_MGR_EXCEPTION_PRINT("%s", "Error has occurred\n");
2349 *return_code = ERR_ALARM_NO_PERMISSION;
2360 for (gs_iter = alarm_context.alarms; gs_iter != NULL;
2361 gs_iter = g_slist_next(gs_iter)) {
2362 entry = gs_iter->data;
2363 if (entry->alarm_id == alarm_id) {
2365 *b_data = g_strdup(g_quark_to_string(entry->quark_bundle));
2371 if ( *b_data && strlen(*b_data) == 4 && strncmp(*b_data,"null",4) == 0){
2372 ALARM_MGR_EXCEPTION_PRINT("Regular alarm,not svc alarm");
2374 *return_code = ERR_ALARM_INVALID_TYPE;
2378 *return_code = ERR_ALARM_INVALID_ID;
2387 gboolean alarm_manager_alarm_get_info(void *pObject, int pid,
2388 alarm_id_t alarm_id, int *start_year,
2389 int *start_month, int *start_day,
2390 int *start_hour, int *start_min,
2391 int *start_sec, int *end_year,
2392 int *end_month, int *end_day,
2393 int *mode_day_of_week, int *mode_repeat,
2394 int *alarm_type, int *reserved_info,
2397 ALARM_MGR_LOG_PRINT("called for pid(%d) and alarm_id(%d)\n", pid,
2400 GSList *gs_iter = NULL;
2401 __alarm_info_t *entry = NULL;
2403 alarm_info_t *alarm_info = NULL;
2406 for (gs_iter = alarm_context.alarms; gs_iter != NULL;
2407 gs_iter = g_slist_next(gs_iter)) {
2408 entry = gs_iter->data;
2409 if (entry->alarm_id == alarm_id) {
2410 alarm_info = &(entry->alarm_info);
2415 if (alarm_info == NULL)
2417 ALARM_MGR_EXCEPTION_PRINT("alarm id(%d) was not found\n",
2419 *return_code = ERR_ALARM_INVALID_ID;
2421 ALARM_MGR_LOG_PRINT("alarm was found\n");
2422 *start_year = alarm_info->start.year;
2423 *start_month = alarm_info->start.month;
2424 *start_day = alarm_info->start.day;
2425 *start_hour = alarm_info->start.hour;
2426 *start_min = alarm_info->start.min;
2427 *start_sec = alarm_info->start.sec;
2429 *end_year = alarm_info->end.year;
2430 *end_year = alarm_info->end.month;
2431 *end_year = alarm_info->end.day;
2433 *mode_day_of_week = alarm_info->mode.u_interval.day_of_week;
2434 *mode_repeat = alarm_info->mode.repeat;
2436 *alarm_type = alarm_info->alarm_type;
2437 *reserved_info = alarm_info->reserved_info;
2444 gboolean alarm_manager_alarm_get_next_duetime(void *pObject, int pid,
2445 alarm_id_t alarm_id, time_t* duetime,
2448 ALARM_MGR_LOG_PRINT("called for pid(%d) and alarm_id(%d)\n", pid,
2451 GSList *gs_iter = NULL;
2452 __alarm_info_t *entry = NULL;
2456 for (gs_iter = alarm_context.alarms; gs_iter != NULL;
2457 gs_iter = g_slist_next(gs_iter)) {
2458 entry = gs_iter->data;
2459 if (entry->alarm_id == alarm_id) {
2466 ALARM_MGR_EXCEPTION_PRINT("alarm id(%d) was not found\n",
2468 *return_code = ERR_ALARM_INVALID_ID;
2470 ALARM_MGR_LOG_PRINT("alarm was found\n");
2471 *duetime = _alarm_next_duetime(entry);
2477 #include "alarm-skeleton.h"
2479 typedef struct AlarmManagerObject AlarmManagerObject;
2480 typedef struct AlarmManagerObjectClass AlarmManagerObjectClass;
2481 GType Server_Object_get_type(void);
2482 struct AlarmManagerObject {
2485 struct AlarmManagerObjectClass {
2486 GObjectClass parent;
2489 #define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0
2491 #define ALARM_MANAGER_TYPE_OBJECT (Server_Object_get_type())
2492 #define ALARM_MANAGER_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST \
2493 ((object), ALARM_MANAGER_TYPE_OBJECT, AlarmManagerObject))
2494 #define ALARM_MANAGER_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
2495 ((klass), ALARM_MANAGER_TYPE_OBJECT, AlarmManagerObjectClass))
2496 #define ALARM_MANAGER_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE \
2497 ((object), ALARM_MANAGER_TYPE_OBJECT))
2498 #define ALARM_MANAGER_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE \
2499 ((klass), ALARM_MANAGER_TYPE_OBJECT))
2500 #define ALARM_MANAGER_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
2501 ((obj), ALARM_MANAGER_TYPE_OBJECT, AlarmManagerObjectClass))
2502 G_DEFINE_TYPE(AlarmManagerObject, Server_Object, G_TYPE_OBJECT)
2503 static void Server_Object_init(AlarmManagerObject * obj)
2508 static void Server_Object_class_init(AlarmManagerObjectClass *klass)
2513 static void __initialize_timer()
2515 struct sigaction sig_timer;
2516 sigemptyset(&sig_timer.sa_mask);
2517 sig_timer.sa_flags = SA_SIGINFO;
2518 sig_timer.sa_sigaction = (void *)__alarm_handler;
2519 sigaction(SIG_TIMER, &sig_timer, NULL);
2521 alarm_context.timer = _alarm_create_timer();
2525 static void __initialize_alarm_list()
2528 alarm_context.alarms = NULL;
2529 alarm_context.c_due_time = -1;
2531 _load_alarms_from_registry();
2533 __rtc_set(); /*Set RTC1 Alarm with alarm due time for alarm-manager initialization*/
2538 if (enable_power_on_alarm) {
2539 /* orginally first arg's value was 21(app_id, WAKEUP_ALARM_APP_ID) in a
2540 * platform with app-server. because __alarm_power_on(..) fuction don't
2541 * use first parameter internally, we set this value to 0(zero)
2543 __alarm_power_on(0, enable_power_on_alarm, NULL);
2548 static void __initialize_scheduled_alarm_lsit()
2550 _init_scheduled_alarm_list();
2554 static void __hibernation_leave_callback()
2557 __initialize_scheduled_alarm_lsit();
2559 __alarm_clean_list();
2561 __initialize_alarm_list();
2564 static bool __initialize_noti()
2567 int fd = heynoti_init();
2569 ALARM_MGR_EXCEPTION_PRINT("fail to heynoti_init\n");
2572 heynoti_subscribe(fd, "HIBERNATION_LEAVE", __hibernation_leave_callback,
2574 ret = heynoti_attach_handler(fd);
2576 ALARM_MGR_EXCEPTION_PRINT("heynoti_attach_handler fail");
2579 if (vconf_notify_key_changed
2580 (VCONFKEY_SYSTEM_TIMECHANGE, __on_system_time_changed, NULL) < 0) {
2581 ALARM_MGR_LOG_PRINT(
2582 "Failed to add callback for time changing event\n");
2584 /*system state change noti ó¸® */
2586 if (vconf_notify_key_changed
2587 (VCONFKEY_SETAPPL_TIMEZONE_ID, __on_time_zone_changed, NULL) < 0) {
2588 ALARM_MGR_LOG_PRINT(
2589 "Failed to add callback for time zone changing event\n");
2592 if (vconf_notify_key_changed
2593 (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) {
2594 ALARM_MGR_LOG_PRINT(
2595 "Failed to add callback for time external changing event\n");
2602 static DBusHandlerResult __alarm_server_filter(DBusConnection *connection,
2603 DBusMessage *message,
2607 if (dbus_message_is_signal
2608 (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) {
2613 __expired_alarm_t *expire_info;
2615 dbus_message_get_args(message,
2617 DBUS_TYPE_STRING, &service,
2618 DBUS_TYPE_STRING, &old_owner,
2619 DBUS_TYPE_STRING, &new_owner,
2622 for (entry = g_expired_alarm_list; entry; entry = entry->next) {
2624 expire_info = (__expired_alarm_t *) entry->data;
2626 if (strcmp(expire_info->service_name, service)
2628 ALARM_MGR_EXCEPTION_PRINT(
2629 "__alarm_server_filter : "
2630 "service name(%s) alarm_id (%d)\n",
2631 expire_info->service_name,\
2632 expire_info->alarm_id);
2634 __alarm_send_noti_to_application(
2635 expire_info->service_name,
2636 expire_info->alarm_id);
2637 g_expired_alarm_list =
2638 g_slist_remove(g_expired_alarm_list,
2645 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2648 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
2651 static bool __initialize_dbus()
2653 GError *error = NULL;
2654 GObject *obj = NULL;
2655 DBusGConnection *connection = NULL;
2657 int request_name_result = 0;
2659 dbus_g_object_type_install_info(ALARM_MANAGER_TYPE_OBJECT,
2660 &dbus_glib_alarm_manager_object_info);
2662 connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
2665 ALARM_MGR_EXCEPTION_PRINT("dbus_g_bus_get failed\n");
2669 dbus_error_init(&derror);
2671 request_name_result =
2672 dbus_bus_request_name(dbus_g_connection_get_connection(connection),
2673 "org.tizen.alarm.manager",
2674 DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT, &derror);
2675 if (dbus_error_is_set(&derror)) { /* failure */
2676 ALARM_MGR_EXCEPTION_PRINT("Failed to dbus_bus_request_name "
2677 "(org.tizen.alarm.manager): %s\n", derror.message);
2678 dbus_error_free(&derror);
2682 if (!(obj = g_object_new(ALARM_MANAGER_TYPE_OBJECT, NULL))) {
2683 ALARM_MGR_EXCEPTION_PRINT("Could not allocate new object\n");
2687 dbus_g_connection_register_g_object(connection,
2688 "/org/tizen/alarm/manager",
2691 /*dbus_bus_add_match (dbus_g_connection_get_connection(connection),
2692 "type='signal',member='NameOwnerChanged'",NULL); */
2694 dbus_bus_add_match(dbus_g_connection_get_connection(connection),
2695 "type='signal',sender='" DBUS_SERVICE_DBUS
2696 "',path='" DBUS_PATH_DBUS
2697 "',interface='" DBUS_INTERFACE_DBUS
2698 "',member='NameOwnerChanged'", NULL);
2700 if (!dbus_connection_add_filter
2701 (dbus_g_connection_get_connection(connection),
2702 __alarm_server_filter, NULL, NULL)) {
2703 ALARM_MGR_EXCEPTION_PRINT("add __expire_alarm_filter failed\n");
2708 alarm_context.bus = connection;
2712 #define ALARMMGR_DB_FILE "/opt/dbspace/.alarmmgr.db"
2713 sqlite3 *alarmmgr_db;
2714 #define QUERY_CREATE_TABLE_ALARMMGR "create table alarmmgr \
2715 (alarm_id integer primary key,\
2719 app_unique_name text,\
2720 app_service_name text,\
2721 app_service_name_mod text,\
2729 day_of_week integer,\
2731 alarm_type integer,\
2732 reserved_info integer,\
2733 dst_service_name text, \
2734 dst_service_name_mod text \
2737 static bool __initialize_db()
2739 char *error_message = NULL;
2742 if (access("/opt/dbspace/.alarmmgr.db", F_OK) == 0) {
2744 db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db,
2745 DB_UTIL_REGISTER_HOOK_METHOD);
2747 if (ret != SQLITE_OK) {
2748 ALARM_MGR_EXCEPTION_PRINT(
2749 "====>>>> connect menu_db [%s] failed!\n",
2758 db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db,
2759 DB_UTIL_REGISTER_HOOK_METHOD);
2761 if (ret != SQLITE_OK) {
2762 ALARM_MGR_EXCEPTION_PRINT(
2763 "====>>>> connect menu_db [%s] failed!\n",
2769 sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL,\
2771 ALARM_MGR_EXCEPTION_PRINT("Don't execute query = %s, "
2772 "error message = %s\n", QUERY_CREATE_TABLE_ALARMMGR,
2780 static void __initialize()
2789 fp = fopen("/proc/alarm_boot", "r");
2794 size = fread(&temp, 1, 1, fp);
2799 alarm_boot = atoi(temp);
2807 struct rtc_time rtc_tm;
2810 fd = open(power_rtc, O_RDONLY);
2812 ALARM_MGR_EXCEPTION_PRINT("cannot open /dev/rtc0\n");
2815 retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
2817 ALARM_MGR_EXCEPTION_PRINT("RTC_RD_TIME ioctl failed");
2823 fd2 = open(default_rtc, O_RDWR);
2825 retval = ioctl(fd2, RTC_SET_TIME, &rtc_tm);
2827 ALARM_MGR_EXCEPTION_PRINT("RTC_SET_TIME ioctl failed");
2832 // ALARM_MGR_EXCEPTION_PRINT("cannot open /dev/rtc1\n");
2835 fd = open(power_rtc, O_RDWR);
2837 ALARM_MGR_EXCEPTION_PRINT("cannot open /dev/rtc0\n");
2840 retval = ioctl(fd, RTC_SET_TIME, &rtc_tm);
2842 ALARM_MGR_EXCEPTION_PRINT("RTC_SET_TIME ioctl failed");
2849 __initialize_timer();
2850 if (__initialize_dbus() == false) { /* because dbus's initialize
2851 failed, we cannot continue any more. */
2852 ALARM_MGR_EXCEPTION_PRINT("because __initialize_dbus failed, "
2853 "alarm-server cannot be runned.\n");
2856 __initialize_scheduled_alarm_lsit();
2858 __initialize_alarm_list();
2859 __initialize_noti();
2864 static bool __check_false_alarm()
2866 time_t current_time;
2869 time(¤t_time);
2871 interval = ab_due_time - current_time;
2873 ALARM_MGR_LOG_PRINT("due_time : %d / current_time %d\n", \
2874 alarm_context.c_due_time, current_time);
2876 if (interval > 0 && interval <= 30) {
2878 } else if (!poweron_alarm_expired) {
2879 /* originally, first arguement's value was 121(app_id) which means
2880 * alarm_booting ui application.and this application's dbus-service
2881 * name had a org.tizen.alarmboot.ui in a platform with app-server.
2882 * so we set "org.tizen.alarmboot.ui.ALARM" instead of 121.
2884 __alarm_send_noti_to_application(
2885 WAKEUP_ALARMBOOTING_APP_ID, -1);
2895 GMainLoop *mainloop = NULL;
2897 ALARM_MGR_LOG_PRINT("Enter main loop\n");
2899 mainloop = g_main_loop_new(NULL, FALSE);
2905 __check_false_alarm();
2909 g_main_loop_run(mainloop);