2 * Copyright (c) 2000 - 2019 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.
26 #include <linux/rtc.h>
27 #include <sys/ioctl.h>
30 #include <tzplatform_config.h>
34 #include <bundle_internal.h>
36 #include <vconf-keys.h>
37 #include <package-manager.h>
38 #include <device/display.h>
39 #include <systemd/sd-login.h>
40 #include <eventsystem.h>
41 #include <notification.h>
42 #include <notification_ipc.h>
43 #include <notification_internal.h>
46 #include "alarm-internal.h"
47 #include "alarm-manager-db.h"
48 #include "alarm-manager-util.h"
49 #include "alarm-manager-dbus.h"
51 #if !GLIB_CHECK_VERSION(2, 31, 0)
52 #include <glib/gmacros.h>
55 #define BILLION 1000000000 /* for calculating nano seconds */
57 /* link path for timezone info */
58 #define TIMEZONE_INFO_LINK_PATH tzplatform_mkpath(TZ_SYS_ETC, "localtime")
60 #ifndef RTC_WKALM_BOOT_SET
61 #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
64 #define _APPFW_FEATURE_WAKEUP_USING_RTC (_get_profile() != PROFILE_TV)
67 static const char default_rtc[] = "/dev/rtc";
70 __alarm_server_context_t alarm_context;
72 extern bool g_dummy_timer_is_set;
74 GSList *g_scheduled_alarm_list;
75 GSList *g_expired_alarm_list;
76 GSList *g_disabled_alarm_list;
77 GHashTable *caller_appid_cache_table;
79 bool is_time_changed = false; /* for calculating next duetime */
80 static time_t periodic_alarm_standard_time = 0;
82 struct running_info_t {
93 static long __get_proper_interval(long interval, int alarm_type);
94 static void __alarm_add_to_list(__alarm_info_t *__alarm_info);
95 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id);
96 static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
97 alarm_info_t *alarm_info, int update_flag, int *error_code);
98 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
100 static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
101 __alarm_info_t *__alarm_info);
102 static void __alarm_update_due_time_of_all_items_in_list(time_t new_time,double diff_time);
103 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
104 int pid, periodic_method_e method, long requested_interval, int is_ref,
105 char *app_service_name, char *app_service_name_mod,
106 const char *dst_service_name, const char *dst_service_name_mod,
108 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
109 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code);
111 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
112 static bool __alarm_update(uid_t uid, alarm_id_t alarm_id,
113 alarm_info_t *alarm_info, int update_flag, int *error_code);
114 static void __on_system_time_external_changed(keynode_t *node, void *data);
115 static void __initialize_alarm_list();
116 static void __initialize_scheduled_alarm_list();
117 static void __initialize_noti();
118 static gboolean __alarm_expired_directly(gpointer user_data);
120 void _release_alarm_info_t(__alarm_info_t *entry);
121 static notification_h __get_notification(guchar *data, int datalen);
123 static bool __get_caller_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid)
125 char caller_appid[MAX_APP_ID_LEN] = {0,};
127 if (unique_name == NULL) {
128 LOGE("unique_name should not be NULL.");
132 if (aul_app_get_appid_bypid_for_uid(pid, caller_appid,
133 sizeof(caller_appid), uid) == AUL_R_OK) {
134 /* When a caller is an application, the unique name is appID. */
137 strncpy(unique_name, caller_appid, size - 1);
139 /* Otherwise, the unique name is /proc/pid/cmdline. */
140 char proc_file[MAX_APP_ID_LEN] = {0,};
141 char process_name[MAX_APP_ID_LEN] = {0,};
148 snprintf(proc_file, MAX_APP_ID_LEN, "/proc/%d/cmdline", pid);
150 fd = open(proc_file, O_RDONLY);
152 SECURE_LOGE("Caution!! pid(%d) seems to be killed.",
156 if (read(fd, process_name, sizeof(process_name) - 1) <= 0) {
157 LOGE("Unable to get the process name.");
163 while (process_name[i] != '\0') {
164 if (process_name[i] == ' ') {
165 process_name[i] = '\0';
170 strncpy(unique_name, process_name, size - 1);
177 gboolean __hash_table_remove_cb(gpointer key, gpointer value, gpointer user_data)
179 char *target_name = (char *)user_data;
180 appid_cache_t *data = (appid_cache_t *)value;
181 if (target_name && data && strcmp(target_name, data->unique_name) == 0) {
182 LOGD("Remove cached data of [%s]", target_name);
189 static bool __get_cached_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid)
195 data = (appid_cache_t *)g_hash_table_lookup(caller_appid_cache_table, GINT_TO_POINTER(pid));
197 snprintf(unique_name, MAX_APP_ID_LEN, "%s", data->unique_name);
199 *is_app = data->is_app;
200 LOGD("Get cached unique_name: %s, pid:%d", unique_name, pid);
204 LOGD("There is no cached unique_name for pid(%d)", pid);
206 ret = __get_caller_unique_name(pid, unique_name, size, &_is_app, uid);
208 g_hash_table_foreach_remove(caller_appid_cache_table, __hash_table_remove_cb, (gpointer)unique_name);
209 data = (appid_cache_t *)calloc(1, sizeof(appid_cache_t));
211 data->unique_name = strdup(unique_name);
212 data->is_app = _is_app;
214 g_hash_table_insert(caller_appid_cache_table, GINT_TO_POINTER(data->pid), (gpointer)data);
220 SECURE_LOGD("unique_name= %s", unique_name);
226 void __hashtable_foreach_cb(gpointer key, gpointer value, gpointer user_data)
228 appid_cache_t *data = (appid_cache_t *)value;
230 LOGD("# %s(%d) - %d", data->unique_name, data->pid, data->is_app);
233 void __free_cached_value(gpointer data)
235 appid_cache_t *value = (appid_cache_t *)data;
238 if (value->unique_name)
239 free(value->unique_name);
246 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
247 const char *rtc = default_rtc;
249 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
250 #ifdef _SIMUL /* RTC does not work in simulator. */
251 LOGE("because it is simulator's mode, we don't set RTC.");
256 gfd = open(rtc, O_RDWR);
258 LOGE("RTC open failed.");
263 /* Read the RTC time/date */
266 char *timebuf = ctime(&alarm_context.c_due_time);
268 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
269 snprintf(log_message, sizeof(log_message), "wakeup time: %d, %s", (int)alarm_context.c_due_time, timebuf);
272 LOGD("alarm_context.c_due_time is %d.", (int)alarm_context.c_due_time);
274 if (alarm_context.c_due_time != -1) {
275 struct rtc_wkalrm rtc_wkalarm = { 0, };
276 rtc_wkalarm.enabled = 0;
277 rtc_wkalarm.time.tm_year = 1900;
278 rtc_wkalarm.time.tm_mon = 0;
279 rtc_wkalarm.time.tm_mday = 1;
280 rtc_wkalarm.time.tm_hour = 0;
281 rtc_wkalarm.time.tm_min = 0;
282 rtc_wkalarm.time.tm_sec = 0;
284 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
287 LOGE("Alarm IRQs is not supported.");
289 LOGE("RTC_WKALM_SET disabled ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
290 _save_module_log("FAIL: SET RTC", log_message);
293 LOGD("[alarm-server]RTC_WKALM_SET disabled ioctl is successfully done.");
295 time_t due_time = alarm_context.c_due_time;
296 gmtime_r(&due_time, &due_tm);
298 LOGD("Setted RTC Alarm date/time is %d-%d-%d, %02d:%02d:%02d (UTC).",
299 due_tm.tm_mday, due_tm.tm_mon + 1, due_tm.tm_year + 1900,
300 due_tm.tm_hour, due_tm.tm_min, due_tm.tm_sec);
302 rtc_wkalarm.enabled = 1;
303 rtc_wkalarm.time.tm_year = due_tm.tm_year;
304 rtc_wkalarm.time.tm_mon = due_tm.tm_mon;
305 rtc_wkalarm.time.tm_mday = due_tm.tm_mday;
306 rtc_wkalarm.time.tm_hour = due_tm.tm_hour;
307 rtc_wkalarm.time.tm_min = due_tm.tm_min;
308 rtc_wkalarm.time.tm_sec = due_tm.tm_sec;
309 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
312 LOGE("Alarm IRQs is not supported.");
314 LOGE("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
315 _save_module_log("FAIL: SET RTC", log_message);
318 LOGD("[alarm-server]RTC ALARM_SET ioctl is successfully done.");
319 _save_module_log("SET RTC", log_message);
321 LOGE("[alarm-server]alarm_context.c_due_time is"
322 "less than 10 sec. RTC alarm does not need to be set");
325 LOGD("[alarm-server] RTC does not work.");
330 static bool __set_time(time_t _time)
334 struct tm tm, *gmtime_res;
339 gmtime_res = gmtime_r(&(tv.tv_sec), &tm);
341 LOGE("gmtime_r is failed. [%d]", errno);
345 ret = settimeofday(&tv, NULL);
347 LOGE("settimeofday is failed.[%d]", errno);
351 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
352 const char *rtc0 = default_rtc;
353 struct rtc_time _rtc_time;
355 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
356 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
357 char *timebuf = ctime(&_time);
359 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
360 snprintf(log_message, sizeof(log_message), "RTC & OS =%ld, %s",
365 gfd = open(rtc0, O_RDWR);
367 LOGE("Opening the /dev/rtc is failed.");
372 memset(&_rtc_time, 0, sizeof(_rtc_time));
373 _rtc_time.tm_sec = tm.tm_sec;
374 _rtc_time.tm_min = tm.tm_min;
375 _rtc_time.tm_hour = tm.tm_hour;
376 _rtc_time.tm_mday = tm.tm_mday;
377 _rtc_time.tm_mon = tm.tm_mon;
378 _rtc_time.tm_year = tm.tm_year;
379 _rtc_time.tm_wday = tm.tm_wday;
380 _rtc_time.tm_yday = tm.tm_yday;
381 _rtc_time.tm_isdst = tm.tm_isdst;
383 ret = ioctl(gfd, RTC_SET_TIME, &_rtc_time);
385 LOGE("ALARM_SET_RTC ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
386 strncpy(log_tag, "FAIL: SET RTC", sizeof(log_tag) - 1);
387 _save_module_log(log_tag, log_message);
389 LOGD("ALARM_SET_RTC ioctl is succeed. [%d]", (int)_time);
390 strncpy(log_tag, "SET RTC START", sizeof(log_tag) - 1);
391 _save_module_log(log_tag, log_message);
395 LOGD("[alarm-server] RTC does not work.");
402 bool __alarm_clean_list()
404 __alarm_info_t *entry = NULL;
407 for (iter = alarm_context.alarms; iter != NULL;
408 iter = g_slist_next(iter)) {
409 entry = (__alarm_info_t *)iter->data;
410 _release_alarm_info_t(entry);
413 g_slist_free(alarm_context.alarms);
414 alarm_context.alarms = NULL;
419 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id)
421 bool unique_id = false;
422 __alarm_info_t *entry = NULL;
425 __alarm_info->alarm_id = g_random_int_range(0, INT_MAX) + 1;
426 LOGD("__alarm_info->alarm_id is %d", __alarm_info->alarm_id);
428 while (unique_id == false) {
431 for (iter = alarm_context.alarms; iter != NULL;
432 iter = g_slist_next(iter)) {
433 entry = (__alarm_info_t *)iter->data;
434 if (entry->alarm_id == __alarm_info->alarm_id) {
435 __alarm_info->alarm_id++;
441 *alarm_id = __alarm_info->alarm_id;
446 static void __alarm_add_to_list(__alarm_info_t *__alarm_info)
448 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
449 __alarm_info_t *entry = NULL;
452 LOGD("[alarm-server]: Before add alarm_id(%d)", __alarm_info->alarm_id);
454 alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info);
455 LOGD("[alarm-server]: After add alarm_id(%d)", __alarm_info->alarm_id);
458 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
459 entry = (__alarm_info_t *)iter->data;
460 LOGD("[alarm-server]: alarm_id(%d).", entry->alarm_id);
463 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
464 if (!_save_alarms(__alarm_info))
465 LOGE("Saving alarm_id(%d) in DB is failed.", __alarm_info->alarm_id);
469 static bool __check_bundle_for_update(const gchar *b_data, uid_t uid)
471 const char *callee_appid;
478 b = bundle_decode((bundle_raw *)b_data, strlen(b_data));
482 callee_appid = appsvc_get_appid(b);
483 if (callee_appid == NULL) {
488 if (_is_ui_app(callee_appid, uid))
495 static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
496 alarm_info_t *alarm_info, int update_flag, int *error_code)
500 __alarm_info_t *entry = NULL;
501 alarm_info_t *_alarm_info = NULL;
504 for (iter = alarm_context.alarms; iter != NULL;
505 iter = g_slist_next(iter)) {
506 entry = (__alarm_info_t *)iter->data;
507 if (entry->uid == uid &&
508 entry->alarm_id == alarm_id) {
510 _alarm_info = &entry->alarm_info;
512 if (update_flag == ALARM_UPDATE_FLAG_TIME ||
513 ALARM_UPDATE_FLAG_WEEK) {
514 if (!__check_bundle_for_update(entry->bundle,
516 *error_code = ERR_ALARM_NOT_PERMITTED_APP;
521 if (update_flag == ALARM_UPDATE_FLAG_TIME) {
522 __alarm_set_start_and_end_time(alarm_info, entry);
523 memcpy(_alarm_info, alarm_info, sizeof(alarm_info_t));
525 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_ONCE) {
527 _alarm_info->reserved_info = current_time;
529 } else if (update_flag == ALARM_UPDATE_FLAG_PERIOD) {
530 _alarm_info->alarm_type |= ALARM_TYPE_INEXACT;
531 _alarm_info->alarm_type |= ALARM_TYPE_PERIOD;
532 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT;
533 _alarm_info->mode.u_interval.interval =
534 __get_proper_interval(alarm_info->mode.u_interval.interval,
535 _alarm_info->alarm_type);
536 } else if (update_flag == ALARM_UPDATE_FLAG_WEEK) {
537 _alarm_info->alarm_type &= ~ALARM_TYPE_INEXACT;
538 _alarm_info->mode = alarm_info->mode;
539 } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_PERIOD) {
540 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_REPEAT) {
541 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
542 _alarm_info->mode.u_interval.interval = 0;
544 } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_WEEK_FLAG) {
545 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_WEEKLY) {
546 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
547 _alarm_info->mode.u_interval.interval = 0;
556 *error_code = ERR_ALARM_INVALID_ID;
560 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
561 if (!_update_alarms(entry))
562 LOGE("Updating alarm_id(%d) in DB is failed.", alarm_id);
568 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
573 alarm_info_t *alarm_info = NULL;
576 __alarm_info_t *entry = NULL;
579 LOGD("[alarm-server]: before del : alarm id(%d)", alarm_id);
581 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
582 entry = (__alarm_info_t *)iter->data;
583 if (entry->uid == uid && entry->alarm_id == alarm_id) {
584 alarm_info = &entry->alarm_info;
586 LOGD("[alarm-server]:Remove alarm id(%d)", entry->alarm_id);
588 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
589 if (!_delete_alarms(alarm_id))
593 alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
594 _release_alarm_info_t(entry);
600 LOGD("[alarm-server]: after del\n");
604 *error_code = ERR_ALARM_INVALID_ID;
611 static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
612 __alarm_info_t *__alarm_info)
614 alarm_date_t *start = &alarm_info->start;
615 alarm_date_t *end = &alarm_info->end;
617 struct tm alarm_tm = { 0, };
619 if (start->year != 0) {
620 if ((alarm_info->alarm_type & ALARM_TYPE_RELATIVE) && alarm_info->reserved_info != 0) {
621 __alarm_info->start = alarm_info->reserved_info;
623 alarm_tm.tm_year = start->year - 1900;
624 alarm_tm.tm_mon = start->month - 1;
625 alarm_tm.tm_mday = start->day;
627 alarm_tm.tm_hour = start->hour;
628 alarm_tm.tm_min = start->min;
629 alarm_tm.tm_sec = start->sec;
630 alarm_tm.tm_isdst = -1;
632 __alarm_info->start = mktime(&alarm_tm);
635 __alarm_info->start = 0;
638 if (end->year != 0) {
639 alarm_tm.tm_year = end->year - 1900;
640 alarm_tm.tm_mon = end->month - 1;
641 alarm_tm.tm_mday = end->day;
643 alarm_tm.tm_hour = end->hour;
644 alarm_tm.tm_min = end->min;
645 alarm_tm.tm_sec = end->sec;
647 __alarm_info->end = mktime(&alarm_tm);
649 __alarm_info->end = 0;
653 static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double diff_time)
656 time_t min_time = -1;
659 __alarm_info_t *entry = NULL;
660 struct tm *p_time = NULL;
661 struct tm due_time_result;
662 bool is_rtc_reset = false;
663 is_time_changed = true;
665 if (periodic_alarm_standard_time != 0)
666 periodic_alarm_standard_time += diff_time;
669 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
670 entry = (__alarm_info_t *)iter->data;
671 alarm_info_t *alarm_info = &(entry->alarm_info);
672 if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) {
673 /* case of RTC reset */
674 if (entry->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
675 if ((entry->due_time + diff_time - new_time) >
676 (entry->due_time - entry->alarm_info.reserved_info)) {
677 LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
678 ctime(&new_time), new_time, diff_time, entry->alarm_id,
679 ctime(&entry->due_time), entry->due_time,
680 entry->alarm_info.reserved_info);
684 entry->due_time += diff_time;
685 entry->alarm_info.reserved_info = new_time;
688 entry->due_time += diff_time;
689 is_rtc_reset = false;
690 if ((entry->due_time - new_time) > alarm_info->mode.u_interval.interval) {
692 entry->due_time = new_time +
693 ((entry->due_time - new_time) % alarm_info->mode.u_interval.interval);
694 LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
695 ctime(&new_time), new_time, diff_time, entry->alarm_id,
696 ctime(&entry->due_time), entry->due_time,
697 alarm_info->mode.u_interval.interval);
701 alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */
702 alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */
704 p_time = localtime_r(&entry->due_time, &due_time_result);
705 if (p_time != NULL) {
706 start->year = p_time->tm_year + 1900;
707 start->month = p_time->tm_mon + 1;
708 start->day = p_time->tm_mday;
709 start->hour = p_time->tm_hour;
710 start->min = p_time->tm_min;
711 start->sec = p_time->tm_sec;
713 if (entry->start != 0)
714 entry->start = entry->due_time;
716 if (entry->end != 0 && is_rtc_reset == false) {
717 entry->end += diff_time;
718 p_time = localtime_r(&entry->end, &due_time_result);
719 if (p_time != NULL) {
720 end->year = p_time->tm_year + 1900;
721 end->month = p_time->tm_mon + 1;
722 end->day = p_time->tm_mday;
723 end->hour = p_time->tm_hour;
724 end->min = p_time->tm_min;
725 end->sec = p_time->tm_sec;
729 _alarm_set_next_duetime(entry);
734 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
735 entry = (__alarm_info_t *)iter->data;
736 due_time = entry->due_time;
740 LOGD("alarm[%d] with duetime(%ld) at current(%ld)", entry->alarm_id, due_time, current_time);
741 if (due_time == 0) { /* 0 means this alarm has been disabled */
745 interval = difftime(due_time, current_time);
748 LOGW("The duetime of alarm(%d) is OVER.", entry->alarm_id);
750 _alarm_set_next_duetime(entry);
751 if (entry->due_time < current_time) {
752 const char *dst = entry->callee_pkgid ? entry->callee_pkgid : entry->dst_service_name;
753 LOGW("The alarm(%d) is removed [unique_name : %s, dst : %s",
754 entry->alarm_id, entry->app_unique_name, dst);
756 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
757 _delete_alarms(entry->alarm_id);
759 _save_alarm_info_log("AUTO_DELETE", entry);
761 alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
762 _release_alarm_info_t(entry);
765 due_time = entry->due_time;
770 interval = difftime(due_time, min_time);
772 if ((interval < 0) || min_time == -1)
776 is_time_changed = false;
777 alarm_context.c_due_time = min_time;
779 g_idle_add(_update_relative_alarms, NULL);
782 static void __set_caller_info(bundle *b, uid_t uid,
783 const char *appid, const char *pkgid)
787 snprintf(buf, sizeof(buf), "%u", uid);
788 bundle_del(b, AUL_K_ORG_CALLER_UID);
789 bundle_add(b, AUL_K_ORG_CALLER_UID, buf);
791 bundle_del(b, AUL_K_ORG_CALLER_APPID);
792 bundle_add(b, AUL_K_ORG_CALLER_APPID, appid);
795 bundle_del(b, AUL_K_ORG_CALLER_PKGID);
796 bundle_add(b, AUL_K_ORG_CALLER_PKGID, pkgid);
800 static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid)
804 char due_time_r[100] = { 0 };
808 SECURE_LOGW("[alarm-server]:pid=%d, app_unique_name=%s, \
809 app_service_name=%s,dst_service_name=%s, c_due_time=%ld",
810 pid, alarm_info->app_unique_name,
811 alarm_info->app_service_name,
812 alarm_info->dst_service_name,
813 alarm_context.c_due_time);
815 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
816 alarm_info->alarm_info.reserved_info = current_time;
818 if (alarm_context.c_due_time < current_time) {
819 LOGW("Caution!! alarm_context.c_due_time (%ld) is less than current time(%ld)",
820 alarm_context.c_due_time, current_time);
821 alarm_context.c_due_time = -1;
824 _alarm_set_next_duetime(alarm_info);
826 if (alarm_info->due_time == 0) {
827 LOGW("[alarm-server]:Create a new alarm: due_time is 0. [alarm(%d):repeat_type(%d)]",
828 alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
830 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
833 __alarm_add_to_list(alarm_info);
835 } else if (current_time == alarm_info->due_time) {
836 LOGW("[alarm-server]:Create alarm: current_time(%ld) is same as due_time(%ld) [alarm(%d):repeat_type(%d)]",
837 current_time, alarm_info->due_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
839 __alarm_add_to_list(alarm_info);
840 _clear_scheduled_alarm_list();
841 _add_to_scheduled_alarm_list(alarm_info);
842 alarm_context.c_due_time = alarm_info->due_time;
844 time_t *_dt = malloc(sizeof(time_t));
846 *_dt = alarm_info->due_time;
848 LOGE("Out of memory");
852 g_idle_add(__alarm_expired_directly, (gpointer)_dt);
855 } else if (difftime(alarm_info->due_time, current_time) < 0) {
856 LOGW("[alarm-server]: Expired Due Time. \
857 [Due time=%ld, Current Time=%ld]!!!Do not add to schedule list. \
858 [alarm(%d):repeat_type(%d)]",
859 alarm_info->due_time, current_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
861 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
864 __alarm_add_to_list(alarm_info);
867 localtime_r(&(alarm_info->due_time), &ts_ret);
868 strftime(due_time_r, 30, "%c", &ts_ret);
869 SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)",
870 alarm_info->alarm_id, due_time_r);
872 __alarm_add_to_list(alarm_info);
875 LOGD("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)",
876 alarm_context.c_due_time, alarm_info->due_time);
878 if (alarm_context.c_due_time == -1 || alarm_info->due_time < alarm_context.c_due_time) {
879 _clear_scheduled_alarm_list();
880 _add_to_scheduled_alarm_list(alarm_info);
881 _alarm_set_timer(alarm_context.timer, alarm_info->due_time);
882 alarm_context.c_due_time = alarm_info->due_time;
884 } else if (alarm_info->due_time == alarm_context.c_due_time) {
885 _add_to_scheduled_alarm_list(alarm_info);
891 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
892 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code)
894 char app_name[MAX_APP_ID_LEN] = { 0 };
896 const char *callee_appid = NULL;
897 bundle_raw *b_data = NULL;
899 bool caller_is_app = false;
901 __alarm_info_t *__alarm_info = NULL;
903 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
904 if (__alarm_info == NULL) {
905 SECURE_LOGE("Caution!! app_pid=%d, calloc failed. it seems to be OOM.", pid);
906 *error_code = ERR_ALARM_SYSTEM_FAIL;
910 __alarm_info->uid = uid;
911 __alarm_info->alarm_id = -1;
912 __alarm_info->requested_interval = requested_interval;
913 __alarm_info->global = false;
915 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) {
916 *error_code = ERR_ALARM_SYSTEM_FAIL;
917 _release_alarm_info_t(__alarm_info);
920 __alarm_info->app_unique_name = strdup(app_name);
924 __alarm_info->caller_pkgid = _get_pkgid_by_appid(app_name, uid);
927 b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
928 callee_appid = appsvc_get_appid(b);
929 __alarm_info->callee_pkgid = _get_pkgid_by_appid(callee_appid, uid);
931 if (b && caller_is_app) {
932 __set_caller_info(b, uid, app_name, __alarm_info->caller_pkgid);
933 bundle_del(b, AUL_K_REQUEST_TYPE);
934 bundle_add(b, AUL_K_REQUEST_TYPE, "indirect-request");
937 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = %s",
938 __alarm_info->caller_pkgid, __alarm_info->callee_pkgid);
940 bundle_encode(b, &b_data, &datalen);
942 __alarm_info->bundle = strdup((const gchar *)b_data);
950 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
951 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
952 __alarm_generate_alarm_id(__alarm_info, alarm_id);
954 if (__alarm_add_and_set(__alarm_info, pid) == false) {
955 *error_code = ERR_ALARM_INVALID_TIME;
956 _release_alarm_info_t(__alarm_info);
960 _save_alarm_info_log("CREATE SVC", __alarm_info);
965 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
966 int pid, periodic_method_e method, long requested_interval, int is_ref,
967 char *app_service_name, char *app_service_name_mod,
968 const char *dst_service_name, const char *dst_service_name_mod,
971 char unique_name[MAX_APP_ID_LEN] = { 0 };
972 bool caller_is_app = false;
974 __alarm_info_t *__alarm_info = NULL;
976 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
977 if (__alarm_info == NULL) {
978 SECURE_LOGE("Caution!! app_pid=%d, calloc "
979 "failed. it seems to be OOM\n", pid);
980 *error_code = ERR_ALARM_SYSTEM_FAIL;
983 __alarm_info->uid = uid;
984 __alarm_info->alarm_id = -1;
985 __alarm_info->method = method;
986 __alarm_info->requested_interval = requested_interval;
987 __alarm_info->is_ref = is_ref;
988 __alarm_info->global = false;
990 if (__get_cached_unique_name(pid, unique_name, sizeof(unique_name),
991 &caller_is_app, uid) == false) {
992 *error_code = ERR_ALARM_SYSTEM_FAIL;
993 _release_alarm_info_t(__alarm_info);
997 /* Get caller_appid to get caller's package id. There is no callee. */
999 __alarm_info->caller_pkgid = _get_pkgid_by_appid(unique_name, uid);
1001 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null", __alarm_info->caller_pkgid);
1003 __alarm_info->app_unique_name = strdup(unique_name);
1004 if (app_service_name)
1005 __alarm_info->app_service_name = strdup(app_service_name);
1006 if (app_service_name_mod)
1007 __alarm_info->app_service_name_mod = strdup(app_service_name_mod);
1008 if (dst_service_name)
1009 __alarm_info->dst_service_name = strdup(dst_service_name);
1010 if (dst_service_name_mod)
1011 __alarm_info->dst_service_name_mod = strdup(dst_service_name_mod);
1013 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1014 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1015 __alarm_generate_alarm_id(__alarm_info, alarm_id);
1017 if (__alarm_add_and_set(__alarm_info, pid) == false) {
1018 *error_code = ERR_ALARM_INVALID_TIME;
1019 _release_alarm_info_t(__alarm_info);
1023 _save_alarm_info_log("CREATE", __alarm_info);
1028 static char *__create_new_noti_data(char *noti_data, pid_t pid, uid_t uid)
1031 guchar *decoded_data;
1032 int decoded_datalen;
1033 notification_h noti = NULL;
1034 char *new_noti_data = NULL;
1035 guchar* data = NULL;
1038 decoded_data = g_base64_decode(noti_data, (gsize *)&decoded_datalen);
1039 if (decoded_data == NULL)
1042 noti = __get_notification(decoded_data, decoded_datalen);
1046 notification_set_indirect_request(noti, pid, uid);
1048 noti_gv = notification_ipc_make_gvariant_from_noti(noti, false);
1049 if (noti_gv == NULL)
1052 datalen = g_variant_get_size(noti_gv);
1056 data = (guchar *)malloc(datalen);
1060 g_variant_store(noti_gv, data);
1061 new_noti_data = g_base64_encode(data, datalen);
1067 notification_free(noti);
1069 g_free(decoded_data);
1071 return new_noti_data;
1074 static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
1075 long requested_interval, uid_t uid, int pid, char *noti_data, int *error_code)
1077 char app_name[MAX_APP_ID_LEN] = { 0 };
1078 bool caller_is_app = false;
1079 char *new_noti_data = NULL;
1081 __alarm_info_t *__alarm_info = NULL;
1083 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
1084 if (__alarm_info == NULL) {
1085 SECURE_LOGE("Caution!! app_pid=%d, calloc "
1086 "failed. it seems to be OOM\n", pid);
1087 *error_code = ERR_ALARM_SYSTEM_FAIL;
1090 __alarm_info->uid = uid;
1091 __alarm_info->alarm_id = -1;
1092 __alarm_info->requested_interval = requested_interval;
1093 __alarm_info->global = false;
1095 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) {
1096 *error_code = ERR_ALARM_SYSTEM_FAIL;
1097 _release_alarm_info_t(__alarm_info);
1100 __alarm_info->app_unique_name = strdup(app_name);
1102 if (caller_is_app) {
1103 __alarm_info->caller_pkgid = _get_pkgid_by_appid(app_name, uid);
1106 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null",
1107 __alarm_info->caller_pkgid);
1110 if (caller_is_app) {
1111 new_noti_data = __create_new_noti_data(noti_data, pid,
1116 __alarm_info->noti = new_noti_data;
1118 __alarm_info->noti = strdup(noti_data);
1121 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1122 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1123 __alarm_generate_alarm_id(__alarm_info, alarm_id);
1125 if (__alarm_add_and_set(__alarm_info, pid) == false) {
1126 *error_code = ERR_ALARM_INVALID_TIME;
1127 _release_alarm_info_t(__alarm_info);
1131 _save_alarm_info_log("CREATE NOTI", __alarm_info);
1136 static bool __alarm_update(uid_t uid, alarm_id_t alarm_id,
1137 alarm_info_t *alarm_info, int update_flag, int *error_code)
1139 time_t current_time;
1140 char due_time_r[100] = { 0 };
1141 __alarm_info_t *__alarm_info = NULL;
1142 bool result = false;
1145 time(¤t_time);
1147 if (alarm_context.c_due_time < current_time) {
1148 LOGE("Caution!! alarm_context.c_due_time "
1149 "(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time);
1150 alarm_context.c_due_time = -1;
1153 __alarm_info = __alarm_update_in_list(uid, alarm_id, alarm_info,
1154 update_flag, error_code);
1155 if (!__alarm_info) {
1156 LOGE("[alarm-server]: requested alarm_id "
1157 "(%d) does not exist. so this value is invalid id.", alarm_id);
1161 if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
1162 __alarm_info->alarm_info.reserved_info = current_time;
1164 _alarm_set_next_duetime(__alarm_info);
1166 _save_alarm_info_log("UPDATE", __alarm_info);
1168 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1169 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1170 /*there is no scheduled alarm */
1171 _alarm_disable_timer();
1174 LOGD("[alarm-server]:Update alarm: alarm(%d).", alarm_id);
1178 if (__alarm_info->due_time == 0)
1179 LOGE("[alarm-server]:Update alarm: due_time is 0.");
1184 if (__alarm_info->due_time == 0) {
1185 LOGE("[alarm-server]:Update alarm: "
1186 "due_time is 0, alarm(%d)\n", alarm_id);
1188 } else if (current_time == __alarm_info->due_time) {
1189 LOGE("[alarm-server]:Update alarm: "
1190 "current_time(%ld) is same as due_time(%ld)", current_time,
1191 __alarm_info->due_time);
1193 } else if (difftime(__alarm_info->due_time, current_time) < 0) {
1194 LOGE("[alarm-server]: Expired Due Time.[Due time=%ld,\
1195 Current Time=%ld]!!!Do not add to schedule list\n",
1196 __alarm_info->due_time, current_time);
1199 localtime_r(&(__alarm_info->due_time), &ts_ret);
1200 strftime(due_time_r, 30, "%c", &ts_ret);
1201 SECURE_LOGD("[alarm-server]:Update alarm: alarm(%d) "
1202 "due_time(%s)\n", alarm_id, due_time_r);
1205 LOGD("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)",
1206 alarm_context.c_due_time, __alarm_info->due_time);
1208 if (alarm_context.c_due_time == -1 || __alarm_info->due_time < alarm_context.c_due_time) {
1209 _clear_scheduled_alarm_list();
1210 _add_to_scheduled_alarm_list(__alarm_info);
1211 _alarm_set_timer(alarm_context.timer, __alarm_info->due_time);
1212 LOGD("[alarm-server1]:alarm_context.c_due_time "
1213 "(%ld), due_time(%ld)", alarm_context.c_due_time, __alarm_info->due_time);
1214 } else if (__alarm_info->due_time == alarm_context.c_due_time) {
1215 _add_to_scheduled_alarm_list(__alarm_info);
1216 LOGD("[alarm-server2]:alarm_context.c_due_time "
1217 "(%ld), due_time(%ld)", alarm_context.c_due_time, __alarm_info->due_time);
1226 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code)
1228 bool result = false;
1230 SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) uid(%d)\n", alarm_id, uid);
1231 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1233 if (!__alarm_remove_from_list(uid, alarm_id, error_code)) {
1235 SECURE_LOGE("[alarm-server]:delete alarm: "
1236 "alarm(%d) uid(%d) has failed with error_code(%d)\n",
1237 alarm_id, uid, *error_code);
1241 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1242 _alarm_disable_timer();
1250 bool _can_skip_expired_cb(alarm_id_t alarm_id)
1252 GSList *gs_iter = NULL;
1253 __alarm_info_t *entry = NULL;
1254 alarm_info_t *alarm = NULL;
1256 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1257 entry = (__alarm_info_t *)gs_iter->data;
1258 if (entry->alarm_id == alarm_id) {
1259 alarm = &(entry->alarm_info);
1262 int dur = entry->requested_interval;
1265 if (dur == 0 || !(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF)
1268 ts_tm.tm_hour = alarm->start.hour;
1269 ts_tm.tm_min = alarm->start.min;
1270 ts_tm.tm_sec = alarm->start.sec;
1272 ts_tm.tm_year = alarm->start.year - 1900;
1273 ts_tm.tm_mon = alarm->start.month - 1;
1274 ts_tm.tm_mday = alarm->start.day;
1275 ts_tm.tm_isdst = -1;
1277 ts = mktime(&ts_tm);
1279 from = (ts / dur) * dur;
1282 if (ts >= from && ts < to && from > ts - alarm->mode.u_interval.interval)
1292 static int __find_login_user(uid_t *uid)
1298 ret = sd_get_uids(&uids);
1302 for (i = 0; i < ret; i++) {
1303 if (sd_uid_get_state(uids[i], &state) < 0) {
1307 if (!strncmp(state, "online", 6)) {
1321 static notification_h __get_notification(guchar *data, int datalen)
1324 GVariant *noti_gv = NULL;
1325 GVariant *body = NULL;
1326 notification_h noti;
1328 if (data == NULL || datalen <= 0)
1331 noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"),
1332 data, datalen, TRUE, NULL, NULL);
1334 if (noti_gv == NULL)
1337 g_variant_get(noti_gv, "(v)", &body);
1340 g_variant_unref(noti_gv);
1344 noti = notification_create(NOTIFICATION_TYPE_NOTI);
1346 g_variant_unref(body);
1347 g_variant_unref(noti_gv);
1351 ret = notification_ipc_make_noti_from_gvariant(noti, body);
1353 if (ret != NOTIFICATION_ERROR_NONE) {
1354 g_variant_unref(body);
1355 g_variant_unref(noti_gv);
1356 notification_free(noti);
1360 g_variant_unref(body);
1361 g_variant_unref(noti_gv);
1366 static int __post_notification(guchar *data, int datalen, uid_t uid)
1369 notification_h noti;
1370 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
1372 noti = __get_notification(data, datalen);
1376 if (vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode) != 0)
1377 LOGE("Failed to get value of VCONFKEY_ALARM_EXPIRE_MODE");
1379 LOGD("Value of alarm_expire_mode [%d]", expire_mode);
1381 if (expire_mode == ALARM_EXPIRE_MODE_NORMAL)
1382 device_display_change_state(DISPLAY_STATE_NORMAL);
1384 ret = notification_post_for_uid(noti, uid);
1386 notification_free(noti);
1391 static int __app_info_iter(const aul_app_info *info, void *data)
1393 struct running_info_t *app_info = (struct running_info_t *)data;
1395 if (strcmp(app_info->appid, info->appid) == 0)
1396 app_info->is_running = true;
1401 void _alarm_expired()
1404 bool is_app = false;
1405 const char *destination_app_service_name = NULL;
1406 alarm_id_t alarm_id = -1;
1408 __alarm_info_t *__alarm_info = NULL;
1409 GSList *iter = NULL;
1410 __scheduled_alarm_t *alarm = NULL;
1411 char alarm_id_val[32];
1418 LOGD("[alarm-server]: Enter");
1420 time_t current_time;
1423 time(¤t_time);
1425 interval = difftime(alarm_context.c_due_time, current_time);
1426 LOGD("[alarm-server]: c_due_time(%ld), current_time(%ld), interval(%f)",
1427 alarm_context.c_due_time, current_time, interval);
1429 if (alarm_context.c_due_time > current_time + 1) {
1430 LOGE("[alarm-server]: False Alarm. due time is (%ld) seconds future",
1431 alarm_context.c_due_time - current_time);
1434 /* 10 seconds is maximum permitted delay from timer expire to this function */
1435 if (alarm_context.c_due_time + 10 < current_time) {
1436 LOGE("[alarm-server]: False Alarm. due time is (%ld) seconds past.",
1437 current_time - alarm_context.c_due_time);
1441 for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) {
1442 alarm = (__scheduled_alarm_t *)iter->data;
1443 alarm_id = alarm->alarm_id;
1444 __alarm_info = alarm->__alarm_info;
1445 app_pid = _get_pid_from_appid(__alarm_info->app_unique_name,
1448 /* Case #1. The process is an application launched by app_control.
1449 * It registered an alarm using launch-based APIs like alarm_schedule_xxx, alarmmgr_xxx_appsvc. */
1450 if (__alarm_info->bundle != NULL) {
1451 b_len = strlen(__alarm_info->bundle);
1453 b = bundle_decode((bundle_raw *)(__alarm_info->bundle), b_len);
1456 LOGE("Error!!!..Unable to decode the bundle!!\n");
1458 snprintf(alarm_id_val, sizeof(alarm_id_val), "%d", alarm_id);
1460 if (bundle_add_str(b, "http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)) {
1461 LOGE("Unable to add alarm id to the bundle\n");
1464 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
1465 if (vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode) != 0)
1466 LOGE("Failed to get value of VCONFKEY_ALARM_EXPIRE_MODE");
1468 LOGD("Value of alarm_expire_mode [%d]", expire_mode);
1469 SECURE_LOGW("alarm_expired : from [uid : %d, pid : %d, pkgid : %s, "
1470 "unique_name : %s]", __alarm_info->uid, app_pid,
1471 __alarm_info->caller_pkgid, __alarm_info->app_unique_name);
1473 if (_compare_api_version(&result, app_pid, __alarm_info->uid) < 0) {
1474 LOGE("Unable to check api version\n");
1480 if (aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, __alarm_info->uid) < 0)
1481 LOGE("Unable to run app svc\n");
1483 LOGD("Successfuly run app svc\n");
1486 appid = (char *)appsvc_get_appid(b);
1487 if ((__alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) {
1488 LOGE("This alarm is ignored\n");
1489 } else if (!(__alarm_info->alarm_info.alarm_type & ALARM_TYPE_INEXACT) ||
1490 !_can_skip_expired_cb(__alarm_info->alarm_id)) {
1491 if (__alarm_info->global) {
1492 if (__find_login_user(&target_uid) < 0) {
1493 LOGE("Fail to get login user\n");
1496 ret = aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, target_uid);
1499 ret = aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, __alarm_info->uid);
1503 LOGE("Unable to launch app [%s] \n", appid);
1505 LOGD("Successfuly ran app svc\n");
1506 if (_is_ui_app(appid, __alarm_info->uid) &&
1507 expire_mode == ALARM_EXPIRE_MODE_NORMAL)
1508 device_display_change_state(DISPLAY_STATE_NORMAL);
1515 } else if (__alarm_info->noti != NULL) {
1520 noti_data = g_base64_decode(__alarm_info->noti,
1523 ret = __post_notification(noti_data, datalen, __alarm_info->uid);
1528 LOGE("Failed to post notification\n");
1530 char appid[MAX_SERVICE_NAME_LEN] = { 0, };
1531 struct running_info_t app_info;
1533 if (__alarm_info->dst_service_name == NULL) {
1534 SECURE_LOGD("[alarm-server]:destination is null, so we send expired alarm to %s.",
1535 __alarm_info->app_service_name);
1536 destination_app_service_name = __alarm_info->app_service_name_mod;
1538 SECURE_LOGD("[alarm-server]:destination :%s",
1539 __alarm_info->dst_service_name);
1540 destination_app_service_name = __alarm_info->dst_service_name_mod;
1544 * we should consider a situation that
1545 * destination_app_service_name is owner_name like (:xxxx) and
1546 * application's pid which registered this alarm was killed.In that case,
1547 * we don't need to send the expire event because the process was killed.
1548 * this causes needless message to be sent.
1551 if (__alarm_info->dst_service_name == NULL) {
1552 if (__alarm_info->app_service_name != NULL && strlen(__alarm_info->app_service_name) > 6)
1553 strncpy(appid, __alarm_info->app_service_name + 6, sizeof(appid) - 1);
1555 if (strlen(__alarm_info->dst_service_name) > 6)
1556 strncpy(appid, __alarm_info->dst_service_name + 6, sizeof(appid) - 1);
1559 if (__alarm_info->uid >= REGULAR_UID_MIN) {
1560 is_app = _is_app(appid, __alarm_info->uid);
1562 LOGD("appid : %s app?(%d)", appid, is_app);
1564 /* Case #2. The process was killed && App type
1565 * This app is launched and owner of DBus connection is changed. and then, expiration noti is sent by DBus. */
1566 app_info.is_running = false;
1568 app_info.appid = appid;
1569 aul_app_get_all_running_app_info_for_uid(__app_info_iter,
1570 &app_info, __alarm_info->uid);
1572 SECURE_LOGD("[alarm-server]: destination_app_id :%s", appid);
1575 if (is_app && !app_info.is_running) {
1576 __expired_alarm_t *expire_info;
1577 char alarm_id_str[32] = { 0, };
1579 if (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) {
1580 __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
1584 expire_info = (__expired_alarm_t *)malloc(sizeof(__expired_alarm_t));
1585 if (G_UNLIKELY(NULL == expire_info)) {
1586 LOGE("[alarm-server]:Malloc failed!Can't notify alarm expiry info\n");
1589 memset(expire_info, '\0', sizeof(__expired_alarm_t));
1590 strncpy(expire_info->service_name, destination_app_service_name, MAX_SERVICE_NAME_LEN-1);
1591 expire_info->alarm_id = alarm_id;
1592 expire_info->uid = __alarm_info->uid;
1593 g_expired_alarm_list = g_slist_append(g_expired_alarm_list, expire_info);
1595 snprintf(alarm_id_str, 31, "%d", alarm_id);
1597 SECURE_LOGD("before aul_launch appid(%s) alarm_id_str(%s)", appid, alarm_id_str);
1599 kb = bundle_create();
1600 bundle_add_str(kb, "__ALARM_MGR_ID", alarm_id_str);
1602 if (__alarm_info->global) {
1603 if (__find_login_user(&target_uid) < 0)
1604 LOGE("Fail to get login user\n");
1606 aul_launch_app_for_uid(appid, kb, target_uid); /* on_bus_name_owner_changed will be called. */
1608 aul_launch_app_for_uid(appid, kb, __alarm_info->uid); /* on_bus_name_owner_changed will be called. */
1613 /* Case #3. The process is alive or was killed && non-app type(daemon)
1614 * Expiration noti is sent by DBus. it makes the process alive. (dbus auto activation) */
1615 LOGD("before alarm_send_noti_to_application");
1617 _alarm_send_noti_to_application_by_dbus(destination_app_service_name,
1618 alarm_id, __alarm_info->alarm_info.msec, __alarm_info->uid); /* dbus auto activation */
1619 LOGD("after _alarm_send_noti_to_application_by_dbus");
1623 LOGD("alarm_id[%d] is expired.", alarm_id);
1625 _save_alarm_info_log("EXPIRED", __alarm_info);
1627 if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
1628 __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
1630 _alarm_set_next_duetime(__alarm_info);
1631 _save_alarm_info_log("DUETIME", __alarm_info);
1636 _clear_scheduled_alarm_list();
1637 alarm_context.c_due_time = -1;
1639 LOGD("[alarm-server]: Leave");
1643 static void __on_system_time_external_changed(keynode_t *node, void *data)
1645 double diff_time = 0.0;
1646 time_t cur_time = 0;
1648 _alarm_disable_timer();
1651 diff_time = vconf_keynode_get_dbl(node);
1653 if (vconf_get_dbl(VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, &diff_time) != 0) {
1654 LOGE("Failed to get value of VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL.");
1662 LOGD("diff_time is %f, New time is %s\n", diff_time, ctime(&cur_time));
1664 LOGD("[alarm-server] System time has been changed externally\n");
1665 LOGD("1.alarm_context.c_due_time is %ld\n",
1666 alarm_context.c_due_time);
1668 if (!__set_time(cur_time)) { /* Change both OS time and RTC */
1669 LOGE("Failed to change both OS time and RTC");
1670 _clear_scheduled_alarm_list();
1676 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
1678 b = bundle_create();
1679 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
1680 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
1683 __alarm_update_due_time_of_all_items_in_list(cur_time, diff_time);
1685 LOGD("2.alarm_context.c_due_time is %ld\n",
1686 alarm_context.c_due_time);
1687 _clear_scheduled_alarm_list();
1691 _save_module_log("SET RTC END", "requested by vconf");
1696 static int __on_app_enable_cb(uid_t target_uid, int req_id,
1697 const char *pkg_type, const char *pkgid, const char *appid,
1698 const char *key, const char *val, const void *pmsg, void *data)
1700 SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id);
1702 GSList *gs_iter = NULL;
1703 __alarm_info_t *entry = NULL;
1704 bool is_restored = false;
1706 if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) {
1707 SECURE_LOGD("Enable appid(%s)", appid);
1708 for (gs_iter = g_disabled_alarm_list; gs_iter != NULL; ) {
1709 entry = (__alarm_info_t *)gs_iter->data;
1711 gs_iter = g_slist_next(gs_iter);
1712 if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) {
1713 _alarm_set_next_duetime(entry);
1714 SECURE_LOGD("Restore alarm_id(%d) duetime(%d) appid(%s)",
1715 entry->alarm_id, (int)(entry->due_time), appid);
1716 alarm_context.alarms = g_slist_append(alarm_context.alarms, entry);
1717 g_disabled_alarm_list = g_slist_remove(g_disabled_alarm_list, entry);
1719 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
1720 _update_db_for_disabled_alarm(entry->alarm_id, false);
1726 _alarm_disable_timer();
1727 _clear_scheduled_alarm_list();
1736 static int __on_app_disable_cb(uid_t target_uid, int req_id,
1737 const char *pkg_type, const char *pkgid, const char *appid,
1738 const char *key, const char *val, const void *pmsg, void *data)
1740 SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id);
1742 GSList *gs_iter = NULL;
1743 __alarm_info_t *entry = NULL;
1744 bool is_disabled = false;
1746 if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) {
1747 SECURE_LOGD("Disable appid(%s)", appid);
1748 for (gs_iter = alarm_context.alarms; gs_iter != NULL; ) {
1749 entry = (__alarm_info_t *)gs_iter->data;
1751 gs_iter = g_slist_next(gs_iter);
1752 if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) {
1753 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
1754 _update_db_for_disabled_alarm(entry->alarm_id, true);
1755 g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, entry);
1756 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
1762 _alarm_disable_timer(alarm_context);
1763 _clear_scheduled_alarm_list();
1772 static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_type,
1773 const char *pkgid, const char *key, const char *val,
1774 const void *pmsg, void *user_data)
1776 GSList *gs_iter = NULL;
1777 __alarm_info_t *entry = NULL;
1778 alarm_info_t *alarm_info = NULL;
1779 bool is_deleted = false;
1781 SECURE_LOGD("pkg_type(%s), pkgid(%s), key(%s), value(%s)", pkg_type, pkgid, key, val);
1783 if (strncmp(key, "end", 3) == 0 && strncmp(val, "ok", 2) == 0) {
1784 for (gs_iter = alarm_context.alarms; gs_iter != NULL;) {
1785 entry = (__alarm_info_t *)gs_iter->data;
1787 const char *caller_pkgid = entry->caller_pkgid;
1788 const char *callee_pkgid = entry->callee_pkgid;
1789 int pid = _get_pid_from_appid(entry->app_unique_name, entry->uid);
1791 gs_iter = g_slist_next(gs_iter);
1792 if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) ||
1793 (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) {
1794 if (_remove_from_scheduled_alarm_list(entry->uid, entry->alarm_id))
1797 alarm_info = &entry->alarm_info;
1798 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
1799 if (!_delete_alarms(entry->alarm_id))
1800 SECURE_LOGE("_delete_alarms() is failed. pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1803 if (g_hash_table_remove(caller_appid_cache_table, GINT_TO_POINTER(pid)) == true)
1804 LOGD("Remove cachd data of pid[%d]", pid);
1806 SECURE_LOGD("Remove pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1807 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
1808 _release_alarm_info_t(entry);
1813 if (is_deleted && (g_slist_length(g_scheduled_alarm_list) == 0)) {
1814 _alarm_disable_timer();
1820 return ALARMMGR_RESULT_SUCCESS;
1823 static long __get_proper_interval(long interval, int alarm_type)
1825 GSList *gs_iter = NULL;
1826 __alarm_info_t *entry = NULL;
1827 long maxInterval = 60;
1829 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1830 entry = (__alarm_info_t *)gs_iter->data;
1831 if (entry->alarm_info.alarm_type & ALARM_TYPE_PERIOD) {
1832 if (entry->alarm_info.mode.u_interval.interval <= interval &&
1833 entry->alarm_info.mode.u_interval.interval > maxInterval)
1834 maxInterval = entry->alarm_info.mode.u_interval.interval;
1838 while ((maxInterval * 2 <= interval && maxInterval < LONG_MAX / 2) ||
1839 (alarm_type & ALARM_TYPE_INEXACT && maxInterval < MIN_INEXACT_INTERVAL))
1845 static gboolean __alarm_expired_directly(gpointer user_data)
1847 if (g_scheduled_alarm_list == NULL || g_scheduled_alarm_list->data == NULL)
1850 time_t *time_sec = (time_t *)user_data;
1851 __scheduled_alarm_t *alarm = (__scheduled_alarm_t *)g_scheduled_alarm_list->data;
1852 __alarm_info_t *alarm_info = alarm->__alarm_info;
1854 /* Expire alarms with duetime equal to newtime by force */
1855 if (alarm_info->due_time == *time_sec) {
1856 if (_display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0) != ALARMMGR_RESULT_SUCCESS)
1857 LOGE("_display_lock_state() is failed");
1859 if (g_dummy_timer_is_set == true) {
1860 LOGD("dummy alarm timer has expired.");
1862 LOGD("due_time=%ld is expired.", alarm_info->due_time);
1869 if (_display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN) != ALARMMGR_RESULT_SUCCESS)
1870 LOGE("_display_unlock_state() is failed");
1879 void __reschedule_alarms_with_newtime(time_t cur_time, time_t new_time, double diff_time)
1881 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
1884 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
1886 b = bundle_create();
1887 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
1888 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
1891 __alarm_update_due_time_of_all_items_in_list(new_time, diff_time); /* Rescheduling alarms with ALARM_TYPE_RELATIVE */
1892 LOGD("Next duetime is %ld", alarm_context.c_due_time);
1894 _clear_scheduled_alarm_list();
1898 char *timebuf = ctime((const time_t *)&new_time);
1900 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid newline */
1901 snprintf(log_message, sizeof(log_message), "Current: %ld, New: %ld, %s, diff: %f", cur_time, new_time, timebuf, diff_time);
1904 _save_module_log("CHANGE TIME", log_message);
1906 _new_time = malloc(sizeof(time_t));
1908 *_new_time = new_time;
1910 LOGE("Out of memory");
1914 g_idle_add(__alarm_expired_directly, (gpointer)_new_time); /* Expire alarms with duetime equal to newtime directly */
1918 static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id)
1920 bool caller_is_app = false;
1921 char app_name[MAX_APP_ID_LEN] = { 0 };
1922 GSList *gs_iter = NULL;
1923 __alarm_info_t *entry = NULL;
1924 char *caller_pkgid = NULL;
1926 if (__get_cached_unique_name(pid, app_name, sizeof(app_name),
1927 &caller_is_app, uid) == false)
1928 return ERR_ALARM_SYSTEM_FAIL;
1930 if (!caller_is_app) {
1931 LOGD("Daemon process is possible to modify alarms[%s]",
1933 return ALARMMGR_RESULT_SUCCESS;
1935 caller_pkgid = _get_pkgid_by_appid(app_name, uid);
1936 if (!caller_pkgid) {
1937 LOGE("Failed to get appinfo %s", app_name);
1938 return ERR_ALARM_SYSTEM_FAIL;
1942 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1943 entry = (__alarm_info_t *)gs_iter->data;
1944 if (entry->uid == uid && entry->alarm_id == alarm_id &&
1945 strcmp(caller_pkgid, entry->caller_pkgid) == 0) {
1946 LOGD("Found alarm of app (uid:%d, pid:%d, caller_pkgid:%s) ", uid, pid, caller_pkgid);
1950 return ALARMMGR_RESULT_SUCCESS;
1954 LOGW("[%s] is not permitted to modify alarm_id[%d]", app_name, alarm_id);
1958 return ERR_ALARM_NOT_PERMITTED_APP;
1961 int alarm_manager_alarm_set_rtc_time(GVariant *parameters)
1963 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
1964 const char *rtc = default_rtc;
1965 struct rtc_wkalrm rtc_wkalarm;
1967 struct tm tm, *alarm_tm = NULL;
1968 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
1969 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
1970 /*extract day of the week, day in the year & daylight saving time from system*/
1971 time_t current_time;
1973 int year, mon, day, hour, min, sec;
1974 int return_code = ALARMMGR_RESULT_SUCCESS;
1976 g_variant_get(parameters, "(iiiiii)", &year, &mon, &day, &hour, &min, &sec);
1978 current_time = time(NULL);
1979 alarm_tm = gmtime_r(¤t_time, &tm);
1980 if (alarm_tm == NULL) {
1981 LOGE("alarm_tm is NULL");
1982 return ERR_ALARM_SYSTEM_FAIL;
1985 alarm_tm->tm_year = year;
1986 alarm_tm->tm_mon = mon;
1987 alarm_tm->tm_mday = day;
1988 alarm_tm->tm_hour = hour;
1989 alarm_tm->tm_min = min;
1990 alarm_tm->tm_sec = sec;
1992 /*convert to calendar time representation*/
1993 time_t rtc_time = mktime(alarm_tm);
1996 gfd = open(rtc, O_RDWR);
1998 LOGE("RTC open failed.");
1999 return ERR_ALARM_SYSTEM_FAIL;
2003 rtc_wkalarm.enabled = 1;
2004 rtc_wkalarm.time.tm_year = year;
2005 rtc_wkalarm.time.tm_mon = mon;
2006 rtc_wkalarm.time.tm_mday = day;
2007 rtc_wkalarm.time.tm_hour = hour;
2008 rtc_wkalarm.time.tm_min = min;
2009 rtc_wkalarm.time.tm_sec = sec;
2011 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
2013 if (errno == ENOTTY)
2014 LOGE("Alarm IRQs is not supported.");
2016 LOGE("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
2017 return_code = ERR_ALARM_SYSTEM_FAIL;
2018 strncpy(log_tag, "FAIL: SET RTC", sizeof(log_tag) - 1);
2020 LOGD("[alarm-server]RTC alarm is setted");
2021 strncpy(log_tag, "SET RTC", sizeof(log_tag) - 1);
2024 snprintf(log_message, sizeof(log_message), "wakeup rtc time: %ld, %s", rtc_time, ctime(&rtc_time));
2025 _save_module_log(log_tag, log_message);
2028 LOGW("[alarm-server] RTC does not work.");
2029 return ERR_ALARM_SYSTEM_FAIL;
2033 static int accrue_msec = 0; /* To check a millisecond part of current time at changing the system time(sec) */
2035 int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid)
2037 double diff_time = 0.0;
2038 struct timeval cur_time = {0,};
2041 char sender_id[MAX_APP_ID_LEN];
2042 char log_message[ALARMMGR_LOG_MESSAGE_SIZE];
2044 g_variant_get(parameters, "(x)", &time_sec);
2046 new_time = (time_t)time_sec;
2048 _alarm_disable_timer(); /* Disable the timer to reschedule the alarm before the time is changed. */
2051 gettimeofday(&cur_time, NULL);
2053 accrue_msec += (cur_time.tv_usec / 1000); /* Accrue the millisecond to compensate the time */
2054 if (accrue_msec > 500) {
2055 diff_time = difftime(new_time, cur_time.tv_sec) - 1;
2056 accrue_msec -= 1000;
2058 diff_time = difftime(new_time, cur_time.tv_sec);
2061 if (!__set_time(new_time)) { /* Change both OS time and RTC */
2062 LOGE("Failed to change both OS time and RTC");
2063 _clear_scheduled_alarm_list();
2066 return ERR_ALARM_SYSTEM_FAIL;
2069 LOGD("[TIMESTAMP]Current time(%ld), New time(%ld)(%s), diff_time(%f)",
2070 cur_time.tv_sec, new_time, ctime((const time_t *)&new_time), diff_time);
2072 __reschedule_alarms_with_newtime(cur_time.tv_sec, new_time, diff_time);
2074 __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001);
2075 snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid);
2076 _save_module_log("SET TIME END", log_message);
2078 return ALARMMGR_RESULT_SUCCESS;;
2081 int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pid_t pid)
2083 double diff_time = 0.0;
2084 struct timespec cur_time = {0,};
2085 struct timespec delay = {0,};
2086 struct timespec sleep_time = {0,};
2087 time_t real_newtime = 0;
2088 accrue_msec = 0; /* reset accrued msec */
2089 time_t new_sec, req_sec;
2090 long new_nsec, req_nsec;
2091 gint64 tmp_new_sec, tmp_req_sec, tmp_new_nsec, tmp_req_nsec;
2092 char sender_id[MAX_APP_ID_LEN];
2093 char log_message[ALARMMGR_LOG_MESSAGE_SIZE];
2095 g_variant_get(parameters, "(xxxx)", &tmp_new_sec, &tmp_new_nsec, &tmp_req_sec, &tmp_req_nsec);
2096 new_sec = (time_t)tmp_new_sec;
2097 new_nsec = (long)tmp_new_nsec;
2098 req_sec = (time_t)tmp_req_sec;
2099 req_nsec = (long)tmp_req_nsec;
2101 _alarm_disable_timer(); /* Disable the timer to reschedule the alarm before the time is changed. */
2104 clock_gettime(CLOCK_REALTIME, &cur_time);
2106 /* Check validation of requested time */
2107 if (req_sec > cur_time.tv_sec || (req_sec == cur_time.tv_sec && req_nsec > cur_time.tv_nsec)) {
2108 LOGE("The requeted time(%ld.%09ld) must be equal to or less than current time(%ld.%09ld).",
2109 req_sec, req_nsec, cur_time.tv_sec, cur_time.tv_nsec);
2110 return ERR_ALARM_INVALID_PARAM;
2113 /* Compensate propagation delay */
2114 if (req_nsec > cur_time.tv_nsec) {
2115 delay.tv_sec = cur_time.tv_sec - 1 - req_sec;
2116 delay.tv_nsec = cur_time.tv_nsec + BILLION - req_nsec;
2118 delay.tv_sec = cur_time.tv_sec - req_sec;
2119 delay.tv_nsec = cur_time.tv_nsec - req_nsec;
2122 if (new_nsec + delay.tv_nsec >= BILLION) {
2123 real_newtime = new_sec + delay.tv_sec + 2;
2124 sleep_time.tv_nsec = BILLION - ((delay.tv_nsec + new_nsec) - BILLION);
2126 real_newtime = new_sec + delay.tv_sec + 1;
2127 sleep_time.tv_nsec = BILLION - (delay.tv_nsec + new_nsec);
2130 nanosleep(&sleep_time, NULL); /* Wait until 0 nsec to match both OS time and RTC(sec) */
2132 if (!__set_time(real_newtime)) { /* Change both OS time and RTC */
2133 LOGE("Failed to change both OS time and RTC");
2134 _clear_scheduled_alarm_list();
2137 return ERR_ALARM_SYSTEM_FAIL;
2140 diff_time = difftime(real_newtime, cur_time.tv_sec);
2141 LOGD("[TIMESTAMP]Current time(%ld.%09ld), New time(%ld.%09ld), Real Newtime(%ld), diff_time(%f)",
2142 cur_time.tv_sec, cur_time.tv_nsec, new_sec, new_nsec, real_newtime, diff_time);
2143 LOGD("Requested(%ld.%09ld) Delay(%ld.%09ld) Sleep(%09ld)", req_sec, req_nsec, delay.tv_sec, delay.tv_nsec, sleep_time.tv_nsec);
2144 __reschedule_alarms_with_newtime(cur_time.tv_sec, real_newtime, diff_time);
2146 __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001);
2147 snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid);
2148 _save_module_log("SET TIME PROPAGATION END", log_message);
2150 return ALARMMGR_RESULT_SUCCESS;
2153 int alarm_manager_alarm_set_timezone(GVariant* parameters)
2156 int return_code = ALARMMGR_RESULT_SUCCESS;
2157 struct stat statbuf;
2159 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2160 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2164 g_variant_get(parameters, "(&s)", &tzpath_str);
2166 LOGD("[TIMESTAMP]Set the timezone to %s.", tzpath_str);
2168 if (lstat(tzpath_str, &statbuf) == -1 && errno == ENOENT) {
2169 LOGE("Invalid tzpath, %s", tzpath_str);
2170 return_code = ERR_ALARM_INVALID_PARAM;
2174 retval = lstat(TIMEZONE_INFO_LINK_PATH, &statbuf);
2175 if (retval == 0 || (retval == -1 && errno != ENOENT)) {
2176 /* unlink the current link */
2177 if (unlink(TIMEZONE_INFO_LINK_PATH) < 0) {
2178 LOGE("unlink() is failed.");
2179 return_code = ERR_ALARM_SYSTEM_FAIL;
2184 /* create a new symlink when the /opt/etc/localtime is empty. */
2185 if (symlink(tzpath_str, TIMEZONE_INFO_LINK_PATH) < 0) {
2186 LOGE("Failed to create an symlink of %s.", tzpath_str);
2187 return_code = ERR_ALARM_SYSTEM_FAIL;
2193 /* Rescheduling alarms */
2194 _alarm_disable_timer();
2196 __alarm_update_due_time_of_all_items_in_list(cur_time, 0);
2197 LOGD("next expiring due_time is %ld", alarm_context.c_due_time);
2199 _clear_scheduled_alarm_list();
2203 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, 0);
2204 b = bundle_create();
2205 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
2206 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
2209 b = bundle_create();
2210 bundle_add_str(b, EVT_KEY_TIME_ZONE, tzpath_str);
2211 eventsystem_send_system_event(SYS_EVENT_TIME_ZONE, b);
2215 if (return_code == ALARMMGR_RESULT_SUCCESS)
2216 strncpy(log_tag, "SET TIMEZONE", sizeof(log_tag) - 1);
2218 strncpy(log_tag, "FAIL: SET TIMEZONE", sizeof(log_tag) - 1);
2220 snprintf(log_message, sizeof(log_message), "Set the timezone to %s.", tzpath_str);
2221 _save_module_log(log_tag, log_message);
2226 int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id)
2228 alarm_info_t alarm_info;
2229 int return_code = ALARMMGR_RESULT_SUCCESS;
2231 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2232 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2235 const char *callee_appid;
2236 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2237 int end_year, end_month, end_day;
2238 int mode_day_of_week, mode_repeat, alarm_type;
2239 time_t mode_interval, reserved_info;
2240 gint64 tmp_mode_interval, tmp_reserved_info;
2243 *alarm_id = _alarm_id;
2244 if (uid < 0 || pid < 0)
2245 return ERR_ALARM_SYSTEM_FAIL;
2247 g_variant_get(parameters, "(iiiiiiiiiixiix&s)",
2248 &start_year, &start_month, &start_day, &start_hour, &start_min,
2249 &start_sec, &end_year, &end_month, &end_day, &mode_day_of_week,
2250 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info, &bundle_data);
2252 mode_interval = (time_t)tmp_mode_interval;
2253 reserved_info = (time_t)tmp_reserved_info;
2255 b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
2257 int ret_bundle = get_last_result();
2258 LOGE("Failed to decode bundle_data[Error:%d]\n", ret_bundle);
2259 return ERR_ALARM_SYSTEM_FAIL;
2261 callee_appid = appsvc_get_appid(b);
2263 if (_compare_api_version(&result, pid, uid) < 0) {
2264 LOGE("Unable to check api version\n");
2266 return ERR_ALARM_SYSTEM_FAIL;
2270 if (alarm_type & ALARM_TYPE_INEXACT)
2271 alarm_type ^= ALARM_TYPE_INEXACT;
2272 } else { /* Since 2.4 */
2273 if (!_is_permitted(callee_appid, alarm_type, uid)) {
2274 LOGE("[%s] is not permitted \n", callee_appid);
2276 return ERR_ALARM_NOT_PERMITTED_APP;
2283 alarm_info.start.year = start_year;
2284 alarm_info.start.month = start_month;
2285 alarm_info.start.day = start_day;
2286 alarm_info.start.hour = start_hour;
2287 alarm_info.start.min = start_min;
2288 alarm_info.start.sec = start_sec;
2290 alarm_info.end.year = end_year;
2291 alarm_info.end.month = end_month;
2292 alarm_info.end.day = end_day;
2294 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2295 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2297 alarm_info.alarm_type = alarm_type;
2298 alarm_info.reserved_info = reserved_info;
2300 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2301 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2302 alarm_info.mode.u_interval.interval =
2303 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2304 } else if (mode_interval <= 0) {
2305 alarm_info.mode.u_interval.interval = 0;
2308 if (!__alarm_create_appsvc(&alarm_info, &_alarm_id, mode_interval, uid, pid, bundle_data, &return_code)) {
2309 LOGE("Unable to create alarm! return_code[%d]", return_code);
2310 strncpy(log_tag, "FAIL: CREATE SVC", sizeof(log_tag) - 1);
2311 snprintf(log_message, sizeof(log_message),
2312 "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2313 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2314 _save_module_log(log_tag, log_message);
2315 return_code = ERR_ALARM_SYSTEM_FAIL;
2317 *alarm_id = _alarm_id;
2318 return_code = ALARMMGR_RESULT_SUCCESS;
2324 int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid,
2327 alarm_info_t alarm_info;
2328 int return_code = ALARMMGR_RESULT_SUCCESS;
2330 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2331 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2332 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2333 int end_year, end_month, end_day;
2334 int mode_day_of_week, mode_repeat, alarm_type;
2335 time_t mode_interval, reserved_info;
2336 gint64 tmp_mode_interval, tmp_reserved_info;
2339 *alarm_id = _alarm_id;
2340 if (uid < 0 || pid < 0)
2341 return ERR_ALARM_SYSTEM_FAIL;
2343 g_variant_get(parameters, "(iiiiiiiiiixiix&s)",
2344 &start_year, &start_month, &start_day, &start_hour, &start_min,
2345 &start_sec, &end_year, &end_month, &end_day, &mode_day_of_week,
2346 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info, ¬i_data);
2348 mode_interval = (time_t)tmp_mode_interval;
2349 reserved_info = (time_t)tmp_reserved_info;
2351 alarm_info.start.year = start_year;
2352 alarm_info.start.month = start_month;
2353 alarm_info.start.day = start_day;
2354 alarm_info.start.hour = start_hour;
2355 alarm_info.start.min = start_min;
2356 alarm_info.start.sec = start_sec;
2358 alarm_info.end.year = end_year;
2359 alarm_info.end.month = end_month;
2360 alarm_info.end.day = end_day;
2362 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2363 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2365 alarm_info.alarm_type = alarm_type;
2366 alarm_info.reserved_info = reserved_info;
2368 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2369 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2370 alarm_info.mode.u_interval.interval =
2371 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2372 } else if (mode_interval <= 0) {
2373 alarm_info.mode.u_interval.interval = 0;
2376 if (!__alarm_create_noti(&alarm_info, &_alarm_id, mode_interval, uid, pid, noti_data, &return_code)) {
2377 LOGE("Unable to create alarm! return_code[%d]", return_code);
2378 strncpy(log_tag, "FAIL: CREATE NOTI", sizeof(log_tag) - 1);
2379 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2380 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2381 _save_module_log(log_tag, log_message);
2382 return_code = ERR_ALARM_SYSTEM_FAIL;
2384 return_code = ALARMMGR_RESULT_SUCCESS;
2385 *alarm_id = _alarm_id;
2391 int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id)
2393 alarm_info_t alarm_info;
2394 int return_code = ALARMMGR_RESULT_SUCCESS;
2396 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2397 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2398 char *_reserved_service_name = NULL;
2399 char *_reserved_service_name_mod = NULL;
2401 char *app_service_name = NULL;
2402 char *app_service_name_mod = NULL;
2403 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2404 int msec, end_year, end_month, end_day;
2405 int mode_day_of_week, mode_repeat, alarm_type;
2406 gint64 tmp_reserved_info;
2407 time_t reserved_info;
2408 char *reserved_service_name = NULL;
2409 char *reserved_service_name_mod = NULL;
2411 *alarm_id = _alarm_id;
2412 if (uid < 0 || pid < 0)
2413 return ERR_ALARM_SYSTEM_FAIL;
2415 g_variant_get(parameters, "(&s&siiiiiiiiiiiiix&s&s)",
2416 &app_service_name, &app_service_name_mod,
2417 &start_year, &start_month, &start_day, &start_hour, &start_min,
2418 &start_sec, &msec, &end_year, &end_month, &end_day,
2419 &mode_day_of_week, &mode_repeat, &alarm_type, &tmp_reserved_info,
2420 &reserved_service_name, &reserved_service_name_mod);
2422 reserved_info = (time_t)tmp_reserved_info;
2424 alarm_info.start.year = start_year;
2425 alarm_info.start.month = start_month;
2426 alarm_info.start.day = start_day;
2427 alarm_info.start.hour = start_hour;
2428 alarm_info.start.min = start_min;
2429 alarm_info.start.sec = start_sec;
2431 alarm_info.msec = msec;
2433 alarm_info.end.year = end_year;
2434 alarm_info.end.month = end_month;
2435 alarm_info.end.day = end_day;
2437 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2438 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2440 alarm_info.alarm_type = alarm_type;
2441 alarm_info.reserved_info = reserved_info;
2443 if (strcmp(reserved_service_name, "null") == 0)
2444 _reserved_service_name = NULL;
2445 if (strcmp(reserved_service_name_mod, "null") == 0)
2446 _reserved_service_name_mod = NULL;
2448 if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, QUANTUMIZE, 0, 0, app_service_name, app_service_name_mod,
2449 _reserved_service_name, _reserved_service_name_mod, &return_code)) {
2450 LOGE("Unable to create alarm! return_code[%d]", return_code);
2451 strncpy(log_tag, "FAIL: CREATE", sizeof(log_tag) - 1);
2452 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2453 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2454 _save_module_log(log_tag, log_message);
2455 return_code = ERR_ALARM_SYSTEM_FAIL;
2457 return_code = ALARMMGR_RESULT_SUCCESS;
2458 *alarm_id = _alarm_id;
2464 time_t _get_periodic_alarm_standard_time(void)
2466 /* To avoid start time of all devices are same. */
2467 if (periodic_alarm_standard_time == 0)
2468 periodic_alarm_standard_time = g_random_int_range(0, BILLION) + 1;
2470 LOGD("periodic_standard_time : [%ld]", periodic_alarm_standard_time);
2471 return periodic_alarm_standard_time;
2474 int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid,
2475 pid_t pid, int *alarm_id)
2477 alarm_info_t alarm_info;
2478 int return_code = ALARMMGR_RESULT_SUCCESS;
2480 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2481 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2482 char *app_service_name = NULL;
2483 char *app_service_name_mod = NULL;
2484 int interval, is_ref, method;
2486 *alarm_id = _alarm_id;
2487 if (uid < 0 || pid < 0)
2488 return ERR_ALARM_SYSTEM_FAIL;
2490 g_variant_get(parameters, "(&s&siii)", &app_service_name,
2491 &app_service_name_mod, &interval, &is_ref, &method);
2493 struct tm standard_tm;
2494 time_t standard_time = _get_periodic_alarm_standard_time();
2495 localtime_r(&standard_time, &standard_tm);
2497 alarm_info.reserved_info = standard_time;
2499 alarm_info.start.year = standard_tm.tm_year + 1900;
2500 alarm_info.start.month = standard_tm.tm_mon + 1;
2501 alarm_info.start.day = standard_tm.tm_mday;
2502 alarm_info.start.hour = standard_tm.tm_hour;
2503 alarm_info.start.min = standard_tm.tm_min;
2504 alarm_info.start.sec = standard_tm.tm_sec;
2506 alarm_info.msec = 0;
2508 alarm_info.end.year = 0;
2509 alarm_info.end.month = 0;
2510 alarm_info.end.day = 0;
2512 alarm_info.alarm_type = ALARM_TYPE_VOLATILE;
2513 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
2514 alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
2515 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2517 if (interval <= 0) {
2518 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
2519 alarm_info.mode.u_interval.interval = 0;
2521 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
2523 alarm_info.mode.u_interval.interval = interval * 60;
2525 alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60, alarm_info.alarm_type);
2528 if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, (periodic_method_e)method, interval * 60, is_ref,
2529 app_service_name, app_service_name_mod,
2530 NULL, NULL, &return_code)) {
2531 LOGE("Unable to create alarm! return_code[%d]", return_code);
2532 strncpy(log_tag, "FAIL: CREATE PERIODIC", sizeof(log_tag) - 1);
2533 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2534 _alarm_id, uid, pid, alarm_info.start.year, alarm_info.start.month,
2535 alarm_info.start.day, alarm_info.start.hour,
2536 alarm_info.start.min, alarm_info.start.sec);
2537 _save_module_log(log_tag, log_message);
2538 return_code = ERR_ALARM_SYSTEM_FAIL;
2540 return_code = ALARMMGR_RESULT_SUCCESS;
2541 *alarm_id = _alarm_id;
2547 int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid)
2549 int return_code = ALARMMGR_RESULT_SUCCESS;
2550 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2551 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2554 if (uid < 0 || pid < 0)
2555 return ERR_ALARM_SYSTEM_FAIL;
2557 g_variant_get(parameters, "(i)", &alarm_id);
2559 return_code = __check_modifiable(uid, pid, alarm_id);
2560 if (return_code != ALARMMGR_RESULT_SUCCESS)
2563 if (!__alarm_delete(uid, alarm_id, &return_code)) {
2564 LOGE("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2565 strncpy(log_tag, "FAIL: DELETE", sizeof(log_tag) - 1);
2566 return_code = ERR_ALARM_SYSTEM_FAIL;
2568 LOGD("alarm_id[%d] is removed.", alarm_id);
2569 strncpy(log_tag, "DELETE", sizeof(log_tag) - 1);
2570 return_code = ALARMMGR_RESULT_SUCCESS;
2573 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d", alarm_id, uid, pid);
2574 _save_module_log(log_tag, log_message);
2579 int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid)
2581 GSList *gs_iter = NULL;
2582 char app_name[MAX_APP_ID_LEN] = { 0 };
2583 alarm_info_t *alarm_info = NULL;
2584 __alarm_info_t *entry = NULL;
2585 bool is_deleted = false;
2586 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2588 if (uid < 0 || pid < 0)
2589 return ERR_ALARM_SYSTEM_FAIL;
2591 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false) {
2592 snprintf(log_message, sizeof(log_message), "pid: %d. Can not get the unique_name.", pid);
2593 _save_module_log("FAIL: DELETE ALL", log_message);
2594 return ERR_ALARM_SYSTEM_FAIL;
2597 SECURE_LOGD("Called by process (pid:%d, unique_name=%s)", pid, app_name);
2599 for (gs_iter = alarm_context.alarms; gs_iter != NULL;) {
2600 bool is_found = false;
2601 entry = (__alarm_info_t*)gs_iter->data;
2602 const char *tmp_appname = entry->app_unique_name;
2603 SECURE_LOGD("Try to remove app_name[%s], alarm_id[%d]\n", tmp_appname, entry->alarm_id);
2604 if (tmp_appname && strncmp(app_name, tmp_appname, strlen(tmp_appname)) == 0) {
2605 if (_remove_from_scheduled_alarm_list(uid, entry->alarm_id))
2608 alarm_info = &entry->alarm_info;
2609 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
2610 if (!_delete_alarms(entry->alarm_id))
2611 SECURE_LOGE("_delete_alarms() is failed. pid[%d], alarm_id[%d]", pid, entry->alarm_id);
2616 gs_iter = g_slist_next(gs_iter);
2619 LOGD("alarm_id[%d] is removed.", entry->alarm_id);
2620 SECURE_LOGD("Removing is done. app_name[%s], alarm_id [%d]\n", tmp_appname, entry->alarm_id);
2621 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
2622 _release_alarm_info_t(entry);
2626 if (is_deleted && (g_slist_length(g_scheduled_alarm_list) == 0)) {
2627 _alarm_disable_timer();
2631 snprintf(log_message, sizeof(log_message), "uid: %d, pid: %d, unique_name: %s", uid, pid, app_name);
2632 _save_module_log("DELETE ALL", log_message);
2635 return ALARMMGR_RESULT_SUCCESS;
2638 int alarm_manager_alarm_update(GVariant *parameters, uid_t uid, pid_t pid)
2640 int return_code = ALARMMGR_RESULT_SUCCESS;
2641 alarm_info_t alarm_info;
2642 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2643 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2645 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2646 int end_year, end_month, end_day;
2647 int mode_repeat, alarm_type, update_flag;
2648 time_t mode_interval, reserved_info;
2649 gint64 tmp_mode_interval, tmp_reserved_info;
2651 if (uid < 0 || pid < 0)
2652 return ERR_ALARM_SYSTEM_FAIL;
2654 g_variant_get(parameters, "(iiiiiiiiiixiixi)",
2655 &alarm_id, &start_year, &start_month, &start_day, &start_hour,
2656 &start_min, &start_sec, &end_year, &end_month, &end_day,
2657 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info,
2660 mode_interval = (time_t)tmp_mode_interval;
2661 reserved_info = (time_t)tmp_reserved_info;
2663 return_code = __check_modifiable(uid, pid, alarm_id);
2664 if (return_code != ALARMMGR_RESULT_SUCCESS)
2667 alarm_info.start.year = start_year;
2668 alarm_info.start.month = start_month;
2669 alarm_info.start.day = start_day;
2670 alarm_info.start.hour = start_hour;
2671 alarm_info.start.min = start_min;
2672 alarm_info.start.sec = start_sec;
2674 alarm_info.end.year = end_year;
2675 alarm_info.end.month = end_month;
2676 alarm_info.end.day = end_day;
2678 alarm_info.mode.u_interval.interval = mode_interval;
2679 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2681 alarm_info.alarm_type = alarm_type;
2682 alarm_info.reserved_info = reserved_info;
2684 if (!__alarm_update(uid, alarm_id, &alarm_info,
2685 update_flag, &return_code)) {
2686 LOGE("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2687 strncpy(log_tag, "FAIL: UPDATE", sizeof(log_tag) - 1);
2688 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2689 alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2690 _save_module_log(log_tag, log_message);
2696 int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids)
2698 GSList *gs_iter = NULL;
2699 char app_name[MAX_APP_ID_LEN] = { 0 };
2700 __alarm_info_t *entry = NULL;
2701 int _num_of_ids = 0;
2703 *num_of_ids = _num_of_ids;
2704 if (uid < 0 || pid < 0)
2705 return ERR_ALARM_SYSTEM_FAIL;
2707 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false)
2708 return ERR_ALARM_SYSTEM_FAIL;
2710 SECURE_LOGD("Called by process (uid:%d, pid:%d, unique_name:%s)", uid, pid, app_name);
2712 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2713 entry = (__alarm_info_t*)gs_iter->data;
2714 SECURE_LOGD("app_name=%s, app_unique_name=%s", app_name, entry->app_unique_name);
2715 if (entry->uid == uid &&
2716 strncmp(app_name, entry->app_unique_name, strlen(app_name)) == 0) {
2718 SECURE_LOGD("inc number of alarms of app (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, _num_of_ids);
2722 SECURE_LOGD("number of alarms of the process (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, _num_of_ids);
2723 *num_of_ids = _num_of_ids;
2724 return ALARMMGR_RESULT_SUCCESS;
2727 int alarm_manager_alarm_get_list_of_ids(GVariant *parameters, uid_t uid,
2728 pid_t pid, GVariant **alarm_array, int *num_of_alarm)
2730 GSList *gs_iter = NULL;
2731 char app_name[MAX_APP_ID_LEN] = { 0 };
2732 __alarm_info_t *entry = NULL;
2734 int max_number_of_ids;
2735 GVariantBuilder *builder = NULL;
2737 *alarm_array = g_variant_new("ai", NULL);
2739 if (uid < 0 || pid < 0)
2740 return ERR_ALARM_SYSTEM_FAIL;
2742 g_variant_get(parameters, "(i)", &max_number_of_ids);
2744 if (max_number_of_ids <= 0) {
2745 SECURE_LOGE("called for uid(%d) pid(%d), but max_number_of_ids(%d) is less than 0.", uid, pid, max_number_of_ids);
2747 return ALARMMGR_RESULT_SUCCESS;
2750 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false)
2751 return ERR_ALARM_SYSTEM_FAIL;
2753 SECURE_LOGD("Called by process (uid: %d, pid:%d, unique_name=%s).", uid, pid, app_name);
2754 builder = g_variant_builder_new(G_VARIANT_TYPE("ai"));
2756 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2757 entry = (__alarm_info_t*)gs_iter->data;
2758 if (entry->uid == uid &&
2759 strncmp(app_name, (entry->app_unique_name), strlen(app_name)) == 0) {
2760 g_variant_builder_add(builder, "i", entry->alarm_id);
2762 SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index);
2766 *alarm_array = g_variant_new("ai", builder);
2767 *num_of_alarm = index;
2769 g_variant_builder_unref(builder);
2770 SECURE_LOGE("Called by uid (%d), pid (%d), but max_number_of_ids(%d).", uid, pid, index);
2772 return ALARMMGR_RESULT_SUCCESS;
2775 int alarm_manager_alarm_get_appsvc_info(GVariant *parameters, uid_t uid, gchar **b_data)
2778 GSList *gs_iter = NULL;
2779 __alarm_info_t *entry = NULL;
2780 int return_code = ALARMMGR_RESULT_SUCCESS;
2784 return ERR_ALARM_SYSTEM_FAIL;
2786 g_variant_get(parameters, "(i)", &alarm_id);
2788 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2790 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2791 entry = (__alarm_info_t*)gs_iter->data;
2792 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2794 *b_data = g_strdup(entry->bundle);
2800 if (*b_data == NULL) {
2801 LOGE("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
2802 return_code = ERR_ALARM_INVALID_TYPE;
2805 LOGE("The alarm(%d) is not found.", alarm_id);
2806 return_code = ERR_ALARM_INVALID_ID;
2812 int alarm_manager_alarm_get_noti_info(GVariant *parameters, uid_t uid, gchar **noti_data)
2815 GSList *gs_iter = NULL;
2816 __alarm_info_t *entry = NULL;
2817 int return_code = ALARMMGR_RESULT_SUCCESS;
2821 return ERR_ALARM_SYSTEM_FAIL;
2823 g_variant_get(parameters, "(i)", &alarm_id);
2825 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2827 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2828 entry = (__alarm_info_t*)gs_iter->data;
2829 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2831 *noti_data = strdup(entry->noti);
2837 if (*noti_data == NULL) {
2838 LOGE("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
2839 return_code = ERR_ALARM_INVALID_TYPE;
2842 LOGE("The alarm(%d) is not found.", alarm_id);
2843 return_code = ERR_ALARM_INVALID_ID;
2849 int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, alarm_info_t *alarm_info)
2851 GSList *gs_iter = NULL;
2852 __alarm_info_t *entry = NULL;
2853 alarm_info_t *_alarm_info = NULL;
2857 return ERR_ALARM_SYSTEM_FAIL;
2859 g_variant_get(parameters, "(i)", &alarm_id);
2861 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2862 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2863 entry = (__alarm_info_t*)gs_iter->data;
2864 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2865 _alarm_info = &(entry->alarm_info);
2870 if (_alarm_info == NULL) {
2871 LOGE("The alarm(%d) is not found.", alarm_id);
2872 return ERR_ALARM_INVALID_ID;
2874 LOGD("The alarm(%d) is found.", alarm_id);
2875 alarm_info->start.year = _alarm_info->start.year;
2876 alarm_info->start.month = _alarm_info->start.month;
2877 alarm_info->start.day = _alarm_info->start.day;
2878 alarm_info->start.hour = _alarm_info->start.hour;
2879 alarm_info->start.min = _alarm_info->start.min;
2880 alarm_info->start.sec = _alarm_info->start.sec;
2881 alarm_info->end.year = _alarm_info->end.year;
2882 alarm_info->end.month = _alarm_info->end.month;
2883 alarm_info->end.day = _alarm_info->end.day;
2884 alarm_info->mode.u_interval.day_of_week =
2885 _alarm_info->mode.u_interval.day_of_week;
2886 alarm_info->mode.repeat = _alarm_info->mode.repeat;
2887 alarm_info->alarm_type = _alarm_info->alarm_type;
2888 alarm_info->reserved_info = _alarm_info->reserved_info;
2891 return ALARMMGR_RESULT_SUCCESS;
2894 int alarm_manager_alarm_get_next_duetime(GVariant *parameters, uid_t uid, time_t *duetime)
2896 GSList *gs_iter = NULL;
2897 __alarm_info_t *entry = NULL;
2898 __alarm_info_t *find_item = NULL;
2902 return ERR_ALARM_SYSTEM_FAIL;
2904 g_variant_get(parameters, "(i)", &alarm_id);
2906 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
2907 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2908 entry = (__alarm_info_t*)gs_iter->data;
2909 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2915 if (find_item == NULL) {
2916 LOGE("The alarm(%d) is not found.", alarm_id);
2917 return ERR_ALARM_INVALID_ID;
2920 _alarm_set_next_duetime(find_item);
2921 LOGD("Next duetime : %s", ctime(&(find_item->due_time)));
2923 *duetime = find_item->due_time;
2924 return ALARMMGR_RESULT_SUCCESS;
2927 int alarm_manager_alarm_get_all_info(uid_t uid, char **db_path)
2930 return ERR_ALARM_SYSTEM_FAIL;
2932 return _get_db_path_for_all_info(uid, &(*db_path));
2935 int alarm_manager_alarm_set_global(GVariant *parameters, uid_t uid)
2937 GSList *gs_iter = NULL;
2938 __alarm_info_t *entry = NULL;
2939 alarm_info_t *alarm_info = NULL;
2941 int return_code = ALARMMGR_RESULT_SUCCESS;
2947 return ERR_ALARM_SYSTEM_FAIL;
2949 g_variant_get(parameters, "(ib)", &alarm_id, &global);
2951 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2952 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2953 entry = (__alarm_info_t*)gs_iter->data;
2954 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2955 alarm_info = &(entry->alarm_info);
2960 if (alarm_info == NULL) {
2961 LOGE("The alarm(%d) is not found.", alarm_id);
2962 return ERR_ALARM_INVALID_ID;
2964 LOGD("The alarm(%d) is found.", alarm_id);
2966 if (entry->callee_pkgid == NULL)
2967 callee_pkgid = entry->app_service_name + 6;
2969 callee_pkgid = entry->callee_pkgid;
2971 LOGD("The alarm pkgid : %s.", callee_pkgid);
2973 retval = _pkg_is_global(callee_pkgid, uid);
2974 if (retval == ALARMMGR_RESULT_SUCCESS) {
2975 entry->global = (bool)global;
2976 if (!_alarm_set_global_to_db(entry, (bool)global))
2977 return_code = ERR_ALARM_SYSTEM_FAIL;
2979 LOGE("Get pkginfo error [%d]", retval);
2980 return_code = retval;
2987 int alarm_manager_alarm_get_global(GVariant *parameters, gboolean *global)
2989 GSList *gs_iter = NULL;
2990 __alarm_info_t *entry = NULL;
2991 __alarm_info_t *find_item = NULL;
2994 g_variant_get(parameters, "(i)", &alarm_id);
2997 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
2998 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2999 entry = (__alarm_info_t*)gs_iter->data;
3000 if (entry->alarm_id == alarm_id) {
3006 if (find_item == NULL) {
3007 LOGE("The alarm(%d) is not found.", alarm_id);
3008 return ERR_ALARM_INVALID_ID;
3011 *global = (gboolean)find_item->global;
3012 LOGD("Is global : %d", *global);
3014 return ALARMMGR_RESULT_SUCCESS;
3017 static void __initialize_alarm_list()
3019 alarm_context.alarms = NULL;
3020 alarm_context.c_due_time = -1;
3022 _load_alarms_from_db();
3024 _rtc_set(); /*Set RTC1 Alarm with alarm due time for alarm-manager initialization*/
3027 static void __initialize_scheduled_alarm_list()
3029 _clear_scheduled_alarm_list();
3032 static void __initialize_noti()
3034 /* VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL is set by OSP app-service. */
3035 if (vconf_notify_key_changed
3036 (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) {
3037 LOGD("Failed to add callback for time external changing event.");
3040 /* If the caller or callee app is uninstalled, all registered alarms will be canceled. */
3041 pkgmgr_client *pc = pkgmgr_client_new(PC_LISTENING);
3042 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_UNINSTALL);
3043 pkgmgr_client_listen_status(pc, __on_app_uninstalled, NULL);
3045 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_ENABLE_APP);
3046 pkgmgr_client_listen_app_status(pc, __on_app_enable_cb, NULL);
3048 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_DISABLE_APP);
3049 pkgmgr_client_listen_app_status(pc, __on_app_disable_cb, NULL);
3052 void _alarm_initialize()
3054 #if !(GLIB_CHECK_VERSION(2, 36, 0))
3059 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
3060 vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode);
3061 LOGD("alarm_expire_mode : %d", expire_mode);
3063 alarm_context.timer = _initialize_timer();
3064 if (alarm_context.timer == -1) {
3065 LOGE("because _initialize_timer failed, "
3066 "alarm-server cannot be runned.\n");
3070 if (_initialize_dbus() == false) {
3071 /* because dbus's initialize
3072 * failed, we cannot continue any more. */
3073 LOGE("because _initialize_dbus failed, "
3074 "alarm-server cannot be runned.\n");
3078 _initialize_module_log(); /* for module log */
3080 __initialize_scheduled_alarm_list();
3081 if (_initialize_db() == false) {
3082 LOGE("_initialize_db failed, "
3083 "alarm cannot be stored to database.\n");
3085 __initialize_alarm_list();
3086 __initialize_noti();
3088 if (!caller_appid_cache_table) {
3089 caller_appid_cache_table = g_hash_table_new_full(g_direct_hash,
3090 g_direct_equal, NULL, __free_cached_value);
3094 void _release_alarm_info_t(__alarm_info_t *entry)
3099 if (entry->caller_pkgid)
3100 free(entry->caller_pkgid);
3101 if (entry->callee_pkgid)
3102 free(entry->callee_pkgid);
3103 if (entry->app_unique_name)
3104 free(entry->app_unique_name);
3105 if (entry->app_service_name)
3106 free(entry->app_service_name);
3107 if (entry->app_service_name_mod)
3108 free(entry->app_service_name_mod);
3109 if (entry->dst_service_name)
3110 free(entry->dst_service_name);
3112 if (entry->dst_service_name_mod)
3113 free(entry->dst_service_name_mod);
3115 free(entry->bundle);