apply removal of mailbox_name field
[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 \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
51
52 #ifdef __FEATURE_USE_APPSYNC__\r
53 #include <appsync.h>
54 #endif\r
55 \r
56 \r
57 #define EMAIL_ALARM_DESTINATION "email-service-0"\r
58 \r
59 GList *alarm_data_list = NULL;\r
60 \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
62 {\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
67 \r
68         if (output_alarm_data == NULL) {\r
69                 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");\r
70                 err = EMAIL_ERROR_INVALID_PARAM;\r
71                 goto FINISH_OFF;\r
72         }\r
73 \r
74         while(index) {\r
75                 alarm_data = index->data;\r
76                 if(alarm_data->alarm_id == input_alarm_id) {\r
77                         break;\r
78                 }\r
79                 index = g_list_next(index);\r
80         }\r
81 \r
82         if(alarm_data)\r
83                 *output_alarm_data = alarm_data;\r
84         else\r
85                 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;\r
86 \r
87 FINISH_OFF:\r
88 \r
89         EM_DEBUG_FUNC_END("err [%d]", err);\r
90         return err;\r
91 }\r
92 \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
94 {\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
99 \r
100         if (output_alarm_data == NULL) {\r
101                 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");\r
102                 err = EMAIL_ERROR_INVALID_PARAM;\r
103                 goto FINISH_OFF;\r
104         }\r
105 \r
106         while(index) {\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
110                         break;\r
111                 }\r
112                 index = g_list_next(index);\r
113         }\r
114 \r
115         if(index)\r
116                 *output_alarm_data = alarm_data;\r
117         else\r
118                 err = EMAIL_ERROR_ALARM_DATA_NOT_FOUND;\r
119 \r
120 FINISH_OFF:\r
121 \r
122         EM_DEBUG_FUNC_END("err [%d]", err);\r
123         return err;\r
124 }\r
125 \r
126 \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
128 {\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
132 \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
136                 goto FINISH_OFF;\r
137         }\r
138 \r
139         alarm_data = em_malloc(sizeof(email_alarm_data_t));\r
140 \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
144                 goto FINISH_OFF;\r
145         }\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
152 \r
153         alarm_data_list = g_list_append(alarm_data_list, (gpointer)alarm_data);\r
154 \r
155 FINISH_OFF:\r
156 \r
157         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
158         return EMAIL_ERROR_NONE;\r
159 }\r
160 \r
161 static int emcore_remove_alarm(email_alarm_data_t *input_alarm_data)\r
162 {\r
163         EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);\r
164 \r
165         int ret = ALARMMGR_RESULT_SUCCESS;\r
166         int err = EMAIL_ERROR_NONE;\r
167 \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
172         }\r
173 \r
174         EM_DEBUG_FUNC_END("err [%d]", err);\r
175         return EMAIL_ERROR_NONE;\r
176 }\r
177 \r
178 INTERNAL_FUNC int emcore_delete_alram_data_from_alarm_data_list(email_alarm_data_t *input_alarm_data)\r
179 {\r
180         EM_DEBUG_FUNC_BEGIN("input_alarm_data [%p]", input_alarm_data);\r
181         int err = EMAIL_ERROR_NONE;\r
182 \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
185         }\r
186 \r
187         alarm_data_list = g_list_remove(alarm_data_list, input_alarm_data);\r
188 \r
189         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
190         return EMAIL_ERROR_NONE;\r
191 }\r
192 \r
193 INTERNAL_FUNC int emcore_delete_alram_data_by_reference_id(int input_class_id, int input_reference_id)\r
194 {\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
198 \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
201                 goto FINISH_OFF;\r
202         }\r
203 \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
206         }\r
207 FINISH_OFF:\r
208         EM_DEBUG_FUNC_END("err [%d]", EMAIL_ERROR_NONE);\r
209         return EMAIL_ERROR_NONE;\r
210 }\r
211 \r
212 static int default_alarm_callback(int input_timer_id, void *user_parameter)\r
213 {\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
217 \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
220                 goto FINISH_OFF;\r
221         }\r
222 \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
225                 goto FINISH_OFF;\r
226         }\r
227 \r
228         emcore_delete_alram_data_from_alarm_data_list(alarm_data);\r
229         EM_SAFE_FREE(alarm_data);\r
230 \r
231 FINISH_OFF:\r
232 \r
233 \r
234         EM_DEBUG_FUNC_END("err [%d]", err);\r
235         return err;\r
236 }\r
237 \r
238 INTERNAL_FUNC int emcore_init_alarm_data_list()\r
239 {\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
244 \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
248                 goto FINISH_OFF;\r
249         }\r
250 \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
254                 goto FINISH_OFF;\r
255         }\r
256 \r
257 FINISH_OFF:\r
258 \r
259         EM_DEBUG_FUNC_END("err [%d]", err);\r
260         return err;\r
261 }\r
262 \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
264 {\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
266 \r
267         int err = EMAIL_ERROR_NONE;\r
268         int ret = 0;\r
269         time_t alarm_interval = 0;\r
270         time_t current_time = 0;\r
271         alarm_id_t alarm_id = 0;\r
272 \r
273         time(&current_time);\r
274 \r
275         alarm_interval = input_trigger_at_time - current_time;\r
276 \r
277         /* old style */
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
283                         goto FINISH_OFF;\r
284                 }\r
285         }\r
286         else
287 #endif
288         {\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
292                         goto FINISH_OFF;\r
293                 }\r
294         }\r
295 \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
298                 goto FINISH_OFF;\r
299         }\r
300 \r
301 FINISH_OFF:\r
302 \r
303         EM_DEBUG_FUNC_END("err [%d]", err);\r
304         return err;\r
305 }\r