d12c866524eee5d7985136a9f14576eeac7e2610
[platform/core/messaging/email-service.git] / email-core / email-core-alarm.c
1 /*\r
2 *  email-service\r
3 *\r
4 * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.\r
5 *\r
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>\r
7 *\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
11 *\r
12 * http://www.apache.org/licenses/LICENSE-2.0\r
13 *\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
19 *\r
20 */\r
21 \r
22 \r
23 /******************************************************************************\r
24  * File :  email-core-alarm.c\r
25  * Desc :  Alarm Management\r
26  *\r
27  * Auth :  Kyuho Jo\r
28  *\r
29  * History :\r
30  *    2013.01.28  :  created\r
31  *****************************************************************************/\r
32 #include <stdio.h>\r
33 #include <stdlib.h>\r
34 #include <string.h>\r
35 #include <time.h>\r
36 #include <sys/types.h>\r
37 #include <vconf.h>\r
38 #include <glib.h>\r
39 #include <alarm.h>\r
40 #ifdef __FEATURE_USE_APPSYNC__\r
41 #include <appsync.h>
42 #endif\r
43 \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
54 \r
55 \r
56 #define EMAIL_ALARM_DESTINATION "email-service-0"\r
57 \r
58 GList *alarm_data_list = NULL;\r
59 \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
61 {\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
66 \r
67         if (output_alarm_data == NULL) {\r
68                 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");\r
69                 err = EMAIL_ERROR_INVALID_PARAM;\r
70                 goto FINISH_OFF;\r
71         }\r
72 \r
73         while(index) {\r
74                 alarm_data = index->data;\r
75                 if(alarm_data->alarm_id == input_alarm_id) {\r
76                         break;\r
77                 }\r
78                 index = g_list_next(index);\r
79         }\r
80 \r
81         if(alarm_data)\r
82                 *output_alarm_data = alarm_data;\r
83         else\r
84                 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;\r
85 \r
86 FINISH_OFF:\r
87 \r
88         EM_DEBUG_FUNC_END("err [%d]", err);\r
89         return err;\r
90 }\r
91 \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
93 {\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
98 \r
99         if (output_alarm_data == NULL) {\r
100                 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");\r
101                 err = EMAIL_ERROR_INVALID_PARAM;\r
102                 goto FINISH_OFF;\r
103         }\r
104 \r
105         while(index) {\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
109                         break;\r
110                 }\r
111                 index = g_list_next(index);\r
112         }\r
113 \r
114         if(index)\r
115                 *output_alarm_data = alarm_data;\r
116         else\r
117                 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;\r
118 \r
119 FINISH_OFF:\r
120 \r
121         EM_DEBUG_FUNC_END("err [%d]", err);\r
122         return err;\r
123 }\r
124 \r
125 \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
127 {\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
131 \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
135                 goto FINISH_OFF;\r
136         }\r
137 \r
138         alarm_data = em_malloc(sizeof(email_alarm_data_t));\r
139 \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
143                 goto FINISH_OFF;\r
144         }\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
151 \r
152         alarm_data_list = g_list_append(alarm_data_list, (gpointer)alarm_data);\r
153 \r
154 FINISH_OFF:\r
155 \r
156         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
157         return EMAIL_ERROR_NONE;\r
158 }\r
159 \r
160 static int emcore_remove_alarm(email_alarm_data_t *input_alarm_data)\r
161 {\r
162         EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);\r
163 \r
164         int ret = ALARMMGR_RESULT_SUCCESS;\r
165         int err = EMAIL_ERROR_NONE;\r
166 \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
171         }\r
172 \r
173         EM_DEBUG_FUNC_END("err [%d]", err);\r
174         return EMAIL_ERROR_NONE;\r
175 }\r
176 \r
177 INTERNAL_FUNC int emcore_delete_alram_data_from_alarm_data_list(email_alarm_data_t *input_alarm_data)\r
178 {\r
179         EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);\r
180         int err = EMAIL_ERROR_NONE;\r
181 \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
184         }\r
185 \r
186         alarm_data_list = g_list_remove(alarm_data_list, input_alarm_data);\r
187 \r
188         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
189         return EMAIL_ERROR_NONE;\r
190 }\r
191 \r
192 INTERNAL_FUNC int emcore_delete_alram_data_by_reference_id(int input_class_id, int input_reference_id)\r
193 {\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
197 \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
200                 goto FINISH_OFF;\r
201         }\r
202 \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
205         }\r
206 FINISH_OFF:\r
207         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
208         return EMAIL_ERROR_NONE;\r
209 }\r
210 \r
211 static int default_alarm_callback(int input_timer_id, void *user_parameter)\r
212 {\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
216 \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
219                 goto FINISH_OFF;\r
220         }\r
221 \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
224                 goto FINISH_OFF;\r
225         }\r
226 \r
227         emcore_delete_alram_data_from_alarm_data_list(alarm_data);\r
228         EM_SAFE_FREE(alarm_data);\r
229 \r
230 FINISH_OFF:\r
231 \r
232 \r
233         EM_DEBUG_FUNC_END("err [%d]", err);\r
234         return err;\r
235 }\r
236 \r
237 INTERNAL_FUNC int emcore_init_alarm_data_list()\r
238 {\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
243 \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
247                 goto FINISH_OFF;\r
248         }\r
249 \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
253                 goto FINISH_OFF;\r
254         }\r
255 \r
256 FINISH_OFF:\r
257 \r
258         EM_DEBUG_FUNC_END("err [%d]", err);\r
259         return err;\r
260 }\r
261 \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
263 {\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
265 \r
266         int err = EMAIL_ERROR_NONE;\r
267         int ret = 0;\r
268         time_t alarm_interval = 0;\r
269         time_t current_time = 0;\r
270         alarm_id_t alarm_id = 0;\r
271 \r
272         time(&current_time);\r
273 \r
274         alarm_interval = input_trigger_at_time - current_time;\r
275 \r
276         /* old style */
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
282                         goto FINISH_OFF;\r
283                 }\r
284         }\r
285         else
286 #endif
287         {\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
291                         goto FINISH_OFF;\r
292                 }\r
293         }\r
294 \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
297                 goto FINISH_OFF;\r
298         }\r
299 \r
300 FINISH_OFF:\r
301 \r
302         EM_DEBUG_FUNC_END("err [%d]", err);\r
303         return err;\r
304 }\r