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 /* link path for timezone info */
56 #define TIMEZONE_INFO_LINK_PATH tzplatform_mkpath(TZ_SYS_ETC, "localtime")
58 #ifndef RTC_WKALM_BOOT_SET
59 #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
62 #define _APPFW_FEATURE_WAKEUP_USING_RTC (_get_profile() != PROFILE_TV)
65 static const char default_rtc[] = "/dev/rtc";
68 __alarm_server_context_t alarm_context;
70 extern bool g_dummy_timer_is_set;
72 GSList *g_scheduled_alarm_list;
73 GSList *g_expired_alarm_list;
74 GSList *g_disabled_alarm_list;
75 GHashTable *caller_appid_cache_table;
77 bool is_time_changed = false; /* for calculating next duetime */
78 static time_t periodic_alarm_standard_time = 0;
80 struct running_info_t {
91 static long __get_proper_interval(long interval, int alarm_type);
92 static void __alarm_add_to_list(__alarm_info_t *__alarm_info);
93 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id);
94 static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
95 alarm_info_t *alarm_info, int update_flag, int *error_code);
96 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
98 static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
99 __alarm_info_t *__alarm_info);
100 static void __alarm_update_due_time_of_all_items_in_list(time_t new_time,double diff_time);
101 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
102 int pid, periodic_method_e method, long requested_interval, int is_ref,
103 char *app_service_name, char *app_service_name_mod,
104 const char *dst_service_name, const char *dst_service_name_mod,
106 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
107 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code);
109 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
110 static bool __alarm_update(uid_t uid, alarm_id_t alarm_id,
111 alarm_info_t *alarm_info, int update_flag, int *error_code);
112 static void __on_system_time_external_changed(keynode_t *node, void *data);
113 static void __initialize_alarm_list();
114 static void __initialize_scheduled_alarm_list();
115 static void __initialize_noti();
116 static gboolean __alarm_expired_directly(gpointer user_data);
118 void _release_alarm_info_t(__alarm_info_t *entry);
119 static notification_h __get_notification(guchar *data, int datalen);
121 static bool __get_caller_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid)
123 char caller_appid[MAX_APP_ID_LEN] = {0,};
125 if (unique_name == NULL) {
126 LOGE("unique_name should not be NULL.");
130 if (aul_app_get_appid_bypid_for_uid(pid, caller_appid,
131 sizeof(caller_appid), uid) == AUL_R_OK) {
132 /* When a caller is an application, the unique name is appID. */
135 strncpy(unique_name, caller_appid, size - 1);
137 /* Otherwise, the unique name is /proc/pid/cmdline. */
138 char proc_file[MAX_APP_ID_LEN] = {0,};
139 char process_name[MAX_APP_ID_LEN] = {0,};
146 snprintf(proc_file, MAX_APP_ID_LEN, "/proc/%d/cmdline", pid);
148 fd = open(proc_file, O_RDONLY);
150 SECURE_LOGE("Caution!! pid(%d) seems to be killed.",
154 if (read(fd, process_name, sizeof(process_name) - 1) <= 0) {
155 LOGE("Unable to get the process name.");
161 while (process_name[i] != '\0') {
162 if (process_name[i] == ' ') {
163 process_name[i] = '\0';
168 strncpy(unique_name, process_name, size - 1);
175 gboolean __hash_table_remove_cb(gpointer key, gpointer value, gpointer user_data)
177 char *target_name = (char *)user_data;
178 appid_cache_t *data = (appid_cache_t *)value;
179 if (target_name && data && strcmp(target_name, data->unique_name) == 0) {
180 LOGD("Remove cached data of [%s]", target_name);
187 static bool __get_cached_unique_name(int pid, char *unique_name, int size, bool *is_app, uid_t uid)
193 data = (appid_cache_t *)g_hash_table_lookup(caller_appid_cache_table, GINT_TO_POINTER(pid));
195 snprintf(unique_name, size, "%s", data->unique_name);
197 *is_app = data->is_app;
198 LOGD("Get cached unique_name: %s, pid:%d", unique_name, pid);
202 LOGD("There is no cached unique_name for pid(%d)", pid);
204 ret = __get_caller_unique_name(pid, unique_name, size, &_is_app, uid);
206 g_hash_table_foreach_remove(caller_appid_cache_table, __hash_table_remove_cb, (gpointer)unique_name);
207 data = (appid_cache_t *)calloc(1, sizeof(appid_cache_t));
209 data->unique_name = strdup(unique_name);
210 data->is_app = _is_app;
212 g_hash_table_insert(caller_appid_cache_table, GINT_TO_POINTER(data->pid), (gpointer)data);
218 SECURE_LOGD("unique_name= %s", unique_name);
224 void __hashtable_foreach_cb(gpointer key, gpointer value, gpointer user_data)
226 appid_cache_t *data = (appid_cache_t *)value;
228 LOGD("# %s(%d) - %d", data->unique_name, data->pid, data->is_app);
231 void __free_cached_value(gpointer data)
233 appid_cache_t *value = (appid_cache_t *)data;
236 if (value->unique_name)
237 free(value->unique_name);
244 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
245 const char *rtc = default_rtc;
247 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
248 #ifdef _SIMUL /* RTC does not work in simulator. */
249 LOGE("because it is simulator's mode, we don't set RTC.");
254 gfd = open(rtc, O_RDWR);
256 LOGE("RTC open failed.");
261 /* Read the RTC time/date */
264 char *timebuf = ctime(&alarm_context.c_due_time);
266 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
267 snprintf(log_message, sizeof(log_message), "wakeup time: %d, %s", (int)alarm_context.c_due_time, timebuf);
270 LOGD("alarm_context.c_due_time is %d.", (int)alarm_context.c_due_time);
272 if (alarm_context.c_due_time != -1) {
273 struct rtc_wkalrm rtc_wkalarm = { 0, };
274 rtc_wkalarm.enabled = 0;
275 rtc_wkalarm.time.tm_year = 1900;
276 rtc_wkalarm.time.tm_mon = 0;
277 rtc_wkalarm.time.tm_mday = 1;
278 rtc_wkalarm.time.tm_hour = 0;
279 rtc_wkalarm.time.tm_min = 0;
280 rtc_wkalarm.time.tm_sec = 0;
282 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
285 LOGE("Alarm IRQs is not supported.");
287 LOGE("RTC_WKALM_SET disabled ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
288 _save_module_log("FAIL: SET RTC", log_message);
291 LOGD("[alarm-server]RTC_WKALM_SET disabled ioctl is successfully done.");
293 time_t due_time = alarm_context.c_due_time;
294 gmtime_r(&due_time, &due_tm);
296 LOGD("Setted RTC Alarm date/time is %d-%d-%d, %02d:%02d:%02d (UTC).",
297 due_tm.tm_mday, due_tm.tm_mon + 1, due_tm.tm_year + 1900,
298 due_tm.tm_hour, due_tm.tm_min, due_tm.tm_sec);
300 rtc_wkalarm.enabled = 1;
301 rtc_wkalarm.time.tm_year = due_tm.tm_year;
302 rtc_wkalarm.time.tm_mon = due_tm.tm_mon;
303 rtc_wkalarm.time.tm_mday = due_tm.tm_mday;
304 rtc_wkalarm.time.tm_hour = due_tm.tm_hour;
305 rtc_wkalarm.time.tm_min = due_tm.tm_min;
306 rtc_wkalarm.time.tm_sec = due_tm.tm_sec;
307 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
310 LOGE("Alarm IRQs is not supported.");
312 LOGE("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
313 _save_module_log("FAIL: SET RTC", log_message);
316 LOGD("[alarm-server]RTC ALARM_SET ioctl is successfully done.");
317 _save_module_log("SET RTC", log_message);
319 LOGE("[alarm-server]alarm_context.c_due_time is"
320 "less than 10 sec. RTC alarm does not need to be set");
323 LOGD("[alarm-server] RTC does not work.");
328 static bool __set_time(time_t _time)
332 struct tm tm, *gmtime_res;
337 gmtime_res = gmtime_r(&(tv.tv_sec), &tm);
339 LOGE("gmtime_r is failed. [%d]", errno);
343 ret = settimeofday(&tv, NULL);
345 LOGE("settimeofday is failed.[%d]", errno);
349 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
350 const char *rtc0 = default_rtc;
351 struct rtc_time _rtc_time;
353 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
354 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
355 char *timebuf = ctime(&_time);
357 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid new line */
358 snprintf(log_message, sizeof(log_message), "RTC & OS =%ld, %s",
363 gfd = open(rtc0, O_RDWR);
365 LOGE("Opening the /dev/rtc is failed.");
370 memset(&_rtc_time, 0, sizeof(_rtc_time));
371 _rtc_time.tm_sec = tm.tm_sec;
372 _rtc_time.tm_min = tm.tm_min;
373 _rtc_time.tm_hour = tm.tm_hour;
374 _rtc_time.tm_mday = tm.tm_mday;
375 _rtc_time.tm_mon = tm.tm_mon;
376 _rtc_time.tm_year = tm.tm_year;
377 _rtc_time.tm_wday = tm.tm_wday;
378 _rtc_time.tm_yday = tm.tm_yday;
379 _rtc_time.tm_isdst = tm.tm_isdst;
381 ret = ioctl(gfd, RTC_SET_TIME, &_rtc_time);
383 LOGE("ALARM_SET_RTC ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
384 strncpy(log_tag, "FAIL: SET RTC", sizeof(log_tag) - 1);
385 _save_module_log(log_tag, log_message);
387 LOGD("ALARM_SET_RTC ioctl is succeed. [%d]", (int)_time);
388 strncpy(log_tag, "SET RTC START", sizeof(log_tag) - 1);
389 _save_module_log(log_tag, log_message);
393 LOGD("[alarm-server] RTC does not work.");
400 bool __alarm_clean_list()
402 __alarm_info_t *entry = NULL;
405 for (iter = alarm_context.alarms; iter != NULL;
406 iter = g_slist_next(iter)) {
407 entry = (__alarm_info_t *)iter->data;
408 _release_alarm_info_t(entry);
411 g_slist_free(alarm_context.alarms);
412 alarm_context.alarms = NULL;
417 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id)
419 bool unique_id = false;
420 __alarm_info_t *entry = NULL;
423 __alarm_info->alarm_id = g_random_int_range(0, INT_MAX) + 1;
424 LOGD("__alarm_info->alarm_id is %d", __alarm_info->alarm_id);
426 while (unique_id == false) {
429 for (iter = alarm_context.alarms; iter != NULL;
430 iter = g_slist_next(iter)) {
431 entry = (__alarm_info_t *)iter->data;
432 if (entry->alarm_id == __alarm_info->alarm_id) {
433 __alarm_info->alarm_id++;
439 *alarm_id = __alarm_info->alarm_id;
444 static void __alarm_add_to_list(__alarm_info_t *__alarm_info)
446 alarm_info_t *alarm_info = &__alarm_info->alarm_info;
447 __alarm_info_t *entry = NULL;
450 LOGD("[alarm-server]: Before add alarm_id(%d)", __alarm_info->alarm_id);
452 alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info);
453 LOGD("[alarm-server]: After add alarm_id(%d)", __alarm_info->alarm_id);
456 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
457 entry = (__alarm_info_t *)iter->data;
458 LOGD("[alarm-server]: alarm_id(%d).", entry->alarm_id);
461 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
462 if (!_save_alarms(__alarm_info))
463 LOGE("Saving alarm_id(%d) in DB is failed.", __alarm_info->alarm_id);
467 static bool __check_bundle_for_update(const gchar *b_data, uid_t uid)
469 const char *callee_appid;
476 b = bundle_decode((bundle_raw *)b_data, strlen(b_data));
480 callee_appid = appsvc_get_appid(b);
481 if (callee_appid == NULL) {
486 if (_is_ui_app(callee_appid, uid))
493 static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
494 alarm_info_t *alarm_info, int update_flag, int *error_code)
498 __alarm_info_t *entry = NULL;
499 alarm_info_t *_alarm_info = NULL;
502 for (iter = alarm_context.alarms; iter != NULL;
503 iter = g_slist_next(iter)) {
504 entry = (__alarm_info_t *)iter->data;
505 if (entry->uid == uid &&
506 entry->alarm_id == alarm_id) {
508 _alarm_info = &entry->alarm_info;
510 if (update_flag == ALARM_UPDATE_FLAG_TIME ||
511 ALARM_UPDATE_FLAG_WEEK) {
512 if (!__check_bundle_for_update(entry->bundle,
514 *error_code = ERR_ALARM_NOT_PERMITTED_APP;
519 if (update_flag == ALARM_UPDATE_FLAG_TIME) {
520 __alarm_set_start_and_end_time(alarm_info, entry);
521 memcpy(_alarm_info, alarm_info, sizeof(alarm_info_t));
523 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_ONCE) {
525 _alarm_info->reserved_info = current_time;
527 } else if (update_flag == ALARM_UPDATE_FLAG_PERIOD) {
528 _alarm_info->alarm_type |= ALARM_TYPE_INEXACT;
529 _alarm_info->alarm_type |= ALARM_TYPE_PERIOD;
530 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT;
531 _alarm_info->mode.u_interval.interval =
532 __get_proper_interval(alarm_info->mode.u_interval.interval,
533 _alarm_info->alarm_type);
534 } else if (update_flag == ALARM_UPDATE_FLAG_WEEK) {
535 _alarm_info->alarm_type &= ~ALARM_TYPE_INEXACT;
536 _alarm_info->mode = alarm_info->mode;
537 } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_PERIOD) {
538 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_REPEAT) {
539 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
540 _alarm_info->mode.u_interval.interval = 0;
542 } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_WEEK_FLAG) {
543 if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_WEEKLY) {
544 _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
545 _alarm_info->mode.u_interval.interval = 0;
554 *error_code = ERR_ALARM_INVALID_ID;
558 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
559 if (!_update_alarms(entry))
560 LOGE("Updating alarm_id(%d) in DB is failed.", alarm_id);
566 static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
571 alarm_info_t *alarm_info = NULL;
574 __alarm_info_t *entry = NULL;
577 LOGD("[alarm-server]: before del : alarm id(%d)", alarm_id);
579 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
580 entry = (__alarm_info_t *)iter->data;
581 if (entry->uid == uid && entry->alarm_id == alarm_id) {
582 alarm_info = &entry->alarm_info;
584 LOGD("[alarm-server]:Remove alarm id(%d)", entry->alarm_id);
586 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
587 if (!_delete_alarms(alarm_id))
591 alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
592 _release_alarm_info_t(entry);
598 LOGD("[alarm-server]: after del\n");
602 *error_code = ERR_ALARM_INVALID_ID;
609 static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
610 __alarm_info_t *__alarm_info)
612 alarm_date_t *start = &alarm_info->start;
613 alarm_date_t *end = &alarm_info->end;
615 struct tm alarm_tm = { 0, };
617 if (start->year != 0) {
618 if ((alarm_info->alarm_type & ALARM_TYPE_RELATIVE) && alarm_info->reserved_info != 0) {
619 __alarm_info->start = alarm_info->reserved_info;
621 alarm_tm.tm_year = start->year - 1900;
622 alarm_tm.tm_mon = start->month - 1;
623 alarm_tm.tm_mday = start->day;
625 alarm_tm.tm_hour = start->hour;
626 alarm_tm.tm_min = start->min;
627 alarm_tm.tm_sec = start->sec;
628 alarm_tm.tm_isdst = -1;
630 __alarm_info->start = mktime(&alarm_tm);
633 __alarm_info->start = 0;
636 if (end->year != 0) {
637 alarm_tm.tm_year = end->year - 1900;
638 alarm_tm.tm_mon = end->month - 1;
639 alarm_tm.tm_mday = end->day;
641 alarm_tm.tm_hour = end->hour;
642 alarm_tm.tm_min = end->min;
643 alarm_tm.tm_sec = end->sec;
645 __alarm_info->end = mktime(&alarm_tm);
647 __alarm_info->end = 0;
651 static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double diff_time)
654 time_t min_time = -1;
657 __alarm_info_t *entry = NULL;
658 struct tm *p_time = NULL;
659 struct tm due_time_result;
660 bool is_rtc_reset = false;
661 is_time_changed = true;
663 if (periodic_alarm_standard_time != 0)
664 periodic_alarm_standard_time += diff_time;
667 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
668 entry = (__alarm_info_t *)iter->data;
669 alarm_info_t *alarm_info = &(entry->alarm_info);
670 if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) {
671 /* case of RTC reset */
672 if (entry->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
673 if ((entry->due_time + diff_time - new_time) >
674 (entry->due_time - entry->alarm_info.reserved_info)) {
675 LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
676 ctime(&new_time), new_time, diff_time, entry->alarm_id,
677 ctime(&entry->due_time), entry->due_time,
678 entry->alarm_info.reserved_info);
682 entry->due_time += diff_time;
683 entry->alarm_info.reserved_info = new_time;
686 entry->due_time += diff_time;
687 is_rtc_reset = false;
688 if ((entry->due_time - new_time) > alarm_info->mode.u_interval.interval) {
690 entry->due_time = new_time +
691 ((entry->due_time - new_time) % alarm_info->mode.u_interval.interval);
692 LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
693 ctime(&new_time), new_time, diff_time, entry->alarm_id,
694 ctime(&entry->due_time), entry->due_time,
695 alarm_info->mode.u_interval.interval);
699 alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */
700 alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */
702 p_time = localtime_r(&entry->due_time, &due_time_result);
703 if (p_time != NULL) {
704 start->year = p_time->tm_year + 1900;
705 start->month = p_time->tm_mon + 1;
706 start->day = p_time->tm_mday;
707 start->hour = p_time->tm_hour;
708 start->min = p_time->tm_min;
709 start->sec = p_time->tm_sec;
711 if (entry->start != 0)
712 entry->start = entry->due_time;
714 if (entry->end != 0 && is_rtc_reset == false) {
715 entry->end += diff_time;
716 p_time = localtime_r(&entry->end, &due_time_result);
717 if (p_time != NULL) {
718 end->year = p_time->tm_year + 1900;
719 end->month = p_time->tm_mon + 1;
720 end->day = p_time->tm_mday;
721 end->hour = p_time->tm_hour;
722 end->min = p_time->tm_min;
723 end->sec = p_time->tm_sec;
727 _alarm_set_next_duetime(entry);
732 for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
733 entry = (__alarm_info_t *)iter->data;
734 due_time = entry->due_time;
738 LOGD("alarm[%d] with duetime(%ld) at current(%ld)", entry->alarm_id, due_time, current_time);
739 if (due_time == 0) { /* 0 means this alarm has been disabled */
743 interval = difftime(due_time, current_time);
746 LOGW("The duetime of alarm(%d) is OVER.", entry->alarm_id);
748 _alarm_set_next_duetime(entry);
749 if (entry->due_time < current_time) {
750 const char *dst = entry->callee_pkgid ? entry->callee_pkgid : entry->dst_service_name;
751 LOGW("The alarm(%d) is removed [unique_name : %s, dst : %s",
752 entry->alarm_id, entry->app_unique_name, dst);
754 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
755 _delete_alarms(entry->alarm_id);
757 _save_alarm_info_log("AUTO_DELETE", entry);
759 alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
760 _release_alarm_info_t(entry);
763 due_time = entry->due_time;
768 interval = difftime(due_time, min_time);
770 if ((interval < 0) || min_time == -1)
774 is_time_changed = false;
775 alarm_context.c_due_time = min_time;
777 g_idle_add(_update_relative_alarms, NULL);
780 static void __set_caller_info(bundle *b, uid_t uid,
781 const char *appid, const char *pkgid)
785 snprintf(buf, sizeof(buf), "%u", uid);
786 bundle_del(b, AUL_K_ORG_CALLER_UID);
787 bundle_add(b, AUL_K_ORG_CALLER_UID, buf);
789 bundle_del(b, AUL_K_ORG_CALLER_APPID);
790 bundle_add(b, AUL_K_ORG_CALLER_APPID, appid);
793 bundle_del(b, AUL_K_ORG_CALLER_PKGID);
794 bundle_add(b, AUL_K_ORG_CALLER_PKGID, pkgid);
798 static bool __alarm_add_and_set(__alarm_info_t *alarm_info, pid_t pid)
802 char due_time_r[100] = { 0 };
806 SECURE_LOGW("[alarm-server]:pid=%d, app_unique_name=%s, \
807 app_service_name=%s,dst_service_name=%s, c_due_time=%ld",
808 pid, alarm_info->app_unique_name,
809 alarm_info->app_service_name,
810 alarm_info->dst_service_name,
811 alarm_context.c_due_time);
813 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
814 alarm_info->alarm_info.reserved_info = current_time;
816 if (alarm_context.c_due_time < current_time) {
817 LOGW("Caution!! alarm_context.c_due_time (%ld) is less than current time(%ld)",
818 alarm_context.c_due_time, current_time);
819 alarm_context.c_due_time = -1;
822 _alarm_set_next_duetime(alarm_info);
824 if (alarm_info->due_time == 0) {
825 LOGW("[alarm-server]:Create a new alarm: due_time is 0. [alarm(%d):repeat_type(%d)]",
826 alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
828 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
831 __alarm_add_to_list(alarm_info);
833 } else if (current_time == alarm_info->due_time) {
834 LOGW("[alarm-server]:Create alarm: current_time(%ld) is same as due_time(%ld) [alarm(%d):repeat_type(%d)]",
835 current_time, alarm_info->due_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
837 __alarm_add_to_list(alarm_info);
838 _clear_scheduled_alarm_list();
839 _add_to_scheduled_alarm_list(alarm_info);
840 alarm_context.c_due_time = alarm_info->due_time;
842 time_t *_dt = malloc(sizeof(time_t));
844 *_dt = alarm_info->due_time;
846 LOGE("Out of memory");
850 g_idle_add(__alarm_expired_directly, (gpointer)_dt);
853 } else if (difftime(alarm_info->due_time, current_time) < 0) {
854 LOGW("[alarm-server]: Expired Due Time. \
855 [Due time=%ld, Current Time=%ld]!!!Do not add to schedule list. \
856 [alarm(%d):repeat_type(%d)]",
857 alarm_info->due_time, current_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat);
859 if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
862 __alarm_add_to_list(alarm_info);
865 localtime_r(&(alarm_info->due_time), &ts_ret);
866 strftime(due_time_r, 30, "%c", &ts_ret);
867 SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)",
868 alarm_info->alarm_id, due_time_r);
870 __alarm_add_to_list(alarm_info);
873 LOGD("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)",
874 alarm_context.c_due_time, alarm_info->due_time);
876 if (alarm_context.c_due_time == -1 || alarm_info->due_time < alarm_context.c_due_time) {
877 _clear_scheduled_alarm_list();
878 _add_to_scheduled_alarm_list(alarm_info);
879 _alarm_set_timer(alarm_context.timer, alarm_info->due_time);
880 alarm_context.c_due_time = alarm_info->due_time;
882 } else if (alarm_info->due_time == alarm_context.c_due_time) {
883 _add_to_scheduled_alarm_list(alarm_info);
889 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
890 long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code)
892 char app_name[MAX_APP_ID_LEN] = { 0 };
894 const char *callee_appid = NULL;
895 bundle_raw *b_data = NULL;
897 bool caller_is_app = false;
899 __alarm_info_t *__alarm_info = NULL;
901 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
902 if (__alarm_info == NULL) {
903 SECURE_LOGE("Caution!! app_pid=%d, calloc failed. it seems to be OOM.", pid);
904 *error_code = ERR_ALARM_SYSTEM_FAIL;
908 __alarm_info->uid = uid;
909 __alarm_info->alarm_id = -1;
910 __alarm_info->requested_interval = requested_interval;
911 __alarm_info->global = false;
913 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) {
914 *error_code = ERR_ALARM_SYSTEM_FAIL;
915 _release_alarm_info_t(__alarm_info);
918 __alarm_info->app_unique_name = strdup(app_name);
922 __alarm_info->caller_pkgid = _get_pkgid_by_appid(app_name, uid);
925 b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
926 callee_appid = appsvc_get_appid(b);
927 __alarm_info->callee_pkgid = _get_pkgid_by_appid(callee_appid, uid);
929 if (b && caller_is_app) {
930 __set_caller_info(b, uid, app_name, __alarm_info->caller_pkgid);
931 bundle_del(b, AUL_K_REQUEST_TYPE);
932 bundle_add(b, AUL_K_REQUEST_TYPE, "indirect-request");
935 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = %s",
936 __alarm_info->caller_pkgid, __alarm_info->callee_pkgid);
938 bundle_encode(b, &b_data, &datalen);
940 __alarm_info->bundle = strdup((const gchar *)b_data);
948 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
949 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
950 __alarm_generate_alarm_id(__alarm_info, alarm_id);
952 if (__alarm_add_and_set(__alarm_info, pid) == false) {
953 *error_code = ERR_ALARM_INVALID_TIME;
954 _release_alarm_info_t(__alarm_info);
958 _save_alarm_info_log("CREATE SVC", __alarm_info);
963 static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
964 int pid, periodic_method_e method, long requested_interval, int is_ref,
965 char *app_service_name, char *app_service_name_mod,
966 const char *dst_service_name, const char *dst_service_name_mod,
969 char unique_name[MAX_APP_ID_LEN] = { 0 };
970 bool caller_is_app = false;
972 __alarm_info_t *__alarm_info = NULL;
974 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
975 if (__alarm_info == NULL) {
976 SECURE_LOGE("Caution!! app_pid=%d, calloc "
977 "failed. it seems to be OOM\n", pid);
978 *error_code = ERR_ALARM_SYSTEM_FAIL;
981 __alarm_info->uid = uid;
982 __alarm_info->alarm_id = -1;
983 __alarm_info->method = method;
984 __alarm_info->requested_interval = requested_interval;
985 __alarm_info->is_ref = is_ref;
986 __alarm_info->global = false;
988 if (__get_cached_unique_name(pid, unique_name, sizeof(unique_name),
989 &caller_is_app, uid) == false) {
990 *error_code = ERR_ALARM_SYSTEM_FAIL;
991 _release_alarm_info_t(__alarm_info);
995 /* Get caller_appid to get caller's package id. There is no callee. */
997 __alarm_info->caller_pkgid = _get_pkgid_by_appid(unique_name, uid);
999 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null", __alarm_info->caller_pkgid);
1001 __alarm_info->app_unique_name = strdup(unique_name);
1002 if (app_service_name)
1003 __alarm_info->app_service_name = strdup(app_service_name);
1004 if (app_service_name_mod)
1005 __alarm_info->app_service_name_mod = strdup(app_service_name_mod);
1006 if (dst_service_name)
1007 __alarm_info->dst_service_name = strdup(dst_service_name);
1008 if (dst_service_name_mod)
1009 __alarm_info->dst_service_name_mod = strdup(dst_service_name_mod);
1011 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1012 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1013 __alarm_generate_alarm_id(__alarm_info, alarm_id);
1015 if (__alarm_add_and_set(__alarm_info, pid) == false) {
1016 *error_code = ERR_ALARM_INVALID_TIME;
1017 _release_alarm_info_t(__alarm_info);
1021 _save_alarm_info_log("CREATE", __alarm_info);
1026 static char *__create_new_noti_data(char *noti_data, pid_t pid, uid_t uid)
1029 guchar *decoded_data;
1030 int decoded_datalen;
1031 notification_h noti = NULL;
1032 char *new_noti_data = NULL;
1033 guchar* data = NULL;
1036 decoded_data = g_base64_decode(noti_data, (gsize *)&decoded_datalen);
1037 if (decoded_data == NULL)
1040 noti = __get_notification(decoded_data, decoded_datalen);
1044 notification_set_indirect_request(noti, pid, uid);
1046 noti_gv = notification_ipc_make_gvariant_from_noti(noti, false);
1047 if (noti_gv == NULL)
1050 datalen = g_variant_get_size(noti_gv);
1054 data = (guchar *)malloc(datalen);
1058 g_variant_store(noti_gv, data);
1059 new_noti_data = g_base64_encode(data, datalen);
1065 notification_free(noti);
1067 g_free(decoded_data);
1069 return new_noti_data;
1072 static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
1073 long requested_interval, uid_t uid, int pid, char *noti_data, int *error_code)
1075 char app_name[MAX_APP_ID_LEN] = { 0 };
1076 bool caller_is_app = false;
1077 char *new_noti_data = NULL;
1079 __alarm_info_t *__alarm_info = NULL;
1081 __alarm_info = (__alarm_info_t *)calloc(1, sizeof(__alarm_info_t));
1082 if (__alarm_info == NULL) {
1083 SECURE_LOGE("Caution!! app_pid=%d, calloc "
1084 "failed. it seems to be OOM\n", pid);
1085 *error_code = ERR_ALARM_SYSTEM_FAIL;
1088 __alarm_info->uid = uid;
1089 __alarm_info->alarm_id = -1;
1090 __alarm_info->requested_interval = requested_interval;
1091 __alarm_info->global = false;
1093 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), &caller_is_app, uid) == false) {
1094 *error_code = ERR_ALARM_SYSTEM_FAIL;
1095 _release_alarm_info_t(__alarm_info);
1098 __alarm_info->app_unique_name = strdup(app_name);
1100 if (caller_is_app) {
1101 __alarm_info->caller_pkgid = _get_pkgid_by_appid(app_name, uid);
1104 SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null",
1105 __alarm_info->caller_pkgid);
1108 if (caller_is_app) {
1109 new_noti_data = __create_new_noti_data(noti_data, pid,
1114 __alarm_info->noti = new_noti_data;
1116 __alarm_info->noti = strdup(noti_data);
1119 __alarm_set_start_and_end_time(alarm_info, __alarm_info);
1120 memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
1121 __alarm_generate_alarm_id(__alarm_info, alarm_id);
1123 if (__alarm_add_and_set(__alarm_info, pid) == false) {
1124 *error_code = ERR_ALARM_INVALID_TIME;
1125 _release_alarm_info_t(__alarm_info);
1129 _save_alarm_info_log("CREATE NOTI", __alarm_info);
1134 static bool __alarm_update(uid_t uid, alarm_id_t alarm_id,
1135 alarm_info_t *alarm_info, int update_flag, int *error_code)
1137 time_t current_time;
1138 char due_time_r[100] = { 0 };
1139 __alarm_info_t *__alarm_info = NULL;
1140 bool result = false;
1143 time(¤t_time);
1145 if (alarm_context.c_due_time < current_time) {
1146 LOGE("Caution!! alarm_context.c_due_time "
1147 "(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time);
1148 alarm_context.c_due_time = -1;
1151 __alarm_info = __alarm_update_in_list(uid, alarm_id, alarm_info,
1152 update_flag, error_code);
1153 if (!__alarm_info) {
1154 LOGE("[alarm-server]: requested alarm_id "
1155 "(%d) does not exist. so this value is invalid id.", alarm_id);
1159 if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
1160 __alarm_info->alarm_info.reserved_info = current_time;
1162 _alarm_set_next_duetime(__alarm_info);
1164 _save_alarm_info_log("UPDATE", __alarm_info);
1166 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1167 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1168 /*there is no scheduled alarm */
1169 _alarm_disable_timer();
1172 LOGD("[alarm-server]:Update alarm: alarm(%d).", alarm_id);
1176 if (__alarm_info->due_time == 0)
1177 LOGE("[alarm-server]:Update alarm: due_time is 0.");
1182 if (__alarm_info->due_time == 0) {
1183 LOGE("[alarm-server]:Update alarm: "
1184 "due_time is 0, alarm(%d)\n", alarm_id);
1186 } else if (current_time == __alarm_info->due_time) {
1187 LOGE("[alarm-server]:Update alarm: "
1188 "current_time(%ld) is same as due_time(%ld)", current_time,
1189 __alarm_info->due_time);
1191 } else if (difftime(__alarm_info->due_time, current_time) < 0) {
1192 LOGE("[alarm-server]: Expired Due Time.[Due time=%ld,\
1193 Current Time=%ld]!!!Do not add to schedule list\n",
1194 __alarm_info->due_time, current_time);
1197 localtime_r(&(__alarm_info->due_time), &ts_ret);
1198 strftime(due_time_r, 30, "%c", &ts_ret);
1199 SECURE_LOGD("[alarm-server]:Update alarm: alarm(%d) "
1200 "due_time(%s)\n", alarm_id, due_time_r);
1203 LOGD("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)",
1204 alarm_context.c_due_time, __alarm_info->due_time);
1206 if (alarm_context.c_due_time == -1 || __alarm_info->due_time < alarm_context.c_due_time) {
1207 _clear_scheduled_alarm_list();
1208 _add_to_scheduled_alarm_list(__alarm_info);
1209 _alarm_set_timer(alarm_context.timer, __alarm_info->due_time);
1210 LOGD("[alarm-server1]:alarm_context.c_due_time "
1211 "(%ld), due_time(%ld)", alarm_context.c_due_time, __alarm_info->due_time);
1212 } else if (__alarm_info->due_time == alarm_context.c_due_time) {
1213 _add_to_scheduled_alarm_list(__alarm_info);
1214 LOGD("[alarm-server2]:alarm_context.c_due_time "
1215 "(%ld), due_time(%ld)", alarm_context.c_due_time, __alarm_info->due_time);
1224 static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code)
1226 bool result = false;
1228 SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) uid(%d)\n", alarm_id, uid);
1229 result = _remove_from_scheduled_alarm_list(uid, alarm_id);
1231 if (!__alarm_remove_from_list(uid, alarm_id, error_code)) {
1233 SECURE_LOGE("[alarm-server]:delete alarm: "
1234 "alarm(%d) uid(%d) has failed with error_code(%d)\n",
1235 alarm_id, uid, *error_code);
1239 if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
1240 _alarm_disable_timer();
1248 bool _can_skip_expired_cb(alarm_id_t alarm_id)
1250 GSList *gs_iter = NULL;
1251 __alarm_info_t *entry = NULL;
1252 alarm_info_t *alarm = NULL;
1254 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1255 entry = (__alarm_info_t *)gs_iter->data;
1256 if (entry->alarm_id == alarm_id) {
1257 alarm = &(entry->alarm_info);
1260 int dur = entry->requested_interval;
1263 if (dur == 0 || !(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF)
1266 ts_tm.tm_hour = alarm->start.hour;
1267 ts_tm.tm_min = alarm->start.min;
1268 ts_tm.tm_sec = alarm->start.sec;
1270 ts_tm.tm_year = alarm->start.year - 1900;
1271 ts_tm.tm_mon = alarm->start.month - 1;
1272 ts_tm.tm_mday = alarm->start.day;
1273 ts_tm.tm_isdst = -1;
1275 ts = mktime(&ts_tm);
1277 from = (ts / dur) * dur;
1280 if (ts >= from && ts < to && from > ts - alarm->mode.u_interval.interval)
1290 static int __find_login_user(uid_t *uid)
1296 ret = sd_get_uids(&uids);
1300 for (i = 0; i < ret; i++) {
1301 if (sd_uid_get_state(uids[i], &state) < 0) {
1305 if (!strncmp(state, "online", 6)) {
1319 static notification_h __get_notification(guchar *data, int datalen)
1322 GVariant *noti_gv = NULL;
1323 GVariant *body = NULL;
1324 notification_h noti;
1326 if (data == NULL || datalen <= 0)
1329 noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"),
1330 data, datalen, TRUE, NULL, NULL);
1332 if (noti_gv == NULL)
1335 g_variant_get(noti_gv, "(v)", &body);
1338 g_variant_unref(noti_gv);
1342 noti = notification_create(NOTIFICATION_TYPE_NOTI);
1344 g_variant_unref(body);
1345 g_variant_unref(noti_gv);
1349 ret = notification_ipc_make_noti_from_gvariant(noti, body);
1351 if (ret != NOTIFICATION_ERROR_NONE) {
1352 g_variant_unref(body);
1353 g_variant_unref(noti_gv);
1354 notification_free(noti);
1358 g_variant_unref(body);
1359 g_variant_unref(noti_gv);
1364 static void __expire_notification(__alarm_info_t *alarm_info)
1368 notification_h noti;
1370 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
1372 noti_data = g_base64_decode(alarm_info->noti,
1375 LOGE("Failed to decode noti data");
1379 noti = __get_notification(noti_data, datalen);
1381 LOGE("Failed to get notification");
1386 if (vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode) != 0)
1387 LOGE("Failed to get value of VCONFKEY_ALARM_EXPIRE_MODE");
1389 LOGD("Value of alarm_expire_mode [%d]", expire_mode);
1391 if (expire_mode == ALARM_EXPIRE_MODE_NORMAL)
1392 device_display_change_state(DISPLAY_STATE_NORMAL);
1394 ret = notification_post_for_uid(noti, alarm_info->uid);
1395 if (ret != NOTIFICATION_ERROR_NONE)
1396 LOGE("Failed to post notification");
1398 notification_free(noti);
1402 static void __expire_app_control(__alarm_info_t *alarm_info)
1404 char alarm_id_val[32];
1411 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
1414 b_len = strlen(alarm_info->bundle);
1415 b = bundle_decode((bundle_raw *)(alarm_info->bundle), b_len);
1417 LOGE("Error!!!..Unable to decode the bundle!!\n");
1421 snprintf(alarm_id_val, sizeof(alarm_id_val), "%d", alarm_info->alarm_id);
1423 if (bundle_add_str(b, "http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)) {
1424 LOGE("Unable to add alarm id to the bundle\n");
1429 app_pid = _get_pid_from_appid(alarm_info->app_unique_name,
1431 SECURE_LOGW("alarm_expired : from [uid : %d, pid : %d, pkgid : %s, "
1432 "unique_name : %s]", alarm_info->uid, app_pid,
1433 alarm_info->caller_pkgid, alarm_info->app_unique_name);
1435 if (_compare_api_version(&result, app_pid, alarm_info->uid) < 0) {
1436 LOGE("Unable to check api version\n");
1442 if (aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, alarm_info->uid) < 0)
1443 LOGE("Unable to run app svc\n");
1445 LOGD("Successfuly run app svc\n");
1448 appid = (char *)appsvc_get_appid(b);
1449 if ((alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) {
1450 LOGE("This alarm is ignored\n");
1451 } else if (!(alarm_info->alarm_info.alarm_type & ALARM_TYPE_INEXACT) ||
1452 !_can_skip_expired_cb(alarm_info->alarm_id)) {
1453 if (alarm_info->global) {
1454 if (__find_login_user(&target_uid) < 0) {
1455 LOGE("Fail to get login user\n");
1458 ret = aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, target_uid);
1461 ret = aul_svc_run_service_async_for_uid(b, 0, NULL, NULL, alarm_info->uid);
1465 LOGE("Unable to launch app [%s] \n", appid);
1467 if (vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode) != 0)
1468 LOGE("Failed to get value of VCONFKEY_ALARM_EXPIRE_MODE");
1470 LOGD("Successfuly ran app svc (expire_mode : %d)", expire_mode);
1472 if (_is_ui_app(appid, alarm_info->uid) &&
1473 expire_mode == ALARM_EXPIRE_MODE_NORMAL)
1474 device_display_change_state(DISPLAY_STATE_NORMAL);
1482 static int __app_info_iter(const aul_app_info *info, void *data)
1484 struct running_info_t *app_info = (struct running_info_t *)data;
1486 if (strcmp(app_info->appid, info->appid) == 0)
1487 app_info->is_running = true;
1492 static void __expire_dbus_activation(__alarm_info_t *alarm_info)
1494 const char *destination_app_service_name = NULL;
1495 char appid[MAX_SERVICE_NAME_LEN] = { 0, };
1496 struct running_info_t app_info;
1499 bool is_app = false;
1501 if (alarm_info->dst_service_name == NULL) {
1502 SECURE_LOGD("[alarm-server]:destination is null, so we send expired alarm to %s.",
1503 alarm_info->app_service_name);
1504 destination_app_service_name = alarm_info->app_service_name_mod;
1506 SECURE_LOGD("[alarm-server]:destination :%s",
1507 alarm_info->dst_service_name);
1508 destination_app_service_name = alarm_info->dst_service_name_mod;
1512 * we should consider a situation that
1513 * destination_app_service_name is owner_name like (:xxxx) and
1514 * application's pid which registered this alarm was killed.In that case,
1515 * we don't need to send the expire event because the process was killed.
1516 * this causes needless message to be sent.
1519 if (alarm_info->dst_service_name == NULL) {
1520 if (alarm_info->app_service_name != NULL && strlen(alarm_info->app_service_name) > 6)
1521 strncpy(appid, alarm_info->app_service_name + 6, sizeof(appid) - 1);
1523 if (strlen(alarm_info->dst_service_name) > 6)
1524 strncpy(appid, alarm_info->dst_service_name + 6, sizeof(appid) - 1);
1527 if (alarm_info->uid >= REGULAR_UID_MIN) {
1528 is_app = _is_app(appid, alarm_info->uid);
1530 LOGD("appid : %s app?(%d)", appid, is_app);
1532 /* Case #3-1. The process was killed && App type
1533 * This app is launched and owner of DBus connection is changed. and then, expiration noti is sent by DBus. */
1534 app_info.is_running = false;
1536 app_info.appid = appid;
1537 aul_app_get_all_running_app_info_for_uid(__app_info_iter,
1538 &app_info, alarm_info->uid);
1540 SECURE_LOGD("[alarm-server]: destination_app_id :%s", appid);
1543 if (is_app && !app_info.is_running) {
1544 __expired_alarm_t *expire_info;
1545 char alarm_id_str[32] = { 0, };
1547 if (alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) {
1548 __alarm_remove_from_list(alarm_info->uid, alarm_info->alarm_id, NULL);
1549 LOGW("[alarm-server]:This alarm_type is WITHCB");
1553 expire_info = (__expired_alarm_t *)malloc(sizeof(__expired_alarm_t));
1554 if (G_UNLIKELY(NULL == expire_info)) {
1555 LOGE("[alarm-server]:Malloc failed!Can't notify alarm expiry info\n");
1558 memset(expire_info, '\0', sizeof(__expired_alarm_t));
1559 strncpy(expire_info->service_name, destination_app_service_name, MAX_SERVICE_NAME_LEN-1);
1560 expire_info->alarm_id = alarm_info->alarm_id;
1561 expire_info->uid = alarm_info->uid;
1562 g_expired_alarm_list = g_slist_append(g_expired_alarm_list, expire_info);
1564 snprintf(alarm_id_str, 31, "%d", alarm_info->alarm_id);
1566 SECURE_LOGD("before aul_launch appid(%s) alarm_id_str(%s)", appid, alarm_id_str);
1568 kb = bundle_create();
1569 bundle_add_str(kb, "__ALARM_MGR_ID", alarm_id_str);
1571 if (alarm_info->global) {
1572 if (__find_login_user(&target_uid) < 0)
1573 LOGE("Fail to get login user\n");
1575 aul_launch_app_for_uid(appid, kb, target_uid); /* on_bus_name_owner_changed will be called. */
1577 aul_launch_app_for_uid(appid, kb, alarm_info->uid); /* on_bus_name_owner_changed will be called. */
1582 /* Case #3-2. The process is alive or was killed && non-app type(daemon)
1583 * Expiration noti is sent by DBus. it makes the process alive. (dbus auto activation) */
1584 LOGD("before alarm_send_noti_to_application");
1586 _alarm_send_noti_to_application_by_dbus(destination_app_service_name,
1587 alarm_info->alarm_id, alarm_info->alarm_info.msec, alarm_info->uid); /* dbus auto activation */
1588 LOGD("after _alarm_send_noti_to_application_by_dbus");
1592 void _alarm_expired()
1594 __alarm_info_t *__alarm_info = NULL;
1595 GSList *iter = NULL;
1596 __scheduled_alarm_t *alarm = NULL;
1598 LOGD("[alarm-server]: Enter");
1600 time_t current_time;
1603 time(¤t_time);
1605 interval = difftime(alarm_context.c_due_time, current_time);
1606 LOGD("[alarm-server]: c_due_time(%ld), current_time(%ld), interval(%f)",
1607 alarm_context.c_due_time, current_time, interval);
1609 if (alarm_context.c_due_time > current_time + 1) {
1610 LOGE("[alarm-server]: False Alarm. due time is (%ld) seconds future",
1611 alarm_context.c_due_time - current_time);
1614 /* 10 seconds is maximum permitted delay from timer expire to this function */
1615 if (alarm_context.c_due_time + 10 < current_time) {
1616 LOGE("[alarm-server]: False Alarm. due time is (%ld) seconds past.",
1617 current_time - alarm_context.c_due_time);
1621 for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) {
1622 alarm = (__scheduled_alarm_t *)iter->data;
1623 __alarm_info = alarm->__alarm_info;
1625 /* Case #1. The process is an application launched by app_control.
1626 * It registered an alarm using launch-based APIs like alarm_schedule_xxx, alarmmgr_xxx_appsvc. */
1627 if (__alarm_info->bundle != NULL) {
1628 __expire_app_control(__alarm_info);
1629 } else if (__alarm_info->noti != NULL) {
1630 /* Case #2. The process is an application launched by notification. */
1631 __expire_notification(__alarm_info);
1633 /* Case #3. Expiration noti is sent by DBus.
1634 * 3-1. The process was killed && App type
1635 * 3-2. The process is alive or was killed && non-app type(daemon) */
1636 __expire_dbus_activation(__alarm_info);
1639 LOGD("alarm_id[%d] is expired.", __alarm_info->alarm_id);
1641 _save_alarm_info_log("EXPIRED", __alarm_info);
1643 if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
1644 __alarm_remove_from_list(__alarm_info->uid, __alarm_info->alarm_id, NULL);
1646 _alarm_set_next_duetime(__alarm_info);
1647 _save_alarm_info_log("DUETIME", __alarm_info);
1652 _clear_scheduled_alarm_list();
1653 alarm_context.c_due_time = -1;
1655 LOGD("[alarm-server]: Leave");
1659 static void __on_system_time_external_changed(keynode_t *node, void *data)
1661 double diff_time = 0.0;
1662 time_t cur_time = 0;
1664 _alarm_disable_timer();
1667 diff_time = vconf_keynode_get_dbl(node);
1669 if (vconf_get_dbl(VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, &diff_time) != 0) {
1670 LOGE("Failed to get value of VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL.");
1678 LOGD("diff_time is %f, New time is %s\n", diff_time, ctime(&cur_time));
1680 LOGD("[alarm-server] System time has been changed externally\n");
1681 LOGD("1.alarm_context.c_due_time is %ld\n",
1682 alarm_context.c_due_time);
1684 if (!__set_time(cur_time)) { /* Change both OS time and RTC */
1685 LOGE("Failed to change both OS time and RTC");
1686 _clear_scheduled_alarm_list();
1692 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
1694 b = bundle_create();
1695 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
1696 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
1699 __alarm_update_due_time_of_all_items_in_list(cur_time, diff_time);
1701 LOGD("2.alarm_context.c_due_time is %ld\n",
1702 alarm_context.c_due_time);
1703 _clear_scheduled_alarm_list();
1707 _save_module_log("SET RTC END", "requested by vconf");
1712 static int __on_app_enable_cb(uid_t target_uid, int req_id,
1713 const char *pkg_type, const char *pkgid, const char *appid,
1714 const char *key, const char *val, const void *pmsg, void *data)
1716 SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id);
1718 GSList *gs_iter = NULL;
1719 __alarm_info_t *entry = NULL;
1720 bool is_restored = false;
1722 if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) {
1723 SECURE_LOGD("Enable appid(%s)", appid);
1724 for (gs_iter = g_disabled_alarm_list; gs_iter != NULL; ) {
1725 entry = (__alarm_info_t *)gs_iter->data;
1727 gs_iter = g_slist_next(gs_iter);
1728 if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) {
1729 _alarm_set_next_duetime(entry);
1730 SECURE_LOGD("Restore alarm_id(%d) duetime(%d) appid(%s)",
1731 entry->alarm_id, (int)(entry->due_time), appid);
1732 alarm_context.alarms = g_slist_append(alarm_context.alarms, entry);
1733 g_disabled_alarm_list = g_slist_remove(g_disabled_alarm_list, entry);
1735 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
1736 _update_db_for_disabled_alarm(entry->alarm_id, false);
1742 _alarm_disable_timer();
1743 _clear_scheduled_alarm_list();
1752 static int __on_app_disable_cb(uid_t target_uid, int req_id,
1753 const char *pkg_type, const char *pkgid, const char *appid,
1754 const char *key, const char *val, const void *pmsg, void *data)
1756 SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id);
1758 GSList *gs_iter = NULL;
1759 __alarm_info_t *entry = NULL;
1760 bool is_disabled = false;
1762 if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) {
1763 SECURE_LOGD("Disable appid(%s)", appid);
1764 for (gs_iter = alarm_context.alarms; gs_iter != NULL; ) {
1765 entry = (__alarm_info_t *)gs_iter->data;
1767 gs_iter = g_slist_next(gs_iter);
1768 if (strncmp(appid, entry->app_unique_name, strlen(appid)) == 0) {
1769 if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE))
1770 _update_db_for_disabled_alarm(entry->alarm_id, true);
1771 g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, entry);
1772 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
1778 _alarm_disable_timer(alarm_context);
1779 _clear_scheduled_alarm_list();
1788 static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_type,
1789 const char *pkgid, const char *key, const char *val,
1790 const void *pmsg, void *user_data)
1792 GSList *gs_iter = NULL;
1793 __alarm_info_t *entry = NULL;
1794 alarm_info_t *alarm_info = NULL;
1795 bool is_deleted = false;
1797 SECURE_LOGD("pkg_type(%s), pkgid(%s), key(%s), value(%s)", pkg_type, pkgid, key, val);
1799 if (strncmp(key, "end", 3) == 0 && strncmp(val, "ok", 2) == 0) {
1800 for (gs_iter = alarm_context.alarms; gs_iter != NULL;) {
1801 entry = (__alarm_info_t *)gs_iter->data;
1803 const char *caller_pkgid = entry->caller_pkgid;
1804 const char *callee_pkgid = entry->callee_pkgid;
1805 int pid = _get_pid_from_appid(entry->app_unique_name, entry->uid);
1807 gs_iter = g_slist_next(gs_iter);
1808 if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) ||
1809 (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) {
1810 if (_remove_from_scheduled_alarm_list(entry->uid, entry->alarm_id))
1813 alarm_info = &entry->alarm_info;
1814 if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
1815 if (!_delete_alarms(entry->alarm_id))
1816 SECURE_LOGE("_delete_alarms() is failed. pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1819 if (g_hash_table_remove(caller_appid_cache_table, GINT_TO_POINTER(pid)) == true)
1820 LOGD("Remove cachd data of pid[%d]", pid);
1822 SECURE_LOGD("Remove pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id);
1823 alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry);
1824 _release_alarm_info_t(entry);
1829 if (is_deleted && (g_slist_length(g_scheduled_alarm_list) == 0)) {
1830 _alarm_disable_timer();
1836 return ALARMMGR_RESULT_SUCCESS;
1839 static long __get_proper_interval(long interval, int alarm_type)
1841 GSList *gs_iter = NULL;
1842 __alarm_info_t *entry = NULL;
1843 long maxInterval = 60;
1845 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1846 entry = (__alarm_info_t *)gs_iter->data;
1847 if (entry->alarm_info.alarm_type & ALARM_TYPE_PERIOD) {
1848 if (entry->alarm_info.mode.u_interval.interval <= interval &&
1849 entry->alarm_info.mode.u_interval.interval > maxInterval)
1850 maxInterval = entry->alarm_info.mode.u_interval.interval;
1854 while ((maxInterval * 2 <= interval && maxInterval < LONG_MAX / 2) ||
1855 (alarm_type & ALARM_TYPE_INEXACT && maxInterval < MIN_INEXACT_INTERVAL))
1861 static gboolean __alarm_expired_directly(gpointer user_data)
1863 if (g_scheduled_alarm_list == NULL || g_scheduled_alarm_list->data == NULL)
1866 time_t *time_sec = (time_t *)user_data;
1867 __scheduled_alarm_t *alarm = (__scheduled_alarm_t *)g_scheduled_alarm_list->data;
1868 __alarm_info_t *alarm_info = alarm->__alarm_info;
1870 /* Expire alarms with duetime equal to newtime by force */
1871 if (alarm_info->due_time == *time_sec) {
1872 _display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0);
1874 if (g_dummy_timer_is_set == true) {
1875 LOGD("dummy alarm timer has expired.");
1877 LOGD("due_time=%ld is expired.", alarm_info->due_time);
1884 _display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN);
1893 void __reschedule_alarms_with_newtime(time_t cur_time, time_t new_time, double diff_time)
1895 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
1898 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time);
1900 b = bundle_create();
1901 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
1902 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
1905 __alarm_update_due_time_of_all_items_in_list(new_time, diff_time); /* Rescheduling alarms with ALARM_TYPE_RELATIVE */
1906 LOGD("Next duetime is %ld", alarm_context.c_due_time);
1908 _clear_scheduled_alarm_list();
1912 char *timebuf = ctime((const time_t *)&new_time);
1914 timebuf[strlen(timebuf) - 1] = '\0'; /* to avoid newline */
1915 snprintf(log_message, sizeof(log_message), "Current: %ld, New: %ld, %s, diff: %f", cur_time, new_time, timebuf, diff_time);
1918 _save_module_log("CHANGE TIME", log_message);
1920 _new_time = malloc(sizeof(time_t));
1922 *_new_time = new_time;
1924 LOGE("Out of memory");
1928 g_idle_add(__alarm_expired_directly, (gpointer)_new_time); /* Expire alarms with duetime equal to newtime directly */
1932 static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id)
1934 bool caller_is_app = false;
1935 char app_name[MAX_APP_ID_LEN] = { 0 };
1936 GSList *gs_iter = NULL;
1937 __alarm_info_t *entry = NULL;
1938 char *caller_pkgid = NULL;
1940 if (__get_cached_unique_name(pid, app_name, sizeof(app_name),
1941 &caller_is_app, uid) == false)
1942 return ERR_ALARM_SYSTEM_FAIL;
1944 if (!caller_is_app) {
1945 LOGD("Daemon process is possible to modify alarms[%s]",
1947 return ALARMMGR_RESULT_SUCCESS;
1949 caller_pkgid = _get_pkgid_by_appid(app_name, uid);
1950 if (!caller_pkgid) {
1951 LOGE("Failed to get appinfo %s", app_name);
1952 return ERR_ALARM_SYSTEM_FAIL;
1956 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
1957 entry = (__alarm_info_t *)gs_iter->data;
1958 if (entry->uid == uid && entry->alarm_id == alarm_id &&
1959 entry->caller_pkgid &&
1960 strcmp(caller_pkgid, entry->caller_pkgid) == 0) {
1961 LOGD("Found alarm of app (uid:%d, pid:%d, caller_pkgid:%s) ", uid, pid, caller_pkgid);
1965 return ALARMMGR_RESULT_SUCCESS;
1969 LOGW("[%s] is not permitted to modify alarm_id[%d]", app_name, alarm_id);
1973 return ERR_ALARM_NOT_PERMITTED_APP;
1976 int alarm_manager_alarm_set_rtc_time(GVariant *parameters)
1978 if (_APPFW_FEATURE_WAKEUP_USING_RTC) {
1979 const char *rtc = default_rtc;
1980 struct rtc_wkalrm rtc_wkalarm;
1982 struct tm tm, *alarm_tm = NULL;
1983 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
1984 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
1985 /*extract day of the week, day in the year & daylight saving time from system*/
1986 time_t current_time;
1988 int year, mon, day, hour, min, sec;
1989 int return_code = ALARMMGR_RESULT_SUCCESS;
1991 g_variant_get(parameters, "(iiiiii)", &year, &mon, &day, &hour, &min, &sec);
1993 current_time = time(NULL);
1994 alarm_tm = gmtime_r(¤t_time, &tm);
1995 if (alarm_tm == NULL) {
1996 LOGE("alarm_tm is NULL");
1997 return ERR_ALARM_SYSTEM_FAIL;
2000 alarm_tm->tm_year = year;
2001 alarm_tm->tm_mon = mon;
2002 alarm_tm->tm_mday = day;
2003 alarm_tm->tm_hour = hour;
2004 alarm_tm->tm_min = min;
2005 alarm_tm->tm_sec = sec;
2007 /*convert to calendar time representation*/
2008 time_t rtc_time = mktime(alarm_tm);
2011 gfd = open(rtc, O_RDWR);
2013 LOGE("RTC open failed.");
2014 return ERR_ALARM_SYSTEM_FAIL;
2018 rtc_wkalarm.enabled = 1;
2019 rtc_wkalarm.time.tm_year = year;
2020 rtc_wkalarm.time.tm_mon = mon;
2021 rtc_wkalarm.time.tm_mday = day;
2022 rtc_wkalarm.time.tm_hour = hour;
2023 rtc_wkalarm.time.tm_min = min;
2024 rtc_wkalarm.time.tm_sec = sec;
2026 retval = ioctl(gfd, RTC_WKALM_SET, &rtc_wkalarm);
2028 if (errno == ENOTTY)
2029 LOGE("Alarm IRQs is not supported.");
2031 LOGE("RTC ALARM_SET ioctl is failed. errno = %s", strerror_r(errno, buf, sizeof(buf)));
2032 return_code = ERR_ALARM_SYSTEM_FAIL;
2033 strncpy(log_tag, "FAIL: SET RTC", sizeof(log_tag) - 1);
2035 LOGD("[alarm-server]RTC alarm is setted");
2036 strncpy(log_tag, "SET RTC", sizeof(log_tag) - 1);
2039 snprintf(log_message, sizeof(log_message), "wakeup rtc time: %ld, %s", rtc_time, ctime(&rtc_time));
2040 _save_module_log(log_tag, log_message);
2043 LOGW("[alarm-server] RTC does not work.");
2044 return ERR_ALARM_SYSTEM_FAIL;
2048 static int accrue_nsec = 0; /* To check a millisecond part of current time at changing the system time(sec) */
2050 int alarm_manager_alarm_set_time(GVariant* parameters, pid_t pid)
2052 double diff_time = 0.0;
2053 struct timespec cur_time;
2056 char sender_id[MAX_APP_ID_LEN] = "NULL";
2057 char log_message[ALARMMGR_LOG_MESSAGE_SIZE];
2059 g_variant_get(parameters, "(x)", &time_sec);
2061 new_time = (time_t)time_sec;
2063 _alarm_disable_timer(); /* Disable the timer to reschedule the alarm before the time is changed. */
2066 clock_gettime(CLOCK_REALTIME, &cur_time);
2068 accrue_nsec += (cur_time.tv_nsec / MILLION); /* Accrue the nanosecond to compensate the time */
2069 if (accrue_nsec > (BILLION / 2)) { /* Over 500ms */
2070 diff_time = difftime(new_time, cur_time.tv_sec) - 1;
2071 accrue_nsec -= BILLION;
2073 diff_time = difftime(new_time, cur_time.tv_sec);
2076 if (!__set_time(new_time)) { /* Change both OS time and RTC */
2077 LOGE("Failed to change both OS time and RTC");
2078 _clear_scheduled_alarm_list();
2081 return ERR_ALARM_SYSTEM_FAIL;
2084 LOGD("[TIMESTAMP]Current time(%ld), New time(%ld)(%s), diff_time(%f)",
2085 cur_time.tv_sec, new_time, ctime((const time_t *)&new_time), diff_time);
2087 __reschedule_alarms_with_newtime(cur_time.tv_sec, new_time, diff_time);
2089 __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001);
2090 snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid);
2091 _save_module_log("SET TIME END", log_message);
2093 return ALARMMGR_RESULT_SUCCESS;;
2096 int alarm_manager_alarm_set_time_with_propagation_delay(GVariant* parameters, pid_t pid)
2098 double diff_time = 0.0;
2099 struct timespec cur_time = {0,};
2100 struct timespec delay = {0,};
2101 struct timespec sleep_time = {0,};
2102 time_t real_newtime = 0;
2103 accrue_nsec = 0; /* reset accrued msec */
2104 time_t new_sec, req_sec;
2105 long new_nsec, req_nsec;
2106 gint64 tmp_new_sec, tmp_req_sec, tmp_new_nsec, tmp_req_nsec;
2107 char sender_id[MAX_APP_ID_LEN];
2108 char log_message[ALARMMGR_LOG_MESSAGE_SIZE];
2110 g_variant_get(parameters, "(xxxx)", &tmp_new_sec, &tmp_new_nsec, &tmp_req_sec, &tmp_req_nsec);
2111 new_sec = (time_t)tmp_new_sec;
2112 new_nsec = (long)tmp_new_nsec;
2113 req_sec = (time_t)tmp_req_sec;
2114 req_nsec = (long)tmp_req_nsec;
2116 _alarm_disable_timer(); /* Disable the timer to reschedule the alarm before the time is changed. */
2119 clock_gettime(CLOCK_REALTIME, &cur_time);
2121 /* Check validation of requested time */
2122 if (req_sec > cur_time.tv_sec || (req_sec == cur_time.tv_sec && req_nsec > cur_time.tv_nsec)) {
2123 LOGE("The requeted time(%ld.%09ld) must be equal to or less than current time(%ld.%09ld).",
2124 req_sec, req_nsec, cur_time.tv_sec, cur_time.tv_nsec);
2125 return ERR_ALARM_INVALID_PARAM;
2128 /* Compensate propagation delay */
2129 if (req_nsec > cur_time.tv_nsec) {
2130 delay.tv_sec = cur_time.tv_sec - 1 - req_sec;
2131 delay.tv_nsec = cur_time.tv_nsec + BILLION - req_nsec;
2133 delay.tv_sec = cur_time.tv_sec - req_sec;
2134 delay.tv_nsec = cur_time.tv_nsec - req_nsec;
2137 if (new_nsec + delay.tv_nsec >= BILLION) {
2138 real_newtime = new_sec + delay.tv_sec + 2;
2139 sleep_time.tv_nsec = BILLION - ((delay.tv_nsec + new_nsec) - BILLION);
2141 real_newtime = new_sec + delay.tv_sec + 1;
2142 sleep_time.tv_nsec = BILLION - (delay.tv_nsec + new_nsec);
2145 nanosleep(&sleep_time, NULL); /* Wait until 0 nsec to match both OS time and RTC(sec) */
2147 if (!__set_time(real_newtime)) { /* Change both OS time and RTC */
2148 LOGE("Failed to change both OS time and RTC");
2149 _clear_scheduled_alarm_list();
2152 return ERR_ALARM_SYSTEM_FAIL;
2155 diff_time = difftime(real_newtime, cur_time.tv_sec);
2156 LOGD("[TIMESTAMP]Current time(%ld.%09ld), New time(%ld.%09ld), Real Newtime(%ld), diff_time(%f)",
2157 cur_time.tv_sec, cur_time.tv_nsec, new_sec, new_nsec, real_newtime, diff_time);
2158 LOGD("Requested(%ld.%09ld) Delay(%ld.%09ld) Sleep(%09ld)", req_sec, req_nsec, delay.tv_sec, delay.tv_nsec, sleep_time.tv_nsec);
2159 __reschedule_alarms_with_newtime(cur_time.tv_sec, real_newtime, diff_time);
2161 __get_cached_unique_name(pid, sender_id, MAX_APP_ID_LEN, NULL, 5001);
2162 snprintf(log_message, sizeof(log_message), "requested by %s (pid %d)", sender_id, pid);
2163 _save_module_log("SET TIME PROPAGATION END", log_message);
2165 return ALARMMGR_RESULT_SUCCESS;
2168 int alarm_manager_alarm_set_timezone(GVariant* parameters)
2171 int return_code = ALARMMGR_RESULT_SUCCESS;
2172 struct stat statbuf;
2174 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2175 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2179 g_variant_get(parameters, "(&s)", &tzpath_str);
2181 LOGD("[TIMESTAMP]Set the timezone to %s.", tzpath_str);
2183 if (lstat(tzpath_str, &statbuf) == -1 && errno == ENOENT) {
2184 LOGE("Invalid tzpath, %s", tzpath_str);
2185 return_code = ERR_ALARM_INVALID_PARAM;
2189 retval = lstat(TIMEZONE_INFO_LINK_PATH, &statbuf);
2190 if (retval == 0 || (retval == -1 && errno != ENOENT)) {
2191 /* unlink the current link */
2192 if (unlink(TIMEZONE_INFO_LINK_PATH) < 0) {
2193 LOGE("unlink() is failed.");
2194 return_code = ERR_ALARM_SYSTEM_FAIL;
2199 /* create a new symlink when the /opt/etc/localtime is empty. */
2200 if (symlink(tzpath_str, TIMEZONE_INFO_LINK_PATH) < 0) {
2201 LOGE("Failed to create an symlink of %s.", tzpath_str);
2202 return_code = ERR_ALARM_SYSTEM_FAIL;
2208 /* Rescheduling alarms */
2209 _alarm_disable_timer();
2211 __alarm_update_due_time_of_all_items_in_list(cur_time, 0);
2212 LOGD("next expiring due_time is %ld", alarm_context.c_due_time);
2214 _clear_scheduled_alarm_list();
2218 vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, 0);
2219 b = bundle_create();
2220 bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE);
2221 eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
2224 b = bundle_create();
2225 bundle_add_str(b, EVT_KEY_TIME_ZONE, tzpath_str);
2226 eventsystem_send_system_event(SYS_EVENT_TIME_ZONE, b);
2230 if (return_code == ALARMMGR_RESULT_SUCCESS)
2231 strncpy(log_tag, "SET TIMEZONE", sizeof(log_tag) - 1);
2233 strncpy(log_tag, "FAIL: SET TIMEZONE", sizeof(log_tag) - 1);
2235 snprintf(log_message, sizeof(log_message), "Set the timezone to %s.", tzpath_str);
2236 _save_module_log(log_tag, log_message);
2241 int alarm_manager_alarm_create_appsvc(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id)
2243 alarm_info_t alarm_info;
2244 int return_code = ALARMMGR_RESULT_SUCCESS;
2246 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2247 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2250 const char *callee_appid;
2251 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2252 int end_year, end_month, end_day;
2253 int mode_day_of_week, mode_repeat, alarm_type;
2254 time_t mode_interval, reserved_info;
2255 gint64 tmp_mode_interval, tmp_reserved_info;
2258 *alarm_id = _alarm_id;
2260 g_variant_get(parameters, "(iiiiiiiiiixiix&s)",
2261 &start_year, &start_month, &start_day, &start_hour, &start_min,
2262 &start_sec, &end_year, &end_month, &end_day, &mode_day_of_week,
2263 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info, &bundle_data);
2265 mode_interval = (time_t)tmp_mode_interval;
2266 reserved_info = (time_t)tmp_reserved_info;
2268 b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
2270 int ret_bundle = get_last_result();
2271 LOGE("Failed to decode bundle_data[Error:%d]\n", ret_bundle);
2272 return ERR_ALARM_SYSTEM_FAIL;
2274 callee_appid = appsvc_get_appid(b);
2276 if (_compare_api_version(&result, pid, uid) < 0) {
2277 LOGE("Unable to check api version\n");
2279 return ERR_ALARM_SYSTEM_FAIL;
2283 if (alarm_type & ALARM_TYPE_INEXACT)
2284 alarm_type ^= ALARM_TYPE_INEXACT;
2285 } else { /* Since 2.4 */
2286 if (!_is_permitted(callee_appid, alarm_type, uid)) {
2287 LOGE("[%s] is not permitted \n", callee_appid);
2289 return ERR_ALARM_NOT_PERMITTED_APP;
2296 alarm_info.start.year = start_year;
2297 alarm_info.start.month = start_month;
2298 alarm_info.start.day = start_day;
2299 alarm_info.start.hour = start_hour;
2300 alarm_info.start.min = start_min;
2301 alarm_info.start.sec = start_sec;
2303 alarm_info.end.year = end_year;
2304 alarm_info.end.month = end_month;
2305 alarm_info.end.day = end_day;
2307 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2308 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2310 alarm_info.alarm_type = alarm_type;
2311 alarm_info.reserved_info = reserved_info;
2313 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2314 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2315 alarm_info.mode.u_interval.interval =
2316 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2317 } else if (mode_interval <= 0) {
2318 alarm_info.mode.u_interval.interval = 0;
2321 if (!__alarm_create_appsvc(&alarm_info, &_alarm_id, mode_interval, uid, pid, bundle_data, &return_code)) {
2322 LOGE("Unable to create alarm! return_code[%d]", return_code);
2323 strncpy(log_tag, "FAIL: CREATE SVC", sizeof(log_tag) - 1);
2324 snprintf(log_message, sizeof(log_message),
2325 "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2326 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2327 _save_module_log(log_tag, log_message);
2328 return_code = ERR_ALARM_SYSTEM_FAIL;
2330 *alarm_id = _alarm_id;
2331 return_code = ALARMMGR_RESULT_SUCCESS;
2337 int alarm_manager_alarm_create_noti(GVariant *parameters, uid_t uid, pid_t pid,
2340 alarm_info_t alarm_info;
2341 int return_code = ALARMMGR_RESULT_SUCCESS;
2343 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2344 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2345 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2346 int end_year, end_month, end_day;
2347 int mode_day_of_week, mode_repeat, alarm_type;
2348 time_t mode_interval, reserved_info;
2349 gint64 tmp_mode_interval, tmp_reserved_info;
2352 *alarm_id = _alarm_id;
2354 g_variant_get(parameters, "(iiiiiiiiiixiix&s)",
2355 &start_year, &start_month, &start_day, &start_hour, &start_min,
2356 &start_sec, &end_year, &end_month, &end_day, &mode_day_of_week,
2357 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info, ¬i_data);
2359 mode_interval = (time_t)tmp_mode_interval;
2360 reserved_info = (time_t)tmp_reserved_info;
2362 alarm_info.start.year = start_year;
2363 alarm_info.start.month = start_month;
2364 alarm_info.start.day = start_day;
2365 alarm_info.start.hour = start_hour;
2366 alarm_info.start.min = start_min;
2367 alarm_info.start.sec = start_sec;
2369 alarm_info.end.year = end_year;
2370 alarm_info.end.month = end_month;
2371 alarm_info.end.day = end_day;
2373 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2374 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2376 alarm_info.alarm_type = alarm_type;
2377 alarm_info.reserved_info = reserved_info;
2379 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) {
2380 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2381 alarm_info.mode.u_interval.interval =
2382 __get_proper_interval(mode_interval, alarm_info.alarm_type);
2383 } else if (mode_interval <= 0) {
2384 alarm_info.mode.u_interval.interval = 0;
2387 if (!__alarm_create_noti(&alarm_info, &_alarm_id, mode_interval, uid, pid, noti_data, &return_code)) {
2388 LOGE("Unable to create alarm! return_code[%d]", return_code);
2389 strncpy(log_tag, "FAIL: CREATE NOTI", sizeof(log_tag) - 1);
2390 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2391 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2392 _save_module_log(log_tag, log_message);
2393 return_code = ERR_ALARM_SYSTEM_FAIL;
2395 return_code = ALARMMGR_RESULT_SUCCESS;
2396 *alarm_id = _alarm_id;
2402 int alarm_manager_alarm_create(GVariant *parameters, uid_t uid, pid_t pid, int *alarm_id)
2404 alarm_info_t alarm_info;
2405 int return_code = ALARMMGR_RESULT_SUCCESS;
2407 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2408 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2409 char *_reserved_service_name = NULL;
2410 char *_reserved_service_name_mod = NULL;
2412 char *app_service_name = NULL;
2413 char *app_service_name_mod = NULL;
2414 int start_year, start_month, start_day, start_hour, start_min, start_sec;
2415 int msec, end_year, end_month, end_day;
2416 int mode_day_of_week, mode_repeat, alarm_type;
2417 gint64 tmp_reserved_info;
2418 time_t reserved_info;
2419 char *reserved_service_name = NULL;
2420 char *reserved_service_name_mod = NULL;
2422 *alarm_id = _alarm_id;
2424 g_variant_get(parameters, "(&s&siiiiiiiiiiiiix&s&s)",
2425 &app_service_name, &app_service_name_mod,
2426 &start_year, &start_month, &start_day, &start_hour, &start_min,
2427 &start_sec, &msec, &end_year, &end_month, &end_day,
2428 &mode_day_of_week, &mode_repeat, &alarm_type, &tmp_reserved_info,
2429 &reserved_service_name, &reserved_service_name_mod);
2431 reserved_info = (time_t)tmp_reserved_info;
2433 alarm_info.start.year = start_year;
2434 alarm_info.start.month = start_month;
2435 alarm_info.start.day = start_day;
2436 alarm_info.start.hour = start_hour;
2437 alarm_info.start.min = start_min;
2438 alarm_info.start.sec = start_sec;
2440 alarm_info.msec = msec;
2442 alarm_info.end.year = end_year;
2443 alarm_info.end.month = end_month;
2444 alarm_info.end.day = end_day;
2446 alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
2447 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2449 alarm_info.alarm_type = alarm_type;
2450 alarm_info.reserved_info = reserved_info;
2452 if (strcmp(reserved_service_name, "null") == 0)
2453 _reserved_service_name = NULL;
2454 if (strcmp(reserved_service_name_mod, "null") == 0)
2455 _reserved_service_name_mod = NULL;
2457 if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, QUANTUMIZE, 0, 0, app_service_name, app_service_name_mod,
2458 _reserved_service_name, _reserved_service_name_mod, &return_code)) {
2459 LOGE("Unable to create alarm! return_code[%d]", return_code);
2460 strncpy(log_tag, "FAIL: CREATE", sizeof(log_tag) - 1);
2461 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2462 _alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2463 _save_module_log(log_tag, log_message);
2464 return_code = ERR_ALARM_SYSTEM_FAIL;
2466 return_code = ALARMMGR_RESULT_SUCCESS;
2467 *alarm_id = _alarm_id;
2473 time_t _get_periodic_alarm_standard_time(void)
2475 /* To avoid start time of all devices are same. */
2476 if (periodic_alarm_standard_time == 0)
2477 periodic_alarm_standard_time = g_random_int_range(0, BILLION) + 1;
2479 LOGD("periodic_standard_time : [%ld]", periodic_alarm_standard_time);
2480 return periodic_alarm_standard_time;
2483 int alarm_manager_alarm_create_periodic(GVariant *parameters, uid_t uid,
2484 pid_t pid, int *alarm_id)
2486 alarm_info_t alarm_info;
2487 int return_code = ALARMMGR_RESULT_SUCCESS;
2489 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2490 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2491 char *app_service_name = NULL;
2492 char *app_service_name_mod = NULL;
2493 int interval, is_ref, method;
2495 *alarm_id = _alarm_id;
2497 g_variant_get(parameters, "(&s&siii)", &app_service_name,
2498 &app_service_name_mod, &interval, &is_ref, &method);
2500 struct tm standard_tm;
2501 time_t standard_time = _get_periodic_alarm_standard_time();
2502 localtime_r(&standard_time, &standard_tm);
2504 alarm_info.reserved_info = standard_time;
2506 alarm_info.start.year = standard_tm.tm_year + 1900;
2507 alarm_info.start.month = standard_tm.tm_mon + 1;
2508 alarm_info.start.day = standard_tm.tm_mday;
2509 alarm_info.start.hour = standard_tm.tm_hour;
2510 alarm_info.start.min = standard_tm.tm_min;
2511 alarm_info.start.sec = standard_tm.tm_sec;
2513 alarm_info.msec = 0;
2515 alarm_info.end.year = 0;
2516 alarm_info.end.month = 0;
2517 alarm_info.end.day = 0;
2519 alarm_info.alarm_type = ALARM_TYPE_VOLATILE;
2520 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
2521 alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
2522 alarm_info.alarm_type |= ALARM_TYPE_PERIOD;
2524 if (interval <= 0) {
2525 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
2526 alarm_info.mode.u_interval.interval = 0;
2528 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
2530 alarm_info.mode.u_interval.interval = interval * 60;
2532 alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60, alarm_info.alarm_type);
2535 if (!__alarm_create(&alarm_info, &_alarm_id, uid, pid, (periodic_method_e)method, interval * 60, is_ref,
2536 app_service_name, app_service_name_mod,
2537 NULL, NULL, &return_code)) {
2538 LOGE("Unable to create alarm! return_code[%d]", return_code);
2539 strncpy(log_tag, "FAIL: CREAT PERIOD", sizeof(log_tag) - 1);
2540 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2541 _alarm_id, uid, pid, alarm_info.start.year, alarm_info.start.month,
2542 alarm_info.start.day, alarm_info.start.hour,
2543 alarm_info.start.min, alarm_info.start.sec);
2544 _save_module_log(log_tag, log_message);
2545 return_code = ERR_ALARM_SYSTEM_FAIL;
2547 return_code = ALARMMGR_RESULT_SUCCESS;
2548 *alarm_id = _alarm_id;
2554 int alarm_manager_alarm_delete(GVariant *parameters, uid_t uid, pid_t pid)
2556 int return_code = ALARMMGR_RESULT_SUCCESS;
2557 char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
2558 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
2561 g_variant_get(parameters, "(i)", &alarm_id);
2563 return_code = __check_modifiable(uid, pid, alarm_id);
2564 if (return_code != ALARMMGR_RESULT_SUCCESS)
2567 if (!__alarm_delete(uid, alarm_id, &return_code)) {
2568 LOGE("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2569 strncpy(log_tag, "FAIL: DELETE", sizeof(log_tag) - 1);
2571 LOGD("alarm_id[%d] is removed.", alarm_id);
2572 strncpy(log_tag, "DELETE", sizeof(log_tag) - 1);
2573 return_code = ALARMMGR_RESULT_SUCCESS;
2576 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d", alarm_id, uid, pid);
2577 _save_module_log(log_tag, log_message);
2582 int alarm_manager_alarm_delete_all(GVariant *parameters, uid_t uid, pid_t pid)
2584 GSList *gs_iter = NULL;
2585 char app_name[MAX_APP_ID_LEN] = { 0 };
2586 alarm_info_t *alarm_info = NULL;
2587 __alarm_info_t *entry = NULL;
2588 bool is_deleted = false;
2589 char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
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 g_variant_get(parameters, "(iiiiiiiiiixiixi)",
2652 &alarm_id, &start_year, &start_month, &start_day, &start_hour,
2653 &start_min, &start_sec, &end_year, &end_month, &end_day,
2654 &tmp_mode_interval, &mode_repeat, &alarm_type, &tmp_reserved_info,
2657 mode_interval = (time_t)tmp_mode_interval;
2658 reserved_info = (time_t)tmp_reserved_info;
2660 return_code = __check_modifiable(uid, pid, alarm_id);
2661 if (return_code != ALARMMGR_RESULT_SUCCESS)
2664 alarm_info.start.year = start_year;
2665 alarm_info.start.month = start_month;
2666 alarm_info.start.day = start_day;
2667 alarm_info.start.hour = start_hour;
2668 alarm_info.start.min = start_min;
2669 alarm_info.start.sec = start_sec;
2671 alarm_info.end.year = end_year;
2672 alarm_info.end.month = end_month;
2673 alarm_info.end.day = end_day;
2675 alarm_info.mode.u_interval.interval = mode_interval;
2676 alarm_info.mode.repeat = (alarm_repeat_mode_t)mode_repeat;
2678 alarm_info.alarm_type = alarm_type;
2679 alarm_info.reserved_info = reserved_info;
2681 if (!__alarm_update(uid, alarm_id, &alarm_info,
2682 update_flag, &return_code)) {
2683 LOGE("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
2684 strncpy(log_tag, "FAIL: UPDATE", sizeof(log_tag) - 1);
2685 snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
2686 alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
2687 _save_module_log(log_tag, log_message);
2693 int alarm_manager_alarm_get_number_of_ids(uid_t uid, pid_t pid, int *num_of_ids)
2695 GSList *gs_iter = NULL;
2696 char app_name[MAX_APP_ID_LEN] = { 0 };
2697 __alarm_info_t *entry = NULL;
2698 int _num_of_ids = 0;
2700 *num_of_ids = _num_of_ids;
2702 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false)
2703 return ERR_ALARM_SYSTEM_FAIL;
2705 SECURE_LOGD("Called by process (uid:%d, pid:%d, unique_name:%s)", uid, pid, app_name);
2707 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2708 entry = (__alarm_info_t*)gs_iter->data;
2709 SECURE_LOGD("app_name=%s, app_unique_name=%s", app_name, entry->app_unique_name);
2710 if (entry->uid == uid &&
2711 strncmp(app_name, entry->app_unique_name, strlen(app_name)) == 0) {
2713 SECURE_LOGD("inc number of alarms of app (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, _num_of_ids);
2717 SECURE_LOGD("number of alarms of the process (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, _num_of_ids);
2718 *num_of_ids = _num_of_ids;
2719 return ALARMMGR_RESULT_SUCCESS;
2722 int alarm_manager_alarm_get_list_of_ids(GVariant *parameters, uid_t uid,
2723 pid_t pid, GVariant **alarm_array, int *num_of_alarm)
2725 GSList *gs_iter = NULL;
2726 char app_name[MAX_APP_ID_LEN] = { 0 };
2727 __alarm_info_t *entry = NULL;
2729 int max_number_of_ids;
2730 GVariantBuilder *builder = NULL;
2732 *alarm_array = g_variant_new("ai", NULL);
2734 g_variant_get(parameters, "(i)", &max_number_of_ids);
2736 if (max_number_of_ids <= 0) {
2737 SECURE_LOGE("called for uid(%d) pid(%d), but max_number_of_ids(%d) is less than 0.", uid, pid, max_number_of_ids);
2739 return ALARMMGR_RESULT_SUCCESS;
2742 if (__get_cached_unique_name(pid, app_name, sizeof(app_name), NULL, uid) == false)
2743 return ERR_ALARM_SYSTEM_FAIL;
2745 SECURE_LOGD("Called by process (uid: %d, pid:%d, unique_name=%s).", uid, pid, app_name);
2746 builder = g_variant_builder_new(G_VARIANT_TYPE("ai"));
2748 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2749 entry = (__alarm_info_t*)gs_iter->data;
2750 if (entry->uid == uid &&
2751 strncmp(app_name, (entry->app_unique_name), strlen(app_name)) == 0) {
2752 g_variant_builder_add(builder, "i", entry->alarm_id);
2754 SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index);
2758 *alarm_array = g_variant_new("ai", builder);
2759 *num_of_alarm = index;
2761 g_variant_builder_unref(builder);
2762 SECURE_LOGE("Called by uid (%d), pid (%d), but max_number_of_ids(%d).", uid, pid, index);
2764 return ALARMMGR_RESULT_SUCCESS;
2767 int alarm_manager_alarm_get_appsvc_info(GVariant *parameters, uid_t uid, gchar **b_data)
2770 GSList *gs_iter = NULL;
2771 __alarm_info_t *entry = NULL;
2772 int return_code = ALARMMGR_RESULT_SUCCESS;
2775 g_variant_get(parameters, "(i)", &alarm_id);
2777 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2779 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2780 entry = (__alarm_info_t*)gs_iter->data;
2781 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2783 *b_data = g_strdup(entry->bundle);
2789 if (*b_data == NULL) {
2790 LOGE("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
2791 return_code = ERR_ALARM_INVALID_TYPE;
2794 LOGE("The alarm(%d) is not found.", alarm_id);
2795 return_code = ERR_ALARM_INVALID_ID;
2801 int alarm_manager_alarm_get_noti_info(GVariant *parameters, uid_t uid, gchar **noti_data)
2804 GSList *gs_iter = NULL;
2805 __alarm_info_t *entry = NULL;
2806 int return_code = ALARMMGR_RESULT_SUCCESS;
2809 g_variant_get(parameters, "(i)", &alarm_id);
2811 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2813 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2814 entry = (__alarm_info_t*)gs_iter->data;
2815 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2817 *noti_data = strdup(entry->noti);
2823 if (*noti_data == NULL) {
2824 LOGE("The alarm(%d) is an regular alarm, not svc alarm.", alarm_id);
2825 return_code = ERR_ALARM_INVALID_TYPE;
2828 LOGE("The alarm(%d) is not found.", alarm_id);
2829 return_code = ERR_ALARM_INVALID_ID;
2835 int alarm_manager_alarm_get_info(GVariant *parameters, uid_t uid, alarm_info_t *alarm_info)
2837 GSList *gs_iter = NULL;
2838 __alarm_info_t *entry = NULL;
2839 alarm_info_t *_alarm_info = NULL;
2842 g_variant_get(parameters, "(i)", &alarm_id);
2844 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2845 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2846 entry = (__alarm_info_t*)gs_iter->data;
2847 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2848 _alarm_info = &(entry->alarm_info);
2853 if (_alarm_info == NULL) {
2854 LOGE("The alarm(%d) is not found.", alarm_id);
2855 return ERR_ALARM_INVALID_ID;
2857 LOGD("The alarm(%d) is found.", alarm_id);
2858 alarm_info->start.year = _alarm_info->start.year;
2859 alarm_info->start.month = _alarm_info->start.month;
2860 alarm_info->start.day = _alarm_info->start.day;
2861 alarm_info->start.hour = _alarm_info->start.hour;
2862 alarm_info->start.min = _alarm_info->start.min;
2863 alarm_info->start.sec = _alarm_info->start.sec;
2864 alarm_info->end.year = _alarm_info->end.year;
2865 alarm_info->end.month = _alarm_info->end.month;
2866 alarm_info->end.day = _alarm_info->end.day;
2867 alarm_info->mode.u_interval.day_of_week =
2868 _alarm_info->mode.u_interval.day_of_week;
2869 alarm_info->mode.repeat = _alarm_info->mode.repeat;
2870 alarm_info->alarm_type = _alarm_info->alarm_type;
2871 alarm_info->reserved_info = _alarm_info->reserved_info;
2874 return ALARMMGR_RESULT_SUCCESS;
2877 int alarm_manager_alarm_get_next_duetime(GVariant *parameters, uid_t uid, time_t *duetime)
2879 GSList *gs_iter = NULL;
2880 __alarm_info_t *entry = NULL;
2881 __alarm_info_t *find_item = NULL;
2884 g_variant_get(parameters, "(i)", &alarm_id);
2886 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
2887 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2888 entry = (__alarm_info_t*)gs_iter->data;
2889 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2895 if (find_item == NULL) {
2896 LOGE("The alarm(%d) is not found.", alarm_id);
2897 return ERR_ALARM_INVALID_ID;
2900 _alarm_set_next_duetime(find_item);
2901 LOGD("Next duetime : %s", ctime(&(find_item->due_time)));
2903 *duetime = find_item->due_time;
2904 return ALARMMGR_RESULT_SUCCESS;
2907 int alarm_manager_alarm_get_all_info(uid_t uid, char **db_path)
2909 return _get_db_path_for_all_info(uid, &(*db_path));
2912 int alarm_manager_alarm_set_global(GVariant *parameters, uid_t uid)
2914 GSList *gs_iter = NULL;
2915 __alarm_info_t *entry = NULL;
2916 alarm_info_t *alarm_info = NULL;
2918 int return_code = ALARMMGR_RESULT_SUCCESS;
2923 g_variant_get(parameters, "(ib)", &alarm_id, &global);
2925 SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
2926 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2927 entry = (__alarm_info_t*)gs_iter->data;
2928 if (entry->uid == uid && entry->alarm_id == alarm_id) {
2929 alarm_info = &(entry->alarm_info);
2934 if (alarm_info == NULL) {
2935 LOGE("The alarm(%d) is not found.", alarm_id);
2936 return ERR_ALARM_INVALID_ID;
2938 LOGD("The alarm(%d) is found.", alarm_id);
2940 if (entry->callee_pkgid == NULL)
2941 callee_pkgid = entry->app_service_name + 6;
2943 callee_pkgid = entry->callee_pkgid;
2945 LOGD("The alarm pkgid : %s.", callee_pkgid);
2947 retval = _pkg_is_global(callee_pkgid, uid);
2948 if (retval == ALARMMGR_RESULT_SUCCESS) {
2949 entry->global = (bool)global;
2950 if (!_alarm_set_global_to_db(entry, (bool)global))
2951 return_code = ERR_ALARM_SYSTEM_FAIL;
2953 LOGE("Get pkginfo error [%d]", retval);
2954 return_code = retval;
2961 int alarm_manager_alarm_get_global(GVariant *parameters, gboolean *global)
2963 GSList *gs_iter = NULL;
2964 __alarm_info_t *entry = NULL;
2965 __alarm_info_t *find_item = NULL;
2968 g_variant_get(parameters, "(i)", &alarm_id);
2971 SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
2972 for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
2973 entry = (__alarm_info_t*)gs_iter->data;
2974 if (entry->alarm_id == alarm_id) {
2980 if (find_item == NULL) {
2981 LOGE("The alarm(%d) is not found.", alarm_id);
2982 return ERR_ALARM_INVALID_ID;
2985 *global = (gboolean)find_item->global;
2986 LOGD("Is global : %d", *global);
2988 return ALARMMGR_RESULT_SUCCESS;
2991 static void __initialize_alarm_list()
2993 alarm_context.alarms = NULL;
2994 alarm_context.c_due_time = -1;
2996 _load_alarms_from_db();
2998 _rtc_set(); /*Set RTC1 Alarm with alarm due time for alarm-manager initialization*/
3001 static void __initialize_scheduled_alarm_list()
3003 _clear_scheduled_alarm_list();
3006 static void __initialize_noti()
3008 /* VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL is set by OSP app-service. */
3009 if (vconf_notify_key_changed
3010 (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) {
3011 LOGD("Failed to add callback for time external changing event.");
3014 /* If the caller or callee app is uninstalled, all registered alarms will be canceled. */
3015 pkgmgr_client *pc = pkgmgr_client_new(PC_LISTENING);
3016 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_UNINSTALL);
3017 pkgmgr_client_listen_status(pc, __on_app_uninstalled, NULL);
3019 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_ENABLE_APP);
3020 pkgmgr_client_listen_app_status(pc, __on_app_enable_cb, NULL);
3022 pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_DISABLE_APP);
3023 pkgmgr_client_listen_app_status(pc, __on_app_disable_cb, NULL);
3026 void _alarm_initialize()
3028 #if !(GLIB_CHECK_VERSION(2, 36, 0))
3033 int expire_mode = ALARM_EXPIRE_MODE_NORMAL;
3034 vconf_get_int(VCONFKEY_ALARM_EXPIRE_MODE, &expire_mode);
3035 LOGD("alarm_expire_mode : %d", expire_mode);
3037 alarm_context.timer = _initialize_timer();
3038 if (alarm_context.timer == -1) {
3039 LOGE("because _initialize_timer failed, "
3040 "alarm-server cannot be runned.\n");
3044 if (_initialize_dbus() == false) {
3045 /* because dbus's initialize
3046 * failed, we cannot continue any more. */
3047 LOGE("because _initialize_dbus failed, "
3048 "alarm-server cannot be runned.\n");
3052 _initialize_module_log(); /* for module log */
3054 __initialize_scheduled_alarm_list();
3055 if (_initialize_db() == false) {
3056 LOGE("_initialize_db failed, "
3057 "alarm cannot be stored to database.\n");
3059 __initialize_alarm_list();
3060 __initialize_noti();
3062 if (!caller_appid_cache_table) {
3063 caller_appid_cache_table = g_hash_table_new_full(g_direct_hash,
3064 g_direct_equal, NULL, __free_cached_value);
3068 void _release_alarm_info_t(__alarm_info_t *entry)
3073 if (entry->caller_pkgid)
3074 free(entry->caller_pkgid);
3075 if (entry->callee_pkgid)
3076 free(entry->callee_pkgid);
3077 if (entry->app_unique_name)
3078 free(entry->app_unique_name);
3079 if (entry->app_service_name)
3080 free(entry->app_service_name);
3081 if (entry->app_service_name_mod)
3082 free(entry->app_service_name_mod);
3083 if (entry->dst_service_name)
3084 free(entry->dst_service_name);
3086 if (entry->dst_service_name_mod)
3087 free(entry->dst_service_name_mod);
3089 free(entry->bundle);