4 * Copyright (c) 2012 - 2013 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.
29 #include <contacts_internal.h>
31 #include "email-convert.h"
32 #include "email-storage.h"
33 #include "email-network.h"
34 #include "email-device.h"
35 #include "email-utilities.h"
36 #include "email-daemon.h"
37 #include "email-daemon-auto-poll.h"
38 #include "email-core-global.h"
39 #include "email-core-account.h"
40 #include "email-core-event.h"
41 #include "email-core-utils.h"
42 #include "email-core-mailbox.h"
43 #include "email-core-imap-mailbox.h"
44 #include "email-core-mail.h"
45 #include "email-core-mailbox-sync.h"
46 #include "email-core-smtp.h"
47 #include "email-core-utils.h"
48 #include "email-core-dpm.h"
49 #include "email-core-signal.h"
50 #include "email-debug-log.h"
52 #include "email-types.h"
53 #include "email-internal-types.h"
55 extern thread_t g_srv_thread;
56 extern pthread_cond_t _event_available_signal;
57 extern pthread_mutex_t *_event_queue_lock;
58 extern pthread_mutex_t *_event_handle_map_lock;
59 extern pthread_mutex_t *_event_callback_table_lock;
60 extern GQueue *g_event_que;
61 extern int g_event_loop;
62 extern int recv_thread_run;
65 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
66 extern pthread_cond_t _auto_downalod_available_signal;
69 static void *worker_event_queue(void *arg);
70 static int event_handler_EMAIL_EVENT_SYNC_HEADER(char *multi_user_name, int input_account_id, int input_mailbox_id, int handle_to_be_published, int *error);
71 static int event_handler_EMAIL_EVENT_VALIDATE_AND_CREATE_ACCOUNT(char *multi_user_name, email_account_t *account, int handle_to_be_published, int *error);
72 static int event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT_EX(char *multi_user_name, email_account_t *input_account, int input_handle_to_be_published);
73 static int event_handler_EMAIL_EVENT_VALIDATE_AND_UPDATE_ACCOUNT(char *multi_user_name, int account_id, email_account_t *new_account_info, int handle_to_be_published, int *error);
74 static int event_handler_EMAIL_EVENT_SET_MAIL_SLOT_SIZE(char *multi_user_name, int account_id, int mailbox_id, int new_slot_size, int handle_to_be_published, int *error);
75 static int event_handler_EMAIL_EVENT_EXPUNGE_MAILS_DELETED_FLAGGED(char *multi_user_name, int input_account_id, int input_mailbox_id);
76 static int event_handler_EMAIL_EVENT_DOWNLOAD_BODY(char *multi_user_name, int account_id, int mail_id, int option, int handle_to_be_published, int *error);
77 static int event_handler_EMAIL_EVENT_DOWNLOAD_ATTACHMENT(char *multi_user_name, int account_id, int mail_id, int attachment_no, int handle_to_be_published, int *error);
78 static int event_handler_EMAIL_EVENT_SYNC_FLAGS_FIELD_TO_SERVER(char *multi_user_name,
82 email_flags_field_type field_type,
85 static int event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT(char *multi_user_name, int account_id, int handle_to_be_published, int *error);
86 static int event_handler_EMAIL_EVENT_UPDATE_MAIL(char *multi_user_name, email_mail_data_t *input_mail_data, email_attachment_data_t *input_attachment_data_list, int input_attachment_count, email_meeting_request_t* input_meeting_request, int input_from_eas, int handle_to_be_published);
87 static int event_handler_EMAIL_EVENT_SAVE_MAIL(char *multi_user_name, int input_account_id, int input_mail_id, int input_handle_to_be_published);
88 static int event_handler_EMAIL_EVENT_MOVE_MAIL(char *multi_user_name, int account_id, int *mail_ids, int mail_id_count, int dest_mailbox_id, int src_mailbox_id, int handle_to_be_published, int *error);
89 static int event_handler_EMAIL_EVENT_DELETE_MAILBOX(char *multi_user_name, int mailbox_id, int on_server, int recursive, int handle_to_be_published);
90 static int event_handler_EMAIL_EVENT_CREATE_MAILBOX(char *multi_user_name, email_mailbox_t *input_new_mailbox, int on_server, int handle_to_be_published);
91 static int event_handler_EMAIL_EVENT_SYNC_MAIL_FLAG_TO_SERVER(char *multi_user_name, int mail_id, int event_handle, int *error);
92 static int event_handler_EMAIL_EVENT_DELETE_MAIL_ALL(char *multi_user_name, int input_account_id, int input_mailbox_id, int input_from_server, int *error);
94 static int event_handler_EMAIL_EVENT_DELETE_MAIL(char *multi_user_name,
102 static int event_hanlder_EMAIL_EVENT_SYNC_HEADER_OMA(char *multi_user_name, int account_id, char *maibox_name, int handle_to_be_published, int *error);
103 static int event_handler_EMAIL_EVENT_SEARCH_ON_SERVER(char *multi_user_name, int account_id, int mailbox_id, email_search_filter_t *input_search_filter, int input_search_filter_count, int handle_to_be_published);
104 static int event_handler_EMAIL_EVENT_RENAME_MAILBOX_ON_IMAP_SERVER(char *multi_user_name, int input_account_id, int input_mailbox_id, char *input_old_mailbox_path, char *input_new_mailbox_path, char *input_new_mailbox_alias, int handle_to_be_published);
106 static void* worker_send_event_queue(void *arg);
108 extern thread_t g_send_srv_thread;
109 extern pthread_cond_t _send_event_available_signal;
110 extern pthread_mutex_t *_send_event_queue_lock;
111 extern pthread_mutex_t *_send_event_handle_map_lock;
113 extern GQueue *g_send_event_que;
114 extern int g_send_event_loop;
115 extern int send_thread_run;
117 extern thread_t g_partial_body_thd;
118 extern pthread_cond_t _partial_body_thd_cond;
119 extern pthread_mutex_t _partial_body_thd_event_queue_lock;
121 extern email_event_partial_body_thd g_partial_body_thd_event_que[TOTAL_PARTIAL_BODY_EVENTS];
122 extern email_event_partial_body_thd g_partial_body_bulk_dwd_que[BULK_PARTIAL_BODY_DOWNLOAD_COUNT];
123 extern int g_partial_body_thd_next_event_idx;
124 //extern int g_partial_body_thd_loop;
125 extern int g_partial_body_thd_queue_empty;
126 extern int g_partial_body_thd_queue_full;
127 extern int g_partial_body_bulk_dwd_queue_empty;
129 extern email_event_t *sync_failed_event_data;
131 static gpointer partial_body_download_thread(gpointer data);
133 /* start api event_data loop */
134 INTERNAL_FUNC int emdaemon_start_event_loop(int *err_code)
136 EM_DEBUG_FUNC_BEGIN();
139 if (err_code != NULL)
140 *err_code = EMAIL_ERROR_NONE;
142 g_event_que = g_queue_new();
143 g_queue_init(g_event_que);
146 EM_DEBUG_EXCEPTION("service thread is already running...");
147 if (err_code != NULL)
148 *err_code = EMAIL_ERROR_UNKNOWN;
154 /* initialize lock */
155 INITIALIZE_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
156 INITIALIZE_RECURSIVE_CRITICAL_SECTION(_event_handle_map_lock);
157 INITIALIZE_RECURSIVE_CRITICAL_SECTION(_event_callback_table_lock);
159 emcore_initialize_event_callback_table();
162 THREAD_CREATE(g_srv_thread, worker_event_queue, NULL, thread_error);
164 if (thread_error != 0) {
165 EM_DEBUG_EXCEPTION("cannot create thread");
167 if (err_code != NULL)
168 *err_code = EMAIL_ERROR_SYSTEM_FAILURE;
172 if (err_code != NULL)
173 *err_code = EMAIL_ERROR_NONE;
178 /*Send event_data loop*/
179 INTERNAL_FUNC int emdaemon_start_event_loop_for_sending_mails(int *err_code)
181 EM_DEBUG_FUNC_BEGIN();
182 int thread_error = -1;
184 if (err_code != NULL)
185 *err_code = EMAIL_ERROR_NONE;
187 g_send_event_que = g_queue_new();
188 g_queue_init(g_send_event_que);
190 if (g_send_srv_thread) {
191 EM_DEBUG_EXCEPTION("send service thread is already running...");
192 if (err_code != NULL)
193 *err_code = EMAIL_ERROR_UNKNOWN;
197 g_send_event_loop = 1;
199 /* initialize lock */
200 INITIALIZE_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
201 INITIALIZE_RECURSIVE_CRITICAL_SECTION(_send_event_handle_map_lock);
202 INITIALIZE_CONDITION_VARIABLE(_send_event_available_signal);
205 THREAD_CREATE_JOINABLE(g_send_srv_thread, worker_send_event_queue, thread_error);
207 if (thread_error != 0) {
208 EM_DEBUG_EXCEPTION("cannot make thread...");
209 g_send_event_loop = 0;
210 if (err_code != NULL)
211 *err_code = EMAIL_ERROR_SYSTEM_FAILURE;
215 if (err_code != NULL)
216 *err_code = EMAIL_ERROR_NONE;
222 static void* worker_event_queue(void *arg)
224 EM_DEBUG_FUNC_BEGIN();
226 int err = EMAIL_ERROR_NONE;
227 int is_storage_full = false;
229 email_event_t *event_data = NULL;
230 email_event_t *started_event = NULL;
231 emstorage_account_tbl_t *account_tbl = NULL;
232 int handle_to_be_published = 0;
233 int pbd_thd_state = 0;
234 int send_event_que_state = 0;
236 if (!emstorage_open(NULL, &err)) {
237 EM_DEBUG_EXCEPTION("emstorage_open falied [%d]", err);
241 /* check that event_data loop is continuous */
242 while (emcore_event_loop_continue()) {
244 pbd_thd_state = emcore_get_pbd_thd_state();
245 send_event_que_state = emcore_is_send_event_queue_empty();
247 /* get a event_data from event_data queue */
248 ENTER_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
249 if (!emcore_retrieve_event(&event_data, &err)) {
250 /* no event_data pending */
251 if (err != EMAIL_ERROR_EVENT_QUEUE_EMPTY) {
252 LEAVE_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
257 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_RECEVING_WORKER, true, NULL);
259 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
261 if ((err = emnetwork_get_wifi_status(&wifi_status)) != EMAIL_ERROR_NONE) {
262 EM_DEBUG_EXCEPTION("emnetwork_get_wifi_status failed [%d]", err);
265 EM_DEBUG_LOG("WIFI Status [%d]", wifi_status);
267 if (!pbd_thd_state && send_event_que_state && wifi_status > 1) {
268 WAKE_CONDITION_VARIABLE(_auto_downalod_available_signal);
272 //go to sleep when queue is empty
273 SLEEP_CONDITION_VARIABLE(_event_available_signal, *_event_queue_lock);
274 EM_DEBUG_LOG("Wake up by _event_available_signal");
275 LEAVE_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
277 LEAVE_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
278 EM_DEBUG_LOG_DEV(">>>>>>>>>>>>>>> Got event_data !!! <<<<<<<<<<<<<<<");
280 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_RECEVING_WORKER, false, NULL);
282 handle_to_be_published = event_data->handle;
283 EM_DEBUG_LOG("Handle to be Published [%d]", handle_to_be_published);
286 /* Handling storage full */
287 is_storage_full = false;
288 if (event_data->type == EMAIL_EVENT_SYNC_HEADER ||
289 event_data->type == EMAIL_EVENT_SYNC_HEADER_OMA ||
290 event_data->type == EMAIL_EVENT_DOWNLOAD_BODY ||
291 event_data->type == EMAIL_EVENT_DOWNLOAD_ATTACHMENT) {
293 if ((err = emcore_is_storage_full()) == EMAIL_ERROR_MAIL_MEMORY_FULL) {
294 EM_DEBUG_EXCEPTION("Storage is full");
295 switch (event_data->type) {
296 case EMAIL_EVENT_SYNC_HEADER:
297 case EMAIL_EVENT_SYNC_HEADER_OMA:
298 noti_id = NOTI_DOWNLOAD_FAIL;
300 case EMAIL_EVENT_DOWNLOAD_BODY:
301 noti_id = NOTI_DOWNLOAD_BODY_FAIL;
303 case EMAIL_EVENT_DOWNLOAD_ATTACHMENT:
304 noti_id = NOTI_DOWNLOAD_ATTACH_FAIL;
310 if (!emcore_notify_network_event(noti_id, event_data->account_id, NULL, handle_to_be_published, err))
311 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] Failed >>>> ");
312 is_storage_full = true;
318 if (event_data->account_id > 0) {
319 if (!emstorage_get_account_by_id(event_data->multi_user_name, event_data->account_id, EMAIL_ACC_GET_OPT_DEFAULT, &account_tbl, false, &err)) {
320 EM_DEBUG_EXCEPTION("emstorage_get_account_by_id [%d]", err);
325 EM_DEBUG_LOG("account_id : [%d], sync_disabled : [%d]", event_data->account_id, account_tbl->sync_disabled);
327 if (!account_tbl || account_tbl->sync_disabled == 0) {
328 switch (event_data->type) {
329 case EMAIL_EVENT_SYNC_IMAP_MAILBOX: /* get imap mailbox list */
330 if (!emcore_sync_mailbox_list(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_3, handle_to_be_published, &err))
331 EM_DEBUG_EXCEPTION("emcore_sync_mailbox_list failed [%d]", err);
334 case EMAIL_EVENT_SYNC_HEADER: /* synchronize mail header */
335 if (is_storage_full == false)
336 event_handler_EMAIL_EVENT_SYNC_HEADER(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_5, handle_to_be_published, &err);
339 case EMAIL_EVENT_SYNC_HEADER_OMA: /* synchronize mail header for OMA */
340 if (is_storage_full == false)
341 event_hanlder_EMAIL_EVENT_SYNC_HEADER_OMA(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_1, handle_to_be_published, &err);
344 case EMAIL_EVENT_DOWNLOAD_BODY: /* download mail body */
345 if (is_storage_full == false)
346 event_handler_EMAIL_EVENT_DOWNLOAD_BODY(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, event_data->event_param_data_5, handle_to_be_published, &err);
349 case EMAIL_EVENT_DOWNLOAD_ATTACHMENT: /* download attachment */
350 if (is_storage_full == false)
351 event_handler_EMAIL_EVENT_DOWNLOAD_ATTACHMENT(event_data->multi_user_name, event_data->account_id, (int)event_data->event_param_data_4, event_data->event_param_data_5, handle_to_be_published, &err);
354 case EMAIL_EVENT_SYNC_FLAGS_FIELD_TO_SERVER: /* Sync flags field */
355 event_handler_EMAIL_EVENT_SYNC_FLAGS_FIELD_TO_SERVER(event_data->multi_user_name,
356 event_data->account_id,
357 (int*)event_data->event_param_data_3,
358 event_data->event_param_data_4 ,
359 event_data->event_param_data_5,
360 event_data->event_param_data_6,
364 case EMAIL_EVENT_DELETE_MAIL: /* delete mails */
365 event_handler_EMAIL_EVENT_DELETE_MAIL(event_data->multi_user_name,
366 event_data->account_id,
367 event_data->event_param_data_6,
368 (int*)event_data->event_param_data_3,
369 event_data->event_param_data_4,
370 event_data->event_param_data_5,
374 case EMAIL_EVENT_DELETE_MAIL_ALL: /* delete all mails */
375 event_handler_EMAIL_EVENT_DELETE_MAIL_ALL(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, (int)event_data->event_param_data_5, &err);
377 #ifdef __FEATURE_SYNC_CLIENT_TO_SERVER__
378 case EMAIL_EVENT_SYNC_MAIL_FLAG_TO_SERVER:
379 event_handler_EMAIL_EVENT_SYNC_MAIL_FLAG_TO_SERVER(event_data->multi_user_name, (int)event_data->event_param_data_4, handle_to_be_published, &err);
383 case EMAIL_EVENT_CREATE_MAILBOX:
384 err = event_handler_EMAIL_EVENT_CREATE_MAILBOX(event_data->multi_user_name, (email_mailbox_t *)event_data->event_param_data_1, event_data->event_param_data_4, handle_to_be_published);
387 case EMAIL_EVENT_DELETE_MAILBOX:
388 err = event_handler_EMAIL_EVENT_DELETE_MAILBOX(event_data->multi_user_name, event_data->event_param_data_4, event_data->event_param_data_5, event_data->event_param_data_6, handle_to_be_published);
391 case EMAIL_EVENT_SAVE_MAIL:
392 err = event_handler_EMAIL_EVENT_SAVE_MAIL(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, handle_to_be_published);
395 case EMAIL_EVENT_MOVE_MAIL:
396 event_handler_EMAIL_EVENT_MOVE_MAIL(event_data->multi_user_name, event_data->account_id, (int *)event_data->event_param_data_3, event_data->event_param_data_4, event_data->event_param_data_5, event_data->event_param_data_8, handle_to_be_published, &err);
399 case EMAIL_EVENT_VALIDATE_ACCOUNT:
400 event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT(event_data->multi_user_name, event_data->account_id, handle_to_be_published, &err);
403 case EMAIL_EVENT_VALIDATE_AND_CREATE_ACCOUNT: {
404 email_account_t *account = (email_account_t *)event_data->event_param_data_1;
405 event_handler_EMAIL_EVENT_VALIDATE_AND_CREATE_ACCOUNT(event_data->multi_user_name, account, handle_to_be_published, &err);
409 case EMAIL_EVENT_VALIDATE_ACCOUNT_EX: {
410 email_account_t *account = (email_account_t *)event_data->event_param_data_1;
411 err = event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT_EX(event_data->multi_user_name, account, handle_to_be_published);
415 case EMAIL_EVENT_VALIDATE_AND_UPDATE_ACCOUNT: {
416 email_account_t *account = (email_account_t *)event_data->event_param_data_1;
417 event_handler_EMAIL_EVENT_VALIDATE_AND_UPDATE_ACCOUNT(event_data->multi_user_name,
418 event_data->account_id,
420 handle_to_be_published,
425 case EMAIL_EVENT_UPDATE_MAIL:
426 event_handler_EMAIL_EVENT_UPDATE_MAIL(event_data->multi_user_name, (email_mail_data_t*)event_data->event_param_data_1, (email_attachment_data_t*)event_data->event_param_data_2, event_data->event_param_data_4, (email_meeting_request_t*)event_data->event_param_data_3, event_data->event_param_data_5, handle_to_be_published);
429 case EMAIL_EVENT_SET_MAIL_SLOT_SIZE:
430 event_handler_EMAIL_EVENT_SET_MAIL_SLOT_SIZE(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, event_data->event_param_data_5, handle_to_be_published, &err);
433 case EMAIL_EVENT_EXPUNGE_MAILS_DELETED_FLAGGED:
434 err = event_handler_EMAIL_EVENT_EXPUNGE_MAILS_DELETED_FLAGGED(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4);
437 #ifdef __FEATURE_LOCAL_ACTIVITY__
438 case EMAIL_EVENT_LOCAL_ACTIVITY:
439 event_handler_EMAIL_EVENT_LOCAL_ACTIVITY(event_data->multi_user_name, event_data->account_id, handle_to_be_published, &err);
441 #endif /* __FEATURE_LOCAL_ACTIVITY__*/
443 case EMAIL_EVENT_SEARCH_ON_SERVER:
444 err = event_handler_EMAIL_EVENT_SEARCH_ON_SERVER(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, (email_search_filter_t *)event_data->event_param_data_1, event_data->event_param_data_5, handle_to_be_published);
447 case EMAIL_EVENT_RENAME_MAILBOX_ON_IMAP_SERVER:
448 err = event_handler_EMAIL_EVENT_RENAME_MAILBOX_ON_IMAP_SERVER(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_4, (char*)event_data->event_param_data_1, (char*)event_data->event_param_data_2, (char*)event_data->event_param_data_3, handle_to_be_published);
451 case EMAIL_EVENT_QUERY_SMTP_MAIL_SIZE_LIMIT:
452 if (!emcore_query_mail_size_limit(event_data->multi_user_name, event_data->account_id, handle_to_be_published, &err))
453 EM_DEBUG_EXCEPTION("emcore_sync_mailbox_list failed [%d]", err);
461 if ((event_data->type == EMAIL_EVENT_SYNC_HEADER || event_data->type == EMAIL_EVENT_SYNC_IMAP_MAILBOX) &&
462 (err != EMAIL_ERROR_NONE)) {
463 EM_DEBUG_LOG("retry syncing");
464 if (event_data->type == EMAIL_EVENT_SYNC_IMAP_MAILBOX && err == EMAIL_ERROR_INVALID_ACCOUNT) {
465 EM_DEBUG_LOG("Unsupported account");
469 /* for the retry syncing */
470 if (sync_failed_event_data) {
471 emcore_free_event(sync_failed_event_data);
472 EM_SAFE_FREE(sync_failed_event_data);
475 sync_failed_event_data = em_malloc(sizeof(email_event_t));
476 if (sync_failed_event_data == NULL) {
477 EM_DEBUG_EXCEPTION("em_malloc failed");
478 err = EMAIL_ERROR_OUT_OF_MEMORY;
482 if (event_data->type == EMAIL_EVENT_SYNC_IMAP_MAILBOX && sync_failed_event_data) {
483 sync_failed_event_data->type = EMAIL_EVENT_SYNC_IMAP_MAILBOX;
484 sync_failed_event_data->account_id = event_data->account_id;
485 sync_failed_event_data->status = EMAIL_EVENT_STATUS_WAIT;
486 sync_failed_event_data->event_param_data_3 = EM_SAFE_STRDUP(event_data->event_param_data_3);
487 sync_failed_event_data->multi_user_name = EM_SAFE_STRDUP(event_data->multi_user_name);
490 if (event_data->type == EMAIL_EVENT_SYNC_HEADER && sync_failed_event_data) {
491 sync_failed_event_data->type = EMAIL_EVENT_SYNC_HEADER;
492 sync_failed_event_data->account_id = event_data->account_id;
493 sync_failed_event_data->status = EMAIL_EVENT_STATUS_WAIT;
494 sync_failed_event_data->event_param_data_5 = event_data->event_param_data_5;
495 sync_failed_event_data->event_param_data_4 = event_data->event_param_data_4;
496 sync_failed_event_data->multi_user_name = EM_SAFE_STRDUP(event_data->multi_user_name);
500 if (!emcore_notify_response_to_api(event_data->type, handle_to_be_published, err))
501 EM_DEBUG_EXCEPTION("emcore_notify_response_to_api failed");
504 emstorage_free_account(&account_tbl, 1, NULL);
508 /* free event itself */
509 ENTER_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
510 started_event = g_queue_pop_head(g_event_que);
511 LEAVE_RECURSIVE_CRITICAL_SECTION(_event_queue_lock);
512 if (!started_event) {
513 EM_DEBUG_EXCEPTION("Failed to g_queue_pop_head");
515 /* freed event_data : event_data is started event */
516 emcore_return_handle(started_event->handle);
517 emcore_free_event(started_event); /*detected by valgrind*/
518 EM_SAFE_FREE(started_event);
523 if (!emstorage_close(&err))
524 EM_DEBUG_EXCEPTION("emstorage_close falied [%d]", err);
526 emcore_close_recv_stream_list();
531 static int event_handler_EMAIL_EVENT_SYNC_HEADER(char *multi_user_name, int input_account_id, int input_mailbox_id,
532 int handle_to_be_published, int *error)
534 EM_DEBUG_FUNC_BEGIN("input_account_id [%d], input_mailbox_id [%d], handle_to_be_published [%d], error[%p]",
535 input_account_id, input_mailbox_id, handle_to_be_published, error);
537 int err = EMAIL_ERROR_NONE, sync_type = 0, ret = false;
538 int mailbox_count = 0, account_count = 0;
539 int counter, account_index;
540 int unread = 0, total_unread = 0;
541 int vip_unread = 0, vip_total_unread = 0;
542 int vip_mail_count = 0, vip_total_mail = 0;
543 int mail_count = 0, total_mail = 0;
544 emcore_uid_list *uid_list = NULL;
545 emstorage_account_tbl_t *account_tbl_array = NULL;
546 emstorage_mailbox_tbl_t *mailbox_tbl_target = NULL, *mailbox_tbl_list = NULL;
547 #ifndef __FEATURE_KEEP_CONNECTION__
548 MAILSTREAM *stream = NULL;
550 char mailbox_id_param_string[10] = {0,};
551 char *input_mailbox_id_str = NULL;
553 if (input_mailbox_id == 0)
554 sync_type = EMAIL_SYNC_ALL_MAILBOX;
556 email_account_t *ref_account = NULL;
557 int sync_disabled = 0;
559 ref_account = emcore_get_account_reference(multi_user_name, input_account_id, false);
561 sync_disabled = ref_account->sync_disabled;
562 emcore_free_account(ref_account);
563 EM_SAFE_FREE(ref_account);
566 EM_DEBUG_LOG("sync_disabled[%d]", sync_disabled);
569 err = EMAIL_ERROR_ACCOUNT_SYNC_IS_DISALBED;
570 EM_DEBUG_LOG("Sync disabled for this account. Do not sync.");
574 if (!emstorage_get_mailbox_by_id(multi_user_name, input_mailbox_id, &mailbox_tbl_target) || !mailbox_tbl_target) {
575 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed [%d]", err);
579 if (mailbox_tbl_target)
580 SNPRINTF(mailbox_id_param_string, 10, "%d", mailbox_tbl_target->mailbox_id);
582 input_mailbox_id_str = (input_mailbox_id == 0) ? NULL : mailbox_id_param_string;
584 /* if (!emcore_notify_network_event(NOTI_DOWNLOAD_START, input_account_id, input_mailbox_id_str, handle_to_be_published, 0))
585 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_DOWNLOAD_START] Failed >>>> ");
587 if (!emnetwork_check_network_status(&err)) {
588 EM_DEBUG_EXCEPTION("emnetwork_check_network_status error [%d]", err);
589 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, input_account_id, input_mailbox_id_str, handle_to_be_published, err))
590 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FAIL] Failed >>>> ");
594 if (emcore_get_dpm_status() == false) {
596 EM_DEBUG_EXCEPTION("dpm policy not allowed");
597 err = EMAIL_ERROR_DPM_RESTRICTED_MODE;
598 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, input_account_id, input_mailbox_id_str, handle_to_be_published, err))
599 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FAIL] Failed >>>> ");
609 if (sync_type != EMAIL_SYNC_ALL_MAILBOX) { /* Sync only particular mailbox */
610 EM_DEBUG_LOG_SEC("sync start: account_id [%d] alias [%s]", input_account_id, mailbox_tbl_target->alias);
611 if ((err = emcore_update_sync_status_of_account(multi_user_name,
614 SYNC_STATUS_SYNCING)) != EMAIL_ERROR_NONE)
615 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed [%d]", err);
617 if (!emcore_sync_header(multi_user_name, mailbox_tbl_target, (void **)&stream,
618 &uid_list, &mail_count, &unread, &vip_mail_count,
619 &vip_unread, 1, handle_to_be_published, &err)) {
620 EM_DEBUG_EXCEPTION("emcore_sync_header failed [%d]", err);
621 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, mailbox_tbl_target->account_id, mailbox_id_param_string, handle_to_be_published, err))
622 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] Failed >>>> ");
624 EM_DEBUG_LOG("emcore_sync_header succeeded [%d]", err);
625 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FINISH, mailbox_tbl_target->account_id, mailbox_id_param_string, handle_to_be_published, 0))
626 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_DOWNLOAD_FINISH] Failed >>>> ");
629 stream = mail_close(stream);
631 total_unread += unread;
632 vip_total_unread += vip_unread;
633 total_mail += mail_count;
634 vip_total_mail += vip_mail_count;
636 if (total_unread > 0 && (emcore_update_sync_status_of_account(multi_user_name, input_account_id, SET_TYPE_UNION, SYNC_STATUS_HAVE_NEW_MAILS)) != EMAIL_ERROR_NONE) {
637 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed");
639 if ((err = emcore_update_sync_status_of_account(multi_user_name, input_account_id, SET_TYPE_MINUS, SYNC_STATUS_SYNCING)) != EMAIL_ERROR_NONE)
640 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed [%d]", err);
643 if (!emstorage_get_account_by_id(multi_user_name, input_account_id, EMAIL_ACC_GET_OPT_DEFAULT, &account_tbl_array, true, &err)) {
644 EM_DEBUG_EXCEPTION("emstorage_get_account_by_id failed [ %d ] ", err);
647 if (!emdaemon_finalize_sync(multi_user_name, input_account_id, 0, 0, 0, 0, true, NULL))
648 EM_DEBUG_EXCEPTION("emdaemon_finalize_sync failed");
650 if (account_tbl_array)
651 emstorage_free_account(&account_tbl_array, 1, NULL);
653 if (mailbox_tbl_target->mailbox_type == EMAIL_MAILBOX_TYPE_INBOX)
654 emcore_display_unread_in_badge(multi_user_name);
655 } else /* All Folder */ {
656 EM_DEBUG_LOG("sync start for all mailbox: account_id [%d]", input_account_id);
657 /* Sync of all mailbox */
659 if (input_account_id == ALL_ACCOUNT) {
660 if ((err = emcore_update_sync_status_of_account(multi_user_name, ALL_ACCOUNT, SET_TYPE_UNION, SYNC_STATUS_SYNCING)) != EMAIL_ERROR_NONE)
661 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed [%d]", err);
662 if (!emstorage_get_account_list(multi_user_name, &account_count, &account_tbl_array , true, false, &err)) {
663 EM_DEBUG_EXCEPTION("emstorage_get_account_list failed [ %d ] ", err);
664 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, input_account_id, NULL, handle_to_be_published, err))
665 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FAIL] Failed >>>> ");
669 if ((err = emcore_update_sync_status_of_account(multi_user_name, input_account_id, SET_TYPE_UNION, SYNC_STATUS_SYNCING)) != EMAIL_ERROR_NONE)
670 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed [%d]", err);
672 if (!emstorage_get_account_by_id(multi_user_name, input_account_id, EMAIL_ACC_GET_OPT_DEFAULT, &account_tbl_array, true, &err)) {
673 EM_DEBUG_EXCEPTION("emstorage_get_account_by_id failed [ %d ] ", err);
674 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, input_account_id, input_mailbox_id_str, handle_to_be_published, err))
675 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FAIL] Failed >>>> ");
681 for (account_index = 0 ; account_index < account_count; account_index++) {
682 if (account_tbl_array[account_index].incoming_server_type == EMAIL_SERVER_TYPE_ACTIVE_SYNC) {
683 EM_DEBUG_LOG("account[%d] is for ActiveSync. Skip ", account_index);
687 if (account_tbl_array[account_index].sync_disabled == 1) {
688 EM_DEBUG_LOG("account[%d] is sync-disabled. Skip ", account_index);
691 /* folder sync is also necessary */
692 if (!emstorage_get_mailbox_list(multi_user_name, account_tbl_array[account_index].account_id, 0,
693 EMAIL_MAILBOX_SORT_BY_TYPE_ASC, &mailbox_count, &mailbox_tbl_list, true, &err) ||
694 mailbox_count <= 0) {
695 EM_DEBUG_EXCEPTION("emstorage_get_mailbox error [%d]", err);
696 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, account_tbl_array[account_index].account_id,
697 input_mailbox_id_str, handle_to_be_published, err))
698 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] error >>>> ");
702 EM_DEBUG_LOG("emcore_get_mailbox_list_to_be_sync returns [%d] mailboxes", mailbox_count);
705 #ifndef __FEATURE_KEEP_CONNECTION__
706 if (account_tbl_array[account_index].incoming_server_type == EMAIL_SERVER_TYPE_IMAP4) {
707 memset(mailbox_id_param_string, 0, 10);
708 SNPRINTF(mailbox_id_param_string, 10, "%d", mailbox_tbl_list[0].mailbox_id);
709 if (!emcore_connect_to_remote_mailbox(multi_user_name,
710 account_tbl_array[account_index].account_id,
711 mailbox_tbl_list[0].mailbox_id,
715 EM_DEBUG_EXCEPTION("emcore_connect_to_remote_mailbox error [%d]", err);
716 if (err == EMAIL_ERROR_LOGIN_FAILURE)
717 EM_DEBUG_EXCEPTION("EMAIL_ERROR_LOGIN_FAILURE ");
719 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, account_tbl_array[account_index].account_id, mailbox_id_param_string, handle_to_be_published, err))
720 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] Failed >>>> ");
723 EM_DEBUG_LOG("emcore_connect_to_remote_mailbox returns [%d]", err);
725 stream = mail_close(stream);
728 for (counter = 0; counter < mailbox_count; counter++) {
730 EM_DEBUG_LOG_SEC("mailbox_name [%s], mailbox_id [%d], mailbox_type [%d]", mailbox_tbl_list[counter].mailbox_name, mailbox_tbl_list[counter].mailbox_id, mailbox_tbl_list[counter].mailbox_type);
731 vip_unread = unread = mail_count = 0;
732 if (mailbox_tbl_list[counter].mailbox_type == EMAIL_MAILBOX_TYPE_ALL_EMAILS
733 || mailbox_tbl_list[counter].mailbox_type == EMAIL_MAILBOX_TYPE_TRASH
734 /*|| mailbox_tbl_list[counter].mailbox_type == EMAIL_MAILBOX_TYPE_SPAMBOX */) {
735 EM_DEBUG_LOG("Skipped for all emails or trash");
737 } else if (!mailbox_tbl_list[counter].local_yn) {
738 EM_DEBUG_LOG_SEC("[%s] Syncing...", mailbox_tbl_list[counter].mailbox_name);
739 #ifdef __FEATURE_KEEP_CONNECTION__
740 if (!emcore_sync_header(multi_user_name,
741 (mailbox_tbl_list + counter),
745 &unread, &vip_mail_count, &vip_unread, 1, handle_to_be_published, &err))
746 #else /* __FEATURE_KEEP_CONNECTION__ */
747 if (!emcore_sync_header(multi_user_name,
748 (mailbox_tbl_list + counter),
752 &unread, &vip_mail_count, &vip_unread, 1, handle_to_be_published, &err))
753 #endif /* __FEATURE_KEEP_CONNECTION__ */
755 EM_DEBUG_EXCEPTION_SEC("emcore_sync_header for %s(mailbox_id = %d) failed [%d]",
756 mailbox_tbl_list[counter].mailbox_name, mailbox_tbl_list[counter].mailbox_id, err);
758 #ifndef __FEATURE_KEEP_CONNECTION__
759 if (err == EMAIL_ERROR_CONNECTION_BROKEN || err == EMAIL_ERROR_NO_SUCH_HOST ||
760 err == EMAIL_ERROR_SOCKET_FAILURE)
761 stream = mail_close(stream);
762 #endif /* __FEATURE_KEEP_CONNECTION__ */
763 memset(mailbox_id_param_string, 0, 10);
764 SNPRINTF(mailbox_id_param_string, 10, "%d", mailbox_tbl_list[counter].mailbox_id);
765 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL,
766 account_tbl_array[account_index].account_id,
767 mailbox_id_param_string,
768 handle_to_be_published, err))
769 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FAIL] Failed >>>> ");
774 EM_DEBUG_LOG_SEC("---mailbox %s has unread %d / %d", mailbox_tbl_list[counter].mailbox_name,
776 total_unread += unread;
777 vip_total_unread += vip_unread;
778 total_mail += mail_count;
779 vip_total_mail += vip_mail_count;
781 if (mailbox_tbl_list[counter].mailbox_type == EMAIL_MAILBOX_TYPE_INBOX)
782 emcore_display_unread_in_badge(multi_user_name);
786 EM_DEBUG_LOG_SEC("Sync for account_id(%d) is completed....! (unread %d/%d)", account_tbl_array[account_index].account_id, total_unread, total_mail);
787 EM_DEBUG_LOG_SEC("Sync for account_id(%d) is completed....! (vip_unread %d/%d)", account_tbl_array[account_index].account_id, vip_total_unread, vip_total_mail);
789 if ((err == EMAIL_ERROR_NONE) && !emcore_notify_network_event(NOTI_DOWNLOAD_FINISH, account_tbl_array[account_index].account_id, NULL, handle_to_be_published, 0))
790 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_DOWNLOAD_FINISH] Failed >>>> ");
792 if ((total_unread > 0) && (emcore_update_sync_status_of_account(multi_user_name, account_tbl_array[account_index].account_id, SET_TYPE_UNION, SYNC_STATUS_HAVE_NEW_MAILS)) != EMAIL_ERROR_NONE) {
793 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed");
795 if ((err = emcore_update_sync_status_of_account(multi_user_name, input_account_id, SET_TYPE_MINUS, SYNC_STATUS_SYNCING)) != EMAIL_ERROR_NONE)
796 EM_DEBUG_EXCEPTION("emcore_update_sync_status_of_account failed [%d]", err);
799 if (!emdaemon_finalize_sync(multi_user_name, account_tbl_array[account_index].account_id, 0, 0, 0, 0, true, NULL))
800 EM_DEBUG_EXCEPTION("emdaemon_finalize_sync failed");
802 #ifndef __FEATURE_KEEP_CONNECTION__
804 stream = mail_close(stream);
806 if (mailbox_tbl_list) {
807 emstorage_free_mailbox(&mailbox_tbl_list, mailbox_count, NULL);
808 mailbox_tbl_list = NULL;
818 #ifndef __FEATURE_KEEP_CONNECTION__
820 stream = mail_close(stream);
825 if (mailbox_tbl_target)
826 emstorage_free_mailbox(&mailbox_tbl_target, 1, NULL);
828 if (mailbox_tbl_list)
829 emstorage_free_mailbox(&mailbox_tbl_list, mailbox_count, NULL);
831 if (account_tbl_array)
832 emstorage_free_account(&account_tbl_array, account_count, NULL);
838 static int event_handler_EMAIL_EVENT_VALIDATE_AND_CREATE_ACCOUNT(char *multi_user_name, email_account_t *account, int handle_to_be_published, int *error)
840 EM_DEBUG_FUNC_BEGIN("account [%p]", account);
841 int err, ret = false;
842 char *imap_cap_string = NULL;
845 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
846 err = EMAIL_ERROR_INVALID_PARAM;
850 EM_DEBUG_LOG_SEC("incoming_server_address : %s", account->incoming_server_address);
852 if (!emnetwork_check_network_status(&err)) {
853 emcore_delete_account_from_unvalidated_account_list(account->account_id);
854 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
855 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_CREATE_ACCOUNT_FAIL, account->account_id, NULL, handle_to_be_published, err))
856 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FAIL] Failed >>>> ");
859 EM_DEBUG_LOG_SEC("incoming_server_address : %s", account->incoming_server_address);
861 if (!emcore_validate_account_with_account_info(multi_user_name, account, EMAIL_EVENT_VALIDATE_AND_CREATE_ACCOUNT, &imap_cap_string, handle_to_be_published, &err)) {
862 emcore_delete_account_from_unvalidated_account_list(account->account_id);
863 EM_DEBUG_EXCEPTION("emcore_validate_account_with_account_info failed err : %d", err);
864 if (err == EMAIL_ERROR_CANCELLED) {
865 EM_DEBUG_EXCEPTION(" notify : NOTI_VALIDATE_AND_CREATE_ACCOUNT_CANCEL ");
866 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_CREATE_ACCOUNT_CANCEL, account->account_id, NULL, handle_to_be_published, err))
867 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_AND_CREATE_ACCOUNT_CANCEL] Failed");
872 emcore_delete_account_from_unvalidated_account_list(account->account_id);
874 if (emcore_create_account(multi_user_name, account, false, &err) == false) {
875 EM_DEBUG_EXCEPTION(" emdaemon_create_account failed - %d", err);
879 EM_DEBUG_LOG("incoming_server_type [%d]", account->incoming_server_type);
881 if ((EMAIL_SERVER_TYPE_IMAP4 == account->incoming_server_type)) {
882 if (!emcore_sync_mailbox_list(multi_user_name, account->account_id, "", handle_to_be_published, &err)) {
883 EM_DEBUG_EXCEPTION("emcore_get_mailbox_list_to_be_sync failed [%d]", err);
884 /* delete account whose mailbox couldn't be obtained from server */
885 emcore_delete_account(multi_user_name, account->account_id, false, NULL);
890 EM_DEBUG_LOG("validating and creating an account are succeeded for account id [%d] err [%d]", account->account_id, err);
891 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_CREATE_ACCOUNT_FINISH, account->account_id, imap_cap_string, handle_to_be_published, err))
892 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FINISH] Success");
899 if (ret == false && err != EMAIL_ERROR_CANCELLED && account) {
900 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_CREATE_ACCOUNT_FAIL, account->account_id, NULL, handle_to_be_published, err))
901 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_AND_CREATE_ACCOUNT_FAIL] Failed");
904 EM_SAFE_FREE(imap_cap_string);
913 static int event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT_EX(char *multi_user_name, email_account_t *input_account, int input_handle_to_be_published)
915 EM_DEBUG_FUNC_BEGIN("input_account [%p]", input_account);
916 int err = EMAIL_ERROR_NONE;
917 char *server_capability_string = NULL;
919 if (!input_account) {
920 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
921 err = EMAIL_ERROR_INVALID_PARAM;
925 EM_DEBUG_LOG_SEC("incoming_server_address [%s]", input_account->incoming_server_address);
927 if (!emnetwork_check_network_status(&err)) {
928 emcore_delete_account_from_unvalidated_account_list(input_account->account_id);
929 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
930 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_CREATE_ACCOUNT_FAIL, input_account->account_id, NULL, input_handle_to_be_published, err))
931 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FAIL] Failed >>>> ");
934 EM_DEBUG_LOG_SEC("incoming_server_address : %s", input_account->incoming_server_address);
936 if (!emcore_validate_account_with_account_info(multi_user_name, input_account, EMAIL_EVENT_VALIDATE_ACCOUNT_EX, &server_capability_string, input_handle_to_be_published, &err)) {
937 emcore_delete_account_from_unvalidated_account_list(input_account->account_id);
939 EM_DEBUG_EXCEPTION("emcore_validate_account_with_account_info failed err : %d", err);
941 if (err == EMAIL_ERROR_CANCELLED) {
942 EM_DEBUG_EXCEPTION(" notify : NOTI_VALIDATE_ACCOUNT_CANCEL ");
943 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_CANCEL, input_account->account_id, NULL, input_handle_to_be_published, err))
944 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_CANCEL] Failed");
949 emcore_delete_account_from_unvalidated_account_list(input_account->account_id);
951 EM_DEBUG_LOG("validating an account are succeeded for account id [%d] err [%d]", input_account->account_id, err);
952 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_FINISH, input_account->account_id, server_capability_string, input_handle_to_be_published, err))
953 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FINISH] Success");
958 if (err != EMAIL_ERROR_NONE && err != EMAIL_ERROR_CANCELLED && input_account) {
959 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_FAIL, input_account->account_id, NULL, input_handle_to_be_published, err))
960 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FAIL] Failed");
963 EM_SAFE_FREE(server_capability_string);
965 EM_DEBUG_FUNC_END("err[%d]", err);
969 static int event_handler_EMAIL_EVENT_VALIDATE_AND_UPDATE_ACCOUNT(char *multi_user_name, int account_id, email_account_t *new_account_info, int handle_to_be_published, int *error)
971 EM_DEBUG_FUNC_BEGIN("account_id [%d], new_account_info [%p]", account_id, new_account_info);
972 int err, ret = false;
973 char *imap_cap_string = NULL;
974 emstorage_account_tbl_t *old_account_tbl = NULL, *new_account_tbl = NULL;
975 email_account_t *duplicated_account_info = NULL, *old_account_info = NULL;
977 if (!new_account_info) {
978 EM_DEBUG_EXCEPTION("Invalid Parameter");
979 err = EMAIL_ERROR_INVALID_PARAM;
983 if (!emnetwork_check_network_status(&err)) {
984 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
986 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_UPDATE_ACCOUNT_FAIL, account_id, NULL, handle_to_be_published, err))
987 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_AND_UPDATE_ACCOUNT_FAIL] Failed >>>> ");
990 EM_DEBUG_LOG_SEC("incoming_server_address: (%s)", new_account_info->incoming_server_address);
992 /* If the password fields are empty, fill the fields with password of old information*/
993 if ((old_account_info = emcore_get_account_reference(multi_user_name, account_id, true)) == NULL) {
994 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed ");
998 EM_DEBUG_LOG_SEC("old_account_info->incoming_server_password [%s]", old_account_info->incoming_server_password);
1000 if (EM_SAFE_STRLEN(new_account_info->incoming_server_password) == 0) {
1001 EM_SAFE_FREE(new_account_info->incoming_server_password); /* be allocated but has zero length */
1002 EM_DEBUG_LOG_SEC("old_account_info->incoming_server_password [%s]", old_account_info->incoming_server_password);
1003 new_account_info->incoming_server_password = EM_SAFE_STRDUP(old_account_info->incoming_server_password);
1004 if (new_account_info->incoming_server_password == NULL) {
1005 EM_DEBUG_EXCEPTION("allocation for new_account_info->password failed");
1006 err = EMAIL_ERROR_OUT_OF_MEMORY;
1011 EM_DEBUG_LOG_SEC("old_account_info->outgoing_server_password [%s]", old_account_info->outgoing_server_password);
1013 if (EM_SAFE_STRLEN(new_account_info->outgoing_server_password) == 0) {
1014 EM_SAFE_FREE(new_account_info->outgoing_server_password);
1015 if (old_account_info->outgoing_server_password) {
1016 new_account_info->outgoing_server_password = EM_SAFE_STRDUP(old_account_info->outgoing_server_password);
1017 if (new_account_info->outgoing_server_password == NULL) {
1018 EM_DEBUG_EXCEPTION("allocation for new_account_info->outgoing_server_password failed");
1019 err = EMAIL_ERROR_OUT_OF_MEMORY;
1025 emcore_duplicate_account(new_account_info, &duplicated_account_info, &err);
1026 if (err != EMAIL_ERROR_NONE) {
1027 EM_DEBUG_EXCEPTION("emcore_duplicate_account failed [%d]", err);
1031 if ((err = emcore_add_account_to_unvalidated_account_list(duplicated_account_info)) != EMAIL_ERROR_NONE) {
1032 EM_DEBUG_EXCEPTION("emcore_add_account_to_unvalidated_account_list failed [%d]", err);
1036 if (!emcore_validate_account_with_account_info(multi_user_name, duplicated_account_info, EMAIL_EVENT_VALIDATE_AND_UPDATE_ACCOUNT, &imap_cap_string, handle_to_be_published, &err)) {
1037 EM_DEBUG_EXCEPTION("emcore_validate_account_with_account_info() failed err : %d", err);
1038 if (err == EMAIL_ERROR_CANCELLED) {
1039 EM_DEBUG_EXCEPTION(" notify : NOTI_VALIDATE_AND_CREATE_ACCOUNT_CANCEL ");
1040 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_UPDATE_ACCOUNT_CANCEL, account_id, NULL, handle_to_be_published, err))
1041 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_AND_UPDATE_ACCOUNT_CANCEL] Failed");
1047 if (!emstorage_get_account_by_id(multi_user_name, account_id, WITHOUT_OPTION, &old_account_tbl, true, &err)) {
1048 EM_DEBUG_EXCEPTION("emstorage_get_account_by_id failed [%d]", err);
1049 /* goto FINISH_OFF; */
1051 duplicated_account_info->account_id = account_id;
1053 new_account_tbl = em_malloc(sizeof(emstorage_account_tbl_t));
1054 if (!new_account_tbl) {
1055 EM_DEBUG_EXCEPTION("allocation failed");
1056 err = EMAIL_ERROR_OUT_OF_MEMORY;
1060 em_convert_account_to_account_tbl(duplicated_account_info, new_account_tbl);
1062 if (!emstorage_update_account(multi_user_name, account_id, new_account_tbl, true, &err)) {
1063 EM_DEBUG_EXCEPTION("emstorage_update_account failed : [%d]", err);
1066 EM_DEBUG_LOG("validating and updating an account are succeeded for account id [%d], err [%d]", duplicated_account_info->account_id, err);
1067 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_UPDATE_ACCOUNT_FINISH, new_account_info->account_id, imap_cap_string, handle_to_be_published, err))
1068 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [NOTI_VALIDATE_AND_UPDATE_ACCOUNT_FINISH] Success");
1076 if (duplicated_account_info) {
1077 if (duplicated_account_info->account_id < 0)
1078 emcore_delete_account_from_unvalidated_account_list(duplicated_account_info->account_id);
1080 emcore_free_account(duplicated_account_info);
1081 EM_SAFE_FREE(duplicated_account_info);
1085 if (old_account_info) {
1086 emcore_free_account(old_account_info);
1087 EM_SAFE_FREE(old_account_info);
1090 if (old_account_tbl)
1091 emstorage_free_account(&old_account_tbl, 1, NULL);
1092 if (new_account_tbl)
1093 emstorage_free_account(&new_account_tbl, 1, NULL);
1095 if (ret == false && err != EMAIL_ERROR_CANCELLED) {
1096 if (!emcore_notify_network_event(NOTI_VALIDATE_AND_UPDATE_ACCOUNT_FAIL, account_id, NULL, handle_to_be_published, err))
1097 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_AND_CREATE_ACCOUNT_FAIL] Failed");
1100 EM_SAFE_FREE(imap_cap_string);
1105 EM_DEBUG_FUNC_END();
1109 static int event_handler_EMAIL_EVENT_SET_MAIL_SLOT_SIZE(char *multi_user_name, int account_id, int mailbox_id, int new_slot_size, int handle_to_be_published, int *error)
1111 EM_DEBUG_FUNC_BEGIN();
1113 emcore_set_mail_slot_size(multi_user_name, account_id, mailbox_id, new_slot_size, error);
1115 EM_DEBUG_FUNC_END();
1119 static int event_handler_EMAIL_EVENT_EXPUNGE_MAILS_DELETED_FLAGGED(char *multi_user_name,
1120 int input_account_id,
1121 int input_mailbox_id)
1123 EM_DEBUG_FUNC_BEGIN("input_account_id [%d], input_mailbox_id [%d]", input_account_id, input_mailbox_id);
1124 int err = EMAIL_ERROR_NONE;
1126 if ((err = emcore_expunge_mails_deleted_flagged_from_remote_server(multi_user_name,
1128 input_mailbox_id)) != EMAIL_ERROR_NONE) {
1129 EM_DEBUG_EXCEPTION("emcore_expunge_mails_deleted_flagged_from_remote_server failed [%d]", err);
1133 if ((err = emcore_expunge_mails_deleted_flagged_from_local_storage(multi_user_name,
1134 input_mailbox_id)) != EMAIL_ERROR_NONE) {
1135 EM_DEBUG_EXCEPTION("emcore_expunge_mails_deleted_flagged_from_local_storage failed [%d]", err);
1141 EM_DEBUG_FUNC_END("err [%d]", err);
1145 #ifdef __FEATURE_LOCAL_ACTIVITY__
1146 static int event_handler_EMAIL_EVENT_LOCAL_ACTIVITY(char *multi_user_name, int account_id, int event_handle, int *error)
1148 EM_DEBUG_FUNC_BEGIN();
1150 int err = EMAIL_ERROR_NONE;
1151 email_mailbox_t mailbox;
1152 emstorage_activity_tbl_t *local_activity = NULL;
1153 int activity_id_count = 0;
1154 int activity_chunk_count = 0;
1155 int *activity_id_list = NULL;
1158 if (!emnetwork_check_network_status(&err))
1159 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1161 if (false == emstorage_get_activity_id_list(multi_user_name, account_id, &activity_id_list, &activity_id_count, ACTIVITY_DELETEMAIL, ACTIVITY_COPYMAIL, true, &err)) {
1162 EM_DEBUG_EXCEPTION("emstorage_get_activity_id_list failed [%d]", err);
1164 for (i = 0; i < activity_id_count; ++i) {
1165 if ((false == emstorage_get_activity(account_id , activity_id_list[i], &local_activity, &activity_chunk_count, true, &err)) || (NULL == local_activity) || (0 == activity_chunk_count))
1166 EM_DEBUG_EXCEPTION(" emstorage_get_activity Failed [ %d] or local_activity is NULL [%p] or activity_chunk_count is 0[%d]", err, local_activity, activity_chunk_count);
1168 EM_DEBUG_LOG("Found local activity type - %d", local_activity[0].activity_type);
1169 switch (local_activity[0].activity_type) {
1170 case ACTIVITY_MODIFYFLAG: {
1171 if (emcore_sync_flag_with_server(multi_user_name, local_activity[0].mail_id , &err)) {
1172 if (!emcore_delete_activity(&local_activity[0], &err))
1173 EM_DEBUG_EXCEPTION(">>>>>>Local Activity [ACTIVITY_MODIFYFLAG] [%d] ", err);
1178 case ACTIVITY_DELETEMAIL:
1179 case ACTIVITY_MOVEMAIL:
1180 case ACTIVITY_MODIFYSEENFLAG:
1181 case ACTIVITY_COPYMAIL: {
1184 int total_mail_ids = activity_chunk_count;
1186 int *mail_id_list = NULL;
1188 mail_id_list = (int *)em_malloc(sizeof(int) * total_mail_ids);
1189 if (mail_id_list == NULL) {
1190 EM_DEBUG_EXCEPTION("em_malloc failed");
1191 err = EMAIL_ERROR_OUT_OF_MEMORY;
1195 if (NULL == mail_id_list) {
1196 EM_DEBUG_EXCEPTION("malloc failed... ");
1202 for (j = 0; j < BULK_OPERATION_COUNT && (k < total_mail_ids); ++j, ++k)
1203 mail_id_list[j] = local_activity[k].mail_id;
1205 switch (local_activity[k-1].activity_type) {
1206 case ACTIVITY_DELETEMAIL: {
1207 if (!emcore_delete_mail(multi_user_name,
1208 local_activity[k-1].account_id,
1211 EMAIL_DELETE_LOCAL_AND_SERVER,
1212 EMAIL_DELETED_BY_COMMAND,
1215 EM_DEBUG_LOG("\t emcore_delete_mail failed - %d", err);
1219 case ACTIVITY_MOVEMAIL: {
1220 if (!emcore_move_mail_on_server_ex(multi_user_name,
1221 local_activity[k-1].account_id ,
1222 local_activity[k-1].src_mbox,
1225 local_activity[k-1].dest_mbox,
1227 EM_DEBUG_LOG("\t emcore_move_mail_on_server_ex failed - %d", err);
1231 case ACTIVITY_MODIFYSEENFLAG: {
1232 int seen_flag = atoi(local_activity[0].src_mbox);
1233 if (!emcore_sync_seen_flag_with_server_ex(multi_user_name, mail_id_list, j , seen_flag , &err)) /* local_activity[0].src_mbox points to the seen flag */
1234 EM_DEBUG_EXCEPTION("\t emcore_sync_seen_flag_with_server_ex failed - %d", err);
1239 } while (k < total_mail_ids);
1241 EM_SAFE_FREE(mail_id_list);
1247 EM_DEBUG_LOG(">>>> No such Local Activity Handled by this thread [ %d ] >>> ", local_activity[0].activity_type);
1251 emstorage_free_local_activity(&local_activity, activity_chunk_count, NULL);
1253 if (g_local_activity_run == 1) {
1254 EM_DEBUG_LOG(" Network event_data found.. Local sync Stopped..! ");
1261 if (activity_id_list) {
1262 if (false == emstorage_free_activity_id_list(activity_id_list, &err))
1263 EM_DEBUG_EXCEPTION("emstorage_free_activity_id_list failed");
1269 EM_DEBUG_FUNC_END();
1273 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1275 static int event_handler_EMAIL_EVENT_DOWNLOAD_BODY(char *multi_user_name, int account_id, int mail_id, int option, int handle_to_be_published, int *error)
1277 EM_DEBUG_FUNC_BEGIN();
1279 int err = EMAIL_ERROR_NONE;
1280 email_mailbox_t mailbox;
1282 memset(&mailbox, 0x00, sizeof(mailbox));
1283 mailbox.account_id = account_id;
1285 if (!emnetwork_check_network_status(&err)) {
1286 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1288 emcore_notify_network_event(NOTI_DOWNLOAD_BODY_FAIL, mail_id, NULL, handle_to_be_published, err);
1290 emstorage_mail_tbl_t *mail = NULL;
1291 MAILSTREAM *tmp_stream = NULL;
1293 if (!emstorage_get_mail_by_id(multi_user_name, mail_id, &mail, true, &err) || !mail) {
1294 EM_DEBUG_EXCEPTION("emstorage_get_mail_by_id failed [%d]", err);
1295 emcore_notify_network_event(NOTI_DOWNLOAD_BODY_FAIL, mail_id, NULL, handle_to_be_published, err);
1299 if (!emcore_connect_to_remote_mailbox(multi_user_name,
1303 (void **)&tmp_stream,
1304 &err) || !tmp_stream) {
1305 EM_DEBUG_EXCEPTION("emcore_connect_to_remote_mailbox failed [%d]", err);
1306 if (err == EMAIL_ERROR_NO_SUCH_HOST)
1307 err = EMAIL_ERROR_CONNECTION_FAILURE;
1310 emstorage_free_mail(&mail, 1, NULL);
1312 if (emcore_notify_network_event(NOTI_DOWNLOAD_BODY_FAIL, mail_id, NULL, handle_to_be_published, err) != 0)
1313 EM_DEBUG_EXCEPTION(">>>>> emcore_notify_network_event failed \n ");
1317 if (!emcore_gmime_download_body_sections(multi_user_name, tmp_stream, mailbox.account_id, mail_id,
1318 option & 0x01, NO_LIMITATION, handle_to_be_published, 1, 0, &err))
1319 EM_DEBUG_EXCEPTION("emcore_gmime_download_body_sections failed - %d", err);
1322 tmp_stream = mail_close(tmp_stream);
1326 emstorage_free_mail(&mail, 1, NULL);
1334 EM_DEBUG_FUNC_END();
1338 static int event_handler_EMAIL_EVENT_DOWNLOAD_ATTACHMENT(char *multi_user_name, int account_id, int mail_id, int attachment_no, int handle_to_be_published, int *error)
1340 EM_DEBUG_FUNC_BEGIN();
1342 int err = EMAIL_ERROR_NONE;
1344 EM_DEBUG_LOG("attachment_no is %d", attachment_no);
1346 if (!emnetwork_check_network_status(&err)) {
1347 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1348 if(!emcore_notify_network_event(NOTI_DOWNLOAD_ATTACH_FAIL, mail_id, NULL, attachment_no, err)){
1349 EM_DEBUG_EXCEPTION("emcore_notify_network_event[NOTI_DOWNLOAD_ATTACH_FAIL] Failed >>>>");
1352 #ifdef __ATTACHMENT_OPTI__
1353 if (!emcore_download_attachment_bulk(account_id, mail_id, attachment_no, handle_to_be_published, &err))
1354 EM_DEBUG_EXCEPTION("\t emcore_download_attachment_bulk failed [%d]", err);
1356 if (!emcore_gmime_download_attachment(multi_user_name, mail_id, attachment_no, 1, handle_to_be_published, 0, &err))
1357 EM_DEBUG_EXCEPTION("emcore_gmime_download_attachment failed [%d]", err);
1364 EM_DEBUG_FUNC_END();
1368 static int event_handler_EMAIL_EVENT_SYNC_FLAGS_FIELD_TO_SERVER(char *multi_user_name,
1372 email_flags_field_type field_type,
1376 EM_DEBUG_FUNC_BEGIN();
1378 int err = EMAIL_ERROR_NONE;
1380 if (!emnetwork_check_network_status(&err))
1381 EM_DEBUG_EXCEPTION("dnet_init failed [%d]", err);
1382 else if (!emcore_sync_flags_field_with_server(multi_user_name, mail_ids, num, field_type, value, &err))
1383 EM_DEBUG_EXCEPTION("emcore_sync_flags_field_with_server failed [%d]", err);
1385 /* timing issue : sending mail (to me) -> sync header -> enter the viewer */
1386 /* viewer is changed the DB -> While syncing update again */
1387 /* So in event update again the DB field */
1388 if (err != EMAIL_ERROR_NONE) {
1389 /* If the emcore_sync_flags_field_with_server is failed, rollback the db */
1390 if (emcore_set_flags_field(multi_user_name, account_id, mail_ids, num, field_type, value ? 0 : 1, NULL) != 0)
1391 EM_DEBUG_EXCEPTION("emcore_set_flags_field failed \n");
1396 EM_DEBUG_FUNC_END();
1400 static int event_handler_EMAIL_EVENT_VALIDATE_ACCOUNT(char *multi_user_name, int account_id, int handle_to_be_published, int *error)
1402 EM_DEBUG_FUNC_BEGIN();
1404 int err = EMAIL_ERROR_NONE;
1406 if (!emnetwork_check_network_status(&err)) {
1407 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1409 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_FAIL, account_id, NULL, handle_to_be_published, err))
1410 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FAIL] Failed >>>>");
1412 if (!emcore_validate_account(multi_user_name, account_id, handle_to_be_published, &err)) {
1413 EM_DEBUG_EXCEPTION("emcore_validate_account failed account id : %d err : %d", account_id, err);
1415 if (err == EMAIL_ERROR_CANCELLED) {
1416 EM_DEBUG_EXCEPTION("notify : NOTI_VALIDATE_ACCOUNT_CANCEL ");
1417 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_CANCEL, account_id, NULL, handle_to_be_published, err))
1418 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_CANCEL] Failed >>>> ");
1420 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_FAIL, account_id, NULL, handle_to_be_published, err))
1421 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FAIL] Failed >>>> ");
1424 email_account_t *account_ref = NULL;
1425 account_ref = emcore_get_account_reference(multi_user_name, account_id, false);
1428 EM_DEBUG_LOG("account_ref->incoming_server_type[%d]", account_ref->incoming_server_type);
1429 if (EMAIL_SERVER_TYPE_IMAP4 == account_ref->incoming_server_type) {
1431 if (!emcore_check_event_thread_status(&dummy, handle_to_be_published)) {
1432 EM_DEBUG_LOG("canceled type [%d]", dummy);
1433 err = EMAIL_ERROR_CANCELLED;
1434 } else if (!emcore_sync_mailbox_list(multi_user_name, account_id, "", handle_to_be_published, &err))
1435 EM_DEBUG_EXCEPTION("\t emcore_get_mailbox_list_to_be_sync falied - %d", err);
1439 EM_DEBUG_EXCEPTION("emcore_validate_account succeeded account id : %d err : %d", account_id, err);
1440 if (!emcore_notify_network_event(NOTI_VALIDATE_ACCOUNT_FINISH, account_id, NULL, handle_to_be_published, err))
1441 EM_DEBUG_EXCEPTION("emcore_notify_network_event [ NOTI_VALIDATE_ACCOUNT_FINISH] Success >>>>");
1444 emcore_free_account(account_ref);
1445 EM_SAFE_FREE(account_ref);
1453 EM_DEBUG_FUNC_END();
1457 static int event_handler_EMAIL_EVENT_UPDATE_MAIL(char *multi_user_name, email_mail_data_t *input_mail_data, email_attachment_data_t *input_attachment_data_list, int input_attachment_count, email_meeting_request_t* input_meeting_request, int input_from_eas, int handle_to_be_published)
1459 EM_DEBUG_FUNC_BEGIN("input_mail_data[%p], input_attachment_data_list[%p], input_attachment_count[%d], input_meeting_request[%p], input_from_eas[%d]", input_mail_data, input_attachment_data_list, input_attachment_count, input_meeting_request, input_from_eas);
1460 int err = EMAIL_ERROR_NONE;
1462 if ((err = emcore_update_mail(multi_user_name, input_mail_data, input_attachment_data_list, input_attachment_count, input_meeting_request, input_from_eas)) != EMAIL_ERROR_NONE)
1463 EM_DEBUG_EXCEPTION("emcore_update_mail failed [%d]", err);
1465 EM_DEBUG_FUNC_END("err [%d", err);
1469 static int event_handler_EMAIL_EVENT_SAVE_MAIL(char *multi_user_name, int input_account_id, int input_mail_id, int input_handle_to_be_published)
1471 EM_DEBUG_FUNC_BEGIN("input_account_id [%d] input_mail_id [%d] input_handle_to_be_published [%d]", input_account_id, input_mail_id, input_handle_to_be_published);
1472 int err = EMAIL_ERROR_NONE;
1474 err = emcore_sync_mail_from_client_to_server(multi_user_name, input_mail_id);
1476 EM_DEBUG_FUNC_END("err [%d]", err);
1480 static int event_handler_EMAIL_EVENT_MOVE_MAIL(char *multi_user_name, int account_id, int *mail_ids, int mail_id_count, int dest_mailbox_id, int src_mailbox_id, int handle_to_be_published, int *error)
1482 EM_DEBUG_FUNC_BEGIN();
1483 int err = EMAIL_ERROR_NONE, ret = false;
1484 email_account_t *account_ref = NULL;
1486 if (!(account_ref = emcore_get_account_reference(multi_user_name, account_id, false))) {
1487 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", account_id);
1488 err = EMAIL_ERROR_INVALID_ACCOUNT;
1492 /* Move mail local */
1494 if (!emcore_mail_move(mail_ids, mail_id_count, dest_mailbox.mailbox_name, EMAIL_MOVED_BY_COMMAND, 0, &err)) {
1495 EM_DEBUG_EXCEPTION("emcore_mail_move failed [%d]", err);
1500 if (account_ref->incoming_server_type == EMAIL_SERVER_TYPE_IMAP4) {
1501 /* Move mail on server */
1502 if (!emnetwork_check_network_status(&err))
1503 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1505 #ifdef __FEATURE_BULK_DELETE_MOVE_UPDATE_REQUEST_OPTI__
1506 if (!emcore_move_mail_on_server_ex(multi_user_name, account_id , src_mailbox_id, mail_ids, mail_id_count, dest_mailbox_id, &err))
1507 EM_DEBUG_EXCEPTION("emcore_move_mail_on_server_ex failed - %d", err);
1509 if (!emcore_move_mail_on_server(multi_user_name, account_id , src_mailbox_id, mail_ids, mail_id_count, dest_mailbox_id, &err))
1510 EM_DEBUG_EXCEPTION("\t emcore_move_mail_on_server failed - %d", err);
1519 emcore_free_account(account_ref);
1520 EM_SAFE_FREE(account_ref);
1526 EM_DEBUG_FUNC_END();
1530 static int event_handler_EMAIL_EVENT_DELETE_MAILBOX(char *multi_user_name, int mailbox_id, int on_server, int recursive, int handle_to_be_published)
1532 EM_DEBUG_FUNC_BEGIN("mailbox_id[%d] on_server[%d] recursive[%d] handle_to_be_published[%d]", mailbox_id, on_server, recursive, handle_to_be_published);
1533 int err = EMAIL_ERROR_NONE;
1535 if ((err = emcore_delete_mailbox(multi_user_name, mailbox_id, on_server, recursive)) != EMAIL_ERROR_NONE)
1536 EM_DEBUG_EXCEPTION("emcore_delete failed [%d]", err);
1538 EM_DEBUG_FUNC_END("err [%d]", err);
1542 static int event_handler_EMAIL_EVENT_CREATE_MAILBOX(char *multi_user_name, email_mailbox_t *input_new_mailbox, int on_server, int handle_to_be_published)
1544 EM_DEBUG_FUNC_BEGIN();
1545 int err = EMAIL_ERROR_NONE;
1547 if (!emcore_create_mailbox(multi_user_name, input_new_mailbox, on_server, -1, -1, &err))
1548 EM_DEBUG_EXCEPTION("emcore_create failed - %d", err);
1550 EM_DEBUG_FUNC_END("err [%d]", err);
1554 static int event_handler_EMAIL_EVENT_SYNC_MAIL_FLAG_TO_SERVER(char *multi_user_name, int mail_id, int event_handle, int *error)
1556 EM_DEBUG_FUNC_BEGIN("mail_id [%d], error [%p]", mail_id, error);
1558 int err = EMAIL_ERROR_NONE;
1560 if (!emnetwork_check_network_status(&err))
1561 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1563 if (!emcore_sync_flag_with_server(multi_user_name, mail_id, event_handle, &err))
1564 EM_DEBUG_EXCEPTION("emcore_sync_flag_with_server failed [%d]", err);
1565 #ifdef __FEATURE_LOCAL_ACTIVITY__
1567 emstorage_activity_tbl_t new_activity;
1568 memset(&new_activity, 0x00, sizeof(emstorage_activity_tbl_t));
1569 new_activity.activity_type = ACTIVITY_MODIFYFLAG;
1570 new_activity.account_id = event_data.account_id;
1571 new_activity.mail_id = event_data.event_param_data_4;
1572 new_activity.dest_mbox = NULL;
1573 new_activity.server_mailid = NULL;
1574 new_activity.src_mbox = NULL;
1576 if (!emcore_delete_activity(&new_activity, &err))
1577 EM_DEBUG_EXCEPTION(">>>>>>Local Activity [ACTIVITY_MODIFYFLAG] [%d] ", err);
1579 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1585 EM_DEBUG_FUNC_END();
1589 static int event_handler_EMAIL_EVENT_DELETE_MAIL_ALL(char *multi_user_name, int input_account_id, int input_mailbox_id, int input_from_server, int *error)
1591 EM_DEBUG_FUNC_BEGIN("input_account_id [%d] input_mailbox_id [%d], input_from_server [%d], error [%p]", input_account_id, input_mailbox_id, input_from_server, error);
1592 int err = EMAIL_ERROR_NONE;
1594 if (!emcore_delete_all_mails_of_mailbox(multi_user_name,
1600 EM_DEBUG_EXCEPTION("emcore_delete_all_mails_of_mailbox failed [%d]", err);
1605 EM_DEBUG_FUNC_END("err [%d]", err);
1609 static int event_handler_EMAIL_EVENT_DELETE_MAIL(char *multi_user_name,
1617 EM_DEBUG_FUNC_BEGIN();
1618 int err = EMAIL_ERROR_NONE;
1620 email_account_t *account_ref = NULL;
1622 if (!(account_ref = emcore_get_account_reference(multi_user_name, account_id, false))) {
1623 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", account_id);
1624 err = EMAIL_ERROR_INVALID_ACCOUNT;
1628 if (!emcore_delete_mail(multi_user_name,
1634 EMAIL_DELETED_BY_COMMAND,
1637 EM_DEBUG_EXCEPTION("emcore_delete_mail failed [%d]", err);
1646 emcore_free_account(account_ref);
1647 EM_SAFE_FREE(account_ref);
1653 EM_DEBUG_FUNC_END();
1657 static int event_hanlder_EMAIL_EVENT_SYNC_HEADER_OMA(char *multi_user_name, int account_id, char *maibox_name, int handle_to_be_published, int *error)
1659 EM_DEBUG_FUNC_BEGIN();
1660 int err = EMAIL_ERROR_NONE;
1662 if (!emnetwork_check_network_status(&err)) {
1663 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1664 if (!emcore_notify_network_event(NOTI_DOWNLOAD_FAIL, account_id, maibox_name, 0, err))
1665 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] Failed");
1667 EM_DEBUG_LOG("Sync of all mailbox");
1668 if (!emcore_sync_mailbox_list(multi_user_name, account_id, "", handle_to_be_published, &err))
1669 EM_DEBUG_EXCEPTION("emcore_sync_mailbox_list failed [%d]", err);
1675 EM_DEBUG_FUNC_END();
1679 static int event_handler_EMAIL_EVENT_SEARCH_ON_SERVER(char *multi_user_name, int account_id, int mailbox_id,
1680 email_search_filter_t *input_search_filter,
1681 int input_search_filter_count, int handle_to_be_published)
1683 EM_DEBUG_FUNC_BEGIN("account_id : [%d], mailbox_id : [%d], input_search_filter : [%p], "
1684 "input_search_filter_count : [%d], handle_to_be_published [%d]",
1685 account_id, mailbox_id, input_search_filter,
1686 input_search_filter_count, handle_to_be_published);
1688 int err = EMAIL_ERROR_NONE;
1689 char mailbox_id_param_string[10] = {0,};
1690 emstorage_mailbox_tbl_t *local_mailbox = NULL;
1692 if ((err = emstorage_get_mailbox_by_id(multi_user_name,
1694 &local_mailbox)) != EMAIL_ERROR_NONE || !local_mailbox) {
1695 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed [%d]", err);
1699 SNPRINTF(mailbox_id_param_string, 10, "%d", local_mailbox->mailbox_id);
1701 if (!emnetwork_check_network_status(&err)) {
1702 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);
1703 if (!emcore_notify_network_event(NOTI_SEARCH_ON_SERVER_FAIL, account_id, mailbox_id_param_string, 0, err))
1704 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_DOWNLOAD_FAIL] Failed");
1708 if (!emcore_notify_network_event(NOTI_SEARCH_ON_SERVER_START,
1710 mailbox_id_param_string,
1711 handle_to_be_published,
1713 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_SEARCH_ON_SERVER_START] failed >>>>");
1715 if ((err = emcore_search_on_server_ex(multi_user_name,
1718 input_search_filter,
1719 input_search_filter_count,
1721 handle_to_be_published)) != EMAIL_ERROR_NONE) {
1722 EM_DEBUG_EXCEPTION("emcore_search_on_server failed [%d]", err);
1728 if (err != EMAIL_ERROR_NONE) {
1729 if (!emcore_notify_network_event(NOTI_SEARCH_ON_SERVER_FAIL,
1731 mailbox_id_param_string,
1732 handle_to_be_published,
1734 EM_DEBUG_EXCEPTION("emcore_notify_network_event [NOTI_SEARCH_ON_SERVER_FAILED] failed >>>>");
1736 if (!emcore_notify_network_event(NOTI_SEARCH_ON_SERVER_FINISH,
1739 handle_to_be_published,
1741 EM_DEBUG_EXCEPTION("emcore_notify_network_event[NOTI_SEARCH_ON_SERVER_FINISH] Failed >>>>>");
1745 emstorage_free_mailbox(&local_mailbox, 1, NULL);
1747 EM_DEBUG_FUNC_END();
1751 static int event_handler_EMAIL_EVENT_RENAME_MAILBOX_ON_IMAP_SERVER(char *multi_user_name,
1752 int input_account_id,
1753 int input_mailbox_id,
1754 char *input_old_mailbox_path,
1755 char *input_new_mailbox_path,
1756 char *input_new_mailbox_alias,
1757 int handle_to_be_published)
1759 EM_DEBUG_FUNC_BEGIN_SEC("input_account_id [%d], input_mailbox_id [%d], input_old_mailbox_path %s], input_new_mailbox_path [%s], input_new_mailbox_alias [%s], handle_to_be_published [%d]", input_account_id, input_mailbox_id, input_old_mailbox_path, input_new_mailbox_path, input_new_mailbox_alias, handle_to_be_published);
1760 int err = EMAIL_ERROR_NONE;
1763 if (err == EMAIL_ERROR_NONE) {
1764 if ((err = emcore_rename_mailbox(multi_user_name, input_mailbox_id, input_new_mailbox_path, input_new_mailbox_alias, NULL, 0, true, true, handle_to_be_published)) != EMAIL_ERROR_NONE) {
1765 EM_DEBUG_EXCEPTION("emcore_rename_mailbox failed [%d]", err);
1769 EM_DEBUG_FUNC_END("err [%d]", err);
1773 static void* worker_send_event_queue(void *arg)
1775 EM_DEBUG_FUNC_BEGIN();
1776 int err = EMAIL_ERROR_NONE;
1777 email_event_t *event_data = NULL;
1778 email_event_t *started_event = NULL;
1779 int pbd_thd_state = 0;
1780 int event_que_state = 0;
1782 if (!emstorage_open(NULL, &err)) {
1783 EM_DEBUG_EXCEPTION("emstorage_open falied [%d]", err);
1787 while (g_send_event_loop) {
1789 pbd_thd_state = emcore_get_pbd_thd_state();
1790 event_que_state = emcore_is_event_queue_empty();
1792 /* get a event_data from event_data send queue */
1793 ENTER_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1794 if (!emcore_retrieve_send_event(&event_data, &err)) {
1795 /* no event_data pending */
1796 if (err != EMAIL_ERROR_EVENT_QUEUE_EMPTY) {
1797 LEAVE_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1801 send_thread_run = 0;
1803 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_SENDING_WORKER, true, NULL);
1805 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
1806 int wifi_status = 0;
1807 if ((err = emnetwork_get_wifi_status(&wifi_status)) != EMAIL_ERROR_NONE) {
1808 EM_DEBUG_EXCEPTION("emnetwork_get_wifi_status failed [%d]", err);
1810 EM_DEBUG_LOG("WIFI Status [%d]", wifi_status);
1812 if (!pbd_thd_state && event_que_state && wifi_status > 1) {
1813 WAKE_CONDITION_VARIABLE(_auto_downalod_available_signal);
1817 //go to sleep when queue is empty
1818 SLEEP_CONDITION_VARIABLE(_send_event_available_signal, *_send_event_queue_lock);
1819 EM_DEBUG_LOG("Wake up by _send_event_available_signal");
1820 LEAVE_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1822 LEAVE_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1823 EM_DEBUG_LOG(">>>>>>>>>>>>>>Got SEND event_data>>>>>>>>>>>>>>>>");
1824 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_SENDING_WORKER, false, NULL);
1825 send_thread_run = 1;
1827 switch (event_data->type) {
1829 case EMAIL_EVENT_SEND_MAIL:
1830 if (!emcore_send_mail(event_data->multi_user_name, event_data->event_param_data_4, &err))
1831 EM_DEBUG_EXCEPTION("emcore_send_mail failed [%d]", err);
1834 case EMAIL_EVENT_SEND_MAIL_SAVED:
1835 /* send mails to been saved in off-line mode */
1836 if (!emcore_send_saved_mail(event_data->multi_user_name, event_data->account_id, event_data->event_param_data_3, &err))
1837 EM_DEBUG_EXCEPTION("emcore_send_saved_mail failed - %d", err);
1840 #ifdef __FEATURE_LOCAL_ACTIVITY__
1841 case EMAIL_EVENT_LOCAL_ACTIVITY: {
1842 emdevice_set_sleep_on_off(false, NULL);
1843 emstorage_activity_tbl_t *local_activity = NULL;
1844 int activity_id_count = 0;
1845 int activity_chunk_count = 0;
1846 int *activity_id_list = NULL;
1849 if (false == emstorage_get_activity_id_list(event_data->account_id, &activity_id_list, &activity_id_count, ACTIVITY_SAVEMAIL, ACTIVITY_DELETEMAIL_SEND, true, &err)) {
1850 EM_DEBUG_EXCEPTION("emstorage_get_activity_id_list failed [%d]", err);
1852 for (i = 0; i < activity_id_count; ++i) {
1853 if ((false == emstorage_get_activity(event_data->account_id, activity_id_list[i], &local_activity, &activity_chunk_count, true, &err)) || (NULL == local_activity) || (0 == activity_chunk_count)) {
1854 EM_DEBUG_EXCEPTION(" emstorage_get_activity Failed [ %d] or local_activity is NULL [%p] or activity_chunk_count is 0[%d]", err, local_activity, activity_chunk_count);
1856 EM_DEBUG_LOG("Found local activity type - %d", local_activity[0].activity_type);
1857 switch (local_activity[0].activity_type) {
1858 case ACTIVITY_SAVEMAIL: {
1859 if (!emcore_sync_mail_from_client_to_server(event_data->multi_user_name, event_data->account_id, local_activity[0].mail_id, &err)) {
1860 EM_DEBUG_EXCEPTION("emcore_sync_mail_from_client_to_server failed - %d ", err);
1865 case ACTIVITY_DELETEMAIL_SEND: /* New Activity Type Added for Race Condition and Crash Fix */ {
1866 if (!emcore_delete_mail(local_activity[0].multi_user_name,
1867 local_activity[0].account_id,
1868 &local_activity[0].mail_id,
1869 EMAIL_DELETE_FOR_SEND_THREAD,
1871 EMAIL_DELETED_BY_COMMAND,
1874 EM_DEBUG_LOG("\t emcore_delete_mail failed - %d", err);
1880 EM_DEBUG_LOG(">>>> No such Local Activity Handled by this thread [ %d ] >>> ", local_activity[0].activity_type);
1885 emstorage_free_local_activity(&local_activity, activity_chunk_count, NULL);
1887 if (g_save_local_activity_run == 1) {
1888 EM_DEBUG_LOG(" Network event_data found.. Local sync Stopped..! ");
1894 if (false == emstorage_free_activity_id_list(activity_id_list, &err)) {
1895 EM_DEBUG_LOG("emstorage_free_activity_id_list failed");
1899 emdevice_set_sleep_on_off(true, NULL);
1902 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1905 EM_DEBUG_LOG("Others not supported by Send Thread..! [%d]", event_data->type);
1909 ENTER_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1910 started_event = g_queue_pop_head(g_send_event_que);
1911 LEAVE_RECURSIVE_CRITICAL_SECTION(_send_event_queue_lock);
1912 if (!started_event) {
1913 EM_DEBUG_EXCEPTION("Failed to g_queue_pop_head");
1915 emcore_return_send_handle(started_event->handle);
1916 emcore_free_event(started_event);
1917 EM_SAFE_FREE(started_event);
1922 if (!emstorage_close(&err))
1923 EM_DEBUG_EXCEPTION("emstorage_close falied [%d]", err);
1925 emcore_close_smtp_stream_list();
1926 EM_DEBUG_FUNC_END("err [%d]", err);
1930 INTERNAL_FUNC int emdaemon_start_thread_for_downloading_partial_body(int *err_code)
1932 EM_DEBUG_FUNC_BEGIN();
1934 int i = 0, thread_error = -1;
1936 /* Clear Partial Body Event Queue*/
1937 memset(&g_partial_body_thd_event_que, 0x00, sizeof(g_partial_body_thd_event_que));
1939 for (i = 0; i < TOTAL_PARTIAL_BODY_EVENTS; ++i) {
1940 g_partial_body_thd_event_que[i].mailbox_name = NULL;
1941 g_partial_body_thd_event_que[i].mailbox_id = 0;
1944 if (g_partial_body_thd) {
1945 EM_DEBUG_EXCEPTION("partial body thread is already running...");
1946 if (err_code != NULL)
1947 *err_code = EMAIL_ERROR_UNKNOWN;
1953 ENTER_CRITICAL_SECTION(_partial_body_thd_event_queue_lock);
1954 g_partial_body_thd_next_event_idx = 0;
1955 // g_partial_body_thd_loop = 1;
1956 g_partial_body_thd_queue_empty = true;
1957 g_partial_body_thd_queue_full = false;
1958 LEAVE_CRITICAL_SECTION(_partial_body_thd_event_queue_lock);
1960 INITIALIZE_CONDITION_VARIABLE(_partial_body_thd_cond);
1963 /* THREAD_CREATE_JOINABLE(g_partial_body_thd, partial_body_download_thread, thread_error); */
1964 THREAD_CREATE(g_partial_body_thd, partial_body_download_thread, NULL, thread_error);
1966 if (thread_error != 0) {
1967 EM_DEBUG_EXCEPTION("cannot make thread...");
1968 if (err_code != NULL)
1969 *err_code = EMAIL_ERROR_UNKNOWN;
1973 if (err_code != NULL)
1974 *err_code = EMAIL_ERROR_NONE;
1981 static gpointer partial_body_download_thread(gpointer data)
1983 EM_DEBUG_FUNC_BEGIN();
1985 int err = EMAIL_ERROR_NONE;
1986 email_session_t *session = NULL;
1987 email_event_partial_body_thd partial_body_thd_event;
1988 int account_count = 0;
1989 emstorage_account_tbl_t *account_list = NULL;
1990 int event_que_state = 0;
1991 int send_event_que_state = 0;
1993 EM_DEBUG_LOG_DEV(" ************ PB THREAD ID IS ALIVE. ID IS [%d] ********************" , THREAD_SELF());
1995 /* Open connection with DB */
1997 if (false == emstorage_open(NULL, &err)) {
1998 EM_DEBUG_EXCEPTION("emstorage_open failed [%d]", err);
2002 /* refactoring session required */
2003 if (!emcore_get_empty_session(&session)) {
2004 EM_DEBUG_EXCEPTION("emcore_get_empty_session failed...");
2009 memset(&partial_body_thd_event, 0, sizeof(email_event_partial_body_thd));
2011 if (false == emcore_retrieve_partial_body_thread_event(&partial_body_thd_event, &err)) {
2012 if (EMAIL_ERROR_EVENT_QUEUE_EMPTY != err)
2013 EM_DEBUG_EXCEPTION("emcore_retrieve_partial_body_thread_event failed [%d]", err);
2015 EM_DEBUG_LOG(" partial body thread event_data queue is empty.");
2017 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
2018 int wifi_status = 0;
2021 /* Flush the que before starting local activity sync to clear the events in queue which are less than 10 in count */
2022 if (!g_partial_body_bulk_dwd_queue_empty) {
2023 partial_body_thd_event.event_type = 0;
2024 partial_body_thd_event.account_id = g_partial_body_bulk_dwd_que[0].account_id;
2025 partial_body_thd_event.mailbox_id = g_partial_body_bulk_dwd_que[0].mailbox_id;
2026 partial_body_thd_event.mailbox_name = EM_SAFE_STRDUP(g_partial_body_bulk_dwd_que[0].mailbox_name); /* need to be freed */
2027 partial_body_thd_event.multi_user_name = EM_SAFE_STRDUP(g_partial_body_bulk_dwd_que[0].multi_user_name); /* need to be freed */
2030 if (false == emcore_mail_partial_body_download(&partial_body_thd_event, &err))
2031 EM_DEBUG_EXCEPTION("emcore_mail_partial_body_download from event_data queue failed [%d]", err);
2033 emcore_pb_thd_set_local_activity_continue(true);
2036 if (true == emcore_pb_thd_can_local_activity_continue()) {
2037 /*Check for local Activities */
2038 int is_local_activity_event_inserted = false;
2040 if (false == emcore_partial_body_thd_local_activity_sync(partial_body_thd_event.multi_user_name, &is_local_activity_event_inserted, &err)) {
2041 EM_DEBUG_EXCEPTION("emcore_partial_body_thd_local_activity_sync failed [%d]", err);
2043 if (true == is_local_activity_event_inserted) {
2044 emcore_pb_thd_set_local_activity_continue(false);
2046 /* emcore_clear_session(session);*/
2048 if (false == emcore_free_partial_body_thd_event(&partial_body_thd_event, &err))
2049 EM_DEBUG_EXCEPTION("emcore_free_partial_body_thd_event_cell failed [%d]", err);
2056 EM_DEBUG_LOG_DEV(" Partial Body Thread is going to sleep");
2060 account_list = NULL;
2061 if (!emstorage_get_account_list(NULL, &account_count, &account_list, false, false, &err)) {
2062 EM_DEBUG_EXCEPTION("emstorage_get_account_list failed : [%d]", err);
2066 for (i = 0; i < account_count; i++) {
2067 if (!emdaemon_finalize_sync(partial_body_thd_event.multi_user_name, account_list[i].account_id, 0, 0, 0, 0, true, NULL))
2068 EM_DEBUG_EXCEPTION("emdaemon_finalize_sync failed");
2073 emstorage_free_account(&account_list, account_count, NULL);
2075 emcore_set_pbd_thd_state(false);
2077 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
2078 if ((err = emnetwork_get_wifi_status(&wifi_status)) != EMAIL_ERROR_NONE) {
2079 EM_DEBUG_EXCEPTION("emnetwork_get_wifi_status failed [%d]", err);
2082 EM_DEBUG_LOG("WIFI Status [%d]", wifi_status);
2084 event_que_state = emcore_is_event_queue_empty();
2085 send_event_que_state = emcore_is_send_event_queue_empty();
2087 /*check: refactoring required*/
2088 ENTER_CRITICAL_SECTION(_partial_body_thd_event_queue_lock);
2089 #ifdef __FEATURE_WIFI_AUTO_DOWNLOAD__
2090 if (event_que_state && send_event_que_state && wifi_status > 1) {
2091 WAKE_CONDITION_VARIABLE(_auto_downalod_available_signal);
2094 SLEEP_CONDITION_VARIABLE(_partial_body_thd_cond, _partial_body_thd_event_queue_lock);
2095 LEAVE_CRITICAL_SECTION(_partial_body_thd_event_queue_lock);
2097 EM_DEBUG_LOG(" Partial Body Thread wakes up ");
2099 emcore_set_pbd_thd_state(true);
2102 EM_DEBUG_LOG(" Event Received from Partial Body Event Queue ");
2104 /* Since all events are network operations dnet init and sleep control is
2105 done before entering switch block*/
2107 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_PARTIAL_BODY_WORKER, false, NULL);
2109 if (!emnetwork_check_network_status(&err)) {
2110 EM_DEBUG_EXCEPTION("emnetwork_check_network_status failed [%d]", err);;
2112 /* Process events */
2113 EM_DEBUG_LOG("partial_body_thd_event.account_id[%d]", partial_body_thd_event.account_id);
2115 switch (partial_body_thd_event.event_type) {
2116 case EMAIL_EVENT_BULK_PARTIAL_BODY_DOWNLOAD: {
2117 if (false == emcore_mail_partial_body_download(&partial_body_thd_event, &err)) {
2118 EM_DEBUG_EXCEPTION("emcore_mail_partial_body_download from event_data queue failed [%d]", err);
2122 case EMAIL_EVENT_LOCAL_ACTIVITY_SYNC_BULK_PBD: {
2123 partial_body_thd_event.event_type = 0;
2125 /* Both the checks below make sure that before starting local activity there is no new/pending event_data in
2126 * g_partial_body_thd_event_que and g_partial_body_bulk_dwd_que */
2127 if (false == emcore_is_partial_body_thd_que_empty())
2129 if (!g_partial_body_bulk_dwd_queue_empty)
2132 if (false == emcore_mail_partial_body_download(&partial_body_thd_event, &err))
2133 EM_DEBUG_EXCEPTION("emcore_mail_partial_body_download from activity table failed [%d]", err);
2137 EM_DEBUG_EXCEPTION(" Warning : Default case entered. This should not happen ");
2142 if (false == emcore_free_partial_body_thd_event(&partial_body_thd_event, NULL))
2143 EM_DEBUG_EXCEPTION("emcore_free_partial_body_thd_event_cell failed");
2145 emdevice_set_sleep_on_off(STAY_AWAKE_FLAG_FOR_PARTIAL_BODY_WORKER, true, NULL);
2148 /* emcore_clear_session(session); */
2151 emcore_close_recv_stream_list();
2152 emcore_clear_session(session);