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
41 #include "email-convert.h"
\r
42 #include "email-types.h"
\r
43 #include "email-daemon.h"
\r
44 #include "email-debug-log.h"
\r
45 #include "email-storage.h"
\r
46 #include "email-network.h"
\r
47 #include "email-utilities.h"
\r
48 #include "email-core-utils.h"
\r
49 #include "email-core-global.h"
\r
50 #include "email-core-alarm.h"
\r
52 #ifdef __FEATURE_USE_APPSYNC__
\r
57 #define EMAIL_ALARM_DESTINATION "email-service-0"
\r
59 GList *alarm_data_list = NULL;
\r
61 INTERNAL_FUNC int emcore_get_alarm_data_by_alarm_id(alarm_id_t input_alarm_id, email_alarm_data_t **output_alarm_data)
\r
63 EM_DEBUG_FUNC_BEGIN("input_alarm_id [%d] output_alarm_data [%p]", input_alarm_id, output_alarm_data);
\r
64 int err = EMAIL_ERROR_NONE;
\r
65 GList *index = g_list_first(alarm_data_list);
\r
66 email_alarm_data_t *alarm_data = NULL;
\r
68 if (output_alarm_data == NULL) {
\r
69 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
70 err = EMAIL_ERROR_INVALID_PARAM;
\r
75 alarm_data = index->data;
\r
76 if(alarm_data->alarm_id == input_alarm_id) {
\r
79 index = g_list_next(index);
\r
83 *output_alarm_data = alarm_data;
\r
85 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;
\r
89 EM_DEBUG_FUNC_END("err [%d]", err);
\r
93 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
95 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
96 int err = EMAIL_ERROR_NONE;
\r
97 GList *index = g_list_first(alarm_data_list);
\r
98 email_alarm_data_t *alarm_data = NULL;
\r
100 if (output_alarm_data == NULL) {
\r
101 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
102 err = EMAIL_ERROR_INVALID_PARAM;
\r
107 alarm_data = index->data;
\r
108 if(alarm_data->class_id == input_class_id && alarm_data->reference_id == input_reference_id) {
\r
109 EM_DEBUG_LOG("found");
\r
112 index = g_list_next(index);
\r
116 *output_alarm_data = alarm_data;
\r
118 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;
\r
122 EM_DEBUG_FUNC_END("err [%d]", err);
\r
127 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
129 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
130 int err = EMAIL_ERROR_NONE;
\r
131 email_alarm_data_t *alarm_data = NULL;
\r
133 if (input_alarm_id == 0 || input_trigger_at_time == 0 || input_alarm_callback == NULL) {
\r
134 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
\r
135 err = EMAIL_ERROR_INVALID_PARAM;
\r
139 alarm_data = em_malloc(sizeof(email_alarm_data_t));
\r
141 if(alarm_data == NULL) {
\r
142 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
\r
143 err = EMAIL_ERROR_OUT_OF_MEMORY;
\r
146 alarm_data->alarm_id = input_alarm_id;
\r
147 alarm_data->class_id = input_class_id;
\r
148 alarm_data->reference_id = input_reference_id;
\r
149 alarm_data->trigger_at_time = input_trigger_at_time;
\r
150 alarm_data->alarm_callback = input_alarm_callback;
\r
151 alarm_data->user_data = user_data;
\r
153 alarm_data_list = g_list_append(alarm_data_list, (gpointer)alarm_data);
\r
157 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
158 return EMAIL_ERROR_NONE;
\r
161 static int emcore_remove_alarm(email_alarm_data_t *input_alarm_data)
\r
163 EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);
\r
165 int ret = ALARMMGR_RESULT_SUCCESS;
\r
166 int err = EMAIL_ERROR_NONE;
\r
168 EM_DEBUG_LOG("alarm_id [%d]", input_alarm_data->alarm_id);
\r
169 if ((ret = alarmmgr_remove_alarm(input_alarm_data->alarm_id)) != ALARMMGR_RESULT_SUCCESS) {
\r
170 EM_DEBUG_EXCEPTION("delete of alarm id failed [%d]", ret);
\r
171 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
174 EM_DEBUG_FUNC_END("err [%d]", err);
\r
175 return EMAIL_ERROR_NONE;
\r
178 INTERNAL_FUNC int emcore_delete_alram_data_from_alarm_data_list(email_alarm_data_t *input_alarm_data)
\r
180 EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);
\r
181 int err = EMAIL_ERROR_NONE;
\r
183 if ((err = emcore_remove_alarm(input_alarm_data)) != EMAIL_ERROR_NONE) {
\r
184 EM_DEBUG_EXCEPTION("emcore_remove_alarm failed[%d]", err);
\r
187 alarm_data_list = g_list_remove(alarm_data_list, input_alarm_data);
\r
189 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
190 return EMAIL_ERROR_NONE;
\r
193 INTERNAL_FUNC int emcore_delete_alram_data_by_reference_id(int input_class_id, int input_reference_id)
\r
195 EM_DEBUG_FUNC_BEGIN("input_class_id[%d] input_reference_id[%d]", input_class_id, input_reference_id);
\r
196 int err = EMAIL_ERROR_NONE;
\r
197 email_alarm_data_t *alarm_data = NULL;
\r
199 if ((err = emcore_get_alarm_data_by_reference_id(input_class_id, input_reference_id, &alarm_data)) != EMAIL_ERROR_NONE) {
\r
200 EM_DEBUG_EXCEPTION("emcore_remove_alarm failed[%d]", err);
\r
204 if ((err = emcore_delete_alram_data_from_alarm_data_list(alarm_data)) != EMAIL_ERROR_NONE) {
\r
205 EM_DEBUG_EXCEPTION("emcore_delete_alram_data_from_alarm_data_list failed[%d]", err);
\r
208 EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);
\r
209 return EMAIL_ERROR_NONE;
\r
212 static int default_alarm_callback(int input_timer_id, void *user_parameter)
\r
214 EM_DEBUG_FUNC_BEGIN("input_timer_id [%d] user_parameter [%p]", input_timer_id, user_parameter);
\r
215 int err = EMAIL_ERROR_NONE;
\r
216 email_alarm_data_t *alarm_data = NULL;
\r
218 if ((err = emcore_get_alarm_data_by_alarm_id(input_timer_id, &alarm_data)) != EMAIL_ERROR_NONE || alarm_data == NULL) {
\r
219 EM_DEBUG_EXCEPTION("emcore_get_alarm_data_by_alarm_id failed [%d]", err);
\r
223 if ((err = alarm_data->alarm_callback(input_timer_id, user_parameter)) != EMAIL_ERROR_NONE) {
\r
224 EM_DEBUG_EXCEPTION("alarm_callback failed [%d]", err);
\r
228 emcore_delete_alram_data_from_alarm_data_list(alarm_data);
\r
229 EM_SAFE_FREE(alarm_data);
\r
234 EM_DEBUG_FUNC_END("err [%d]", err);
\r
238 INTERNAL_FUNC int emcore_init_alarm_data_list()
\r
240 EM_DEBUG_FUNC_BEGIN();
\r
241 int ret = ALARMMGR_RESULT_SUCCESS;
\r
242 int err = EMAIL_ERROR_NONE;
\r
243 alarm_data_list = NULL;
\r
245 if ((ret = alarmmgr_init(EMAIL_ALARM_DESTINATION)) != ALARMMGR_RESULT_SUCCESS) {
\r
246 EM_DEBUG_EXCEPTION("alarmmgr_init failed [%d]",ret);
\r
247 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
251 if ((ret = alarmmgr_set_cb(default_alarm_callback, NULL)) != ALARMMGR_RESULT_SUCCESS) {
\r
252 EM_DEBUG_EXCEPTION("alarmmgr_set_cb() failed [%d]", ret);
\r
253 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
259 EM_DEBUG_FUNC_END("err [%d]", err);
\r
263 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
265 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
267 int err = EMAIL_ERROR_NONE;
\r
269 time_t alarm_interval = 0;
\r
270 time_t current_time = 0;
\r
271 alarm_id_t alarm_id = 0;
\r
273 time(¤t_time);
\r
275 alarm_interval = input_trigger_at_time - current_time;
\r
278 #ifdef __FEATURE_USE_APPSYNC__
\r
279 if(input_class_id == EMAIL_ALARM_CLASS_AUTO_POLLING) {
\r
280 if ((ret = appsync_daemon_schedule_after_delay(alarm_interval, 0, &alarm_id)) != APPSYNC_ERROR_NONE) {
\r
281 EM_DEBUG_EXCEPTION("appsync_daemon_schedule_after_delay failed [%d]",ret);
\r
282 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
289 if ((ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, alarm_interval, ALARM_REPEAT_MODE_ONCE, EMAIL_ALARM_DESTINATION, &alarm_id)) != ALARMMGR_RESULT_SUCCESS) {
\r
290 EM_DEBUG_EXCEPTION("alarmmgr_add_alarm failed [%d]",ret);
\r
291 err = EMAIL_ERROR_SYSTEM_FAILURE;
\r
296 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
297 EM_DEBUG_EXCEPTION("emcore_add_alarm_data_to_alarm_data_list failed [%d]", err);
\r
303 EM_DEBUG_FUNC_END("err [%d]", err);
\r