4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 #include "email-internal-types.h"
25 #ifdef __FEATURE_AUTO_POLLING__
31 #include <stdarg.h> /* Needed for the definition of va_list */
34 #include "email-types.h"
35 #include "email-daemon.h"
36 #include "email-daemon-auto-poll.h"
37 #include "email-core-utils.h"
38 #include "email-debug-log.h"
39 #include "email-storage.h"
40 #include "email-utilities.h"
42 typedef struct _emf_account_alarm_binder
47 } email_account_alarm_binder;
50 typedef struct _emf_account_alarm_binder_list_t
52 email_account_alarm_binder account_alarm_binder;
53 struct _emf_account_alarm_binder_list_t *next;
54 }email_account_alarm_binder_list_t;
56 /* sowmya.kr@samsung.com, 23022010, Implementation of auto-polling feature */
58 email_account_alarm_binder_list_t *g_account_alarm_binder_list = NULL;
60 static int _emdaemon_get_polling_alarm_and_timerinterval(int account_id, alarm_id_t *alarm_id, int *timer_interval);
61 static int _emdaemon_get_polling_account_and_timeinterval(alarm_id_t alarm_id, int *account_id, int *timer_interval);
62 static int _emdaemon_create_alarm(int alarm_interval, alarm_id_t *p_alarm_id);
63 static int _emdaemon_add_to_account_alarm_binder_list(email_account_alarm_binder_list_t *p_account_alarm_binder);
64 static int _emdaemon_remove_from_account_alarm_binder_list(int account_id);
65 static int _emdaemon_update_account_alarm_binder_list(int account_id, alarm_id_t alarm_id);
67 INTERNAL_FUNC int emdaemon_add_polling_alarm(int account_id, int alarm_interval)
69 EM_DEBUG_FUNC_BEGIN();
71 if(!account_id || (alarm_interval <= 0)) {
72 EM_DEBUG_EXCEPTION("Invalid param");
75 EM_DEBUG_EXCEPTION(" emdaemon_add_polling_alarm : account_id [%d]",account_id);
76 if(emdaemon_check_auto_polling_started(account_id)) {
77 EM_DEBUG_EXCEPTION("auto polling already started for account : return");
81 alarm_id_t alarmID = 0;
82 email_account_alarm_binder_list_t *p_account_alarm_binder = NULL;
84 if(!_emdaemon_create_alarm(alarm_interval, &alarmID)) {
85 EM_DEBUG_EXCEPTION("_emdaemon_create_alarm failed");
89 p_account_alarm_binder = (email_account_alarm_binder_list_t*)em_malloc(sizeof(email_account_alarm_binder_list_t));
90 if(!p_account_alarm_binder) {
91 EM_DEBUG_EXCEPTION("malloc Failed ");
95 p_account_alarm_binder->account_alarm_binder.account_id = account_id;
96 p_account_alarm_binder->account_alarm_binder.alarm_id = alarmID;
97 p_account_alarm_binder->account_alarm_binder.timer_interval = alarm_interval;
99 _emdaemon_add_to_account_alarm_binder_list(p_account_alarm_binder);
105 INTERNAL_FUNC int emdaemon_remove_polling_alarm(int account_id)
107 EM_DEBUG_FUNC_BEGIN();
110 EM_DEBUG_EXCEPTION("Invalid param ");
114 alarm_id_t alarm_id = 0;
115 int a_nErrorCode = 0, retval =0;
117 if(!_emdaemon_get_polling_alarm_and_timerinterval(account_id,&alarm_id,NULL)) {
118 EM_DEBUG_EXCEPTION("_emdaemon_get_polling_alarm_and_timerinterval failed");
124 a_nErrorCode = alarmmgr_remove_alarm(alarm_id);
126 EM_DEBUG_LOG("ErrorCode :%d, Return Value:%d ",a_nErrorCode,retval);
132 /* delete from list */
133 if(!_emdaemon_remove_from_account_alarm_binder_list(account_id)) {
134 EM_DEBUG_EXCEPTION("_emdaemon_remove_from_account_alarm_binder_list failed");
141 INTERNAL_FUNC int emdaemon_check_auto_polling_started(int account_id)
143 EM_DEBUG_FUNC_BEGIN();
145 if(g_account_alarm_binder_list == NULL) {
146 EM_DEBUG_EXCEPTION("g_account_alarm_binder_list NULL ");
150 email_account_alarm_binder_list_t *p_temp = g_account_alarm_binder_list;
151 int match_found = false;
153 while(p_temp != NULL) {
154 if(p_temp->account_alarm_binder.account_id == account_id) {
155 EM_DEBUG_EXCEPTION("account match found : polling already started");
159 p_temp = p_temp->next;
163 EM_DEBUG_EXCEPTION("account match not found : polling not started");
168 INTERNAL_FUNC int emdaemon_alarm_polling_cb(alarm_id_t alarm_id, void* user_param)
170 EM_DEBUG_FUNC_BEGIN();
173 time_t ct = time(&ct);
174 struct tm* lt = localtime(&ct);
177 EM_DEBUG_LOG( "Current Time : [%d-%d-%d %d:%d:%d] ",
178 lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday,
179 lt->tm_hour, lt->tm_min, lt->tm_sec);
183 email_mailbox_t mailbox = {0};
184 int account_id = 0, err = EMAIL_ERROR_NONE, timer_interval =0, alarmID =0,ret = false;
185 char* mailbox_name = NULL;
187 if(!_emdaemon_get_polling_account_and_timeinterval(alarm_id,&account_id,&timer_interval)) {
188 EM_DEBUG_EXCEPTION("email_get_polling_account failed");
192 EM_DEBUG_EXCEPTION(" emdaemon_alarm_polling_cb : account_id [%d]",account_id);
193 /* create alarm, for polling */
194 if(!_emdaemon_create_alarm(timer_interval,&alarmID)) {
195 EM_DEBUG_EXCEPTION("_emdaemon_create_alarm failed");
199 /*update alarm ID in list */
200 /* delete from list */
201 if(!_emdaemon_update_account_alarm_binder_list(account_id,alarmID)) {
202 EM_DEBUG_EXCEPTION("_emdaemon_update_account_alarm_binder_list failed");
206 memset(&mailbox, 0x00, sizeof(email_mailbox_t));
207 mailbox.account_id = account_id;
209 if (!emstorage_get_mailbox_name_by_mailbox_type(mailbox.account_id,EMAIL_MAILBOX_TYPE_INBOX,&mailbox_name, false, &err)) {
210 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_name_by_mailbox_type failed [%d]", err);
215 mailbox.mailbox_name = mailbox_name;
217 if (!emdaemon_sync_header(account_id, mailbox.mailbox_id, NULL, &err)) {
218 EM_DEBUG_EXCEPTION("emdaemon_sync_header falied [%d]", err);
224 EM_SAFE_FREE(mailbox_name);
229 static int _emdaemon_get_polling_alarm_and_timerinterval(int account_id, alarm_id_t *alarm_id, int *timer_interval)
231 EM_DEBUG_FUNC_BEGIN();
233 if(!account_id || !alarm_id)
236 if(g_account_alarm_binder_list == NULL) {
237 EM_DEBUG_EXCEPTION("g_account_alarm_binder_list NULL ");
241 email_account_alarm_binder_list_t *p_temp = g_account_alarm_binder_list;
242 int match_found = false;
244 while(p_temp != NULL) {
245 if(p_temp->account_alarm_binder.account_id == account_id) {
246 EM_DEBUG_EXCEPTION("account match found ");
247 *alarm_id = p_temp->account_alarm_binder.alarm_id;
250 *timer_interval = p_temp->account_alarm_binder.timer_interval;
256 p_temp = p_temp->next;
260 EM_DEBUG_EXCEPTION("account match not found ");
268 static int _emdaemon_get_polling_account_and_timeinterval(alarm_id_t alarm_id, int *account_id, int *timer_interval)
270 EM_DEBUG_FUNC_BEGIN();
272 if(!alarm_id || !account_id)
275 if(g_account_alarm_binder_list == NULL) {
276 EM_DEBUG_EXCEPTION("g_account_alarm_binder_list NULL ");
280 email_account_alarm_binder_list_t *p_temp = g_account_alarm_binder_list;
281 int match_found = false;
283 while(p_temp != NULL) {
284 if(p_temp->account_alarm_binder.alarm_id == alarm_id) {
285 EM_DEBUG_EXCEPTION("aalrm match found ");
286 *account_id = p_temp->account_alarm_binder.account_id;
289 *timer_interval = p_temp->account_alarm_binder.timer_interval;
295 p_temp = p_temp->next;
299 EM_DEBUG_EXCEPTION("aalrm match not found ");
306 #define AUTO_POLL_DESTINATION "org.tizen.email-service"
307 static int _emdaemon_create_alarm(int alarm_interval, alarm_id_t *p_alarm_id)
309 EM_DEBUG_FUNC_BEGIN();
312 time_t ct = time(&ct);
313 struct tm* lt = localtime(&ct);
316 EM_DEBUG_LOG( "Current Time : [%d-%d-%d %d:%d:%d] ",
317 lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday,
318 lt->tm_hour, lt->tm_min, lt->tm_sec);
321 /* alarm_info_t alarm_info = {0}; */
322 int a_nErrorCode = 0;
325 if((alarm_interval <= 0) || !p_alarm_id) {
326 EM_DEBUG_EXCEPTION("Invalid param ");
330 /* time_t current_time = {0}; */
331 /* struct tm current_tm = {0}; */
334 /* Fill alarm info */
335 /* int timeFormat = 0; */ /*0 means 12hrs , 1 means 24hrs*/
337 /* TO DO, need to findout header for DBG_MID_MSGPORTING_NORMAL and then we have to use this */
338 /* error_code = vconf_get_int(DBG_MID_MSGPORTING_NORMAL, &timeFormat); */
340 a_nErrorCode = alarmmgr_init(AUTO_POLL_DESTINATION);
341 EM_DEBUG_LOG("ErrorCode :%d, Return Value:%d ",a_nErrorCode,retval);
346 a_nErrorCode = alarmmgr_set_cb(emdaemon_alarm_polling_cb, NULL);
347 EM_DEBUG_LOG("ErrorCode :%d, Return Value:%d ",a_nErrorCode,retval);
352 error_code = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, alarm_interval * 60 /*(sec)*/, ALARM_REPEAT_MODE_ONCE, AUTO_POLL_DESTINATION, p_alarm_id);
354 EM_DEBUG_LOG("ErrorCode :%d,Return Value :%d ",error_code,retval);
362 INTERNAL_FUNC int emdaemon_free_account_alarm_binder_list()
364 EM_DEBUG_FUNC_BEGIN();
366 email_account_alarm_binder_list_t *p = g_account_alarm_binder_list, *p_next = NULL;
367 int a_nErrorCode = 0;
369 /* delete alarm as well */
372 if (p->account_alarm_binder.alarm_id > 0) {
373 a_nErrorCode = alarmmgr_remove_alarm(p->account_alarm_binder.alarm_id);
381 g_account_alarm_binder_list = NULL;
386 static int _emdaemon_add_to_account_alarm_binder_list(email_account_alarm_binder_list_t *p_account_alarm_binder)
388 email_account_alarm_binder_list_t *p_temp = NULL;
390 if(!p_account_alarm_binder) {
391 EM_DEBUG_EXCEPTION("Invalid param ");
395 if(g_account_alarm_binder_list == NULL) {
396 g_account_alarm_binder_list = p_account_alarm_binder;
397 p_account_alarm_binder = NULL;
400 p_temp = g_account_alarm_binder_list;
401 while(p_temp->next != NULL)
402 p_temp = p_temp->next;
404 p_temp->next = p_account_alarm_binder;
405 p_account_alarm_binder = NULL;
411 static int _emdaemon_remove_from_account_alarm_binder_list(int account_id)
413 email_account_alarm_binder_list_t *p_temp = g_account_alarm_binder_list, *p_prev = NULL;
414 int match_found = false;
417 EM_DEBUG_EXCEPTION("Invalid param ");
421 /* first node mattch */
422 if(p_temp->account_alarm_binder.account_id == account_id) {
425 g_account_alarm_binder_list = p_temp->next;
426 EM_SAFE_FREE(p_temp);
429 while(p_temp != NULL) {
430 if(p_temp->account_alarm_binder.account_id == account_id) {
431 EM_DEBUG_EXCEPTION("account match found ");
433 p_prev->next = p_temp->next;
434 EM_SAFE_FREE(p_temp);
441 p_temp = p_temp->next;
451 static int _emdaemon_update_account_alarm_binder_list(int account_id, alarm_id_t alarm_id)
453 email_account_alarm_binder_list_t *p_temp = g_account_alarm_binder_list;
454 int match_found = false;
456 if( !account_id || !alarm_id) {
457 EM_DEBUG_EXCEPTION("Invalid param ");
461 while(p_temp != NULL) {
462 if(p_temp->account_alarm_binder.account_id == account_id) {
463 EM_DEBUG_EXCEPTION("account match found ");
464 /* update alarm id */
465 p_temp->account_alarm_binder.alarm_id = alarm_id;
469 p_temp = p_temp->next;
473 EM_DEBUG_EXCEPTION("account match not found ");