2 * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <sys/socket.h>
25 #include <sys/types.h>
29 #include <sys/timerfd.h>
33 #include <tzplatform_config.h>
38 #include <vconf-keys.h>
40 #include <pkgmgr-info.h>
41 #include <package-manager.h>
42 #include <device/display.h>
43 #include <systemd/sd-login.h>
44 #include <eventsystem.h>
45 #include <notification.h>
46 #include <notification_ipc.h>
47 #include <notification_internal.h>
50 #if !GLIB_CHECK_VERSION(2, 31, 0)
51 #include <glib/gmacros.h>
56 #include "alarm-internal.h"
57 #include "alarm-mgr-stub.h"
60 #define SIG_TIMER 0x32
61 #define WAKEUP_ALARM_APP_ID "org.tizen.alarm.ALARM"
62 /* alarm ui application's alarm's dbus_service name instead of 21
63 * (alarm application's app_id) value */
65 __alarm_server_context_t alarm_context;
66 bool g_dummy_timer_is_set = FALSE;
68 GSList *g_scheduled_alarm_list = NULL;
69 GSList *g_expired_alarm_list = NULL;
71 #ifndef RTC_WKALM_BOOT_SET
72 #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
76 * 2008. 6. 3 sewook7.park
77 * When the alarm becoms sleeping mode, alarm timer is not expired.
78 * So using RTC, phone is awaken before alarm rings.
81 #include <linux/rtc.h>
82 #include <sys/ioctl.h>
85 #ifdef _APPFW_FEATURE_WAKEUP_USING_RTC
86 static const char default_rtc[] = "/dev/rtc";
88 #endif /*__APPFW_FEATURE_WAKEUP_USING_RTC*/
90 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
91 #define ALARMMGR_LOG_BUFFER_SIZE 10000
92 #define ALARMMGR_LOG_BUFFER_STRING_SIZE 200
93 #define ALARMMGR_LOG_TAG_SIZE 20
94 #define ALARMMGR_LOG_MESSAGE_SIZE 120
95 #define ALARMMGR_LOG_FILE_PATH "/var/log/alarmmgr.log"
96 static int log_index = 0;
97 static int log_fd = 0;
100 /* display lock and unlock */
101 #define DEVICED_BUS_NAME "org.tizen.system.deviced"
102 #define DEVICED_PATH_DISPLAY "/Org/Tizen/System/DeviceD/Display"
103 #define DEVICED_INTERFACE_DISPLAY "org.tizen.system.deviced.display"
104 #define DEVICED_LOCK_STATE "lockstate"
105 #define DEVICED_UNLOCK_STATE "unlockstate"
106 #define DEVICED_DBUS_REPLY_TIMEOUT (120*1000)
107 #define DEVICED_LCD_OFF "lcdoff"
108 #define DEVICED_STAY_CUR_STATE "staycurstate"
109 #define DEVICED_SLEEP_MARGIN "sleepmargin"
111 /* link path for timezone info */
112 #define TIMEZONE_INFO_LINK_PATH tzplatform_mkpath(TZ_SYS_ETC, "localtime")
114 /* GDBus Declaration */
115 #define ALARM_MGR_DBUS_PATH "/org/tizen/alarm/manager"
116 #define ALARM_MGR_DBUS_NAME "org.tizen.alarm.manager"
117 static AlarmManager* interface = NULL;
119 sqlite3 *alarmmgr_db;
120 bool is_time_changed = false; /* for calculating next duetime */
122 #define BILLION 1000000000 /* for calculating nano seconds */
123 static time_t periodic_alarm_standard_time = 0;
125 static bool __alarm_add_to_list(__alarm_info_t *__alarm_info);
126 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id);
127 static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
129 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
131 static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
132 __alarm_info_t *__alarm_info);
133 static bool __alarm_update_due_time_of_all_items_in_list(double diff_time);
134 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
135 int pid, periodic_method_e method, long requested_interval, int is_ref,
136 char *app_service_name, char *app_service_name_mod,
137 const char *dst_service_name, const char *dst_service_name_mod,
139 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
140 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code);
142 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
143 static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
144 alarm_info_t *alarm_info, int *error_code);
145 static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, uid_t uid);
146 static void __alarm_expired();
147 static gboolean __alarm_handler_idle(gpointer user_data);
148 static void __on_system_time_external_changed(keynode_t *node, void *data);
149 static void __initialize_timer();
150 static void __initialize_alarm_list();
151 static void __initialize_scheduled_alarm_list();
152 static bool __initialize_noti();
154 static bool __initialize_dbus();
155 static bool __initialize_db();
156 static void __initialize();
157 void on_bus_name_owner_changed(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path,
158 const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data);
159 bool __get_caller_unique_name(int pid, char *unique_name, bool *is_app, uid_t uid);
161 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
162 static void __initialize_module_log(void);
163 static bool __save_module_log(const char *tag, const char *messgae);
166 int __display_lock_state(char *state, char *flag, unsigned int timeout);
167 int __display_unlock_state(char *state, char *flag);
169 int __set_time(time_t _time);
171 struct filtered_alarm_app_s {
176 GHashTable* appid_cache_table = NULL;
184 static bool __get_cached_unique_name(int pid, char *unique_name, bool *is_app, uid_t uid)
186 appid_cache_t *data = NULL;
187 data = (appid_cache_t *)g_hash_table_lookup(appid_cache_table, &pid);
189 snprintf(unique_name, MAX_APP_ID, "%s", data->unique_name);
191 *is_app = data->is_app;
192 ALARM_MGR_LOG_PRINT("Get cached unique_name: %s, pid:%d", unique_name, pid);
196 ALARM_MGR_LOG_PRINT("There is no cached unique_name for pid(%d)", pid);
197 return __get_caller_unique_name(pid, unique_name, is_app, uid);
200 gboolean __hash_table_remove_cb(gpointer key, gpointer value, gpointer user_data)
202 char *target_name = user_data;
203 appid_cache_t *data = value;
204 if (target_name && data && strcmp(target_name, data->unique_name) == 0) {
205 ALARM_MGR_LOG_PRINT("Remove cached data of [%s]", target_name);
211 void __hashtable_foreach_cb(gpointer key, gpointer value, gpointer user_data)
213 appid_cache_t *data = value;
215 ALARM_MGR_LOG_PRINT("# %s(%d) - %s - %d", data->unique_name, data->pid, data->is_app);
218 void __free_cached_value(gpointer data)
220 appid_cache_t* value = data;
223 if (value->unique_name)
224 free(value->unique_name);
229 static void __rtc_set()
231 #ifdef _APPFW_FEATURE_WAKEUP_USING_RTC
232 const char *rtc = default_rtc;
234 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
235 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
237 #ifdef _SIMUL /* RTC does not work in simulator. */
238 ALARM_MGR_EXCEPTION_PRINT("because it is simulator's mode, we don't set RTC.");
243 gfd = open(rtc, O_RDWR);
245 ALARM_MGR_EXCEPTION_PRINT("RTC open failed.");
250 /* Read the RTC time/date */
253 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
254 char *timebuf = ctime(&alarm_context.c_due_time);
256 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
257 snprintf(log_message, sizeof(log_message), "wakeup time: %d, %s", (int)alarm_context.c_due_time, timebuf);
261 ALARM_MGR_LOG_PRINT("alarm_context.c_due_time is %d.", (int)alarm_context.c_due_time);
263 if (alarm_context.c_due_time != -1) {
264 struct rtc_wkalrm rtc_wkalarm = { 0, };
265 rtc_wkalarm.enabled = 0;
266 rtc_wkalarm.time.tm_year = 1900;
267 rtc_wkalarm.time.tm_mon = 0;
268 rtc_wkalarm.time.tm_mday = 1;
269 rtc_wkalarm.time.tm_hour = 0;
270 rtc_wkalarm.time.tm_min = 0;
271 rtc_wkalarm.time.tm_sec = 0;
273 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
276 ALARM_MGR_EXCEPTION_PRINT("Alarm IRQs is not supported.");
278 ALARM_MGR_EXCEPTION_PRINT("RTC_WKALM_SET disabled ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
281 ALARM_MGR_LOG_PRINT("[alarm-server]RTC_WKALM_SET disabled ioctl is successfully done.");
283 time_t due_time = alarm_context.c_due_time;
284 localtime_r(&due_time, &due_tm);
286 ALARM_MGR_LOG_PRINT("Setted RTC Alarm date/time is %d-%d-%d, %02d:%02d:%02d (UTC).",
287 due_tm.tm_mday, due_tm.tm_mon + 1, due_tm.tm_year + 1900,
288 due_tm.tm_hour, due_tm.tm_min, due_tm.tm_sec);
290 rtc_wkalarm.enabled = 1;
291 rtc_wkalarm.time.tm_year = due_tm.tm_year;
292 rtc_wkalarm.time.tm_mon = due_tm.tm_mon;
293 rtc_wkalarm.time.tm_mday = due_tm.tm_mday;
294 rtc_wkalarm.time.tm_hour = due_tm.tm_hour;
295 rtc_wkalarm.time.tm_min = due_tm.tm_min;
296 rtc_wkalarm.time.tm_sec = due_tm.tm_sec - 1; /* Wakeup is 1000ms faster than expiring time to correct RTC error. */
297 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
300 ALARM_MGR_EXCEPTION_PRINT("Alarm IRQs is not supported.");
302 ALARM_MGR_EXCEPTION_PRINT("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
303 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
304 __save_module_log("FAIL: SET RTC", log_message);
308 ALARM_MGR_LOG_PRINT("[alarm-server]RTC ALARM_SET ioctl is successfully done.");
309 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
310 __save_module_log("SET RTC", log_message);
313 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]alarm_context.c_due_time is"
314 "less than 10 sec. RTC alarm does not need to be set");
317 ALARM_MGR_LOG_PRINT("[alarm-server] RTC does not work.");
318 #endif /* _APPFW_FEATURE_WAKEUP_USING_RTC */
322 int __set_time(time_t _time)
326 struct tm tm, *gmtime_res;
331 gmtime_res = gmtime_r(&(tv.tv_sec), &tm);
333 ALARM_MGR_EXCEPTION_PRINT("gmtime_r is failed. [%d]", errno);
335 ret = settimeofday(&tv, NULL);
337 ALARM_MGR_EXCEPTION_PRINT("settimeofday is failed.[%d]", errno);
339 #ifdef _APPFW_FEATURE_WAKEUP_USING_RTC
340 /* Using /dev/alarm, this function changes both OS time and RTC. */
341 const char *rtc0 = default_rtc;
342 struct rtc_time _rtc_time;
343 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
344 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
345 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
350 gfd = open(rtc0, O_RDWR);
352 ALARM_MGR_EXCEPTION_PRINT("Opening the /dev/alarm is failed.");
358 memset(&_rtc_time, 0, sizeof(_rtc_time));
359 _rtc_time.tm_sec = tm.tm_sec;
360 _rtc_time.tm_min = tm.tm_min;
361 _rtc_time.tm_hour = tm.tm_hour;
362 _rtc_time.tm_mday = tm.tm_mday;
363 _rtc_time.tm_mon = tm.tm_mon;
364 _rtc_time.tm_year = tm.tm_year;
365 _rtc_time.tm_wday = tm.tm_wday;
366 _rtc_time.tm_yday = tm.tm_yday;
367 _rtc_time.tm_isdst = tm.tm_isdst;
369 ret = ioctl(gfd, RTC_SET_TIME, &_rtc_time);
371 ALARM_MGR_EXCEPTION_PRINT("ALARM_SET_RTC ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
372 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
373 strncpy(log_tag, "FAIL: SET RTC", strlen("FAIL: SET RTC"));
377 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
379 strncpy(log_tag, "SET RTC", strlen("SET RTC"));
381 char *timebuf = ctime(&_time);
383 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
384 snprintf(log_message, sizeof(log_message), "RTC & OS =%d, %s", (int)_time, timebuf);
387 __save_module_log(log_tag, log_message);
390 ALARM_MGR_LOG_PRINT("[alarm-server] RTC does not work.");
391 #endif /* _APPFW_FEATURE_WAKEUP_USING_RTC */
396 bool __alarm_clean_list()
398 g_slist_free_full(alarm_context.alarms, g_free);
402 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id)
404 bool unique_id = false;
405 __alarm_info_t *entry = NULL;
408 srand((unsigned int)time(NULL));
409 __alarm_info->alarm_id = (rand() % INT_MAX) + 1;
410 ALARM_MGR_LOG_PRINT("__alarm_info->alarm_id is %d", __alarm_info->alarm_id);
412 while (unique_id == false) {
415 for (iter = alarm_context.alarms; iter != NULL;
416 iter = g_slist_next(iter)) {
418 if (entry->alarm_id == __alarm_info->alarm_id) {
419 __alarm_info->alarm_id++;
425 *alarm_id = __alarm_info->alarm_id;
430 static bool __alarm_add_to_list(__alarm_info_t *__alarm_info)
432 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
433 __alarm_info_t *entry = NULL;
436 ALARM_MGR_LOG_PRINT("[alarm-server]: Before add alarm_id(%d)", __alarm_info->alarm_id);
438 alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info);
439 ALARM_MGR_LOG_PRINT("[alarm-server]: After add alarm_id(%d)", __alarm_info->alarm_id);
442 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
444 ALARM_MGR_LOG_PRINT("[alarm-server]: alarm_id(%d).", entry->alarm_id);
447 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
448 if (!_save_alarms(__alarm_info))
449 ALARM_MGR_EXCEPTION_PRINT("Saving alarm_id(%d) in DB is failed.", __alarm_info->alarm_id);
455 static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
459 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
461 __alarm_info_t *entry = NULL;
463 for (iter = alarm_context.alarms; iter != NULL;
464 iter = g_slist_next(iter)) {
466 if (entry->uid == __alarm_info->uid &&
467 entry->alarm_id == __alarm_info->alarm_id) {
469 __alarm_info->quark_app_unique_name =
470 entry->quark_app_unique_name;
471 __alarm_info->quark_dst_service_name =
472 entry->quark_dst_service_name;
473 memcpy(entry, __alarm_info, sizeof(__alarm_info_t));
481 *error_code = ERR_ALARM_INVALID_ID;
485 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
486 if (!_update_alarms(__alarm_info))
487 ALARM_MGR_EXCEPTION_PRINT("Updating alarm_id(%d) in DB is failed.", __alarm_info->alarm_id);
493 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
498 alarm_info_t *alarm_info = NULL;
501 __alarm_info_t *entry = NULL;
504 ALARM_MGR_LOG_PRINT("[alarm-server]: before del : alarm id(%d)", alarm_id);
506 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
508 if (entry->uid == uid && entry->alarm_id == alarm_id) {
509 alarm_info = &entry->alarm_info;
511 ALARM_MGR_LOG_PRINT("[alarm-server]:Remove alarm id(%d)", entry->alarm_id);
513 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE))
514 _delete_alarms(alarm_id);
516 alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
524 ALARM_MGR_LOG_PRINT("[alarm-server]: after del\n");
528 *error_code = ERR_ALARM_INVALID_ID;
535 static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
536 __alarm_info_t *__alarm_info)
538 alarm_date_t *start = &alarm_info->start;
539 alarm_date_t *end = &alarm_info->end;
541 struct tm alarm_tm = { 0, };
543 if (start->year != 0) {
544 if ((alarm_info->alarm_type & ALARM_TYPE_RELATIVE) && alarm_info->reserved_info != 0) {
545 __alarm_info->start = alarm_info->reserved_info;
547 alarm_tm.tm_year = start->year - 1900;
548 alarm_tm.tm_mon = start->month - 1;
549 alarm_tm.tm_mday = start->day;
551 alarm_tm.tm_hour = start->hour;
552 alarm_tm.tm_min = start->min;
553 alarm_tm.tm_sec = start->sec;
554 alarm_tm.tm_isdst = -1;
556 __alarm_info->start = mktime(&alarm_tm);
559 __alarm_info->start = 0;
562 if (end->year != 0) {
563 alarm_tm.tm_year = end->year - 1900;
564 alarm_tm.tm_mon = end->month - 1;
565 alarm_tm.tm_mday = end->day;
567 alarm_tm.tm_hour = end->hour;
568 alarm_tm.tm_min = end->min;
569 alarm_tm.tm_sec = end->sec;
571 __alarm_info->end = mktime(&alarm_tm);
573 __alarm_info->end = 0;
580 static bool alarm_get_tz_info(int *gmt_idx, int *dst)
582 GConfValue *value1 = NULL;
583 GConfValue *value2 = NULL;
584 GConfClient* gConfClient = NULL;
587 gConfClient = gconf_client_get_default();
590 value1 = gconf_client_get(gConfClient, SETTINGS_CLOCKTIMEZONE,
593 ALARM_MGR_LOG_PRINT("__on_system_time_changed:
594 gconf_client_get() failed:
595 error:[%s]\n", err->message);
599 *gmt_idx = gconf_value_get_int(value1);
600 ALARM_MGR_LOG_PRINT("gconf return gmt_idx =%d\n ", *gmt_idx);
602 value2 = gconf_client_get(gConfClient,
603 SETTINGS_DAYLIGHTSTATUS, &err);
605 ALARM_MGR_LOG_PRINT("__on_system_time_changed:
606 gconf_client_get() failed: error:[%s]\n", err->message);
611 *dst = gconf_value_get_int(value2);
612 ALARM_MGR_LOG_PRINT("gconf return dst =%d\n ", *dst);
614 if(gConfClient != NULL) {
615 g_object_unref(gConfClient);
620 ALARM_MGR_LOG_PRINT("check the gconf setting failed!!!!! \n ");
623 gconf_value_free(value1);
627 gconf_value_free(value2);
635 gboolean __update_relative_alarms(gpointer user_data)
638 __alarm_info_t *entry = NULL;
639 char *error_message = NULL;
641 if (sqlite3_exec(alarmmgr_db, "BEGIN EXCLUSIVE", NULL, NULL, &error_message) != SQLITE_OK) {
642 SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message);
646 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
648 alarm_info_t *alarm_info = &(entry->alarm_info);
649 if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE)
650 _update_alarms(entry);
653 if (sqlite3_exec(alarmmgr_db, "COMMIT", NULL, NULL, &error_message) != SQLITE_OK) {
654 SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message);
661 static bool __alarm_update_due_time_of_all_items_in_list(double diff_time)
664 time_t min_time = -1;
667 __alarm_info_t *entry = NULL;
668 struct tm *p_time = NULL ;
669 struct tm due_time_result ;
670 is_time_changed = true;
673 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
675 alarm_info_t *alarm_info = &(entry->alarm_info);
676 if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) {
677 entry->due_time += diff_time;
679 alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */
680 alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */
682 p_time = localtime_r(&entry->due_time, &due_time_result);
683 if (p_time != NULL) {
684 start->year = p_time->tm_year + 1900;
685 start->month = p_time->tm_mon + 1;
686 start->day = p_time->tm_mday;
687 start->hour = p_time->tm_hour;
688 start->min = p_time->tm_min;
689 start->sec = p_time->tm_sec;
691 if (entry->start != 0) {
692 entry->start = entry->due_time;
695 if (entry->end != 0) {
696 entry->end += diff_time;
697 p_time = localtime_r(&entry->end, &due_time_result);
698 if (p_time != NULL) {
699 end->year = p_time->tm_year + 1900;
700 end->month = p_time->tm_mon + 1;
701 end->day = p_time->tm_mday;
702 end->hour = p_time->tm_hour;
703 end->min = p_time->tm_min;
704 end->sec = p_time->tm_sec;
708 _alarm_next_duetime(entry);
713 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
715 due_time = entry->due_time;
719 ALARM_MGR_LOG_PRINT("alarm[%d] with duetime(%u) at current(%u)", entry->alarm_id, due_time, current_time);
720 if (due_time == 0) { /* 0 means this alarm has been disabled */
724 interval = difftime(due_time, current_time);
727 ALARM_MGR_EXCEPTION_PRINT("The duetime of alarm(%d) is OVER.", entry->alarm_id);
731 interval = difftime(due_time, min_time);
733 if ((interval < 0) || min_time == -1)
737 is_time_changed = false;
738 alarm_context.c_due_time = min_time;
740 g_idle_add(__update_relative_alarms, NULL);
744 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
745 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code)
750 char due_time_r[100] = { 0 };
751 char app_name[512] = { 0 };
753 const char* callee_appid = NULL;
754 char* caller_pkgid = NULL;
755 char* callee_pkgid = NULL;
756 pkgmgrinfo_pkginfo_h caller_handle;
757 pkgmgrinfo_pkginfo_h callee_handle;
758 bundle_raw *b_data = NULL;
760 bool caller_is_app = false;
762 __alarm_info_t *__alarm_info = NULL;
764 __alarm_info = malloc(sizeof(__alarm_info_t));
765 if (__alarm_info == NULL) {
766 SECURE_LOGE("Caution!! app_pid=%d, malloc failed. it seems to be OOM.", pid);
767 *error_code = ERR_ALARM_SYSTEM_FAIL;
771 __alarm_info->uid = uid;
772 __alarm_info->pid = pid;
773 __alarm_info->alarm_id = -1;
774 __alarm_info->requested_interval = requested_interval;
775 __alarm_info->global = false;
777 if (__get_cached_unique_name(pid, app_name, &caller_is_app, uid) == false) {
778 *error_code = ERR_ALARM_SYSTEM_FAIL;
782 __alarm_info->quark_app_unique_name = g_quark_from_string(app_name);
785 __alarm_info->quark_caller_pkgid = g_quark_from_string("null");
788 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_name, uid, &caller_handle) == PMINFO_R_OK) {
789 if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) {
791 __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
793 pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
798 __alarm_info->quark_callee_pkgid = g_quark_from_string("null");
800 b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
801 callee_appid = appsvc_get_appid(b);
802 if (pkgmgrinfo_appinfo_get_usr_appinfo(callee_appid, uid, &callee_handle) == PMINFO_R_OK) {
803 if (pkgmgrinfo_appinfo_get_pkgid(callee_handle, &callee_pkgid) == PMINFO_R_OK) {
805 __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid);
807 pkgmgrinfo_appinfo_destroy_appinfo(callee_handle);
810 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = %s",
811 g_quark_to_string(__alarm_info->quark_caller_pkgid), g_quark_to_string(__alarm_info->quark_callee_pkgid));
813 bundle_encode(b, &b_data, &datalen);
814 __alarm_info->quark_bundle = g_quark_from_string((const gchar *)b_data);
815 __alarm_info->quark_noti = g_quark_from_string("null");
816 __alarm_info->quark_app_service_name = g_quark_from_string("null");
817 __alarm_info->quark_dst_service_name = g_quark_from_string("null");
818 __alarm_info->quark_app_service_name_mod = g_quark_from_string("null");
819 __alarm_info->quark_dst_service_name_mod = g_quark_from_string("null");
827 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
828 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
829 __alarm_generate_alarm_id(__alarm_info, alarm_id);
833 if (alarm_context.c_due_time < current_time) {
834 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
835 "(%d) is less than current time(%d)", alarm_context.c_due_time, current_time);
836 alarm_context.c_due_time = -1;
839 due_time = _alarm_next_duetime(__alarm_info);
840 if (__alarm_add_to_list(__alarm_info) == false) {
842 *error_code = ERR_ALARM_SYSTEM_FAIL;
847 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: "
848 "due_time is 0, alarm(%d) \n", *alarm_id);
850 } else if (current_time == due_time) {
851 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: "
852 "current_time(%d) is same as due_time(%d)", current_time,
855 } else if (difftime(due_time, current_time) < 0) {
856 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);
859 localtime_r(&due_time, &ts_ret);
860 strftime(due_time_r, 30, "%c", &ts_ret);
861 SECURE_LOGD("[alarm-server]:Create a new alarm: "
862 "alarm(%d) due_time(%s)", *alarm_id,
866 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), due_time(%d)", alarm_context.c_due_time, due_time);
868 if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) {
869 _clear_scheduled_alarm_list();
870 _add_to_scheduled_alarm_list(__alarm_info);
871 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time);
872 alarm_context.c_due_time = due_time;
873 } else if (due_time == alarm_context.c_due_time) {
874 _add_to_scheduled_alarm_list(__alarm_info);
882 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
883 int pid, periodic_method_e method, long requested_interval, int is_ref,
884 char *app_service_name, char *app_service_name_mod,
885 const char *dst_service_name, const char *dst_service_name_mod,
890 char unique_name[MAX_APP_ID] = { 0 };
891 char* caller_pkgid = NULL;
892 pkgmgrinfo_pkginfo_h caller_handle;
893 bool caller_is_app = false;
895 __alarm_info_t *__alarm_info = NULL;
897 __alarm_info = malloc(sizeof(__alarm_info_t));
898 if (__alarm_info == NULL) {
899 SECURE_LOGE("Caution!! app_pid=%d, malloc "
900 "failed. it seems to be OOM\n", pid);
901 *error_code = ERR_ALARM_SYSTEM_FAIL;
904 __alarm_info->uid = uid;
905 __alarm_info->pid = pid;
906 __alarm_info->alarm_id = -1;
907 __alarm_info->quark_caller_pkgid = g_quark_from_string("null");
908 __alarm_info->method = method;
909 __alarm_info->requested_interval = requested_interval;
910 __alarm_info->is_ref = is_ref;
911 __alarm_info->global = false;
913 if (__get_cached_unique_name(pid, unique_name, &caller_is_app, uid) == false) {
914 *error_code = ERR_ALARM_SYSTEM_FAIL;
919 /* Get caller_appid to get caller's package id. There is no callee. */
921 if (pkgmgrinfo_appinfo_get_usr_appinfo(unique_name, uid, &caller_handle) == PMINFO_R_OK) {
922 if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) {
924 __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
926 pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
930 __alarm_info->quark_callee_pkgid = g_quark_from_string("null");
931 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null", g_quark_to_string(__alarm_info->quark_caller_pkgid));
933 __alarm_info->quark_app_unique_name = g_quark_from_string(unique_name);
934 __alarm_info->quark_app_service_name = g_quark_from_string(app_service_name);
935 __alarm_info->quark_app_service_name_mod = g_quark_from_string(app_service_name_mod);
936 __alarm_info->quark_dst_service_name = g_quark_from_string(dst_service_name);
937 __alarm_info->quark_dst_service_name_mod = g_quark_from_string(dst_service_name_mod);
938 __alarm_info->quark_bundle = g_quark_from_string("null");
939 __alarm_info->quark_noti = g_quark_from_string("null");
941 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
942 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
943 __alarm_generate_alarm_id(__alarm_info, alarm_id);
947 SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, "
948 "app_service_name=%s,dst_service_name=%s, c_due_time=%d", \
949 pid, g_quark_to_string(__alarm_info->quark_app_unique_name), \
950 g_quark_to_string(__alarm_info->quark_app_service_name), \
951 g_quark_to_string(__alarm_info->quark_dst_service_name), \
952 alarm_context.c_due_time);
954 if (alarm_context.c_due_time < current_time) {
955 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
956 "(%d) is less than current time(%d)", alarm_context.c_due_time, current_time);
957 alarm_context.c_due_time = -1;
960 due_time = _alarm_next_duetime(__alarm_info);
961 if (__alarm_add_to_list(__alarm_info) == false) {
967 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: due_time is 0, alarm(%d).", *alarm_id);
969 } else if (current_time == due_time) {
970 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: current_time(%d) is same as due_time(%d).",
971 current_time, due_time);
973 } else if (difftime(due_time, current_time) < 0) {
974 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list.",
975 due_time, current_time);
978 char due_time_r[100] = { 0 };
980 localtime_r(&due_time, &ts_ret);
981 strftime(due_time_r, 30, "%c", &ts_ret);
982 SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", *alarm_id, due_time_r);
985 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), due_time(%d)", alarm_context.c_due_time, due_time);
987 if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) {
988 _clear_scheduled_alarm_list();
989 _add_to_scheduled_alarm_list(__alarm_info);
990 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time);
991 alarm_context.c_due_time = due_time;
992 } else if (due_time == alarm_context.c_due_time) {
993 _add_to_scheduled_alarm_list(__alarm_info);
1001 static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
1002 long requested_interval, uid_t uid, int pid, char *noti_data, int *error_code)
1004 time_t current_time;
1007 char due_time_r[100] = { 0 };
1008 char app_name[512] = { 0 };
1009 char* caller_pkgid = NULL;
1010 pkgmgrinfo_pkginfo_h caller_handle;
1011 bool caller_is_app = false;
1013 __alarm_info_t *__alarm_info = NULL;
1015 __alarm_info = malloc(sizeof(__alarm_info_t));
1016 if (__alarm_info == NULL) {
1017 SECURE_LOGE("Caution!! app_pid=%d, malloc "
1018 "failed. it seems to be OOM\n", pid);
1019 *error_code = ERR_ALARM_SYSTEM_FAIL;
1022 __alarm_info->uid = uid;
1023 __alarm_info->pid = pid;
1024 __alarm_info->alarm_id = -1;
1025 __alarm_info->requested_interval = requested_interval;
1026 __alarm_info->global = false;
1028 if (__get_cached_unique_name(pid, app_name, &caller_is_app, uid) == false) {
1029 *error_code = ERR_ALARM_SYSTEM_FAIL;
1033 __alarm_info->quark_app_unique_name = g_quark_from_string(app_name);
1035 __alarm_info->quark_caller_pkgid = g_quark_from_string("null");
1037 if (caller_is_app) {
1038 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_name, uid, &caller_handle) == PMINFO_R_OK) {
1039 if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) {
1041 __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
1043 pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
1047 __alarm_info->quark_callee_pkgid = g_quark_from_string("null");
1048 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null",
1049 g_quark_to_string(__alarm_info->quark_caller_pkgid));
1051 __alarm_info->quark_bundle = g_quark_from_string("null");
1052 __alarm_info->quark_noti = g_quark_from_string(noti_data);
1053 __alarm_info->quark_app_service_name = g_quark_from_string("null");
1054 __alarm_info->quark_dst_service_name = g_quark_from_string("null");
1055 __alarm_info->quark_app_service_name_mod = g_quark_from_string("null");
1056 __alarm_info->quark_dst_service_name_mod = g_quark_from_string("null");
1058 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1059 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1060 __alarm_generate_alarm_id(__alarm_info, alarm_id);
1062 time(¤t_time);
1064 SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, "
1065 "app_service_name=%s,dst_service_name=%s, c_due_time=%d", \
1066 pid, g_quark_to_string(__alarm_info->quark_app_unique_name), \
1067 g_quark_to_string(__alarm_info->quark_app_service_name), \
1068 g_quark_to_string(__alarm_info->quark_dst_service_name), \
1069 alarm_context.c_due_time);
1071 if (alarm_context.c_due_time < current_time) {
1072 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
1073 "(%d) is less than current time(%d)", alarm_context.c_due_time, current_time);
1074 alarm_context.c_due_time = -1;
1077 due_time = _alarm_next_duetime(__alarm_info);
1078 if (__alarm_add_to_list(__alarm_info) == false) {
1083 if (due_time == 0) {
1084 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: due_time is 0, alarm(%d).", *alarm_id);
1086 } else if (current_time == due_time) {
1087 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: current_time(%d) is same as due_time(%d).",
1088 current_time, due_time);
1090 } else if (difftime(due_time, current_time) < 0) {
1091 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list.",
1092 due_time, current_time);
1095 localtime_r(&due_time, &ts_ret);
1096 strftime(due_time_r, 30, "%c", &ts_ret);
1097 SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", *alarm_id, due_time_r);
1100 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1102 if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) {
1103 _clear_scheduled_alarm_list();
1104 _add_to_scheduled_alarm_list(__alarm_info);
1105 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time);
1106 alarm_context.c_due_time = due_time;
1107 } else if (due_time == alarm_context.c_due_time) {
1108 _add_to_scheduled_alarm_list(__alarm_info);
1116 static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
1117 alarm_info_t *alarm_info, int *error_code)
1119 time_t current_time;
1122 __alarm_info_t *__alarm_info = NULL;
1123 bool result = false;
1125 __alarm_info = malloc(sizeof(__alarm_info_t));
1126 if (__alarm_info == NULL) {
1127 SECURE_LOGE("Caution!! app_pid=%d, malloc failed. it seems to be OOM.", pid);
1128 *error_code = ERR_ALARM_SYSTEM_FAIL;
1132 __alarm_info->uid = uid;
1133 __alarm_info->pid = pid;
1134 __alarm_info->alarm_id = alarm_id;
1136 /* we should consider to check whether pid is running or Not
1139 __alarm_info->quark_app_service_name =
1140 g_quark_from_string(app_service_name);
1141 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1142 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1144 time(¤t_time);
1146 if (alarm_context.c_due_time < current_time) {
1147 ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
1148 "(%d) is less than current time(%d)", alarm_context.c_due_time, current_time);
1149 alarm_context.c_due_time = -1;
1152 due_time = _alarm_next_duetime(__alarm_info);
1153 if (!__alarm_update_in_list(__alarm_info, error_code)) {
1155 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: requested alarm_id "
1156 "(%d) does not exist. so this value is invalid id.", alarm_id);
1160 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1162 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1163 /*there is no scheduled alarm */
1164 _alarm_disable_timer(alarm_context);
1167 ALARM_MGR_LOG_PRINT("[alarm-server]:Update alarm: alarm(%d).", alarm_id);
1172 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: due_time is 0.");
1178 if (due_time == 0) {
1179 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
1180 "due_time is 0, alarm(%d)\n", alarm_id);
1183 } else if (current_time == due_time) {
1184 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
1185 "current_time(%d) is same as due_time(%d)", current_time,
1189 } else if (difftime(due_time, current_time) < 0) {
1190 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);
1194 char due_time_r[100] = { 0 };
1196 localtime_r(&due_time, &ts_ret);
1197 strftime(due_time_r, 30, "%c", &ts_ret);
1198 SECURE_LOGD("[alarm-server]:Update alarm: alarm(%d) "
1199 "due_time(%s)\n", alarm_id, due_time_r);
1202 ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1204 if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) {
1205 _clear_scheduled_alarm_list();
1206 _add_to_scheduled_alarm_list(__alarm_info);
1207 _alarm_set_timer(&alarm_context, alarm_context.timer, due_time);
1208 alarm_context.c_due_time = due_time;
1209 ALARM_MGR_LOG_PRINT("[alarm-server1]:alarm_context.c_due_time "
1210 "(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1211 } else if (due_time == alarm_context.c_due_time) {
1212 _add_to_scheduled_alarm_list(__alarm_info);
1213 ALARM_MGR_LOG_PRINT("[alarm-server2]:alarm_context.c_due_time "
1214 "(%d), due_time(%d)", alarm_context.c_due_time, due_time);
1224 static bool __alarm_set_global_to_db(__alarm_info_t *alarm_info, bool global)
1227 char *error_message = NULL;
1228 char *query = sqlite3_mprintf("update alarmmgr set global=%d where alarm_id=%d",
1229 alarm_info->global, alarm_info->alarm_id);
1231 if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) {
1232 SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message);
1233 sqlite3_free(query);
1237 sqlite3_free(query);
1242 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code)
1244 bool result = false;
1246 SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) uid(%d)\n", alarm_id, uid);
1247 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1249 if (!__alarm_remove_from_list(uid, alarm_id, error_code)) {
1251 SECURE_LOGE("[alarm-server]:delete alarm: "
1252 "alarm(%d) uid(%d) has failed with error_code(%d)\n",
1253 alarm_id, uid, *error_code);
1257 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1258 _alarm_disable_timer(alarm_context);
1267 static bool __can_skip_expired_cb(alarm_id_t alarm_id)
1269 GSList *gs_iter = NULL;
1270 __alarm_info_t *entry = NULL;
1271 alarm_info_t *alarm = NULL;
1273 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1274 entry = gs_iter->data;
1275 if (entry->alarm_id == alarm_id) {
1276 alarm = &(entry->alarm_info);
1279 int dur = entry->requested_interval;
1282 if (dur == 0 || !(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF)
1285 ts_tm.tm_hour = alarm->start.hour;
1286 ts_tm.tm_min = alarm->start.min;
1287 ts_tm.tm_sec = alarm->start.sec;
1289 ts_tm.tm_year = alarm->start.year - 1900;
1290 ts_tm.tm_mon = alarm->start.month - 1;
1291 ts_tm.tm_mday = alarm->start.day;
1292 ts_tm.tm_isdst = -1;
1294 ts = mktime(&ts_tm);
1296 from = (ts / dur) * dur;
1299 if (ts >= from && ts < to && from > ts - alarm->mode.u_interval.interval)
1309 static gboolean __send_noti_to_session_bus(char *service_name,
1310 alarm_id_t alarm_id, uid_t uid)
1315 struct sockaddr_un saddr;
1320 fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
1324 saddr.sun_family = AF_UNIX;
1325 snprintf(saddr.sun_path, sizeof(saddr.sun_path),
1326 "/run/alarm_agent/%d", uid);
1328 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1330 ALARM_MGR_EXCEPTION_PRINT("connect failed - (errno %d)", errno);
1335 gv = g_variant_new("(is)", alarm_id, service_name);
1341 len = g_variant_get_size(gv);
1345 gv_data = malloc(len);
1348 g_variant_unref(gv);
1353 g_variant_store(gv, gv_data);
1354 g_variant_unref(gv);
1356 data = malloc(len + 4);
1362 memcpy(data, &len, 4);
1363 memcpy(data + 4, gv_data, len);
1366 if (send(fd, data, len + 4, 0) == -1) {
1367 ALARM_MGR_EXCEPTION_PRINT("sendto() failed (errno %d)", errno);
1378 static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, uid_t uid)
1380 char service_name[MAX_SERVICE_NAME_LEN] = {0,};
1383 if (app_service_name == NULL || strlen(app_service_name) == 0) {
1384 ALARM_MGR_EXCEPTION_PRINT("This alarm destination is invalid.");
1388 if (__can_skip_expired_cb(alarm_id))
1391 memcpy(service_name, app_service_name, strlen(app_service_name));
1392 SECURE_LOGI("[alarm server][send expired_alarm(alarm_id=%d) to app_service_name(%s)]", alarm_id, service_name);
1394 if (uid >= REGULAR_UID_MIN) {
1395 ret = __send_noti_to_session_bus(service_name, alarm_id, uid);
1397 ALARM_MGR_EXCEPTION_PRINT("failed to send alarm expired noti for %d, %s",
1398 alarm_id, service_name);
1400 g_dbus_connection_call(alarm_context.connection,
1402 "/org/tizen/alarm/client",
1403 "org.tizen.alarm.client",
1405 g_variant_new("(is)", alarm_id, service_name),
1407 G_DBUS_CALL_FLAGS_NONE,
1415 static int __get_caller_uid(const char *name)
1419 GError *error = NULL;
1421 ret = g_dbus_connection_call_sync(
1422 alarm_context.connection,
1423 "org.freedesktop.DBus",
1424 "/org/freedesktop/DBus",
1425 "org.freedesktop.DBus",
1426 "GetConnectionUnixUser",
1427 g_variant_new("(s)", name),
1429 G_DBUS_CALL_FLAGS_NONE,
1434 ALARM_MGR_EXCEPTION_PRINT("failed to get caller uid");
1436 ALARM_MGR_EXCEPTION_PRINT("dbus error message : %s", error->message);
1437 g_error_free(error);
1441 g_variant_get(ret, "(u)", &uid);
1442 g_variant_unref(ret);
1447 static int __get_caller_pid(const char *name)
1451 GError *error = NULL;
1453 ret = g_dbus_connection_call_sync(alarm_context.connection,
1454 "org.freedesktop.DBus",
1455 "/org/freedesktop/DBus",
1456 "org.freedesktop.DBus",
1457 "GetConnectionUnixProcessID",
1458 g_variant_new("(s)", name),
1460 G_DBUS_CALL_FLAGS_NONE,
1465 ALARM_MGR_EXCEPTION_PRINT("failed to get caller pid");
1467 ALARM_MGR_EXCEPTION_PRINT("dbus error message : %s", error->message);
1468 g_error_free(error);
1472 g_variant_get(ret, "(u)", &pid);
1473 g_variant_unref(ret);
1478 static int __is_ui_app(const char *appid, uid_t uid)
1484 pkgmgrinfo_appinfo_h appinfo_h = NULL;
1486 ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, uid, &appinfo_h);
1491 char *component = NULL;
1494 ret = pkgmgrinfo_appinfo_get_component_type(appinfo_h, &component);
1495 if (ret == 0 && component != NULL && strncmp(component, "uiapp", 5) == 0)
1499 pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
1504 static int __compare_api_version(int *result, int pid, uid_t uid)
1507 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1508 char pkgid[512] = {0, };
1511 if (aul_app_get_pkgid_bypid_for_uid(pid, pkgid, sizeof(pkgid), uid) != AUL_R_OK) {
1512 ALARM_MGR_EXCEPTION_PRINT("aul_app_get_pkgid_bypid() is failed. PID %d may not be app.", getpid());
1514 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
1515 if (ret != PMINFO_R_OK) {
1516 ALARM_MGR_EXCEPTION_PRINT("Failed to get pkginfo\n");
1518 ret = pkgmgrinfo_pkginfo_get_api_version(pkginfo, &pkg_version);
1519 if (ret != PMINFO_R_OK)
1520 ALARM_MGR_EXCEPTION_PRINT("Failed to check api version [%d]\n", ret);
1521 *result = strverscmp(pkg_version, "2.4");
1522 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1528 static int __find_login_user(uid_t *uid)
1534 ret = sd_get_uids(&uids);
1538 for (i = 0; i < ret ; i++) {
1539 if (sd_uid_get_state(uids[i], &state) < 0) {
1543 if (!strncmp(state, "online", 6)) {
1556 static void __alarm_expired()
1559 const char *destination_app_service_name = NULL;
1560 alarm_id_t alarm_id = -1;
1562 __alarm_info_t *__alarm_info = NULL;
1563 char alarm_id_val[32];
1568 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
1569 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
1572 ALARM_MGR_LOG_PRINT("[alarm-server]: Enter");
1574 time_t current_time;
1577 time(¤t_time);
1579 interval = difftime(alarm_context.c_due_time, current_time);
1580 ALARM_MGR_LOG_PRINT("[alarm-server]: c_due_time(%d), current_time(%d), interval(%d)",
1581 alarm_context.c_due_time, current_time, interval);
1583 if (alarm_context.c_due_time > current_time + 1) {
1584 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds future",
1585 alarm_context.c_due_time - current_time);
1588 /* 10 seconds is maximum permitted delay from timer expire to this function */
1589 if (alarm_context.c_due_time + 10 < current_time) {
1590 ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds past.",
1591 current_time - alarm_context.c_due_time);
1595 GSList *iter = NULL;
1596 __scheduled_alarm_t *alarm = NULL;
1598 for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) {
1600 alarm_id = alarm->alarm_id;
1601 __alarm_info = alarm->__alarm_info;
1602 app_pid = __alarm_info->pid;
1604 /* Case #1. The process is an application launched by app_control.
1605 * It registered an alarm using launch-based APIs like alarm_schedule_xxx, alarmmgr_xxx_appsvc. */
1606 if (strncmp(g_quark_to_string(__alarm_info->quark_bundle), "null", 4) != 0) {
1607 b_len = strlen(g_quark_to_string(__alarm_info->quark_bundle));
1609 b = bundle_decode((bundle_raw *)g_quark_to_string(__alarm_info->quark_bundle), b_len);
1612 ALARM_MGR_EXCEPTION_PRINT("Error!!!..Unable to decode the bundle!!\n");
1614 snprintf(alarm_id_val, sizeof(alarm_id_val), "%d", alarm_id);
1616 if (bundle_add_str(b, "http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)) {
1617 ALARM_MGR_EXCEPTION_PRINT("Unable to add alarm id to the bundle\n");
1621 if (__compare_api_version(&result, app_pid, __alarm_info->uid) < 0) {
1622 ALARM_MGR_EXCEPTION_PRINT("Unable to check api version\n");
1628 if (appsvc_usr_run_service(b, 0, NULL, NULL, __alarm_info->uid) < 0)
1629 ALARM_MGR_EXCEPTION_PRINT("Unable to run app svc\n");
1631 ALARM_MGR_LOG_PRINT("Successfuly run app svc\n");
1634 appid = (char *)appsvc_get_appid(b);
1635 if ((__alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) {
1636 ALARM_MGR_EXCEPTION_PRINT("This alarm is ignored\n");
1637 } else if (!(__alarm_info->alarm_info.alarm_type & ALARM_TYPE_INEXACT) ||
1638 !__can_skip_expired_cb(__alarm_info->alarm_id)) {
1639 if (__alarm_info->global) {
1640 if (__find_login_user(&target_uid) < 0) {
1641 ALARM_MGR_EXCEPTION_PRINT("Fail to get login user\n");
1644 ret = appsvc_usr_run_service(b, 0, NULL, NULL, target_uid);
1647 ret = appsvc_usr_run_service(b, 0, NULL, NULL, __alarm_info->uid);
1651 ALARM_MGR_EXCEPTION_PRINT("Unable to launch app [%s] \n", appid);
1653 ALARM_MGR_LOG_PRINT("Successfuly ran app svc\n");
1654 if (__is_ui_app(appid, __alarm_info->uid))
1655 device_display_change_state(DISPLAY_STATE_NORMAL);
1662 } else if (strncmp(g_quark_to_string(__alarm_info->quark_noti), "null", 4) != 0) {
1663 GVariant *noti_gv = NULL;
1664 GVariant *body = NULL;
1666 notification_h noti;
1669 data = g_base64_decode(g_quark_to_string(__alarm_info->quark_noti),
1672 noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"),
1676 g_variant_get(noti_gv, "(v)", &body);
1678 noti = notification_create(NOTIFICATION_TYPE_NOTI);
1679 notification_ipc_make_noti_from_gvariant(noti, body);
1680 notification_post_for_uid(noti, __alarm_info->uid);
1682 char appid[MAX_SERVICE_NAME_LEN] = { 0, };
1683 pkgmgrinfo_appinfo_h appinfo_handle = NULL;
1685 if (g_quark_to_string(__alarm_info->quark_bundle) != NULL && strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null", 4) == 0) {
1686 SECURE_LOGD("[alarm-server]:destination is null, so we send expired alarm to %s(%u).",
1687 g_quark_to_string(__alarm_info->quark_app_service_name), __alarm_info->quark_app_service_name);
1688 destination_app_service_name = g_quark_to_string(__alarm_info->quark_app_service_name_mod);
1690 SECURE_LOGD("[alarm-server]:destination :%s(%u)",
1691 g_quark_to_string(__alarm_info->quark_dst_service_name), __alarm_info->quark_dst_service_name);
1692 destination_app_service_name = g_quark_to_string(__alarm_info->quark_dst_service_name_mod);
1696 * we should consider a situation that
1697 * destination_app_service_name is owner_name like (:xxxx) and
1698 * application's pid which registered this alarm was killed.In that case,
1699 * we don't need to send the expire event because the process was killed.
1700 * this causes needless message to be sent.
1702 SECURE_LOGD("[alarm-server]: destination_app_service_name :%s, app_pid=%d", destination_app_service_name, app_pid);
1704 if (g_quark_to_string(__alarm_info->quark_dst_service_name) != NULL && strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null", 4) == 0) {
1705 if (g_quark_to_string(__alarm_info->quark_app_service_name) != NULL && strlen(g_quark_to_string(__alarm_info->quark_app_service_name)) > 6)
1706 strncpy(appid, g_quark_to_string(__alarm_info->quark_app_service_name) + 6, strlen(g_quark_to_string(__alarm_info->quark_app_service_name)) - 6);
1708 if (g_quark_to_string(__alarm_info->quark_dst_service_name) != NULL && strlen(g_quark_to_string(__alarm_info->quark_dst_service_name)) > 6)
1709 strncpy(appid, g_quark_to_string(__alarm_info->quark_dst_service_name) + 6, strlen(g_quark_to_string(__alarm_info->quark_dst_service_name)) - 6);
1712 ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, __alarm_info->uid, &appinfo_handle);
1713 ALARM_MGR_LOG_PRINT("appid : %s (%x)", appid, appinfo_handle);
1715 /* Case #2. The process was killed && App type
1716 * This app is launched and owner of DBus connection is changed. and then, expiration noti is sent by DBus. */
1717 if (ret == PMINFO_R_OK && !aul_app_is_running_for_uid(appid, __alarm_info->uid)) {
1718 __expired_alarm_t *expire_info;
1719 char alarm_id_str[32] = { 0, };
1721 if (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) {
1722 __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
1726 expire_info = malloc(sizeof(__expired_alarm_t));
1727 if (G_UNLIKELY(NULL == expire_info)) {
1728 ALARM_MGR_ASSERT_PRINT("[alarm-server]:Malloc failed!Can't notify alarm expiry info\n");
1731 memset(expire_info, '\0', sizeof(__expired_alarm_t));
1732 strncpy(expire_info->service_name, destination_app_service_name, MAX_SERVICE_NAME_LEN-1);
1733 expire_info->alarm_id = alarm_id;
1734 expire_info->uid = __alarm_info->uid;
1735 g_expired_alarm_list = g_slist_append(g_expired_alarm_list, expire_info);
1737 snprintf(alarm_id_str, 31, "%d", alarm_id);
1739 SECURE_LOGD("before aul_launch appid(%s) alarm_id_str(%s)", appid, alarm_id_str);
1742 kb = bundle_create();
1743 bundle_add_str(kb, "__ALARM_MGR_ID", alarm_id_str);
1745 if (__alarm_info->global) {
1746 if (__find_login_user(&target_uid) < 0)
1747 ALARM_MGR_EXCEPTION_PRINT("Fail to get login user\n");
1749 aul_launch_app_for_uid(appid, kb, target_uid); /* on_bus_name_owner_changed will be called. */
1751 aul_launch_app_for_uid(appid, kb, __alarm_info->uid); /* on_bus_name_owner_changed will be called. */
1756 /* Case #3. The process is alive or was killed && non-app type(daemon)
1757 * Expiration noti is sent by DBus. it makes the process alive. (dbus auto activation) */
1758 ALARM_MGR_LOG_PRINT("before alarm_send_noti_to_application");
1759 ALARM_MGR_LOG_PRINT("WAKEUP pid: %d", __alarm_info->pid);
1761 /* TODO: implement aul_update_freezer_status */
1762 /* aul_update_freezer_status(__alarm_info->pid, "wakeup"); */
1763 __alarm_send_noti_to_application(destination_app_service_name,
1764 alarm_id, __alarm_info->uid); /* dbus auto activation */
1765 ALARM_MGR_LOG_PRINT("after __alarm_send_noti_to_application");
1769 ALARM_MGR_LOG_PRINT("alarm_id[%d] is expired.", alarm_id);
1771 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
1772 snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, duetime: %d", alarm_id, app_pid, (int)__alarm_info->due_time);
1773 __save_module_log("EXPIRED", log_message);
1776 if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
1777 __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
1779 _alarm_next_duetime(__alarm_info);
1783 _clear_scheduled_alarm_list();
1784 alarm_context.c_due_time = -1;
1786 ALARM_MGR_LOG_PRINT("[alarm-server]: Leave");
1789 static gboolean __alarm_handler_idle(gpointer user_data)
1791 GPollFD *gpollfd = (GPollFD *) user_data;
1793 time_t current_time;
1795 if (gpollfd == NULL) {
1796 ALARM_MGR_EXCEPTION_PRINT("gpollfd is NULL");
1800 if (read(gpollfd->fd, &exp, sizeof(uint64_t)) < 0) {
1801 ALARM_MGR_EXCEPTION_PRINT("Reading the fd is failed.");
1805 ALARM_MGR_LOG_PRINT("Lock the display not to enter LCD OFF");
1806 if (__display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0) != ALARMMGR_RESULT_SUCCESS)
1807 ALARM_MGR_EXCEPTION_PRINT("__display_lock_state() is failed");
1809 if (g_dummy_timer_is_set == true) {
1810 ALARM_MGR_LOG_PRINT("dummy alarm timer has expired.");
1812 ALARM_MGR_LOG_PRINT("__alarm_handler_idle");
1819 * Previous alarm can be expired late as tolerance of RTC.
1820 * In this case, Expire alarms forcibly if real duetime is same to current time.
1822 time(¤t_time);
1823 if (alarm_context.c_due_time == current_time) {
1824 ALARM_MGR_LOG_PRINT("Expire alarms forcibly when duetime is same to current time(%d).", current_time);
1831 ALARM_MGR_LOG_PRINT("Unlock the display from LCD OFF");
1832 if (__display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN) != ALARMMGR_RESULT_SUCCESS)
1833 ALARM_MGR_EXCEPTION_PRINT("__display_unlock_state() is failed");
1838 static void __on_system_time_external_changed(keynode_t *node, void *data)
1840 double diff_time = 0.0;
1841 time_t cur_time = 0;
1843 _alarm_disable_timer(alarm_context);
1846 diff_time = vconf_keynode_get_dbl(node);
1848 if (vconf_get_dbl(VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, &diff_time) != 0) {
1849 ALARM_MGR_EXCEPTION_PRINT("Failed to get value of VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL.");
1857 ALARM_MGR_LOG_PRINT("diff_time is %f, New time is %s\n", diff_time, ctime(&cur_time));
1859 ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed externally\n");
1860 ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n",
1861 alarm_context.c_due_time);
1863 __set_time(cur_time);
1865 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
1867 b = bundle_create();
1868 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
1869 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
1872 __alarm_update_due_time_of_all_items_in_list(diff_time);
1874 ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n",
1875 alarm_context.c_due_time);
1876 _clear_scheduled_alarm_list();
1883 static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_type,
1884 const char *pkgid, const char *key, const char *val,
1885 const void *pmsg, void *user_data)
1887 GSList* gs_iter = NULL;
1888 __alarm_info_t* entry = NULL;
1889 alarm_info_t* alarm_info = NULL;
1890 bool is_deleted = false;
1892 SECURE_LOGD("pkg_type(%s), pkgid(%s), key(%s), value(%s)", pkg_type, pkgid, key, val);
1894 if (strncmp(key, "end", 3) == 0 && strncmp(val, "ok", 2) == 0) {
1895 for (gs_iter = alarm_context.alarms; gs_iter != NULL;) {
1896 entry = gs_iter->data;
1898 const char* caller_pkgid = g_quark_to_string(entry->quark_caller_pkgid);
1899 const char* callee_pkgid = g_quark_to_string(entry->quark_callee_pkgid);
1901 gs_iter = g_slist_next(gs_iter);
1902 if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) ||
1903 (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) {
1904 if (_remove_from_scheduled_alarm_list(entry->uid, entry->alarm_id))
1907 alarm_info = &entry->alarm_info;
1908 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
1909 if (!_delete_alarms(entry->alarm_id))
1910 SECURE_LOGE("_delete_alarms() is failed. pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1913 if (g_hash_table_remove(appid_cache_table, &entry->pid) == true)
1914 ALARM_MGR_LOG_PRINT("Remove cachd data of pid[%d]", entry->pid);
1916 SECURE_LOGD("Remove pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1917 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
1923 if (is_deleted && (g_slist_length(g_scheduled_alarm_list) == 0)) {
1924 _alarm_disable_timer(alarm_context);
1930 return ALARMMGR_RESULT_SUCCESS;
1933 bool __get_caller_unique_name(int pid, char *unique_name, bool *is_app, uid_t uid)
1935 char caller_appid[256] = {0,};
1937 if (unique_name == NULL) {
1938 ALARM_MGR_EXCEPTION_PRINT("unique_name should not be NULL.");
1942 if (aul_app_get_appid_bypid_for_uid(pid, caller_appid,
1943 sizeof(caller_appid), uid) == AUL_R_OK) {
1944 /* When a caller is an application, the unique name is appID. */
1947 strncpy(unique_name, caller_appid, strlen(caller_appid));
1949 /* Otherwise, the unique name is /proc/pid/cmdline. */
1950 char proc_file[512] = {0,};
1951 char process_name[512] = {0,};
1958 snprintf(proc_file, 512, "/proc/%d/cmdline", pid);
1960 fd = open(proc_file, O_RDONLY);
1962 SECURE_LOGE("Caution!! pid(%d) seems to be killed.",
1966 if (read(fd, process_name, sizeof(process_name) - 1) <= 0) {
1967 ALARM_MGR_EXCEPTION_PRINT("Unable to get the process name.");
1973 while (process_name[i] != '\0') {
1974 if (process_name[i] == ' ') {
1975 process_name[i] = '\0';
1980 strncpy(unique_name, process_name, strlen(process_name));
1983 appid_cache_t* entry = (appid_cache_t*)calloc(1, sizeof(appid_cache_t));
1985 entry->unique_name = strdup(unique_name);
1986 entry->is_app = is_app;
1988 g_hash_table_foreach_remove(appid_cache_table, __hash_table_remove_cb, (gpointer)unique_name);
1989 g_hash_table_insert(appid_cache_table, &entry->pid, (gpointer)entry);
1991 SECURE_LOGD("unique_name= %s", unique_name);
1995 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
1996 static void __initialize_module_log(void)
2000 log_fd = open(ALARMMGR_LOG_FILE_PATH, O_CREAT | O_WRONLY, 0644);
2002 ALARM_MGR_EXCEPTION_PRINT("Opening the file for alarmmgr log is failed. err: %s", strerror_r(errno, buf, sizeof(buf)));
2006 int offset = lseek(log_fd, 0, SEEK_END);
2008 log_index = (int)(offset / ALARMMGR_LOG_BUFFER_STRING_SIZE);
2009 if (log_index >= ALARMMGR_LOG_BUFFER_SIZE) {
2011 lseek(log_fd, 0, SEEK_SET);
2017 static bool __save_module_log(const char *tag, const char *message)
2019 char buffer[ALARMMGR_LOG_BUFFER_STRING_SIZE] = {0,};
2024 ALARM_MGR_EXCEPTION_PRINT("The file is not ready.");
2029 lseek(log_fd, 0, SEEK_CUR);
2031 lseek(log_fd, 0, SEEK_SET);
2034 snprintf(buffer, ALARMMGR_LOG_BUFFER_STRING_SIZE, "[%-6d] %-20s %-120s %d-%s", log_index, tag, message, (int)now, ctime(&now));
2036 int ret = write(log_fd, buffer, strlen(buffer));
2038 ALARM_MGR_EXCEPTION_PRINT("Writing the alarmmgr log is failed. err: %s", strerror_r(errno, buf, sizeof(buf)));
2042 if (++log_index >= ALARMMGR_LOG_BUFFER_SIZE)
2047 #endif /* _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG */
2049 int __display_lock_state(char *state, char *flag, unsigned int timeout)
2051 GDBusMessage *msg = NULL;
2052 GDBusMessage *reply = NULL;
2053 GVariant *body = NULL;
2054 int ret = ALARMMGR_RESULT_SUCCESS;
2057 msg = g_dbus_message_new_method_call(DEVICED_BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY, DEVICED_LOCK_STATE);
2059 ALARM_MGR_EXCEPTION_PRINT("g_dbus_message_new_method_call() is failed. (%s:%s-%s)", DEVICED_BUS_NAME, DEVICED_INTERFACE_DISPLAY, DEVICED_LOCK_STATE);
2060 return ERR_ALARM_SYSTEM_FAIL;
2063 g_dbus_message_set_body(msg, g_variant_new("(sssi)", state, flag, "NULL", timeout));
2065 reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL);
2067 ALARM_MGR_EXCEPTION_PRINT("No reply. g_dbus_connection_send_message_with_reply_sync() is failed.");
2068 ret = ERR_ALARM_SYSTEM_FAIL;
2070 body = g_dbus_message_get_body(reply);
2072 ALARM_MGR_EXCEPTION_PRINT("g_dbus_message_get_body() is failed.");
2073 ret = ERR_ALARM_SYSTEM_FAIL;
2075 g_variant_get(body, "(i)", &val);
2077 ALARM_MGR_EXCEPTION_PRINT("Failed to lock display");
2078 ret = ERR_ALARM_SYSTEM_FAIL;
2080 ALARM_MGR_LOG_PRINT("Lock LCD OFF is successfully done");
2085 g_dbus_connection_flush_sync(alarm_context.connection, NULL, NULL);
2086 g_object_unref(msg);
2088 g_object_unref(reply);
2093 int __display_unlock_state(char *state, char *flag)
2095 GDBusMessage *msg = NULL;
2096 GDBusMessage *reply = NULL;
2097 GVariant *body = NULL;
2098 int ret = ALARMMGR_RESULT_SUCCESS;
2101 msg = g_dbus_message_new_method_call(DEVICED_BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY, DEVICED_UNLOCK_STATE);
2103 ALARM_MGR_EXCEPTION_PRINT("g_dbus_message_new_method_call() is failed. (%s:%s-%s)", DEVICED_BUS_NAME, DEVICED_INTERFACE_DISPLAY, DEVICED_UNLOCK_STATE);
2104 return ERR_ALARM_SYSTEM_FAIL;
2107 g_dbus_message_set_body(msg, g_variant_new("(ss)", state, flag));
2109 reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL);
2111 ALARM_MGR_EXCEPTION_PRINT("No reply. g_dbus_connection_send_message_with_reply_sync() is failed.");
2112 ret = ERR_ALARM_SYSTEM_FAIL;
2114 body = g_dbus_message_get_body(reply);
2116 ALARM_MGR_EXCEPTION_PRINT("g_dbus_message_get_body() is failed.");
2117 ret = ERR_ALARM_SYSTEM_FAIL;
2119 g_variant_get(body, "(i)", &val);
2121 ALARM_MGR_EXCEPTION_PRINT("Failed to unlock display");
2122 ret = ERR_ALARM_SYSTEM_FAIL;
2124 ALARM_MGR_LOG_PRINT("Unlock LCD OFF is successfully done");
2129 g_dbus_connection_flush_sync(alarm_context.connection, NULL, NULL);
2130 g_object_unref(msg);
2132 g_object_unref(reply);
2137 static long __get_proper_interval(long interval, int alarm_type)
2139 GSList *gs_iter = NULL;
2140 __alarm_info_t *entry = NULL;
2141 long maxInterval = 60;
2143 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2144 entry = gs_iter->data;
2145 if (entry->alarm_info.alarm_type & ALARM_TYPE_PERIOD) {
2146 if (entry->alarm_info.mode.u_interval.interval <= interval &&
2147 entry->alarm_info.mode.u_interval.interval > maxInterval)
2148 maxInterval = entry->alarm_info.mode.u_interval.interval;
2152 while (maxInterval * 2 <= interval ||
2153 (alarm_type & ALARM_TYPE_INEXACT && maxInterval < MIN_INEXACT_INTERVAL))
2159 gboolean __alarm_expired_directly(gpointer user_data)
2161 if (g_scheduled_alarm_list == NULL || g_scheduled_alarm_list->data == NULL)
2164 int time_sec = (int)(intptr_t)user_data;
2165 __scheduled_alarm_t *alarm = g_scheduled_alarm_list->data;
2166 __alarm_info_t *alarm_info = alarm->__alarm_info;
2168 /* Expire alarms with duetime equal to newtime by force */
2169 if (alarm_info->due_time == time_sec) {
2170 if (__display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0) != ALARMMGR_RESULT_SUCCESS)
2171 ALARM_MGR_EXCEPTION_PRINT("__display_lock_state() is failed");
2173 if (g_dummy_timer_is_set == true) {
2174 ALARM_MGR_LOG_PRINT("dummy alarm timer has expired.");
2176 ALARM_MGR_LOG_PRINT("due_time=%d is expired.", alarm_info->due_time);
2183 if (__display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN) != ALARMMGR_RESULT_SUCCESS)
2184 ALARM_MGR_EXCEPTION_PRINT("__display_unlock_state() is failed");
2190 void __reschedule_alarms_with_newtime(int cur_time, int new_time, double diff_time)
2192 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2193 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2196 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
2198 b = bundle_create();
2199 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
2200 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
2203 __alarm_update_due_time_of_all_items_in_list(diff_time); /* Rescheduling alarms with ALARM_TYPE_RELATIVE */
2204 ALARM_MGR_LOG_PRINT("Next duetime is %d", alarm_context.c_due_time);
2206 _clear_scheduled_alarm_list();
2210 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2211 char *timebuf = ctime((const time_t *)&new_time);
2213 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid newline */
2214 snprintf(log_message, sizeof(log_message), "Current: %d, New: %d, %s, diff: %f", cur_time, new_time, timebuf, diff_time);
2216 __save_module_log("CHANGE TIME", log_message);
2219 g_idle_add(__alarm_expired_directly, (gpointer)(intptr_t)new_time); /* Expire alarms with duetime equal to newtime directly */
2223 gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocation *invoc,
2224 int year, int mon, int day,
2225 int hour, int min, int sec,
2226 gpointer user_data) {
2227 int return_code = ALARMMGR_RESULT_SUCCESS;
2228 #ifdef _APPFW_FEATURE_WAKEUP_USING_RTC
2229 const char *rtc = default_rtc;
2230 struct rtc_wkalrm rtc_wkalarm;
2232 struct tm tm, *alarm_tm = NULL;
2233 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2234 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2235 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2237 /*extract day of the week, day in the year & daylight saving time from system*/
2238 time_t current_time;
2241 current_time = time(NULL);
2242 alarm_tm = gmtime_r(¤t_time, &tm);
2243 if (alarm_tm == NULL) {
2244 ALARM_MGR_EXCEPTION_PRINT("alarm_tm is NULL");
2245 return_code = ERR_ALARM_SYSTEM_FAIL;
2246 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2251 alarm_tm->tm_year = year;
2252 alarm_tm->tm_mon = mon;
2253 alarm_tm->tm_mday = day;
2254 alarm_tm->tm_hour = hour;
2255 alarm_tm->tm_min = min;
2256 alarm_tm->tm_sec = sec;
2258 /*convert to calendar time representation*/
2259 time_t rtc_time = mktime(alarm_tm);
2262 gfd = open(rtc, O_RDWR);
2264 ALARM_MGR_EXCEPTION_PRINT("RTC open failed.");
2265 return_code = ERR_ALARM_SYSTEM_FAIL;
2266 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2271 rtc_wkalarm.enabled = 1;
2272 rtc_wkalarm.time.tm_year = year;
2273 rtc_wkalarm.time.tm_mon = mon;
2274 rtc_wkalarm.time.tm_mday = day;
2275 rtc_wkalarm.time.tm_hour = hour;
2276 rtc_wkalarm.time.tm_min = min;
2277 rtc_wkalarm.time.tm_sec = sec;
2279 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
2281 if (errno == ENOTTY)
2282 ALARM_MGR_EXCEPTION_PRINT("Alarm IRQs is not supported.");
2284 ALARM_MGR_EXCEPTION_PRINT("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
2285 return_code = ERR_ALARM_SYSTEM_FAIL;
2286 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2287 strncpy(log_tag, "FAIL: SET RTC", strlen("FAIL: SET RTC"));
2290 ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is setted");
2291 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2292 strncpy(log_tag, "SET RTC", strlen("SET RTC"));
2296 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2297 snprintf(log_message, sizeof(log_message), "wakeup rtc time: %d, %s", (int)rtc_time, ctime(&rtc_time));
2298 __save_module_log(log_tag, log_message);
2301 ALARM_MGR_LOG_PRINT("[alarm-server] RTC does not work.");
2302 return_code = ERR_ALARM_SYSTEM_FAIL;
2303 #endif /* _APPFW_FEATURE_WAKEUP_USING_RTC */
2305 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2309 static int accrue_msec = 0; /* To check a millisecond part of current time at changing the system time(sec) */
2311 gboolean alarm_manager_alarm_set_time(AlarmManager *pObj, GDBusMethodInvocation *invoc, int time_sec, gpointer user_data)
2313 double diff_time = 0.0;
2314 struct timeval cur_time = {0,};
2315 int return_code = ALARMMGR_RESULT_SUCCESS;
2317 _alarm_disable_timer(alarm_context); /* Disable the timer to reschedule the alarm before the time is changed. */
2320 gettimeofday(&cur_time, NULL);
2322 accrue_msec += (cur_time.tv_usec / 1000); /* Accrue the millisecond to compensate the time */
2323 if (accrue_msec > 500) {
2324 diff_time = difftime(time_sec, cur_time.tv_sec) - 1;
2325 accrue_msec -= 1000;
2327 diff_time = difftime(time_sec, cur_time.tv_sec);
2330 __set_time(time_sec); /* Change both OS time and RTC */
2331 ALARM_MGR_LOG_PRINT("[TIMESTAMP]Current time(%d), New time(%d)(%s), diff_time(%f)",
2332 cur_time.tv_sec, time_sec, ctime((const time_t *)&time_sec), diff_time);
2334 __reschedule_alarms_with_newtime(cur_time.tv_sec, time_sec, diff_time);
2335 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2339 gboolean alarm_manager_alarm_set_time_with_propagation_delay(AlarmManager *pObj, GDBusMethodInvocation *invoc,
2340 guint new_sec, guint new_nsec, guint req_sec, guint req_nsec, gpointer user_data)
2342 double diff_time = 0.0;
2343 struct timespec cur_time = {0,};
2344 struct timespec delay = {0,};
2345 struct timespec sleep_time = {0,};
2346 guint real_newtime = 0;
2347 accrue_msec = 0; /* reset accrued msec */
2349 _alarm_disable_timer(alarm_context); /* Disable the timer to reschedule the alarm before the time is changed. */
2352 clock_gettime(CLOCK_REALTIME, &cur_time);
2354 /* Check validation of requested time */
2355 if (req_sec > cur_time.tv_sec || (req_sec == cur_time.tv_sec && req_nsec > cur_time.tv_nsec)) {
2356 ALARM_MGR_EXCEPTION_PRINT("The requeted time(%d.%09d) must be equal to or less than current time(%d.%09d).",
2357 req_sec, req_nsec, cur_time.tv_sec, cur_time.tv_nsec);
2358 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ERR_ALARM_INVALID_PARAM));
2362 /* Compensate propagation delay */
2363 if (req_nsec > cur_time.tv_nsec) {
2364 delay.tv_sec = cur_time.tv_sec - 1 - req_sec;
2365 delay.tv_nsec = cur_time.tv_nsec + BILLION - req_nsec;
2367 delay.tv_sec = cur_time.tv_sec - req_sec;
2368 delay.tv_nsec = cur_time.tv_nsec - req_nsec;
2371 if (new_nsec + delay.tv_nsec >= BILLION) {
2372 real_newtime = new_sec + delay.tv_sec + 2;
2373 sleep_time.tv_nsec = BILLION - ((delay.tv_nsec + new_nsec) - BILLION);
2375 real_newtime = new_sec + delay.tv_sec + 1;
2376 sleep_time.tv_nsec = BILLION - (delay.tv_nsec + new_nsec);
2379 nanosleep(&sleep_time, NULL); /* Wait until 0 nsec to match both OS time and RTC(sec) */
2381 __set_time(real_newtime); /* Change both OS time and RTC */
2383 diff_time = difftime(real_newtime, cur_time.tv_sec);
2384 ALARM_MGR_LOG_PRINT("[TIMESTAMP]Current time(%d.%09d), New time(%d.%09d), Real Newtime(%d), diff_time(%f)",
2385 cur_time.tv_sec, cur_time.tv_nsec, new_sec, new_nsec, real_newtime, diff_time);
2386 ALARM_MGR_LOG_PRINT("Requested(%d.%09d) Delay(%d.%09d) Sleep(%09d)", req_sec, req_nsec, delay.tv_sec, delay.tv_nsec, sleep_time.tv_nsec);
2387 __reschedule_alarms_with_newtime(cur_time.tv_sec, real_newtime, diff_time);
2388 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ALARMMGR_RESULT_SUCCESS));
2392 gboolean alarm_manager_alarm_set_timezone(AlarmManager *pObject, GDBusMethodInvocation *invoc, char *tzpath_str, gpointer user_data)
2395 int return_code = ALARMMGR_RESULT_SUCCESS;
2396 struct stat statbuf;
2397 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2398 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2399 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2402 ALARM_MGR_LOG_PRINT("[TIMESTAMP]Set the timezone to %s.", tzpath_str);
2404 if (stat(tzpath_str, &statbuf) == -1 && errno == ENOENT) {
2405 ALARM_MGR_EXCEPTION_PRINT("Invalid tzpath, %s", tzpath_str);
2406 return_code = ERR_ALARM_INVALID_PARAM;
2410 retval = stat(TIMEZONE_INFO_LINK_PATH, &statbuf);
2411 if (retval == 0 || (retval == -1 && errno != ENOENT)) {
2412 /* unlink the current link */
2413 if (unlink(TIMEZONE_INFO_LINK_PATH) < 0) {
2414 ALARM_MGR_EXCEPTION_PRINT("unlink() is failed.");
2415 return_code = ERR_ALARM_SYSTEM_FAIL;
2420 /* create a new symlink when the /opt/etc/localtime is empty. */
2421 if (symlink(tzpath_str, TIMEZONE_INFO_LINK_PATH) < 0) {
2422 ALARM_MGR_EXCEPTION_PRINT("Failed to create an symlink of %s.", tzpath_str);
2423 return_code = ERR_ALARM_SYSTEM_FAIL;
2429 /* Rescheduling alarms */
2430 _alarm_disable_timer(alarm_context);
2431 __alarm_update_due_time_of_all_items_in_list(0);
2432 ALARM_MGR_LOG_PRINT("next expiring due_time is %d", alarm_context.c_due_time);
2434 _clear_scheduled_alarm_list();
2438 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, 0);
2440 b = bundle_create();
2441 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
2442 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
2445 b = bundle_create();
2446 bundle_add_str(b, EVT_KEY_TIME_ZONE, tzpath_str);
2447 eventsystem_send_system_event(SYS_EVENT_TIME_ZONE, b);
2451 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2452 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2453 if (return_code == ALARMMGR_RESULT_SUCCESS)
2454 strncpy(log_tag, "SET TIMEZONE", strlen("SET TIMEZONE"));
2456 strncpy(log_tag, "FAIL: SET TIMEZONE", strlen("FAIL: SET TIMEZONE"));
2458 snprintf(log_message, sizeof(log_message), "Set the timezone to %s.", tzpath_str);
2459 __save_module_log(log_tag, log_message);
2465 gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInvocation *invoc,
2467 int start_month, int start_day,
2468 int start_hour, int start_min,
2469 int start_sec, int end_year, int end_month,
2470 int end_day, int mode_day_of_week,
2471 unsigned int mode_interval,
2472 int mode_repeat, int alarm_type,
2477 alarm_info_t alarm_info;
2478 int return_code = ALARMMGR_RESULT_SUCCESS;
2480 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2481 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2482 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2487 const char *name = g_dbus_method_invocation_get_sender(invoc);
2489 uid = __get_caller_uid(name);
2490 pid = __get_caller_pid(name);
2491 if (uid < 0 || pid < 0) {
2492 return_code = ERR_ALARM_SYSTEM_FAIL;
2493 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2497 alarm_info.start.year = start_year;
2498 alarm_info.start.month = start_month;
2499 alarm_info.start.day = start_day;
2500 alarm_info.start.hour = start_hour;
2501 alarm_info.start.min = start_min;
2502 alarm_info.start.sec = start_sec;
2504 alarm_info.end.year = end_year;
2505 alarm_info.end.month = end_month;
2506 alarm_info.end.day = end_day;
2508 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2509 alarm_info.mode.repeat = mode_repeat;
2511 alarm_info.alarm_type = alarm_type;
2512 alarm_info.reserved_info = reserved_info;
2514 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2515 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2516 alarm_info.mode.u_interval.interval =
2517 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2518 } else if (mode_interval <= 0) {
2519 alarm_info.mode.u_interval.interval = 0;
2522 if (!__alarm_create_appsvc(&alarm_info, &alarm_id, mode_interval, uid, pid, bundle_data, &return_code)) {
2523 ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
2524 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2525 strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE"));
2529 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2530 strncpy(log_tag, "CREATE", strlen("CREATE"));
2534 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2536 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2537 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2538 alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2539 __save_module_log(log_tag, log_message);
2545 gboolean alarm_manager_alarm_create_noti(AlarmManager *pObject, GDBusMethodInvocation *invoc,
2547 int start_month, int start_day,
2548 int start_hour, int start_min,
2549 int start_sec, int end_year, int end_month,
2550 int end_day, int mode_day_of_week,
2551 unsigned int mode_interval,
2552 int mode_repeat, int alarm_type,
2557 alarm_info_t alarm_info;
2558 int return_code = ALARMMGR_RESULT_SUCCESS;
2560 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2561 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2562 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2567 const char *name = g_dbus_method_invocation_get_sender(invoc);
2569 uid = __get_caller_uid(name);
2570 pid = __get_caller_pid(name);
2571 if (uid < 0 || pid < 0) {
2572 return_code = ERR_ALARM_SYSTEM_FAIL;
2573 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2577 alarm_info.start.year = start_year;
2578 alarm_info.start.month = start_month;
2579 alarm_info.start.day = start_day;
2580 alarm_info.start.hour = start_hour;
2581 alarm_info.start.min = start_min;
2582 alarm_info.start.sec = start_sec;
2584 alarm_info.end.year = end_year;
2585 alarm_info.end.month = end_month;
2586 alarm_info.end.day = end_day;
2588 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2589 alarm_info.mode.repeat = mode_repeat;
2591 alarm_info.alarm_type = alarm_type;
2592 alarm_info.reserved_info = reserved_info;
2594 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2595 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2596 alarm_info.mode.u_interval.interval =
2597 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2598 } else if (mode_interval <= 0) {
2599 alarm_info.mode.u_interval.interval = 0;
2602 if (!__alarm_create_noti(&alarm_info, &alarm_id, mode_interval, uid, pid, noti_data, &return_code)) {
2603 ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
2604 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2605 strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE"));
2609 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2610 strncpy(log_tag, "CREATE", strlen("CREATE"));
2614 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2616 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2617 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2618 alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2619 __save_module_log(log_tag, log_message);
2625 gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *invoc,
2626 char *app_service_name, char *app_service_name_mod, int start_year,
2627 int start_month, int start_day,
2628 int start_hour, int start_min,
2629 int start_sec, int end_year, int end_month,
2630 int end_day, int mode_day_of_week,
2631 int mode_repeat, int alarm_type,
2633 char *reserved_service_name, char *reserved_service_name_mod,
2636 alarm_info_t alarm_info;
2637 int return_code = ALARMMGR_RESULT_SUCCESS;
2639 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2640 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2641 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2646 const char *name = g_dbus_method_invocation_get_sender(invoc);
2648 pid = __get_caller_pid(name);
2649 uid = __get_caller_uid(name);
2650 if (uid < 0 || pid < 0) {
2651 return_code = ERR_ALARM_SYSTEM_FAIL;
2652 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2656 alarm_info.start.year = start_year;
2657 alarm_info.start.month = start_month;
2658 alarm_info.start.day = start_day;
2659 alarm_info.start.hour = start_hour;
2660 alarm_info.start.min = start_min;
2661 alarm_info.start.sec = start_sec;
2663 alarm_info.end.year = end_year;
2664 alarm_info.end.month = end_month;
2665 alarm_info.end.day = end_day;
2667 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2668 alarm_info.mode.repeat = mode_repeat;
2670 alarm_info.alarm_type = alarm_type;
2671 alarm_info.reserved_info = reserved_info;
2673 if (!__alarm_create(&alarm_info, &alarm_id, uid, pid, 0, 0, 0, app_service_name, app_service_name_mod,
2674 reserved_service_name, reserved_service_name_mod, &return_code)) {
2675 ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
2676 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2677 strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE"));
2681 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2682 strncpy(log_tag, "CREATE", strlen("CREATE"));
2686 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2688 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2689 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2690 alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2691 __save_module_log(log_tag, log_message);
2697 time_t _get_periodic_alarm_standard_time(void)
2699 /* To avoid start time of all devices are same. */
2700 if (periodic_alarm_standard_time == 0) {
2701 srand((unsigned int)time(NULL));
2702 periodic_alarm_standard_time = rand() % BILLION + 1; /* 1 ~ 1000000000 */
2705 ALARM_MGR_LOG_PRINT("periodic_standard_time : [%d]", periodic_alarm_standard_time);
2706 return periodic_alarm_standard_time;
2709 gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvocation *invoc,
2710 char *app_service_name, char *app_service_name_mod, int interval,
2711 int is_ref, int method, gpointer user_data)
2713 alarm_info_t alarm_info;
2714 int return_code = ALARMMGR_RESULT_SUCCESS;
2716 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2717 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2718 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2723 const char *name = g_dbus_method_invocation_get_sender(invoc);
2725 uid = __get_caller_uid(name);
2726 pid = __get_caller_pid(name);
2727 if (uid < 0 || pid < 0) {
2728 return_code = ERR_ALARM_SYSTEM_FAIL;
2729 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
2733 struct tm standard_tm;
2734 time_t standard_time = _get_periodic_alarm_standard_time();
2735 localtime_r(&standard_time, &standard_tm);
2737 alarm_info.reserved_info = standard_time;
2739 alarm_info.start.year = standard_tm.tm_year + 1900;
2740 alarm_info.start.month = standard_tm.tm_mon + 1;
2741 alarm_info.start.day = standard_tm.tm_mday;
2742 alarm_info.start.hour = standard_tm.tm_hour;
2743 alarm_info.start.min = standard_tm.tm_min;
2744 alarm_info.start.sec = standard_tm.tm_sec;
2746 alarm_info.end.year = 0;
2747 alarm_info.end.month = 0;
2748 alarm_info.end.day = 0;
2750 alarm_info.alarm_type = ALARM_TYPE_VOLATILE;
2751 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
2752 alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
2753 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2755 if (interval <= 0) {
2756 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
2757 alarm_info.mode.u_interval.interval = 0;
2759 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
2761 alarm_info.mode.u_interval.interval = interval * 60;
2763 alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60, alarm_info.alarm_type);
2766 if (!__alarm_create(&alarm_info, &alarm_id, uid, pid, method, interval * 60, is_ref,
2767 app_service_name, app_service_name_mod,
2768 "null", "null", &return_code)) {
2769 ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
2770 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2771 strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE"));
2775 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2776 strncpy(log_tag, "CREATE", strlen("CREATE"));
2781 g_dbus_method_invocation_return_value(invoc,
2782 g_variant_new("(ii)", alarm_id, return_code));
2783 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2784 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2785 alarm_id, uid, pid, alarm_info.start.year, alarm_info.start.month,
2786 alarm_info.start.day, alarm_info.start.hour,
2787 alarm_info.start.min, alarm_info.start.sec);
2788 __save_module_log(log_tag, log_message);
2793 gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *invoc,
2794 alarm_id_t alarm_id, gpointer user_data)
2796 int return_code = ALARMMGR_RESULT_SUCCESS;
2797 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2798 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2799 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2804 const char *name = g_dbus_method_invocation_get_sender(invoc);
2806 uid = __get_caller_uid(name);
2807 pid = __get_caller_pid(name);
2808 if (uid < 0 || pid < 0) {
2809 return_code = ERR_ALARM_SYSTEM_FAIL;
2810 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2815 if (!__alarm_delete(uid, alarm_id, &return_code)) {
2816 ALARM_MGR_EXCEPTION_PRINT("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2817 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2818 strncpy(log_tag, "FAIL: DELETE", strlen("FAIL: DELETE"));
2822 ALARM_MGR_LOG_PRINT("alarm_id[%d] is removed.", alarm_id);
2823 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2824 strncpy(log_tag, "DELETE", strlen("DELETE"));
2828 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2830 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2831 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d", alarm_id, uid, pid);
2832 __save_module_log(log_tag, log_message);
2838 gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation *invoc,
2841 GSList* gs_iter = NULL;
2842 char app_name[512] = { 0 };
2843 alarm_info_t* alarm_info = NULL;
2844 __alarm_info_t* entry = NULL;
2845 bool is_deleted = false;
2846 int return_code = ALARMMGR_RESULT_SUCCESS;
2847 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2848 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2852 const char *name = g_dbus_method_invocation_get_sender(invoc);
2854 uid = __get_caller_uid(name);
2855 pid = __get_caller_pid(name);
2856 if (uid < 0 || pid < 0) {
2857 return_code = ERR_ALARM_SYSTEM_FAIL;
2858 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2862 if (__get_cached_unique_name(pid, app_name, NULL, uid) == false) {
2863 return_code = ERR_ALARM_SYSTEM_FAIL;
2864 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2865 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2866 snprintf(log_message, sizeof(log_message), "pid: %d. Can not get the unique_name.", pid);
2867 __save_module_log("FAIL: DELETE ALL", log_message);
2872 SECURE_LOGD("Called by process (pid:%d, unique_name=%s)", pid, app_name);
2874 for (gs_iter = alarm_context.alarms; gs_iter != NULL;) {
2875 bool is_found = false;
2876 entry = gs_iter->data;
2877 const char* tmp_appname = g_quark_to_string(entry->quark_app_unique_name);
2878 SECURE_LOGD("Try to remove app_name[%s], alarm_id[%d]\n", tmp_appname, entry->alarm_id);
2879 if (tmp_appname && strncmp(app_name, tmp_appname, strlen(tmp_appname)) == 0) {
2880 if (_remove_from_scheduled_alarm_list(uid, entry->alarm_id))
2883 alarm_info = &entry->alarm_info;
2884 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
2885 if (!_delete_alarms(entry->alarm_id))
2886 SECURE_LOGE("_delete_alarms() is failed. pid[%d], alarm_id[%d]", pid, entry->alarm_id);
2891 gs_iter = g_slist_next(gs_iter);
2894 ALARM_MGR_LOG_PRINT("alarm_id[%d] is removed.", entry->alarm_id);
2895 SECURE_LOGD("Removing is done. app_name[%s], alarm_id [%d]\n", tmp_appname, entry->alarm_id);
2896 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
2901 if (is_deleted && (g_slist_length(g_scheduled_alarm_list) == 0)) {
2902 _alarm_disable_timer(alarm_context);
2906 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2907 snprintf(log_message, sizeof(log_message), "uid: %d, pid: %d, unique_name: %s", uid, pid, app_name);
2908 __save_module_log("DELETE ALL", log_message);
2912 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2916 gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *invoc,
2917 char *app_service_name, alarm_id_t alarm_id,
2918 int start_year, int start_month,
2919 int start_day, int start_hour,
2920 int start_min, int start_sec, int end_year,
2921 int end_month, int end_day,
2922 int mode_day_of_week, int mode_repeat,
2923 int alarm_type, int reserved_info,
2926 int return_code = ALARMMGR_RESULT_SUCCESS;
2927 alarm_info_t alarm_info;
2929 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2930 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2931 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2935 const char *name = g_dbus_method_invocation_get_sender(invoc);
2937 uid = __get_caller_uid(name);
2938 pid = __get_caller_pid(name);
2939 if (uid < 0 || pid < 0) {
2940 return_code = ERR_ALARM_SYSTEM_FAIL;
2941 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2945 alarm_info.start.year = start_year;
2946 alarm_info.start.month = start_month;
2947 alarm_info.start.day = start_day;
2948 alarm_info.start.hour = start_hour;
2949 alarm_info.start.min = start_min;
2950 alarm_info.start.sec = start_sec;
2952 alarm_info.end.year = end_year;
2953 alarm_info.end.month = end_month;
2954 alarm_info.end.day = end_day;
2956 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2957 alarm_info.mode.repeat = mode_repeat;
2959 alarm_info.alarm_type = alarm_type;
2960 alarm_info.reserved_info = reserved_info;
2962 if (!__alarm_update(uid, pid, app_service_name, alarm_id, &alarm_info, &return_code)) {
2963 ALARM_MGR_EXCEPTION_PRINT("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2964 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2965 strncpy(log_tag, "FAIL: UPDATE", strlen("FAIL: UPDATE"));
2969 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2970 strncpy(log_tag, "UPDATE", strlen("UPDATE"));
2974 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
2976 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
2977 snprintf(log_message, sizeof(log_message), "alarmID: %d, appname: %s, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2978 alarm_id, app_service_name, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2979 __save_module_log(log_tag, log_message);
2985 gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMethodInvocation *invoc,
2988 GSList *gs_iter = NULL;
2989 char app_name[256] = { 0 };
2990 __alarm_info_t *entry = NULL;
2992 int return_code = ALARMMGR_RESULT_SUCCESS;
2995 const char *name = g_dbus_method_invocation_get_sender(invoc);
2997 uid = __get_caller_uid(name);
2998 pid = __get_caller_pid(name);
2999 if (uid < 0 || pid < 0) {
3000 return_code = ERR_ALARM_SYSTEM_FAIL;
3001 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code));
3005 if (__get_cached_unique_name(pid, app_name, NULL, uid) == false) {
3006 return_code = ERR_ALARM_SYSTEM_FAIL;
3007 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code));
3011 SECURE_LOGD("Called by process (uid:%d, pid:%d, unique_name:%s)", uid, pid, app_name);
3013 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3014 entry = gs_iter->data;
3015 SECURE_LOGD("app_name=%s, quark_app_unique_name=%s", app_name, g_quark_to_string(entry->quark_app_unique_name));
3016 if (entry->uid == uid &&
3017 strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
3019 SECURE_LOGD("inc number of alarms of app (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, num_of_ids);
3023 SECURE_LOGD("number of alarms of the process (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, num_of_ids);
3024 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code));
3028 gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3029 int max_number_of_ids, gpointer user_data)
3031 GSList *gs_iter = NULL;
3032 char app_name[512] = { 0 };
3033 __alarm_info_t *entry = NULL;
3035 GVariant* arr = NULL;
3036 GVariantBuilder* builder = NULL;
3038 int return_code = ALARMMGR_RESULT_SUCCESS;
3041 const char *name = g_dbus_method_invocation_get_sender(invoc);
3043 uid = __get_caller_uid(name);
3044 pid = __get_caller_pid(name);
3045 if (uid < 0 || pid < 0) {
3046 return_code = ERR_ALARM_SYSTEM_FAIL;
3047 g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", g_variant_new("ai", NULL), num_of_ids, return_code));
3051 if (max_number_of_ids <= 0) {
3052 SECURE_LOGE("called for uid(%d) pid(%d), but max_number_of_ids(%d) is less than 0.", uid, pid, max_number_of_ids);
3053 g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", g_variant_new("ai", NULL), num_of_ids, return_code));
3057 if (__get_cached_unique_name(pid, app_name, NULL, uid) == false) {
3058 return_code = ERR_ALARM_SYSTEM_FAIL;
3059 g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", g_variant_new("ai", NULL), num_of_ids, return_code));
3063 SECURE_LOGD("Called by process (uid: %d, pid:%d, unique_name=%s).", uid, pid, app_name);
3065 builder = g_variant_builder_new(G_VARIANT_TYPE("ai"));
3066 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3067 entry = gs_iter->data;
3068 if (entry->uid == uid &&
3069 strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
3070 g_variant_builder_add(builder, "i", entry->alarm_id);
3072 SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index);
3076 arr = g_variant_new("ai", builder);
3079 SECURE_LOGE("Called by uid (%d), pid (%d), but max_number_of_ids(%d) return code %d.", uid, pid, num_of_ids, return_code);
3080 g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", arr, num_of_ids, return_code));
3082 g_variant_builder_unref(builder);
3086 gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3087 alarm_id_t alarm_id, gpointer user_data)
3090 GSList *gs_iter = NULL;
3091 __alarm_info_t *entry = NULL;
3092 int return_code = ALARMMGR_RESULT_SUCCESS;
3093 gchar *b_data = NULL;
3095 const char *name = g_dbus_method_invocation_get_sender(invoc);
3097 uid = __get_caller_uid(name);
3099 return_code = ERR_ALARM_SYSTEM_FAIL;
3100 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", b_data, return_code));
3104 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
3106 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3107 entry = gs_iter->data;
3108 if (entry->uid == uid && entry->alarm_id == alarm_id) {
3110 b_data = g_strdup(g_quark_to_string(entry->quark_bundle));
3116 if (b_data && strlen(b_data) == 4 && strncmp(b_data, "null", 4) == 0) {
3117 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
3118 return_code = ERR_ALARM_INVALID_TYPE;
3121 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3122 return_code = ERR_ALARM_INVALID_ID;
3125 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", b_data, return_code));
3130 gboolean alarm_manager_alarm_get_noti_info(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3131 alarm_id_t alarm_id, gpointer user_data)
3134 GSList *gs_iter = NULL;
3135 __alarm_info_t *entry = NULL;
3136 int return_code = ALARMMGR_RESULT_SUCCESS;
3137 gchar *noti_data = NULL;
3139 const char *name = g_dbus_method_invocation_get_sender(invoc);
3141 uid = __get_caller_uid(name);
3143 return_code = ERR_ALARM_SYSTEM_FAIL;
3144 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", noti_data, return_code));
3148 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
3150 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3151 entry = gs_iter->data;
3152 if (entry->uid == uid && entry->alarm_id == alarm_id) {
3154 noti_data = strdup(g_quark_to_string(entry->quark_noti));
3160 if (noti_data && strlen(noti_data) == 4 && strncmp(noti_data, "null", 4) == 0) {
3161 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
3162 return_code = ERR_ALARM_INVALID_TYPE;
3165 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3166 return_code = ERR_ALARM_INVALID_ID;
3169 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", noti_data, return_code));
3174 gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3175 alarm_id_t alarm_id, gpointer user_data)
3177 GSList *gs_iter = NULL;
3178 __alarm_info_t *entry = NULL;
3179 alarm_info_t *alarm_info = NULL;
3180 int return_code = ALARMMGR_RESULT_SUCCESS;
3182 const char *name = g_dbus_method_invocation_get_sender(invoc);
3184 uid = __get_caller_uid(name);
3186 return_code = ERR_ALARM_SYSTEM_FAIL;
3187 g_dbus_method_invocation_return_value(invoc, g_variant_new("(iiiiiiiiiiiiii)", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, return_code));
3191 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
3192 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3193 entry = gs_iter->data;
3194 if (entry->uid == uid && entry->alarm_id == alarm_id) {
3195 alarm_info = &(entry->alarm_info);
3200 if (alarm_info == NULL) {
3201 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3202 return_code = ERR_ALARM_INVALID_ID;
3203 g_dbus_method_invocation_return_value(invoc, g_variant_new("(iiiiiiiiiiiiii)", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, return_code));
3205 ALARM_MGR_LOG_PRINT("The alarm(%d) is found.", alarm_id);
3206 g_dbus_method_invocation_return_value(invoc, g_variant_new("(iiiiiiiiiiiiii)", alarm_info->start.year, alarm_info->start.month,
3207 alarm_info->start.day, alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec, alarm_info->end.year, alarm_info->end.month,
3208 alarm_info->end.day, alarm_info->mode.u_interval.day_of_week, alarm_info->mode.repeat, alarm_info->alarm_type, alarm_info->reserved_info, return_code));
3214 gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3215 alarm_id_t alarm_id, gpointer user_data)
3217 GSList *gs_iter = NULL;
3218 __alarm_info_t *entry = NULL;
3219 __alarm_info_t *find_item = NULL;
3220 int return_code = ALARMMGR_RESULT_SUCCESS;
3223 const char *name = g_dbus_method_invocation_get_sender(invoc);
3225 uid = __get_caller_uid(name);
3227 return_code = ERR_ALARM_SYSTEM_FAIL;
3228 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", duetime, return_code));
3232 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
3233 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3234 entry = gs_iter->data;
3235 if (entry->uid == uid && entry->alarm_id == alarm_id) {
3241 if (find_item == NULL) {
3242 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3243 return_code = ERR_ALARM_INVALID_ID;
3244 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", duetime, return_code));
3248 duetime = _alarm_next_duetime(find_item);
3249 ALARM_MGR_LOG_PRINT("Next duetime : %s", ctime(&duetime));
3251 g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", duetime, return_code));
3255 gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvocation *invoc, gpointer user_data)
3257 sqlite3 *alarmmgr_tool_db;
3258 char *db_path = NULL;
3259 char db_path_tmp[50] = {0,};
3260 time_t current_time = 0;
3261 struct tm current_tm;
3262 const char *query_for_creating_table = "create table alarmmgr_tool \
3263 (alarm_id integer primary key,\
3264 duetime_epoch integer,\
3266 start_epoch integer,\
3272 app_unique_name text,\
3273 app_service_name text,\
3274 dst_service_name text,\
3275 day_of_week integer,\
3277 alarm_type integer)";
3278 const char *query_for_deleting_table = "drop table alarmmgr_tool";
3279 int return_code = ALARMMGR_RESULT_SUCCESS;
3280 GSList *gs_iter = NULL;
3281 __alarm_info_t *entry = NULL;
3282 char *error_message = NULL;
3284 const char *name = g_dbus_method_invocation_get_sender(invoc);
3286 uid = __get_caller_uid(name);
3288 return_code = ERR_ALARM_SYSTEM_FAIL;
3289 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", db_path, return_code));
3294 time(¤t_time);
3295 localtime_r(¤t_time, ¤t_tm);
3296 snprintf(db_path_tmp, sizeof(db_path_tmp), "/tmp/alarmmgr_%d%d%d_%02d%02d%02d.db",
3297 current_tm.tm_year + 1900, current_tm.tm_mon + 1, current_tm.tm_mday, current_tm.tm_hour, current_tm.tm_min, current_tm.tm_sec);
3298 db_path = strdup(db_path_tmp);
3300 if (db_util_open(db_path, &alarmmgr_tool_db, DB_UTIL_REGISTER_HOOK_METHOD) != SQLITE_OK) {
3301 ALARM_MGR_EXCEPTION_PRINT("Opening [%s] failed", db_path);
3302 return_code = ERR_ALARM_SYSTEM_FAIL;
3303 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", db_path, return_code));
3309 if (sqlite3_exec(alarmmgr_tool_db, query_for_deleting_table, NULL, NULL, &error_message) != SQLITE_OK)
3310 ALARM_MGR_EXCEPTION_PRINT("Deleting the table is failed. error message = %s", error_message);
3312 /* Create a table if it does not exist */
3313 if (sqlite3_exec(alarmmgr_tool_db, query_for_creating_table, NULL, NULL, &error_message) != SQLITE_OK) {
3314 ALARM_MGR_EXCEPTION_PRINT("Creating the table is failed. error message = %s", error_message);
3315 sqlite3_close(alarmmgr_tool_db);
3316 return_code = ERR_ALARM_SYSTEM_FAIL;
3317 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", db_path, return_code));
3322 /* Get information of all alarms and save those into the DB. */
3324 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3325 entry = gs_iter->data;
3326 if (entry->uid != uid)
3329 SECURE_LOGD("#%d alarm id[%d] app_name[%s] duetime[%d]",
3330 index, entry->alarm_id, g_quark_to_string(entry->quark_app_unique_name), entry->start);
3332 alarm_info_t *alarm_info = (alarm_info_t *) &(entry->alarm_info);
3333 alarm_mode_t *mode = &alarm_info->mode;
3335 char *query = sqlite3_mprintf("insert into alarmmgr_tool( alarm_id, duetime_epoch, duetime, start_epoch,\
3336 end_epoch, pid, global, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, dst_service_name, day_of_week, repeat, alarm_type)\
3337 values (%d,%d,%Q,%d,%d,%d,%d,%Q,%Q,%Q,%Q,%Q,%d,%d,%d)",
3339 (int)entry->due_time,
3340 ctime(&(entry->due_time)),
3344 (bool)entry->global,
3345 (char *)g_quark_to_string(entry->quark_caller_pkgid),
3346 (char *)g_quark_to_string(entry->quark_callee_pkgid),
3347 (char *)g_quark_to_string(entry->quark_app_unique_name),
3348 (char *)g_quark_to_string(entry->quark_app_service_name),
3349 (char *)g_quark_to_string(entry->quark_dst_service_name),
3350 mode->u_interval.day_of_week,
3352 entry->alarm_info.alarm_type);
3354 if (sqlite3_exec(alarmmgr_tool_db, query, NULL, NULL, &error_message) != SQLITE_OK)
3355 SECURE_LOGE("sqlite3_exec() is failed. error message = %s", error_message);
3357 sqlite3_free(query);
3360 sqlite3_close(alarmmgr_tool_db);
3362 return_code = ALARMMGR_RESULT_SUCCESS;
3363 g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", db_path, return_code));
3368 gboolean alarm_manager_alarm_set_global(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3369 alarm_id_t alarm_id, bool global, gpointer user_data)
3371 GSList *gs_iter = NULL;
3372 __alarm_info_t *entry = NULL;
3373 alarm_info_t *alarm_info = NULL;
3375 int return_code = ALARMMGR_RESULT_SUCCESS;
3377 const char *name = g_dbus_method_invocation_get_sender(invoc);
3380 uid = __get_caller_uid(name);
3382 return_code = ERR_ALARM_SYSTEM_FAIL;
3383 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
3387 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
3388 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3389 entry = gs_iter->data;
3390 if (entry->uid == uid && entry->alarm_id == alarm_id) {
3391 alarm_info = &(entry->alarm_info);
3396 if (alarm_info == NULL) {
3397 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3398 return_code = ERR_ALARM_INVALID_ID;
3399 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
3401 ALARM_MGR_LOG_PRINT("The alarm(%d) is found.", alarm_id);
3403 callee_pkgid = (char *)g_quark_to_string(entry->quark_callee_pkgid);
3404 if (strncmp(callee_pkgid, "null", strlen(callee_pkgid)) == 0)
3405 callee_pkgid = (char *)g_quark_to_string(entry->quark_app_service_name)+6;
3407 ALARM_MGR_LOG_PRINT("The alarm pkgid : %s.", callee_pkgid);
3409 pkgmgrinfo_pkginfo_h handle;
3410 retval = pkgmgrinfo_pkginfo_get_usr_pkginfo(callee_pkgid, uid, &handle);
3411 if (retval != PMINFO_R_OK) {
3412 ALARM_MGR_EXCEPTION_PRINT("Failed to get pkginfo\n");
3413 return_code = ERR_ALARM_INVALID_ID;
3416 retval = pkgmgrinfo_pkginfo_is_global(handle, &is_global);
3417 if (retval == PMINFO_R_OK && is_global) {
3418 entry->global = global;
3419 if (!__alarm_set_global_to_db(entry, global))
3420 return_code = ERR_ALARM_SYSTEM_FAIL;
3421 } else if (retval == PMINFO_R_OK && !is_global) {
3422 return_code = ERR_ALARM_NOT_PERMITTED_APP;
3426 g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
3432 gboolean alarm_manager_alarm_get_global(AlarmManager *pObject, GDBusMethodInvocation *invoc,
3433 alarm_id_t alarm_id, gpointer user_data)
3435 GSList *gs_iter = NULL;
3436 __alarm_info_t *entry = NULL;
3437 __alarm_info_t *find_item = NULL;
3438 int return_code = ALARMMGR_RESULT_SUCCESS;
3439 bool global = false;
3441 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
3442 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
3443 entry = gs_iter->data;
3444 if (entry->alarm_id == alarm_id) {
3450 if (find_item == NULL) {
3451 ALARM_MGR_EXCEPTION_PRINT("The alarm(%d) is not found.", alarm_id);
3452 return_code = ERR_ALARM_INVALID_ID;
3453 g_dbus_method_invocation_return_value(invoc, g_variant_new("(bi)", global, return_code));
3457 global = find_item->global;
3458 ALARM_MGR_LOG_PRINT("Is global : %d", global);
3460 g_dbus_method_invocation_return_value(invoc, g_variant_new("(bi)", global, return_code));
3465 static void __timer_glib_finalize(GSource *src)
3470 fd_list = src->poll_fds;
3472 tmp = (GPollFD *) fd_list->data;
3475 fd_list = fd_list->next;
3481 static gboolean __timer_glib_check(GSource *src)
3486 fd_list = src->poll_fds;
3488 tmp = (GPollFD *) fd_list->data;
3489 if (tmp->revents & (POLLIN | POLLPRI))
3492 fd_list = fd_list->next;
3498 static gboolean __timer_glib_dispatch(GSource *src, GSourceFunc callback,
3505 static gboolean __timer_glib_prepare(GSource *src, gint *timeout)
3510 GSourceFuncs funcs = {
3511 .prepare = __timer_glib_prepare,
3512 .check = __timer_glib_check,
3513 .dispatch = __timer_glib_dispatch,
3514 .finalize = __timer_glib_finalize
3517 static void __initialize_timer()
3524 fd = timerfd_create(CLOCK_REALTIME, 0);
3526 ALARM_MGR_EXCEPTION_PRINT("timerfd_create() is failed.\n");
3529 src = g_source_new(&funcs, sizeof(GSource));
3531 gpollfd = (GPollFD *) g_malloc(sizeof(GPollFD));
3532 if (gpollfd == NULL) {
3533 ALARM_MGR_EXCEPTION_PRINT("Out of memory\n");
3536 gpollfd->events = POLLIN;
3539 g_source_add_poll(src, gpollfd);
3540 g_source_set_callback(src, (GSourceFunc) __alarm_handler_idle,
3541 (gpointer) gpollfd, NULL);
3542 g_source_set_priority(src, G_PRIORITY_HIGH);
3544 ret = g_source_attach(src, NULL);
3546 ALARM_MGR_EXCEPTION_PRINT("g_source_attach() is failed.\n");
3550 g_source_unref(src);
3552 alarm_context.timer = fd;
3555 static void __initialize_alarm_list()
3557 alarm_context.alarms = NULL;
3558 alarm_context.c_due_time = -1;
3560 _load_alarms_from_registry();
3562 __rtc_set(); /*Set RTC1 Alarm with alarm due time for alarm-manager initialization*/
3565 static void __initialize_scheduled_alarm_list()
3567 _init_scheduled_alarm_list();
3570 static bool __initialize_noti()
3572 /* VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL is set by OSP app-service. */
3573 if (vconf_notify_key_changed
3574 (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) {
3575 ALARM_MGR_LOG_PRINT("Failed to add callback for time external changing event.");
3578 /* If the caller or callee app is uninstalled, all registered alarms will be canceled. */
3579 int event_type = PKGMGR_CLIENT_STATUS_UNINSTALL;
3580 pkgmgr_client *pc = pkgmgr_client_new(PC_LISTENING);
3581 pkgmgr_client_set_status_type(pc, event_type);
3582 pkgmgr_client_listen_status(pc, __on_app_uninstalled, NULL);
3587 void on_bus_name_owner_changed(GDBusConnection *connection,
3588 const gchar *sender_name,
3589 const gchar *object_path,
3590 const gchar *interface_name,
3591 const gchar *signal_name,
3592 GVariant *parameters,
3595 GSList *entry = NULL;
3596 __expired_alarm_t *expire_info = NULL;
3597 char *service_name = NULL;
3599 /* On expiry, the killed app can be launched by aul. Then, the owner of the bus name which was registered by the app is changed.
3600 * In this case, "NameOwnerChange" signal is broadcasted. */
3601 if (signal_name && strcmp(signal_name , "NameOwnerChanged") == 0) {
3602 g_variant_get(parameters, "(sss)", &service_name, NULL, NULL);
3604 for (entry = g_expired_alarm_list; entry; entry = entry->next) {
3606 expire_info = (__expired_alarm_t *) entry->data;
3607 SECURE_LOGD("expired service(%s), owner changed service(%s)", expire_info->service_name, service_name);
3609 if (strcmp(expire_info->service_name, service_name) == 0) {
3610 SECURE_LOGE("expired service name(%s) alarm_id (%d)", expire_info->service_name, expire_info->alarm_id);
3611 __alarm_send_noti_to_application(expire_info->service_name, expire_info->alarm_id, expire_info->uid);
3612 g_expired_alarm_list = g_slist_remove(g_expired_alarm_list, entry->data);
3613 g_free(expire_info);
3617 g_free(service_name);
3621 static bool __initialize_dbus()
3623 GDBusConnection *connection = NULL;
3624 GError *error = NULL;
3626 ALARM_MGR_LOG_PRINT("__initialize_dbus Enter");
3628 connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3629 if (connection == NULL) {
3630 ALARM_MGR_EXCEPTION_PRINT("g_bus_get_sync() is failed");
3632 ALARM_MGR_EXCEPTION_PRINT("dbus error message : %s", error->message);
3633 g_error_free(error);
3638 interface = alarm_manager_skeleton_new();
3639 if (interface == NULL) {
3640 ALARM_MGR_EXCEPTION_PRINT("Creating a skeleton object is failed.");
3641 g_object_unref(connection);
3645 g_signal_connect(interface, "handle_alarm_create", G_CALLBACK(alarm_manager_alarm_create), NULL);
3646 g_signal_connect(interface, "handle_alarm_create_periodic", G_CALLBACK(alarm_manager_alarm_create_periodic), NULL);
3647 g_signal_connect(interface, "handle_alarm_create_appsvc", G_CALLBACK(alarm_manager_alarm_create_appsvc), NULL);
3648 g_signal_connect(interface, "handle_alarm_create_noti", G_CALLBACK(alarm_manager_alarm_create_noti), NULL);
3649 g_signal_connect(interface, "handle_alarm_delete", G_CALLBACK(alarm_manager_alarm_delete), NULL);
3650 g_signal_connect(interface, "handle_alarm_delete_all", G_CALLBACK(alarm_manager_alarm_delete_all), NULL);
3651 g_signal_connect(interface, "handle_alarm_get_appsvc_info", G_CALLBACK(alarm_manager_alarm_get_appsvc_info), NULL);
3652 g_signal_connect(interface, "handle_alarm_get_info", G_CALLBACK(alarm_manager_alarm_get_info), NULL);
3653 g_signal_connect(interface, "handle_alarm_get_noti_info", G_CALLBACK(alarm_manager_alarm_get_noti_info), NULL);
3654 g_signal_connect(interface, "handle_alarm_get_list_of_ids", G_CALLBACK(alarm_manager_alarm_get_list_of_ids), NULL);
3655 g_signal_connect(interface, "handle_alarm_get_next_duetime", G_CALLBACK(alarm_manager_alarm_get_next_duetime), NULL);
3656 g_signal_connect(interface, "handle_alarm_get_number_of_ids", G_CALLBACK(alarm_manager_alarm_get_number_of_ids), NULL);
3657 g_signal_connect(interface, "handle_alarm_set_rtc_time", G_CALLBACK(alarm_manager_alarm_set_rtc_time), NULL);
3658 g_signal_connect(interface, "handle_alarm_set_time", G_CALLBACK(alarm_manager_alarm_set_time), NULL);
3659 g_signal_connect(interface, "handle_alarm_set_timezone", G_CALLBACK(alarm_manager_alarm_set_timezone), NULL);
3660 g_signal_connect(interface, "handle_alarm_update", G_CALLBACK(alarm_manager_alarm_update), NULL);
3661 g_signal_connect(interface, "handle_alarm_get_all_info", G_CALLBACK(alarm_manager_alarm_get_all_info), NULL);
3662 g_signal_connect(interface, "handle_alarm_set_time_with_propagation_delay", G_CALLBACK(alarm_manager_alarm_set_time_with_propagation_delay), NULL);
3663 g_signal_connect(interface, "handle_alarm_set_global", G_CALLBACK(alarm_manager_alarm_set_global), NULL);
3664 g_signal_connect(interface, "handle_alarm_get_global", G_CALLBACK(alarm_manager_alarm_get_global), NULL);
3666 subsc_id = g_dbus_connection_signal_subscribe(connection,
3667 "org.freedesktop.DBus", "org.freedesktop.DBus",
3668 "NameOwnerChanged", "/org/freedesktop/DBus", NULL,
3669 G_DBUS_SIGNAL_FLAGS_NONE, on_bus_name_owner_changed, NULL, NULL);
3670 if (subsc_id == 0) {
3671 ALARM_MGR_EXCEPTION_PRINT("Subscribing to signal for invoking callback is failed.");
3672 g_object_unref(interface);
3674 g_object_unref(connection);
3678 if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(interface), connection, ALARM_MGR_DBUS_PATH, NULL)) {
3679 ALARM_MGR_EXCEPTION_PRINT("Exporting the interface is failed.");
3680 g_object_unref(interface);
3682 g_object_unref(connection);
3686 guint owner_id = g_bus_own_name_on_connection(connection,
3687 ALARM_MGR_DBUS_NAME, G_BUS_NAME_OWNER_FLAGS_NONE,
3688 NULL, NULL, NULL, NULL);
3690 if (owner_id == 0) {
3691 ALARM_MGR_EXCEPTION_PRINT("Acquiring the own name is failed.");
3692 g_object_unref(interface);
3694 g_object_unref(connection);
3698 alarm_context.connection = connection;
3703 #define ALARMMGR_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".alarmmgr.db")
3704 #define QUERY_CREATE_TABLE_ALARMMGR "create table alarmmgr \
3705 (alarm_id integer primary key,\
3713 app_unique_name text,\
3714 app_service_name text,\
3715 app_service_name_mod text,\
3725 day_of_week integer,\
3727 alarm_type integer,\
3728 reserved_info integer,\
3729 dst_service_name text, \
3730 dst_service_name_mod text \
3733 static bool __initialize_db()
3735 char *error_message = NULL;
3738 if (access(ALARMMGR_DB_FILE, F_OK) == 0) {
3739 ret = db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db, DB_UTIL_REGISTER_HOOK_METHOD);
3741 if (ret != SQLITE_OK) {
3742 ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", ALARMMGR_DB_FILE);
3749 ret = db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db, DB_UTIL_REGISTER_HOOK_METHOD);
3751 if (ret != SQLITE_OK) {
3752 ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", ALARMMGR_DB_FILE);
3756 if (SQLITE_OK != sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message)) {
3757 ALARM_MGR_EXCEPTION_PRINT("Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message);
3764 static void __initialize()
3766 #if !(GLIB_CHECK_VERSION(2, 36, 0))
3770 __initialize_timer();
3771 if (__initialize_dbus() == false) {
3772 /* because dbus's initialize
3773 * failed, we cannot continue any more. */
3774 ALARM_MGR_EXCEPTION_PRINT("because __initialize_dbus failed, "
3775 "alarm-server cannot be runned.\n");
3779 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
3780 __initialize_module_log(); /* for module log */
3783 __initialize_scheduled_alarm_list();
3785 __initialize_alarm_list();
3786 __initialize_noti();
3788 if (!appid_cache_table) {
3789 appid_cache_table = g_hash_table_new_full(g_int_hash, g_int_equal,
3790 NULL, __free_cached_value);
3796 GMainLoop *mainloop = NULL;
3798 ALARM_MGR_LOG_PRINT("Enter main loop\n");
3800 mainloop = g_main_loop_new(NULL, FALSE);
3804 g_main_loop_run(mainloop);