#define BILLION 1000000000 /* for calculating nano seconds */
static time_t periodic_alarm_standard_time = 0;
+static int __is_ui_app(const char *appid, uid_t uid);
+static long __get_proper_interval(long interval, int alarm_type);
static bool __alarm_add_to_list(__alarm_info_t *__alarm_info);
static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id);
-static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
- int *error_code);
+static __alarm_info_t *__alarm_update_in_list(int uid, alarm_id_t alarm_id,
+ alarm_info_t *alarm_info, int update_flag, int *error_code);
static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
int *error_code);
static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code);
static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
-static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
- alarm_info_t *alarm_info, int *error_code);
+static bool __alarm_update(uid_t uid, int pid, alarm_id_t alarm_id,
+ alarm_info_t *alarm_info, int update_flag, int *error_code);
static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, int msec, uid_t uid);
static void __alarm_expired();
static gboolean __alarm_handler_idle(gpointer user_data);
return true;
}
-static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
- int *error_code)
+static bool __check_bundle_for_update(const gchar *b_data, uid_t uid)
+{
+ const char *callee_appid;
+ bundle *b;
+
+ if (strlen(b_data) == 4 && strncmp(b_data, "null", 4) == 0)
+ return true;
+
+ b = bundle_decode((bundle_raw *)b_data, strlen(b_data));
+ callee_appid = appsvc_get_appid(b);
+ if (callee_appid == NULL)
+ return false;
+
+ if (__is_ui_app(callee_appid, uid))
+ return true;
+
+ return false;
+}
+
+static __alarm_info_t *__alarm_update_in_list(int uid, alarm_id_t alarm_id,
+ alarm_info_t *alarm_info, int update_flag, int *error_code)
{
bool found = false;
- alarm_info_t *alarm_info = &__alarm_info->alarm_info;
GSList *iter = NULL;
__alarm_info_t *entry = NULL;
+ alarm_info_t *_alarm_info = NULL;
for (iter = alarm_context.alarms; iter != NULL;
iter = g_slist_next(iter)) {
entry = iter->data;
- if (entry->uid == __alarm_info->uid &&
- entry->alarm_id == __alarm_info->alarm_id) {
+ if (entry->uid == uid &&
+ entry->alarm_id == alarm_id) {
found = true;
- __alarm_info->quark_app_unique_name =
- entry->quark_app_unique_name;
- __alarm_info->quark_dst_service_name =
- entry->quark_dst_service_name;
- memcpy(entry, __alarm_info, sizeof(__alarm_info_t));
+ _alarm_info = &entry->alarm_info;
+
+ if (update_flag == ALARM_UPDATE_FLAG_TIME ||
+ ALARM_UPDATE_FLAG_WEEK) {
+ if (!__check_bundle_for_update(g_quark_to_string(entry->quark_bundle),
+ entry->uid)) {
+ *error_code = ERR_ALARM_NOT_PERMITTED_APP;
+ return NULL;
+ }
+ }
+ if (update_flag == ALARM_UPDATE_FLAG_TIME) {
+ __alarm_set_start_and_end_time(alarm_info, entry);
+ } else if (update_flag == ALARM_UPDATE_FLAG_PERIOD) {
+ _alarm_info->alarm_type |= ALARM_TYPE_INEXACT;
+ _alarm_info->alarm_type |= ALARM_TYPE_PERIOD;
+ _alarm_info->mode.repeat = ALARM_REPEAT_MODE_REPEAT;
+ _alarm_info->mode.u_interval.interval =
+ __get_proper_interval(alarm_info->mode.u_interval.interval,
+ _alarm_info->alarm_type);
+ } else if (update_flag == ALARM_UPDATE_FLAG_WEEK) {
+ _alarm_info->alarm_type &= ~ALARM_TYPE_INEXACT;
+ _alarm_info->mode = alarm_info->mode;
+ } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_PERIOD) {
+ if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_REPEAT) {
+ _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
+ _alarm_info->mode.u_interval.interval = 0;
+ }
+ } else if (update_flag == ALARM_UPDATE_FLAG_CLEAR_WEEK_FLAG) {
+ if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_WEEKLY) {
+ _alarm_info->mode.repeat = ALARM_REPEAT_MODE_ONCE;
+ _alarm_info->mode.u_interval.interval = 0;
+ }
+ }
break;
}
}
if (!found) {
if (error_code)
*error_code = ERR_ALARM_INVALID_ID;
- return false;
+ return NULL;
}
if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) {
- if (!_update_alarms(__alarm_info))
- ALARM_MGR_EXCEPTION_PRINT("Updating alarm_id(%d) in DB is failed.", __alarm_info->alarm_id);
+ if (!_update_alarms(entry))
+ ALARM_MGR_EXCEPTION_PRINT("Updating alarm_id(%d) in DB is failed.", alarm_id);
}
- return true;
+ return entry;
}
static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
return true;
}
-static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
- alarm_info_t *alarm_info, int *error_code)
+static bool __alarm_update(uid_t uid, int pid, alarm_id_t alarm_id,
+ alarm_info_t *alarm_info, int update_flag, int *error_code)
{
time_t current_time;
time_t due_time;
__alarm_info_t *__alarm_info = NULL;
bool result = false;
- __alarm_info = malloc(sizeof(__alarm_info_t));
- if (__alarm_info == NULL) {
- SECURE_LOGE("Caution!! app_pid=%d, malloc failed. it seems to be OOM.", pid);
- *error_code = ERR_ALARM_SYSTEM_FAIL;
- return false;
- }
-
- __alarm_info->uid = uid;
- __alarm_info->pid = pid;
- __alarm_info->alarm_id = alarm_id;
-
- /* we should consider to check whether pid is running or Not
- */
-
- __alarm_info->quark_app_service_name =
- g_quark_from_string(app_service_name);
- __alarm_set_start_and_end_time(alarm_info, __alarm_info);
- memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
-
time(¤t_time);
if (alarm_context.c_due_time < current_time) {
alarm_context.c_due_time = -1;
}
- due_time = _alarm_next_duetime(__alarm_info);
- if (!__alarm_update_in_list(__alarm_info, error_code)) {
- free(__alarm_info);
+ __alarm_info = __alarm_update_in_list(uid, alarm_id, alarm_info,
+ update_flag, error_code);
+ if (!__alarm_info) {
ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: requested alarm_id "
"(%d) does not exist. so this value is invalid id.", alarm_id);
return false;
}
+ due_time = _alarm_next_duetime(__alarm_info);
+
result = _remove_from_scheduled_alarm_list(uid, alarm_id);
if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
if (due_time == 0)
ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: due_time is 0.");
- free(__alarm_info);
return true;
}
if (due_time == 0) {
ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
"due_time is 0, alarm(%d)\n", alarm_id);
- free(__alarm_info);
return true;
} else if (current_time == due_time) {
ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Update alarm: "
"current_time(%d) is same as due_time(%d)", current_time,
due_time);
- free(__alarm_info);
return true;
} else if (difftime(due_time, current_time) < 0) {
ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%d, Current Time=%d]!!!Do not add to schedule list\n", due_time, current_time);
- free(__alarm_info);
return true;
} else {
char due_time_r[100] = { 0 };
__rtc_set();
- free(__alarm_info);
-
return true;
}
}
gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *invoc,
- char *app_service_name, alarm_id_t alarm_id,
+ alarm_id_t alarm_id,
int start_year, int start_month,
int start_day, int start_hour,
int start_min, int start_sec, int end_year,
int end_month, int end_day,
- int mode_day_of_week, int mode_repeat,
+ int mode_interval,
+ int mode_repeat,
int alarm_type, int reserved_info,
+ int update_flag,
gpointer user_data)
{
int return_code = ALARMMGR_RESULT_SUCCESS;
alarm_info.end.month = end_month;
alarm_info.end.day = end_day;
- alarm_info.mode.u_interval.day_of_week = mode_day_of_week;
+ alarm_info.mode.u_interval.interval = mode_interval;
alarm_info.mode.repeat = mode_repeat;
alarm_info.alarm_type = alarm_type;
alarm_info.reserved_info = reserved_info;
- if (!__alarm_update(uid, pid, app_service_name, alarm_id, &alarm_info, &return_code)) {
+ if (!__alarm_update(uid, pid, alarm_id, &alarm_info,
+ update_flag, &return_code)) {
ALARM_MGR_EXCEPTION_PRINT("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
strncpy(log_tag, "FAIL: UPDATE", strlen("FAIL: UPDATE"));
g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
- snprintf(log_message, sizeof(log_message), "alarmID: %d, appname: %s, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
- alarm_id, app_service_name, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
+ snprintf(log_message, sizeof(log_message), "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
+ alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
__save_module_log(log_tag, log_message);
#endif