4 * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
\r
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
\r
8 * Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * you may not use this file except in compliance with the License.
\r
10 * You may obtain a copy of the License at
\r
12 * http://www.apache.org/licenses/LICENSE-2.0
\r
14 * Unless required by applicable law or agreed to in writing, software
\r
15 * distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * See the License for the specific language governing permissions and
\r
18 * limitations under the License.
\r
23 /******************************************************************************
\r
24 * File : email-core-alarm.c
\r
25 * Desc : Alarm Management
\r
30 * 2013.01.28 : created
\r
31 *****************************************************************************/
\r
36 #include <sys/types.h>
\r
40 #ifdef __FEATURE_USE_APPSYNC__
\r
44 #include "email-convert.h"
\r
45 #include "email-types.h"
\r
46 #include "email-daemon.h"
\r
47 #include "email-debug-log.h"
\r
48 #include "email-storage.h"
\r
49 #include "email-network.h"
\r
50 #include "email-utilities.h"
\r
51 #include "email-core-utils.h"
\r
52 #include "email-core-global.h"
\r
53 #include "email-core-alarm.h"
\r
56 #define EMAIL_ALARM_DESTINATION "email-service-0"
\r
58 GList *alarm_data_list = NULL;
\r
60 INTERNAL_FUNC int emcore_get_alarm_data_by_alarm_id(alarm_id_t input_alarm_id, email_alarm_data_t **output_alarm_data)
\r
62 EM_DEBUG_FUNC_BEGIN("input_alarm_id [%d] output_alarm_data [%p]", input_alarm_id, output_alarm_data);
\r
63 int err = EMAIL_ERROR_NONE;
\r
64 GList *index = g_list_first(alarm_data_list);
\r
65 email_alarm_data_t *alarm_data = NULL;
\r
67 if (output_alarm_data == NULL) {
\r
68 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
69 err = EMAIL_ERROR_INVALID_PARAM;
\r
74 alarm_data = index->data;
\r
75 if(alarm_data->alarm_id == input_alarm_id) {
\r
78 index = g_list_next(index);
\r
82 *output_alarm_data = alarm_data;
\r
84 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;
\r
88 EM_DEBUG_FUNC_END("err [%d]", err);
\r
92 INTERNAL_FUNC int emcore_get_alarm_data_by_reference_id(int input_class_id, int input_reference_id, email_alarm_data_t **output_alarm_data)
\r
94 EM_DEBUG_FUNC_BEGIN("input_class_id [%d] input_reference_id [%d] output_alarm_data [%p]", input_class_id, input_reference_id, output_alarm_data);
\r
95 int err = EMAIL_ERROR_NONE;
\r
96 GList *index = g_list_first(alarm_data_list);
\r
97 email_alarm_data_t *alarm_data = NULL;
\r
99 if (output_alarm_data == NULL) {
\r
100 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
101 err = EMAIL_ERROR_INVALID_PARAM;
\r
106 alarm_data = index->data;
\r
107 if(alarm_data->class_id == input_class_id && alarm_data->reference_id == input_reference_id) {
\r
108 EM_DEBUG_LOG("found");
\r
111 index = g_list_next(index);
\r
115 *output_alarm_data = alarm_data;
\r
117 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;
\r
121 EM_DEBUG_FUNC_END("err [%d]", err);
\r
126 static int emcore_add_alarm_data_to_alarm_data_list(alarm_id_t input_alarm_id, int input_class_id, int input_reference_id, time_t input_trigger_at_time, int (*input_alarm_callback)(int, void *), void *user_data)
\r
128 EM_DEBUG_FUNC_BEGIN("input_alarm_id [%d] input_class_id[%d] input_reference_id[%d] input_trigger_at_time[%d] input_alarm_callback [%p] user_data[%p]", input_alarm_id, input_class_id, input_reference_id, input_trigger_at_time, input_alarm_callback, user_data);
\r
129 int err = EMAIL_ERROR_NONE;
\r
130 email_alarm_data_t *alarm_data = NULL;
\r
132 if (input_alarm_id == 0 || input_trigger_at_time == 0 || input_alarm_callback == NULL) {
\r
133 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
134 err = EMAIL_ERROR_INVALID_PARAM;
\r
138 alarm_data = em_malloc(sizeof(email_alarm_data_t));
\r
140 if(alarm_data == NULL) {
\r
141 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
\r
142 err = EMAIL_ERROR_OUT_OF_MEMORY;
\r
145 alarm_data->alarm_id = input_alarm_id;
\r
146 alarm_data->class_id = input_class_id;
\r
147 alarm_data->reference_id = input_reference_id;
\r
148 alarm_data->trigger_at_time = input_trigger_at_time;
\r
149 alarm_data->alarm_callback = input_alarm_callback;
\r
150 alarm_data->user_data = user_data;
\r
152 alarm_data_list = g_list_append(alarm_data_list, (gpointer)alarm_data);
\r
156 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
157 return EMAIL_ERROR_NONE;
\r
160 static int emcore_remove_alarm(email_alarm_data_t *input_alarm_data)
\r
162 EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);
\r
164 int ret = ALARMMGR_RESULT_SUCCESS;
\r
165 int err = EMAIL_ERROR_NONE;
\r
167 EM_DEBUG_LOG("alarm_id [%d]", input_alarm_data->alarm_id);
\r
168 if ((ret = alarmmgr_remove_alarm(input_alarm_data->alarm_id)) != ALARMMGR_RESULT_SUCCESS) {
\r
169 EM_DEBUG_EXCEPTION("delete of alarm id failed [%d]", ret);
\r
170 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
173 EM_DEBUG_FUNC_END("err [%d]", err);
\r
174 return EMAIL_ERROR_NONE;
\r
177 INTERNAL_FUNC int emcore_delete_alram_data_from_alarm_data_list(email_alarm_data_t *input_alarm_data)
\r
179 EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);
\r
180 int err = EMAIL_ERROR_NONE;
\r
182 if ((err = emcore_remove_alarm(input_alarm_data)) != EMAIL_ERROR_NONE) {
\r
183 EM_DEBUG_EXCEPTION("emcore_remove_alarm failed[%d]", err);
\r
186 alarm_data_list = g_list_remove(alarm_data_list, input_alarm_data);
\r
188 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
189 return EMAIL_ERROR_NONE;
\r
192 INTERNAL_FUNC int emcore_delete_alram_data_by_reference_id(int input_class_id, int input_reference_id)
\r
194 EM_DEBUG_FUNC_BEGIN("input_class_id[%d] input_reference_id[%d]", input_class_id, input_reference_id);
\r
195 int err = EMAIL_ERROR_NONE;
\r
196 email_alarm_data_t *alarm_data = NULL;
\r
198 if ((err = emcore_get_alarm_data_by_reference_id(input_class_id, input_reference_id, &alarm_data)) != EMAIL_ERROR_NONE) {
\r
199 EM_DEBUG_EXCEPTION("emcore_remove_alarm failed[%d]", err);
\r
203 if ((err = emcore_delete_alram_data_from_alarm_data_list(alarm_data)) != EMAIL_ERROR_NONE) {
\r
204 EM_DEBUG_EXCEPTION("emcore_delete_alram_data_from_alarm_data_list failed[%d]", err);
\r
207 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
208 return EMAIL_ERROR_NONE;
\r
211 static int default_alarm_callback(int input_timer_id, void *user_parameter)
\r
213 EM_DEBUG_FUNC_BEGIN("input_timer_id [%d] user_parameter [%p]", input_timer_id, user_parameter);
\r
214 int err = EMAIL_ERROR_NONE;
\r
215 email_alarm_data_t *alarm_data = NULL;
\r
217 if ((err = emcore_get_alarm_data_by_alarm_id(input_timer_id, &alarm_data)) != EMAIL_ERROR_NONE || alarm_data == NULL) {
\r
218 EM_DEBUG_EXCEPTION("emcore_get_alarm_data_by_alarm_id failed [%d]", err);
\r
222 if ((err = alarm_data->alarm_callback(input_timer_id, user_parameter)) != EMAIL_ERROR_NONE) {
\r
223 EM_DEBUG_EXCEPTION("alarm_callback failed [%d]", err);
\r
227 emcore_delete_alram_data_from_alarm_data_list(alarm_data);
\r
228 EM_SAFE_FREE(alarm_data);
\r
233 EM_DEBUG_FUNC_END("err [%d]", err);
\r
237 INTERNAL_FUNC int emcore_init_alarm_data_list()
\r
239 EM_DEBUG_FUNC_BEGIN();
\r
240 int ret = ALARMMGR_RESULT_SUCCESS;
\r
241 int err = EMAIL_ERROR_NONE;
\r
242 alarm_data_list = NULL;
\r
244 if ((ret = alarmmgr_init(EMAIL_ALARM_DESTINATION)) != ALARMMGR_RESULT_SUCCESS) {
\r
245 EM_DEBUG_EXCEPTION("alarmmgr_init failed [%d]",ret);
\r
246 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
250 if ((ret = alarmmgr_set_cb(default_alarm_callback, NULL)) != ALARMMGR_RESULT_SUCCESS) {
\r
251 EM_DEBUG_EXCEPTION("alarmmgr_set_cb() failed [%d]", ret);
\r
252 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
258 EM_DEBUG_FUNC_END("err [%d]", err);
\r
262 INTERNAL_FUNC int emcore_add_alarm(time_t input_trigger_at_time, int input_class_id, int input_reference_id, int (*input_alarm_callback)(int, void *), void *input_user_data)
\r
264 EM_DEBUG_FUNC_BEGIN("input_trigger_at_time[%d] input_class_id[%d] input_reference_id[%d] input_alarm_callback[%p] input_user_data[%p]", input_trigger_at_time, input_class_id, input_reference_id, input_alarm_callback, input_user_data);
\r
266 int err = EMAIL_ERROR_NONE;
\r
268 time_t alarm_interval = 0;
\r
269 time_t current_time = 0;
\r
270 alarm_id_t alarm_id = 0;
\r
272 time(¤t_time);
\r
274 alarm_interval = input_trigger_at_time - current_time;
\r
277 #ifdef __FEATURE_USE_APPSYNC__
\r
278 if(input_class_id == EMAIL_ALARM_CLASS_AUTO_POLLING) {
\r
279 if ((ret = appsync_daemon_schedule_after_delay(alarm_interval, 0, &alarm_id)) != APPSYNC_ERROR_NONE) {
\r
280 EM_DEBUG_EXCEPTION("appsync_daemon_schedule_after_delay failed [%d]",ret);
\r
281 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
288 if ((ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, alarm_interval, ALARM_REPEAT_MODE_ONCE, EMAIL_ALARM_DESTINATION, &alarm_id)) != ALARMMGR_RESULT_SUCCESS) {
\r
289 EM_DEBUG_EXCEPTION("alarmmgr_add_alarm failed [%d]",ret);
\r
290 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
295 if((err = emcore_add_alarm_data_to_alarm_data_list(alarm_id, input_class_id, input_reference_id, input_trigger_at_time, input_alarm_callback, input_user_data)) != EMAIL_ERROR_NONE) {
\r
296 EM_DEBUG_EXCEPTION("emcore_add_alarm_data_to_alarm_data_list failed [%d]", err);
\r
302 EM_DEBUG_FUNC_END("err [%d]", err);
\r