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.
24 /******************************************************************************
25 * File: email-daemon-mail.c
26 * Desc: email-daemon Mail Operation
31 * 2006.08.16 : created
32 *****************************************************************************/
36 #include <sys/types.h>
43 #include "email-internal-types.h"
44 #include "email-daemon.h"
45 #include "email-network.h"
46 #include "email-core-event.h"
47 #include "email-daemon-account.h"
48 #include "email-debug-log.h"
49 #include "email-storage.h"
50 #include "email-utilities.h"
51 #include "email-core-account.h"
52 #include "email-core-mail.h"
53 #include "email-core-mailbox.h"
54 #include "email-core-utils.h"
55 #include "email-core-smtp.h"
56 #include "email-core-timer.h"
57 #include "email-core-signal.h"
59 #ifdef __FEATURE_LOCAL_ACTIVITY__
60 extern int g_local_activity_run;
61 extern int g_save_local_activity_run;
63 static int _emdaemon_check_mail_id(char *multi_user_name, int mail_id, int* err_code);
65 INTERNAL_FUNC int emdaemon_send_mail(char *multi_user_name, int mail_id, int *handle, int* err_code)
67 EM_DEBUG_FUNC_BEGIN("mail_id[%d], handle[%p], err_code[%p]", mail_id, handle, err_code);
69 int ret = false, err = EMAIL_ERROR_NONE, err_2 = EMAIL_ERROR_NONE;
70 int result_handle = 0, account_id = 0;
71 email_event_t *event_data = NULL;
72 emstorage_mail_tbl_t* mail_table_data = NULL;
73 emstorage_mailbox_tbl_t* local_mailbox = NULL;
74 email_account_t* ref_account = NULL;
75 int dst_mailbox_id = 0;
78 EM_DEBUG_EXCEPTION("mail_id is not valid");
79 err = EMAIL_ERROR_INVALID_PARAM;
83 if (!emstorage_get_mail_by_id(multi_user_name, mail_id, &mail_table_data, true, &err)) {
84 EM_DEBUG_EXCEPTION("Failed to get mail by mail_id [%d]", err);
88 if (!mail_table_data || mail_table_data->mailbox_id <= 0 || mail_table_data->account_id <= 0) {
89 if (mail_table_data != NULL)
90 EM_DEBUG_EXCEPTION(" mail_table_data->mailbox_id[%d], mail_table_data->account_id[%d]", mail_table_data->mailbox_id, mail_table_data->account_id);
92 *err_code = EMAIL_ERROR_INVALID_MAILBOX;
94 emstorage_free_mail(&mail_table_data, 1, &err);
98 account_id = mail_table_data->account_id;
100 ref_account = emcore_get_account_reference(multi_user_name, account_id, false);
102 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", account_id);
103 err = EMAIL_ERROR_INVALID_ACCOUNT;
109 #ifdef __FEATURE_MOVE_TO_OUTBOX_FIRST__
110 if (!emstorage_get_mailbox_by_mailbox_type(multi_user_name, account_id, EMAIL_MAILBOX_TYPE_OUTBOX, &local_mailbox, true, &err)) {
111 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_mailbox_type failed [%d]", err);
115 dst_mailbox_id = local_mailbox->mailbox_id;
116 if (mail_table_data->mailbox_id != dst_mailbox_id) {
117 /* mail is moved to 'OUTBOX' first of all. */
118 if (!emcore_move_mail(multi_user_name, &mail_id, 1, dst_mailbox_id, EMAIL_MOVED_AFTER_SENDING, 0, &err)) {
119 EM_DEBUG_EXCEPTION("emcore_mail_move falied [%d]", err);
123 #endif /* __FEATURE_MOVE_TO_OUTBOX_FIRST__ */
125 if (!emcore_notify_network_event(NOTI_SEND_START, account_id, NULL, mail_id, 0))
126 EM_DEBUG_EXCEPTION(" emcore_notify_network_event [ NOTI_SEND_START] Failed >>>> ");
128 /* set EMAIL_MAIL_STATUS_SEND_WAIT status */
129 if (!emstorage_set_field_of_mails_with_integer_value(multi_user_name, account_id, &mail_id, 1, "save_status", EMAIL_MAIL_STATUS_SEND_WAIT, true, &err)) {
130 EM_DEBUG_EXCEPTION("emstorage_set_field_of_mails_with_integer_value [%d]", err);
134 event_data = em_malloc(sizeof(email_event_t));
135 if (event_data == NULL) {
136 EM_DEBUG_EXCEPTION("em_malloc failed");
137 err = EMAIL_ERROR_OUT_OF_MEMORY;
141 event_data->type = EMAIL_EVENT_SEND_MAIL;
142 event_data->account_id = account_id;
143 event_data->event_param_data_4 = mail_id;
144 event_data->event_param_data_5 = mail_table_data->mailbox_id;
145 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
147 if (!emcore_insert_event_for_sending_mails(event_data, &result_handle, &err)) {
148 EM_DEBUG_EXCEPTION(" emcore_insert_event failed [%d]", err);
152 #ifdef __FEATURE_LOCAL_ACTIVITY__
153 EM_DEBUG_LOG("Setting g_save_local_activity_run ");
154 g_save_local_activity_run = 1;
158 *handle = result_handle;
164 EM_DEBUG_EXCEPTION("emdaemon_send_mail failed [%d]", err);
166 if (!emstorage_set_field_of_mails_with_integer_value(multi_user_name, account_id, &mail_id, 1, "save_status", EMAIL_MAIL_STATUS_SAVED, true, &err))
167 EM_DEBUG_EXCEPTION("emstorage_set_field_of_mails_with_integer_value [%d]", err);
170 emcore_free_event(event_data);
171 EM_SAFE_FREE(event_data);
176 emcore_free_account(ref_account);
177 EM_SAFE_FREE(ref_account);
180 if (!emcore_add_transaction_info(mail_id , result_handle , &err_2))
181 EM_DEBUG_EXCEPTION("emcore_add_transaction_info failed [%d]", err_2);
184 emstorage_free_mailbox(&local_mailbox, 1, NULL);
186 if (err_code != NULL)
190 emstorage_free_mail(&mail_table_data, 1, &err);
196 INTERNAL_FUNC int emdaemon_send_mail_saved(char *multi_user_name, int account_id, int *handle, int* err_code)
198 EM_DEBUG_FUNC_BEGIN("account_id[%d],handle[%p], err_code[%p]", account_id, handle, err_code);
201 int err = EMAIL_ERROR_NONE;
202 email_event_t *event_data = NULL;
203 email_account_t *ref_account = NULL;
204 char *mailbox_name = NULL;
206 if (account_id <= 0) {
207 EM_DEBUG_EXCEPTION("account_id = %d", account_id);
208 err = EMAIL_ERROR_INVALID_PARAM;
212 ref_account = emcore_get_account_reference(multi_user_name, account_id, false);
214 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", account_id);
215 err = EMAIL_ERROR_INVALID_ACCOUNT;
219 if (!emstorage_get_mailbox_name_by_mailbox_type(multi_user_name, account_id, EMAIL_MAILBOX_TYPE_OUTBOX, &mailbox_name, false, &err)) {
220 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_name_by_mailbox_type failed [%d]", err);
224 event_data = em_malloc(sizeof(email_event_t));
225 if (event_data == NULL) {
226 EM_DEBUG_EXCEPTION("em_malloc failed");
227 err = EMAIL_ERROR_OUT_OF_MEMORY;
231 event_data->type = EMAIL_EVENT_SEND_MAIL_SAVED;
232 event_data->account_id = account_id;
233 event_data->event_param_data_3 = EM_SAFE_STRDUP(mailbox_name);
234 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
236 if (!emcore_insert_event_for_sending_mails(event_data, (int *)handle, &err)) {
237 EM_DEBUG_EXCEPTION(" emcore_insert_event failed [%d]", err);
245 if (ret == false && event_data) {
246 emcore_free_event(event_data);
247 EM_SAFE_FREE(event_data);
251 emcore_free_account(ref_account);
252 EM_SAFE_FREE(ref_account);
255 EM_SAFE_FREE(mailbox_name);
264 INTERNAL_FUNC int emdaemon_add_mail(char *multi_user_name,
265 email_mail_data_t *input_mail_data,
266 email_attachment_data_t *input_attachment_data_list,
267 int input_attachment_count,
268 email_meeting_request_t *input_meeting_request,
271 EM_DEBUG_FUNC_BEGIN("input_mail_data[%p], input_attachment_data_list[%p], input_attachment_count [%d], input_meeting_req [%p], input_from_eas[%d]", input_mail_data, input_attachment_data_list, input_attachment_count, input_meeting_request, input_from_eas);
274 int err = EMAIL_ERROR_NONE;
276 email_event_t *event_data = NULL;
277 email_account_t *ref_account = NULL;
279 if (!input_mail_data || input_mail_data->account_id <= 0 ||
280 (((input_mail_data->report_status & EMAIL_MAIL_REPORT_MDN) != 0) && !input_mail_data->full_address_to)) {
281 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
282 err = EMAIL_ERROR_INVALID_PARAM;
286 ref_account = emcore_get_account_reference(multi_user_name, input_mail_data->account_id, false);
288 EM_DEBUG_LOG(" emcore_get_account_reference failed [%d]", input_mail_data->account_id);
289 err = EMAIL_ERROR_INVALID_ACCOUNT;
293 if ((err = emcore_add_mail(multi_user_name, input_mail_data, input_attachment_data_list, input_attachment_count, input_meeting_request, input_from_eas, false)) != EMAIL_ERROR_NONE) {
294 EM_DEBUG_EXCEPTION("emcore_add_mail failed [%d]", err);
298 #ifdef __FEATURE_SYNC_CLIENT_TO_SERVER__
299 if (input_from_eas == 0 && ref_account->incoming_server_type == EMAIL_SERVER_TYPE_IMAP4) {
300 event_data = em_malloc(sizeof(email_event_t));
301 if (event_data == NULL) {
302 EM_DEBUG_EXCEPTION("em_malloc failed");
303 err = EMAIL_ERROR_OUT_OF_MEMORY;
307 event_data->type = EMAIL_EVENT_SAVE_MAIL;
308 event_data->account_id = input_mail_data->account_id;
309 event_data->event_param_data_4 = input_mail_data->mail_id;
310 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
312 if (!emcore_insert_event(event_data, &handle, &err)) {
313 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
323 if (ret == false && event_data) {
324 emcore_free_event(event_data);
325 EM_SAFE_FREE(event_data);
329 emcore_free_account(ref_account);
330 EM_SAFE_FREE(ref_account);
333 EM_DEBUG_FUNC_END("err [%d]", err);
339 INTERNAL_FUNC int emdaemon_add_meeting_request(char *multi_user_name, int account_id, int input_mailbox_id, email_meeting_request_t *meeting_req, int* err_code)
341 EM_DEBUG_FUNC_BEGIN("account_id[%d], input_mailbox_id[%d], meeting_req[%p], err_code[%p]", account_id, input_mailbox_id, meeting_req, err_code);
343 /* default variable */
345 int err = EMAIL_ERROR_NONE;
347 if (account_id <= 0 || !meeting_req || meeting_req->mail_id <= 0) {
349 EM_DEBUG_EXCEPTION("mail_id[%d]", meeting_req->mail_id);
351 err = EMAIL_ERROR_INVALID_PARAM;
355 if (!emcore_add_meeting_request(multi_user_name, account_id, input_mailbox_id, meeting_req, &err)) {
356 EM_DEBUG_EXCEPTION(" emcore_save_mail_meeting_request failed [%d]", err);
369 INTERNAL_FUNC int emdaemon_download_body(char *multi_user_name, int account_id, int mail_id, int verbose, int with_attachment, int *handle, int* err_code)
371 EM_DEBUG_FUNC_BEGIN("account_id[%d], mail_id[%d], verbose[%d], with_attachment[%d], handle[%p], err_code[%p]", account_id, mail_id, verbose, with_attachment, handle, err_code);
374 int err = EMAIL_ERROR_NONE;
375 email_event_t *event_data = NULL;
377 if (!_emdaemon_check_mail_id(multi_user_name, mail_id, &err)) {
378 EM_DEBUG_EXCEPTION("_emdaemon_check_mail_id failed [%d]", err);
382 event_data = em_malloc(sizeof(email_event_t));
383 if (event_data == NULL) {
384 EM_DEBUG_EXCEPTION("em_malloc failed");
385 err = EMAIL_ERROR_OUT_OF_MEMORY;
389 event_data->type = EMAIL_EVENT_DOWNLOAD_BODY;
390 event_data->account_id = account_id;
391 event_data->event_param_data_4 = mail_id;
392 event_data->event_param_data_5 = (verbose << 1 | with_attachment);
393 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
395 if (!emcore_insert_event(event_data, (int*)handle, &err)) {
396 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
397 err = EMAIL_ERROR_DB_FAILURE;
401 #ifdef __FEATURE_LOCAL_ACTIVITY__
402 EM_DEBUG_LOG("Setting g_local_activity_run ");
403 g_local_activity_run = 1;
409 if (ret == false && event_data) {
410 emcore_free_event(event_data);
411 EM_SAFE_FREE(event_data);
422 int emdaemon_get_attachment(char *multi_user_name, int attachment_id, email_attachment_data_t** attachment, int* err_code)
424 EM_DEBUG_FUNC_BEGIN("attachment_id[%d], attachment[%p], err_code[%p]", attachment_id, attachment, err_code);
426 /* default variable */
428 int err = EMAIL_ERROR_NONE;
430 if (!attachment_id || !attachment) {
431 EM_DEBUG_EXCEPTION("mail_id[%d], attachment_id[%d], attachment[%p]\n", attachment_id, attachment);
432 err = EMAIL_ERROR_INVALID_PARAM;
436 if (!emcore_get_attachment_info(multi_user_name, attachment_id, attachment, &err) || !attachment) {
437 EM_DEBUG_EXCEPTION("emcore_get_attachment_info failed [%d]", err);
453 int emdaemon_add_attachment(char *multi_user_name, int mail_id, email_attachment_data_t* attachment, int* err_code)
455 EM_DEBUG_FUNC_BEGIN("mail_id[%d], attachment[%p], err_code[%p]", mail_id, attachment, err_code);
457 /* default variable */
459 int err = EMAIL_ERROR_NONE;
462 EM_DEBUG_EXCEPTION(" mailbox[%p], mail_id[%d], attachment[%p]", mail_id, attachment);
463 err = EMAIL_ERROR_INVALID_PARAM;
467 if (!_emdaemon_check_mail_id(multi_user_name, mail_id, &err)) {
468 EM_DEBUG_EXCEPTION(" _emdaemon_check_mail_id failed [%d]", err);
472 if (!emcore_add_attachment(multi_user_name, mail_id, attachment, &err)) {
473 EM_DEBUG_EXCEPTION(" emcore_add_attachment failed [%d]", err);
489 int emdaemon_delete_mail_attachment(char *multi_user_name, int attachment_id, int* err_code)
491 EM_DEBUG_FUNC_BEGIN("attachment_id[%d], err_code[%p]", attachment_id, err_code);
493 /* default variable */
495 int err = EMAIL_ERROR_NONE;
497 if (!attachment_id) {
498 EM_DEBUG_EXCEPTION("attachment_id[%d]", attachment_id);
499 err = EMAIL_ERROR_INVALID_PARAM;
503 if (!emcore_delete_mail_attachment(multi_user_name, attachment_id, &err)) {
504 EM_DEBUG_EXCEPTION(" emcore_delete_mail_attachment failed [%d]", err);
520 INTERNAL_FUNC int emdaemon_download_attachment(char *multi_user_name, int account_id, int mail_id, int nth, int *handle, int* err_code)
522 EM_DEBUG_FUNC_BEGIN("account_id[%d], mail_id[%d], nth[%d], handle[%p], err_code[%p]", account_id, mail_id, nth, handle, err_code);
525 int err = EMAIL_ERROR_NONE;
526 email_event_t *event_data = NULL;
529 EM_DEBUG_EXCEPTION("nth[%p] is invalid", nth);
530 err = EMAIL_ERROR_INVALID_PARAM;
534 if (!_emdaemon_check_mail_id(multi_user_name, mail_id, &err)) {
535 EM_DEBUG_EXCEPTION("_emdaemon_check_mail_id failed [%d]", err);
539 event_data = em_malloc(sizeof(email_event_t));
540 if (event_data == NULL) {
541 EM_DEBUG_EXCEPTION("em_malloc failed");
542 err = EMAIL_ERROR_OUT_OF_MEMORY;
546 event_data->type = EMAIL_EVENT_DOWNLOAD_ATTACHMENT;
547 event_data->account_id = account_id;
548 event_data->event_param_data_4 = mail_id;
549 event_data->event_param_data_5 = nth;
550 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
552 if (!emcore_insert_event(event_data, (int*)handle, &err)) {
553 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
557 #ifdef __FEATURE_LOCAL_ACTIVITY__
558 EM_DEBUG_LOG("Setting g_local_activity_run ");
559 g_local_activity_run = 1;
566 if (ret == false && event_data) {
567 emcore_free_event(event_data);
568 EM_SAFE_FREE(event_data);
579 INTERNAL_FUNC int emdaemon_free_attachment_data(email_attachment_data_t** atch_data, int* err_code)
581 EM_DEBUG_FUNC_BEGIN();
582 return emcore_free_attachment_data(atch_data, 1, err_code);
585 void* thread_func_to_delete_mail(void *thread_argument)
587 EM_DEBUG_FUNC_BEGIN();
588 int err = EMAIL_ERROR_NONE;
589 int *mail_id_list = NULL;
590 int mail_id_count = 0;
593 int noti_param_2 = 0;
594 char *multi_user_name = NULL;
595 email_event_t *event_data = (email_event_t*)thread_argument;
597 if (event_data == NULL) {
598 EM_DEBUG_EXCEPTION("Invalid parameter");
602 account_id = event_data->account_id;
603 mail_id_list = (int*)event_data->event_param_data_3;
604 mail_id_count = event_data->event_param_data_4;
605 mailbox_id = event_data->event_param_data_6;
606 multi_user_name = event_data->multi_user_name;
608 if (!emcore_delete_mail(multi_user_name,
613 EMAIL_DELETE_LOCALLY,
614 EMAIL_DELETE_LOCAL_AND_SERVER,
617 EM_DEBUG_EXCEPTION("emcore_delete_mail failed [%d]", err);
623 emcore_free_event(event_data);
624 EM_SAFE_FREE(event_data);
630 INTERNAL_FUNC int emdaemon_delete_mail(char *multi_user_name,
639 EM_DEBUG_FUNC_BEGIN("account_id[%d], mailbox_id[%d], mail_ids[%p], "
640 "mail_ids_count[%d], from_server[%d], handle[%p], err_code[%p]",
641 account_id, mailbox_id, mail_ids, mail_ids_count, from_server, handle, err_code);
644 int err = EMAIL_ERROR_NONE;
645 int *p = NULL, *p2 = NULL;
646 int thread_error = 0;
647 email_event_t *event_data = NULL;
648 email_event_t *thread_func_event_data = NULL;
649 email_account_t *ref_account = NULL;
650 thread_t delete_thread;
652 /* mailbox can be NULL for deleting thread mail. */
653 if (mail_ids_count <= 0) {
654 EM_DEBUG_EXCEPTION("mail_ids_count [%d]", mail_ids_count);
655 err = EMAIL_ERROR_INVALID_PARAM;
659 ref_account = emcore_get_account_reference(multi_user_name, account_id, false);
661 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed.");
662 err = EMAIL_ERROR_INVALID_ACCOUNT;
666 if (ref_account->incoming_server_type == EMAIL_SERVER_TYPE_ACTIVE_SYNC) {
667 from_server = EMAIL_DELETE_LOCALLY;
670 if (from_server == EMAIL_DELETE_LOCAL_AND_SERVER || from_server == EMAIL_DELETE_FROM_SERVER) {
671 if ((event_data = em_malloc(sizeof(email_event_t))) == NULL) {
672 EM_DEBUG_EXCEPTION("em_malloc for event_data failed...");
673 err = EMAIL_ERROR_OUT_OF_MEMORY;
677 if ((p = em_malloc(sizeof(int) * mail_ids_count)) == NULL) {
678 EM_DEBUG_EXCEPTION("em_malloc for p failed...");
679 err = EMAIL_ERROR_OUT_OF_MEMORY;
683 memcpy(p, mail_ids, sizeof(int) * mail_ids_count);
685 event_data->type = EMAIL_EVENT_DELETE_MAIL;
686 event_data->account_id = account_id;
687 event_data->event_param_data_3 = (char*)p;
688 event_data->event_param_data_4 = mail_ids_count;
689 event_data->event_param_data_5 = from_server;
690 event_data->event_param_data_6 = mailbox_id;
691 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
693 if (!emcore_insert_event(event_data, handle, &err)) {
694 EM_DEBUG_EXCEPTION("emcore_insert_event failed : [%d]", err);
700 if (err != EMAIL_ERROR_NONE) {
702 emcore_free_event(event_data);
703 EM_SAFE_FREE(event_data);
709 thread_func_event_data = em_malloc(sizeof(email_event_t));
710 if (thread_func_event_data == NULL) {
711 EM_DEBUG_EXCEPTION("em_malloc failed");
712 err = EMAIL_ERROR_OUT_OF_MEMORY;
716 p2 = em_malloc(sizeof(int) * mail_ids_count);
718 EM_DEBUG_EXCEPTION("em_malloc failed");
719 err = EMAIL_ERROR_OUT_OF_MEMORY;
723 memcpy(p2, mail_ids, sizeof(int) * mail_ids_count);
725 thread_func_event_data->type = EMAIL_EVENT_DELETE_MAIL;
726 thread_func_event_data->account_id = account_id;
727 thread_func_event_data->event_param_data_3 = (char *)p2;
728 thread_func_event_data->event_param_data_4 = mail_ids_count;
729 thread_func_event_data->event_param_data_5 = from_server;
730 thread_func_event_data->event_param_data_6 = mailbox_id;
731 thread_func_event_data->multi_user_name = g_strdup(multi_user_name);
733 THREAD_CREATE(delete_thread, thread_func_to_delete_mail, (void *)thread_func_event_data, thread_error);
734 if (thread_error == 0)
735 THREAD_DETACH(delete_thread); /* free resources used for new thread */
740 if (err != EMAIL_ERROR_NONE || thread_error != 0) {
741 if (thread_func_event_data) {
742 emcore_free_event(thread_func_event_data);
743 EM_SAFE_FREE(thread_func_event_data);
748 emcore_free_account(ref_account);
749 EM_SAFE_FREE(ref_account);
758 int emdaemon_delete_mail_all(char *multi_user_name, int input_mailbox_id, int input_from_server, int *output_handle, int *output_err_code)
760 EM_DEBUG_FUNC_BEGIN("input_mailbox_id[%d], input_from_server[%d], handle[%p], err_code[%p]", input_mailbox_id, input_from_server, output_handle, output_err_code);
763 int err = EMAIL_ERROR_NONE;
764 emstorage_mailbox_tbl_t *mailbox_tbl = NULL;
765 email_event_t *event_data = NULL;
767 if (!input_mailbox_id) {
768 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
769 err = EMAIL_ERROR_INVALID_PARAM;
773 if ((err = emstorage_get_mailbox_by_id(multi_user_name, input_mailbox_id, &mailbox_tbl) != EMAIL_ERROR_NONE)) {
774 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed [%d]", err);
778 if (!emcore_delete_all_mails_of_mailbox(multi_user_name,
779 mailbox_tbl->account_id,
782 EMAIL_DELETE_LOCALLY,
784 EM_DEBUG_EXCEPTION("emcore_delete_all_mails_of_mailbox failed [%d]", err);
788 #ifdef __FEATURE_SYNC_CLIENT_TO_SERVER__
789 if (input_from_server == EMAIL_DELETE_LOCAL_AND_SERVER || input_from_server == EMAIL_DELETE_FROM_SERVER) {
790 event_data = em_malloc(sizeof(email_event_t));
791 if (event_data == NULL) {
792 EM_DEBUG_EXCEPTION("em_malloc failed");
793 err = EMAIL_ERROR_OUT_OF_MEMORY;
797 event_data->type = EMAIL_EVENT_DELETE_MAIL_ALL;
798 event_data->account_id = mailbox_tbl->account_id;
799 event_data->event_param_data_4 = input_mailbox_id;
800 event_data->event_param_data_5 = input_from_server;
801 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
803 if (!emcore_insert_event(event_data, (int*)output_handle, &err)) {
804 EM_DEBUG_EXCEPTION("emcore_insert_event falied [%d]", err);
808 #ifdef __FEATURE_LOCAL_ACTIVITY__
810 DB_STMT search_handle = 0;
811 int *mail_ids = NULL;
812 emstorage_activity_tbl_t new_activity;
815 if (false == emcore_get_next_activity_id(&activityid, &err)) {
816 EM_DEBUG_EXCEPTION(" emcore_get_next_activity_id Failed - %d ", err);
819 if (!emstorage_mail_search_start(multi_user_name, NULL, mailbox->account_id, mailbox->mailbox_name, 0, &search_handle, &total, true, &err)) {
820 EM_DEBUG_EXCEPTION(" emstorage_mail_search_start failed [%d]", err);
824 mail_ids = em_malloc(sizeof(int) * total);
825 if (mail_ids == NULL) {
826 EM_DEBUG_EXCEPTION(" mailloc failed...");
827 err = EMAIL_ERROR_OUT_OF_MEMORY;
831 for (i = 0; i < total; i++) {
832 if (!emstorage_mail_search_result(search_handle, RETRIEVE_ID, (void**)&mail_ids[i], true, &err)) {
833 EM_DEBUG_EXCEPTION(" emstorage_mail_search_result failed [%d]", err);
836 EM_SAFE_FREE(mail_ids);
840 new_activity.activity_id = activityid;
841 new_activity.activity_type = ACTIVITY_DELETEMAIL;
842 new_activity.mail_id = mail_ids[i];
843 new_activity.server_mailid = NULL;
844 new_activity.src_mbox = mailbox->mailbox_name;
845 new_activity.dest_mbox = NULL;
846 new_activity.account_id = mailbox->account_id;
848 if (!emcore_add_activity(&new_activity, &err))
849 EM_DEBUG_EXCEPTION(" emcore_add_activity Failed - %d ", err);
853 EM_SAFE_FREE(mail_ids);
855 EM_DEBUG_LOG("Setting g_local_activity_run ");
856 g_local_activity_run = 1;
859 #endif /* __FEATURE_SYNC_CLIENT_TO_SERVER__ */
865 if (ret == false && event_data) {
866 emcore_free_event(event_data);
867 EM_SAFE_FREE(event_data);
871 emstorage_free_mailbox(&mailbox_tbl, 1, NULL);
874 *output_err_code = err;
879 void* thread_func_to_move_mail(void *thread_argument)
881 EM_DEBUG_FUNC_BEGIN();
883 int *mail_ids = NULL, mail_ids_count, noti_param_1, noti_param_2, err;
884 email_event_t *event_data = (email_event_t*)thread_argument;
885 int dst_mailbox_id = 0;
886 char *multi_user_name = NULL;
888 if (!event_data) { /*prevent 53096*/
889 EM_DEBUG_EXCEPTION("INVALID_PARMAETER");
893 /* dst_mailbox_name = (char*)event_data->event_param_data_1; */ /*prevent 33693*/
894 mail_ids = (int*)event_data->event_param_data_3;
895 mail_ids_count = event_data->event_param_data_4;
896 dst_mailbox_id = event_data->event_param_data_5;
897 noti_param_1 = event_data->event_param_data_6;
898 noti_param_2 = event_data->event_param_data_7;
899 multi_user_name = event_data->multi_user_name;
901 if (!emcore_move_mail(multi_user_name,
908 EM_DEBUG_EXCEPTION("emcore_mail_move failed [%d]", err);
914 emcore_free_event(event_data);
915 EM_SAFE_FREE(event_data);
921 INTERNAL_FUNC int emdaemon_move_mail_all_mails(char *multi_user_name, int src_mailbox_id, int dst_mailbox_id, int* err_code)
923 EM_DEBUG_FUNC_BEGIN("src_mailbox_id[%d], dst_mailbox_id[%d], err_code[%p]", src_mailbox_id, dst_mailbox_id, err_code);
926 int err = EMAIL_ERROR_NONE;
934 int thread_error = 0;
935 email_account_t *ref_account = NULL;
936 email_mail_list_item_t *mail_list = NULL;
937 email_event_t *event_data = NULL;
938 email_event_t *thread_func_event_data = NULL;
939 thread_t move_thread;
940 emstorage_mailbox_tbl_t *dst_mailbox_tbl = NULL;
941 emstorage_mailbox_tbl_t *src_mailbox_tbl = NULL;
943 if (dst_mailbox_id <= 0 || src_mailbox_id <= 0) {
944 EM_DEBUG_EXCEPTION("Invalid Parameter");
945 err = EMAIL_ERROR_INVALID_PARAM;
949 if ((err = emstorage_get_mailbox_by_id(multi_user_name,
951 &dst_mailbox_tbl)) != EMAIL_ERROR_NONE || !dst_mailbox_tbl) {
952 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed. [%d]", err);
956 if ((err = emstorage_get_mailbox_by_id(multi_user_name,
958 &src_mailbox_tbl)) != EMAIL_ERROR_NONE || !src_mailbox_tbl) {
959 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed. [%d]", err);
963 ref_account = emcore_get_account_reference(multi_user_name, dst_mailbox_tbl->account_id, false);
965 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", dst_mailbox_tbl->account_id);
966 err = EMAIL_ERROR_INVALID_ACCOUNT;
970 if (!emstorage_get_mail_list(multi_user_name,
971 src_mailbox_tbl->account_id,
974 EMAIL_LIST_TYPE_NORMAL,
979 EMAIL_SORT_DATETIME_HIGH,
984 EM_DEBUG_EXCEPTION("emstorage_get_mail_list failed");
988 mails = malloc(sizeof(int) * select_num);
990 EM_DEBUG_EXCEPTION("Malloc failed...!");
991 err = EMAIL_ERROR_OUT_OF_MEMORY;
995 memset(mails, 0x00, sizeof(int) * select_num);
997 for (i = 0 ; i < select_num ; i++) {
998 if (mail_list[i].save_status != EMAIL_MAIL_STATUS_SENDING) {
999 mails[num] = mail_list[i].mail_id;
1005 EM_DEBUG_EXCEPTION("can't find avalable mails. num = %d", num);
1006 err = EMAIL_ERROR_MAIL_NOT_FOUND;
1010 if ((event_data = em_malloc(sizeof(email_event_t))) == NULL) {
1011 EM_DEBUG_EXCEPTION("em_malloc for event_data failed...");
1012 err = EMAIL_ERROR_OUT_OF_MEMORY;
1016 if ((p = em_malloc(sizeof(int) * num)) == NULL) {
1017 EM_DEBUG_EXCEPTION("em_malloc for p failed...");
1018 err = EMAIL_ERROR_OUT_OF_MEMORY;
1022 memcpy(p, mails, sizeof(int) * num);
1024 event_data->account_id = dst_mailbox_tbl->account_id;
1025 event_data->type = EMAIL_EVENT_MOVE_MAIL;
1026 event_data->event_param_data_3 = (char *)p;
1027 event_data->event_param_data_4 = num;
1028 event_data->event_param_data_5 = dst_mailbox_id;
1029 event_data->event_param_data_8 = src_mailbox_id;
1030 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1032 if (!emcore_insert_event(event_data, &handle, &err)) {
1033 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
1039 if (err != EMAIL_ERROR_NONE) {
1041 emcore_free_event(event_data);
1042 EM_SAFE_FREE(event_data);
1047 #ifdef __FEATURE_LOCAL_ACTIVITY__
1048 int i = 0, activityid = 0;
1050 if (false == emcore_get_next_activity_id(&activityid, &err))
1051 EM_DEBUG_EXCEPTION(" emcore_get_next_activity_id Failed - %d ", err);
1053 for (i = 0; i < event_data.event_param_data_4; i++) {
1054 emstorage_activity_tbl_t new_activity;
1055 new_activity.activity_id = activityid;
1056 new_activity.activity_type = ACTIVITY_MOVEMAIL;
1057 new_activity.account_id = event_data.account_id;
1058 new_activity.mail_id = mail_ids[i];
1059 new_activity.dest_mbox = event_data.event_param_data_1;
1060 new_activity.server_mailid = NULL;
1061 new_activity.src_mbox = event_data.event_param_data_2;
1063 if (!emcore_add_activity(&new_activity, &err))
1064 EM_DEBUG_EXCEPTION(" emcore_add_activity Failed - %d ", err);
1066 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1068 /* seperated the event because of timing issue */
1069 thread_func_event_data = (email_event_t *)em_malloc(sizeof(email_event_t));
1070 if (thread_func_event_data == NULL) {
1071 EM_DEBUG_EXCEPTION("em_malloc failed");
1072 err = EMAIL_ERROR_OUT_OF_MEMORY;
1076 p2 = em_malloc(sizeof(int) * num);
1078 EM_DEBUG_EXCEPTION("em_malloc for p2 failed...");
1079 err = EMAIL_ERROR_OUT_OF_MEMORY;
1083 memcpy(p2, mails, sizeof(int) * num);
1085 thread_func_event_data->type = EMAIL_EVENT_MOVE_MAIL;
1086 thread_func_event_data->account_id = dst_mailbox_tbl->account_id;
1087 thread_func_event_data->event_param_data_3 = (char *)p2;
1088 thread_func_event_data->event_param_data_4 = num;
1089 thread_func_event_data->event_param_data_5 = dst_mailbox_id;
1090 thread_func_event_data->event_param_data_8 = src_mailbox_id;
1091 thread_func_event_data->multi_user_name = g_strdup(multi_user_name);
1093 THREAD_CREATE(move_thread, thread_func_to_move_mail, (void*)thread_func_event_data, thread_error);
1094 if (thread_error == 0)
1095 THREAD_DETACH(move_thread); /* free resources used for new thread */
1096 EM_DEBUG_LOG("thread_error [%d]", thread_error);
1101 if (err != EMAIL_ERROR_NONE || thread_error != 0) {
1102 if (thread_func_event_data) {
1103 emcore_free_event(thread_func_event_data);
1104 EM_SAFE_FREE(thread_func_event_data);
1108 #ifdef __FEATURE_LOCAL_ACTIVITY__
1109 EM_DEBUG_LOG("Setting g_local_activity_run ");
1110 g_local_activity_run = 1;
1111 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1117 emcore_free_account(ref_account);
1118 EM_SAFE_FREE(ref_account);
1121 if (dst_mailbox_tbl)
1122 emstorage_free_mailbox(&dst_mailbox_tbl, 1, NULL);
1124 if (src_mailbox_tbl)
1125 emstorage_free_mailbox(&src_mailbox_tbl, 1, NULL);
1128 EM_SAFE_FREE(mail_list);
1131 EM_SAFE_FREE(mails);
1133 EM_DEBUG_FUNC_END("ret [%d]", ret);
1137 INTERNAL_FUNC int emdaemon_move_mail(char *multi_user_name, int mail_ids[], int num, int dst_mailbox_id, int noti_param_1, int noti_param_2, int* err_code)
1139 EM_DEBUG_FUNC_BEGIN("mail_ids[%p], num[%d], dst_mailbox_id[%d], err_code[%p]", mail_ids, num, dst_mailbox_id, err_code);
1141 /* default variable */
1143 int mail_id = 0, thread_error = 0;
1144 int *p = NULL, *p2 = NULL;
1145 int ret = false, err = EMAIL_ERROR_NONE;
1146 emstorage_mail_tbl_t* mail_table_data = NULL;
1147 email_account_t* ref_account = NULL;
1148 email_event_t *event_data = NULL;
1149 email_event_t *thread_func_event_data = NULL;
1150 thread_t move_thread;
1151 emstorage_mailbox_tbl_t *dest_mailbox_tbl = NULL;
1152 int src_mailbox_id = 0;
1154 if (num <= 0 || dst_mailbox_id <= 0) {
1155 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
1156 err = EMAIL_ERROR_INVALID_PARAM;
1160 if ((err = emstorage_get_mailbox_by_id(multi_user_name, dst_mailbox_id, &dest_mailbox_tbl)) != EMAIL_ERROR_NONE || !dest_mailbox_tbl) {
1161 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed. [%d]", err);
1165 ref_account = emcore_get_account_reference(multi_user_name, dest_mailbox_tbl->account_id, false);
1168 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", dest_mailbox_tbl->account_id);
1169 err = EMAIL_ERROR_INVALID_ACCOUNT;
1173 /* Getting source mailbox name */
1174 mail_id = mail_ids[0];
1176 if (!emstorage_get_mail_field_by_id(multi_user_name, mail_id, RETRIEVE_SUMMARY, &mail_table_data, true, &err) || !mail_table_data) {
1177 EM_DEBUG_EXCEPTION("emstorage_get_mail_field_by_id failed [%d]", err);
1181 if (src_mailbox_id == 0)
1182 src_mailbox_id = mail_table_data->mailbox_id;
1184 emstorage_free_mail(&mail_table_data, 1, NULL);
1186 if ((event_data = em_malloc(sizeof(email_event_t))) == NULL) {
1187 EM_DEBUG_EXCEPTION("em_malloc for event_data failed...");
1188 err = EMAIL_ERROR_OUT_OF_MEMORY;
1192 if ((p = em_malloc(sizeof(int) * num)) == NULL) {
1193 EM_DEBUG_EXCEPTION("em_malloc for p failed...");
1194 err = EMAIL_ERROR_OUT_OF_MEMORY;
1198 memcpy(p, mail_ids, sizeof(int) * num);
1200 event_data->type = EMAIL_EVENT_MOVE_MAIL;
1201 event_data->account_id = dest_mailbox_tbl->account_id;
1202 event_data->event_param_data_3 = (char*)p;
1203 event_data->event_param_data_4 = num;
1204 event_data->event_param_data_5 = dst_mailbox_id;
1205 event_data->event_param_data_8 = src_mailbox_id;
1206 event_data->event_param_data_6 = noti_param_1;
1207 event_data->event_param_data_7 = noti_param_2;
1208 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1210 if (!emcore_insert_event(event_data, &handle, &err)) {
1211 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
1217 if (err != EMAIL_ERROR_NONE) {
1219 emcore_free_event(event_data);
1220 EM_SAFE_FREE(event_data);
1225 #ifdef __FEATURE_LOCAL_ACTIVITY__
1226 int i = 0, activityid = 0;
1228 if (false == emcore_get_next_activity_id(&activityid, &err))
1229 EM_DEBUG_EXCEPTION(" emcore_get_next_activity_id Failed - %d ", err);
1231 for (i = 0; i < event_data.event_param_data_4; i++) {
1232 emstorage_activity_tbl_t new_activity;
1233 new_activity.activity_id = activityid;
1234 new_activity.activity_type = ACTIVITY_MOVEMAIL;
1235 new_activity.account_id = event_data.account_id;
1236 new_activity.mail_id = mail_ids[i];
1237 new_activity.dest_mbox = event_data.event_param_data_1;
1238 new_activity.server_mailid = NULL;
1239 new_activity.src_mbox = event_data.event_param_data_2;
1241 if (!emcore_add_activity(&new_activity, &err))
1242 EM_DEBUG_EXCEPTION(" emcore_add_activity Failed - %d ", err);
1244 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1245 thread_func_event_data = (email_event_t *)em_malloc(sizeof(email_event_t));
1246 if (thread_func_event_data == NULL) {
1247 EM_DEBUG_EXCEPTION("em_malloc failed");
1248 err = EMAIL_ERROR_OUT_OF_MEMORY;
1252 p2 = em_malloc(sizeof(int) * num);
1254 EM_DEBUG_EXCEPTION("em_malloc failed");
1255 err = EMAIL_ERROR_OUT_OF_MEMORY;
1259 memcpy(p2, mail_ids, sizeof(int) * num);
1261 thread_func_event_data->type = EMAIL_EVENT_MOVE_MAIL;
1262 thread_func_event_data->account_id = dest_mailbox_tbl->account_id;
1263 thread_func_event_data->event_param_data_3 = (char*)p2;
1264 thread_func_event_data->event_param_data_4 = num;
1265 thread_func_event_data->event_param_data_5 = dst_mailbox_id;
1266 thread_func_event_data->event_param_data_8 = src_mailbox_id;
1267 thread_func_event_data->event_param_data_6 = noti_param_1;
1268 thread_func_event_data->event_param_data_7 = noti_param_2;
1269 thread_func_event_data->multi_user_name = g_strdup(multi_user_name);
1271 THREAD_CREATE(move_thread, thread_func_to_move_mail, (void*)thread_func_event_data, thread_error);
1272 if (thread_error == 0)
1273 THREAD_DETACH(move_thread); /* free resources used for new thread */
1274 EM_DEBUG_LOG("thread_error [%d]", thread_error);
1279 if (err != EMAIL_ERROR_NONE || thread_error != 0) {
1280 if (thread_func_event_data) {
1281 emcore_free_event(thread_func_event_data);
1282 EM_SAFE_FREE(thread_func_event_data);
1286 #ifdef __FEATURE_LOCAL_ACTIVITY__
1287 EM_DEBUG_LOG("Setting g_local_activity_run ");
1288 g_local_activity_run = 1;
1289 #endif /* __FEATURE_LOCAL_ACTIVITY__ */
1295 emcore_free_account(ref_account);
1296 EM_SAFE_FREE(ref_account);
1299 if (dest_mailbox_tbl)
1300 emstorage_free_mailbox(&dest_mailbox_tbl, 1, NULL);
1302 EM_DEBUG_FUNC_END("ret [%d]", ret);
1306 INTERNAL_FUNC int emdaemon_set_flags_field(char *multi_user_name, int account_id, int mail_ids[],
1307 int num, email_flags_field_type field_type, int value,
1308 int onserver, int* err_code)
1310 EM_DEBUG_FUNC_BEGIN("mail_ids[%p], num[%d], field_type [%d], value[%d], err_code[%p]",
1311 mail_ids, num, field_type, value, err_code); /*prevent 27460*/
1313 int ret = false, err = EMAIL_ERROR_NONE;
1314 emstorage_account_tbl_t *account_tbl = NULL;
1315 int *mail_id_array = NULL;
1316 email_event_t *event_data = NULL;
1319 if (account_id <= 0 || !mail_ids || num <= 0) {
1320 err = EMAIL_ERROR_INVALID_PARAM;
1321 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
1325 if (!emstorage_get_account_by_id(multi_user_name,
1327 EMAIL_ACC_GET_OPT_DEFAULT,
1331 EM_DEBUG_EXCEPTION("emstorage_get_account_by_id falled [%d]", err);
1334 /* UI display issue with read/unread sync */
1335 if (!emcore_set_flags_field(multi_user_name, account_id, mail_ids, num, field_type, value, &err)) {
1336 EM_DEBUG_EXCEPTION("emcore_set_flags_field falled [%d]", err);
1340 if (onserver && account_tbl->incoming_server_type == EMAIL_SERVER_TYPE_IMAP4) {
1341 event_data = em_malloc(sizeof(email_event_t));
1342 if (event_data == NULL) {
1343 EM_DEBUG_EXCEPTION("em_malloc failed");
1344 err = EMAIL_ERROR_OUT_OF_MEMORY;
1348 mail_id_array = em_malloc(sizeof(int) * num);
1349 if (mail_id_array == NULL) {
1350 EM_DEBUG_EXCEPTION("em_malloc failed...");
1351 err = EMAIL_ERROR_OUT_OF_MEMORY;
1355 memcpy(mail_id_array, mail_ids, sizeof(int) * num);
1357 event_data->type = EMAIL_EVENT_SYNC_FLAGS_FIELD_TO_SERVER;
1358 event_data->account_id = account_id;
1359 event_data->event_param_data_1 = NULL;
1360 event_data->event_param_data_3 = (char*)mail_id_array;
1361 event_data->event_param_data_4 = num;
1362 event_data->event_param_data_5 = field_type;
1363 event_data->event_param_data_6 = value;
1364 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1366 if (!emcore_insert_event(event_data, (int*)&handle, &err)) {
1367 EM_DEBUG_LOG("emcore_insert_event failed [%d]", err);
1376 if (ret == false && event_data) {
1377 emcore_free_event(event_data);
1378 EM_SAFE_FREE(event_data);
1382 emstorage_free_account(&account_tbl, 1, NULL);
1387 EM_DEBUG_FUNC_END();
1391 INTERNAL_FUNC int emdaemon_update_mail(char *multi_user_name, email_mail_data_t *input_mail_data,
1392 email_attachment_data_t *input_attachment_data_list, int input_attachment_count,
1393 email_meeting_request_t *input_meeting_request, int input_from_eas)
1395 EM_DEBUG_FUNC_BEGIN("input_mail_data[%p], input_attachment_data_list[%p], "
1396 "input_attachment_count [%d], input_meeting_req [%p], "
1397 "input_from_eas[%d]", input_mail_data, input_attachment_data_list,
1398 input_attachment_count, input_meeting_request, input_from_eas);
1400 int err = EMAIL_ERROR_NONE;
1401 /*email_event_t *event_data = NULL;*/
1402 email_account_t *ref_account = NULL;
1404 if (!input_mail_data || input_mail_data->account_id <= 0 || input_mail_data->mail_id == 0 ||
1405 (((input_mail_data->report_status & EMAIL_MAIL_REPORT_MDN) != 0) && !input_mail_data->full_address_to)) {
1406 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
1407 err = EMAIL_ERROR_INVALID_PARAM;
1411 ref_account = emcore_get_account_reference(multi_user_name, input_mail_data->account_id, false);
1413 EM_DEBUG_LOG(" emcore_get_account_reference failed [%d]", input_mail_data->account_id);
1414 err = EMAIL_ERROR_INVALID_ACCOUNT;
1418 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) {
1419 EM_DEBUG_EXCEPTION("emcore_update_mail failed [%d]", err);
1423 #ifdef __FEATURE_SYNC_CLIENT_TO_SERVER__
1424 /* if (input_from_eas == 0) {
1425 event_data = em_malloc(sizeof(email_event_t));
1426 if (event_data == NULL) {
1427 EM_DEBUG_EXCEPTION("em_malloc failed");
1428 err = EMAIL_ERROR_OUT_OF_MEMORY;
1432 event_data->type = EMAIL_EVENT_UPDATE_MAIL;
1433 event_data->account_id = input_mail_data->account_id;
1434 event_data->event_param_data_1 = (char*)input_mail_data; // need to be duplicated, it is double freed
1435 event_data->event_param_data_2 = (char*)input_attachment_data_list; // need to be duplicated, it is double freed
1436 event_data->event_param_data_3 = (char*)input_meeting_request; // need to be duplicated, it is double freed
1437 event_data->event_param_data_4 = input_attachment_count;
1438 event_data->event_param_data_5 = input_from_eas;
1439 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1441 if (!emcore_insert_event(event_data, &handle, &err)) {
1442 EM_DEBUG_EXCEPTION("emcore_insert_event_for_sending_mails failed [%d]", err);
1443 err = EMAIL_ERROR_NONE;
1453 emcore_free_account(ref_account);
1454 EM_SAFE_FREE(ref_account);
1457 EM_DEBUG_FUNC_END("err [%d]", err);
1462 int _emdaemon_check_mail_id(char *multi_user_name, int mail_id, int* err_code)
1464 EM_DEBUG_FUNC_BEGIN("mail_id[%d], err_code[%p]", mail_id, err_code);
1467 int err = EMAIL_ERROR_NONE;
1469 emstorage_mail_tbl_t* mail = NULL;
1471 if (!emstorage_get_mail_field_by_id(multi_user_name, mail_id, RETRIEVE_SUMMARY, &mail, true, &err)) {
1472 EM_DEBUG_EXCEPTION("emstorage_get_mail_field_by_id failed [%d]", err);
1480 emstorage_free_mail(&mail, 1, NULL);
1482 if (err_code != NULL)
1484 EM_DEBUG_FUNC_END();
1490 char *multi_user_name;
1493 INTERNAL_FUNC int emdaemon_send_mail_retry(char *multi_user_name, int mail_id, int timeout_in_sec, int* err_code)
1496 int err = EMAIL_ERROR_NONE;
1497 long nTimerValue = 0;
1498 email_retry_info *retry_info = NULL;
1500 if (!_emdaemon_check_mail_id(multi_user_name, mail_id, &err)) {
1501 EM_DEBUG_EXCEPTION("_emdaemon_check_mail_id failed [%d]", err);
1505 if (timeout_in_sec == 0) {
1506 if (!emdaemon_send_mail(multi_user_name, mail_id, NULL, &err)) {
1507 EM_DEBUG_EXCEPTION("emdaemon_send_mail failed [%d]", err);
1510 } else if (timeout_in_sec > 0) {
1511 retry_info = em_malloc(sizeof(email_retry_info));
1512 if (retry_info == NULL) {
1513 EM_DEBUG_EXCEPTION("em_malloc failed");
1514 err = EMAIL_ERROR_OUT_OF_MEMORY;
1518 retry_info->mail_id = mail_id;
1519 retry_info->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1520 nTimerValue = timeout_in_sec * 1000;
1522 if (emcore_set_timer_ex(nTimerValue, (EMAIL_TIMER_CALLBACK) _OnMailSendRetryTimerCB, (void*)retry_info) <= 0) {
1523 EM_DEBUG_EXCEPTION("Failed to start timer");
1537 INTERNAL_FUNC void _OnMailSendRetryTimerCB(void* data)
1539 EM_DEBUG_FUNC_BEGIN();
1540 int err = EMAIL_ERROR_NONE;
1541 email_retry_info *retry_info = NULL;
1544 EM_DEBUG_LOG("Invalid param");
1548 retry_info = (email_retry_info *)data;
1550 if (!_emdaemon_check_mail_id(retry_info->multi_user_name, retry_info->mail_id, &err)) {
1551 EM_DEBUG_EXCEPTION("_emdaemon_check_mail_id failed [%d]", err);
1555 if (!emdaemon_send_mail(retry_info->multi_user_name, retry_info->mail_id, NULL, &err)) {
1556 EM_DEBUG_EXCEPTION("emdaemon_send_mail failed [%d]", err);
1562 free(retry_info->multi_user_name);
1565 EM_DEBUG_FUNC_END();
1569 INTERNAL_FUNC int emdaemon_move_mail_thread_to_mailbox(char *multi_user_name, int thread_id, int target_mailbox_id, int move_always_flag, int *err_code)
1571 EM_DEBUG_FUNC_BEGIN("thread_id [%d], target_mailbox_id [%d], move_always_flag [%d], err_code [%p]", thread_id, target_mailbox_id, move_always_flag, err_code);
1573 int err = EMAIL_ERROR_NONE;
1574 int *mail_id_list = NULL, result_count = 0, i, mailbox_count = 0, account_id;
1575 email_mail_list_item_t *mail_list = NULL;
1576 email_mailbox_t *target_mailbox_list = NULL, *target_mailbox = NULL;
1577 char mailbox_id_param_string[10] = {0,};
1579 if (target_mailbox_id == 0) {
1580 EM_DEBUG_EXCEPTION("target_mailbox_id [%d]", target_mailbox_id);
1581 err = EMAIL_ERROR_INVALID_PARAM;
1585 if (!emstorage_get_mail_list(multi_user_name, 0, 0, NULL, thread_id, -1, -1, 0, NULL, EMAIL_SORT_DATETIME_HIGH, true, &mail_list, &result_count, &err) || !mail_list || !result_count) {
1586 EM_DEBUG_EXCEPTION("emstorage_get_mail_list failed [%d]", err);
1591 mail_id_list = em_malloc(sizeof(int) * result_count);
1593 if (mail_id_list == NULL) {
1594 EM_DEBUG_EXCEPTION("em_malloc failed...");
1595 err = EMAIL_ERROR_OUT_OF_MEMORY;
1599 for (i = 0; i < result_count; i++) {
1600 mail_id_list[i] = mail_list[i].mail_id;
1602 account_id = mail_list[0].account_id;
1605 if (!emcore_get_mailbox_list(multi_user_name, account_id, &target_mailbox_list, &mailbox_count, &err)) {
1606 EM_DEBUG_EXCEPTION("emcore_get_mailbox_list failed [%d]", err);
1610 for (i = 0; i < mailbox_count; i++) {
1611 EM_DEBUG_LOG_SEC("%s %d", target_mailbox_list[i].mailbox_name, target_mailbox_id);
1612 if (target_mailbox_list[i].mailbox_id == target_mailbox_id) {
1613 target_mailbox = (target_mailbox_list + i);
1618 if (!target_mailbox) {
1619 EM_DEBUG_EXCEPTION("couldn't find proper target mailbox.");
1624 if (!emdaemon_move_mail(multi_user_name, mail_id_list, result_count, target_mailbox->mailbox_id, EMAIL_MOVED_BY_MOVING_THREAD, move_always_flag, &err)) {
1625 EM_DEBUG_EXCEPTION("emdaemon_move_mail failed [%d]", err);
1630 SNPRINTF(mailbox_id_param_string, 10, "%d", target_mailbox->mailbox_id);
1631 if (!emcore_notify_storage_event(NOTI_THREAD_MOVE, account_id, thread_id, mailbox_id_param_string, move_always_flag))
1632 EM_DEBUG_EXCEPTION(" emcore_notify_storage_event Failed [NOTI_MAIL_MOVE] >>>> ");
1637 emcore_free_mailbox_list(&target_mailbox_list, mailbox_count);
1638 EM_SAFE_FREE(mail_list);
1639 EM_SAFE_FREE(mail_id_list);
1643 EM_DEBUG_FUNC_END();
1647 INTERNAL_FUNC int emdaemon_delete_mail_thread(char *multi_user_name, int thread_id, int delete_always_flag, int *handle, int *err_code)
1649 EM_DEBUG_FUNC_BEGIN("thread_id [%d], delete_always_flag [%d], err_code [%p]", thread_id, delete_always_flag, err_code);
1651 int err = EMAIL_ERROR_NONE;
1653 int *mail_id_list = NULL, result_count = 0, i;
1654 email_mail_list_item_t *mail_list = NULL;
1656 if (!emstorage_get_mail_list(multi_user_name,
1665 EMAIL_SORT_MAILBOX_ID_HIGH,
1669 &err) || !mail_list || !result_count) {
1670 EM_DEBUG_EXCEPTION("emstorage_get_mail_list failed [%d]", err);
1674 mail_id_list = em_malloc(sizeof(int) * result_count);
1675 if (mail_id_list == NULL) {
1676 EM_DEBUG_EXCEPTION("em_malloc failed...");
1677 err = EMAIL_ERROR_OUT_OF_MEMORY;
1681 for (i = 0; i < result_count; i++) {
1682 mail_id_list[i] = mail_list[i].mail_id;
1685 account_id = mail_list[0].account_id;
1687 // should remove requiring of mailbox information from this function.
1688 // email-service should find mailboxes itself by its mail id.
1689 if (!emdaemon_delete_mail(multi_user_name,
1694 EMAIL_DELETE_LOCALLY,
1697 EM_DEBUG_EXCEPTION("emdaemon_delete_mail failed [%d]", err);
1701 if (!emcore_notify_storage_event(NOTI_THREAD_DELETE, account_id, thread_id, NULL, delete_always_flag))
1702 EM_DEBUG_EXCEPTION(" emcore_notify_storage_event Failed [NOTI_THREAD_DELETE] >>>> ");
1708 EM_SAFE_FREE(mail_list);
1709 EM_SAFE_FREE(mail_id_list);
1713 EM_DEBUG_FUNC_END();
1717 INTERNAL_FUNC int emdaemon_modify_seen_flag_of_thread(char *multi_user_name, int thread_id, int seen_flag, int on_server, int *handle, int *err_code)
1719 EM_DEBUG_FUNC_BEGIN("thread_id [%d], seen_flag [%d], on_server [%d], handle [%p], err_code [%p]", thread_id, seen_flag, on_server, handle, err_code);
1721 int err = EMAIL_ERROR_NONE;
1722 int account_id, *mail_id_list = NULL, result_count = 0, i;
1723 email_mail_list_item_t *mail_list = NULL;
1725 if (!emstorage_get_mail_list(multi_user_name, 0, 0, NULL, thread_id, -1, -1, 0, NULL, EMAIL_SORT_MAILBOX_ID_HIGH, true, &mail_list, &result_count, &err) || !mail_list || !result_count) {
1726 EM_DEBUG_EXCEPTION("emstorage_get_mail_list failed [%d]", err);
1730 mail_id_list = em_malloc(sizeof(int) * result_count);
1732 if (mail_id_list == NULL) {
1733 EM_DEBUG_EXCEPTION("em_malloc failed...");
1734 err = EMAIL_ERROR_OUT_OF_MEMORY;
1738 for (i = 0; i < result_count; i++) {
1739 mail_id_list[i] = mail_list[i].mail_id;
1742 account_id = mail_list[0].account_id;
1744 if (!emdaemon_set_flags_field(multi_user_name, account_id, mail_id_list, result_count, EMAIL_FLAGS_SEEN_FIELD, seen_flag, on_server, &err)) {
1745 EM_DEBUG_EXCEPTION("emdaemon_set_flags_field failed [%d]", err);
1749 if (!emcore_notify_storage_event(NOTI_THREAD_MODIFY_SEEN_FLAG, account_id, thread_id, NULL, seen_flag))
1750 EM_DEBUG_EXCEPTION(" emcore_notify_storage_event Failed [NOTI_MAIL_MOVE] >>>> ");
1756 EM_SAFE_FREE(mail_list);
1757 EM_SAFE_FREE(mail_id_list);
1762 EM_DEBUG_FUNC_END();
1766 INTERNAL_FUNC int emdaemon_expunge_mails_deleted_flagged(char *multi_user_name, int input_mailbox_id, int input_on_server, int *output_handle)
1768 EM_DEBUG_FUNC_BEGIN("input_mailbox_id [%d], input_on_server [%d], output_handle [%p]", input_mailbox_id, input_on_server, output_handle);
1769 int err = EMAIL_ERROR_NONE;
1771 int event_insert = false;
1772 email_event_t *event_data = NULL;
1773 email_account_t *ref_account = NULL;
1774 emstorage_mailbox_tbl_t *mailbox_tbl = NULL;
1776 if (input_mailbox_id <= 0) {
1777 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
1778 err = EMAIL_ERROR_INVALID_PARAM;
1782 if ((err = emstorage_get_mailbox_by_id(multi_user_name, input_mailbox_id, &mailbox_tbl)) != EMAIL_ERROR_NONE) {
1783 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_id failed [%d]", err);
1787 ref_account = emcore_get_account_reference(multi_user_name, mailbox_tbl->account_id, false);
1789 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed [%d]", mailbox_tbl->account_id);
1790 err = EMAIL_ERROR_INVALID_ACCOUNT;
1794 #ifdef __FEATURE_SYNC_CLIENT_TO_SERVER__
1795 if (input_on_server) {
1796 event_data = em_malloc(sizeof(email_event_t));
1797 if (event_data == NULL) {
1798 EM_DEBUG_EXCEPTION("em_malloc failed");
1799 err = EMAIL_ERROR_OUT_OF_MEMORY;
1803 event_data->type = EMAIL_EVENT_EXPUNGE_MAILS_DELETED_FLAGGED;
1804 event_data->account_id = mailbox_tbl->account_id;
1805 event_data->event_param_data_4 = input_mailbox_id;
1806 event_data->multi_user_name = EM_SAFE_STRDUP(multi_user_name);
1808 if (!emcore_insert_event(event_data, &handle, &err)) {
1809 EM_DEBUG_EXCEPTION("emcore_insert_event failed [%d]", err);
1812 event_insert = true;
1816 if ((err = emcore_expunge_mails_deleted_flagged_from_local_storage(multi_user_name,
1817 input_mailbox_id)) != EMAIL_ERROR_NONE) {
1818 EM_DEBUG_EXCEPTION("emcore_expunge_mails_deleted_flagged_from_local_storage failed [%d]", err);
1824 if (event_insert == false && event_data) {
1825 emcore_free_event(event_data);
1826 EM_SAFE_FREE(event_data);
1830 emcore_free_account(ref_account);
1831 EM_SAFE_FREE(ref_account);
1835 emstorage_free_mailbox(&mailbox_tbl, 1, NULL);
1837 EM_DEBUG_FUNC_END("err [%d]", err);