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 * Created on: 2012. 11. 5.
25 * Author: kyuho.jo@samsung.com
32 #include "email-debug-log.h"
33 #include "email-utilities.h"
34 #include "email-internal-types.h"
35 #include "email-core-tasks.h"
36 #include "email-core-task-manager.h"
37 #include "email-core-mail.h"
38 #include "email-core-smtp.h"
39 #include "email-core-mailbox-sync.h"
40 #include "email-core-signal.h"
41 #include "email-core-utils.h"
44 /*-------------------------------------------------------------------------------------------*/
45 /* to handle EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT */
46 #define task_parameter_format_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT "iiiB"
48 INTERNAL_FUNC int email_encode_task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT(void *input_task_parameter_struct, char **output_byte_stream, int *output_stream_size)
50 EM_DEBUG_FUNC_BEGIN("input_task_parameter_struct [%p] output_byte_stream [%p] output_stream_size [%p]", input_task_parameter_struct, output_byte_stream, output_stream_size);
52 int err = EMAIL_ERROR_NONE;
53 task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT *task_parameter = input_task_parameter_struct;
56 void *result_data = NULL;
57 size_t result_data_length = 0;
59 if (task_parameter == NULL || output_byte_stream == NULL || output_stream_size == NULL) {
60 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
61 err = EMAIL_ERROR_INVALID_PARAM;
65 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT
66 , &task_parameter->source_mailbox_id
67 , &task_parameter->target_mailbox_id
68 , &task_parameter->mail_id_count
71 EM_DEBUG_EXCEPTION("tpl_map failed");
72 err = EMAIL_ERROR_SYSTEM_FAILURE;
76 tb.sz = sizeof(int) * task_parameter->mail_id_count;
77 tb.addr = task_parameter->mail_id_array;
79 tpl_dump(tn, TPL_MEM, &result_data, &result_data_length);
82 *output_byte_stream = result_data;
83 *output_stream_size = result_data_length;
87 EM_DEBUG_FUNC_END("err [%d]", err);
91 INTERNAL_FUNC int email_decode_task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT(char *input_byte_stream, int input_stream_size, void **output_task_parameter_struct)
93 EM_DEBUG_FUNC_BEGIN("input_byte_stream [%p] input_stream_size [%d] output_task_parameter_struct [%p]", input_byte_stream, input_stream_size, output_task_parameter_struct);
94 int err = EMAIL_ERROR_NONE;
97 task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT *task_parameter = NULL;
99 if (input_byte_stream == NULL || input_stream_size == 0 || output_task_parameter_struct == NULL) {
100 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
101 err = EMAIL_ERROR_INVALID_PARAM;
105 task_parameter = em_malloc(sizeof(task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT));
106 if (task_parameter == NULL) {
107 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
108 err = EMAIL_ERROR_OUT_OF_MEMORY;
112 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT
113 , &task_parameter->source_mailbox_id
114 , &task_parameter->target_mailbox_id
115 , &task_parameter->mail_id_count
118 EM_DEBUG_EXCEPTION("tpl_map failed");
119 EM_SAFE_FREE(task_parameter);
120 err = EMAIL_ERROR_SYSTEM_FAILURE;
124 tpl_load(tn, TPL_MEM, input_byte_stream, input_stream_size);
126 if(task_parameter->mail_id_count <= 0 || tb.addr == NULL) {
127 EM_DEBUG_LOG("No mail id list. mail_id_count[%d] addr[%p]", task_parameter->mail_id_count, tb.addr);
130 task_parameter->mail_id_array = tb.addr;
133 *output_task_parameter_struct = task_parameter;
140 EM_DEBUG_FUNC_END("err [%d]", err);
144 INTERNAL_FUNC void* task_handler_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT(void *input_param)
146 EM_DEBUG_FUNC_BEGIN("input_param [%p]", input_param);
147 int err = EMAIL_ERROR_NONE;
148 int err_for_signal = EMAIL_ERROR_NONE;
150 int task_id = THREAD_SELF();
151 task_parameter_EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT *task_param = input_param;
153 for(i = 0; i < task_param->mail_id_count; i++) {
154 if((err = emcore_move_mail_to_another_account(task_param->multi_user_name, task_param->mail_id_array[i], task_param->source_mailbox_id, task_param->target_mailbox_id, task_id)) != EMAIL_ERROR_NONE) {
155 EM_DEBUG_EXCEPTION("emcore_move_mail_to_another_account failed [%d]", err);
159 /* Send progress signal */
160 if((err_for_signal = emcore_send_task_status_signal(EMAIL_ASYNC_TASK_MOVE_MAILS_TO_MAILBOX_OF_ANOTHER_ACCOUNT, task_id, EMAIL_TASK_STATUS_IN_PROGRESS, i, task_param->mail_id_count)) != EMAIL_ERROR_NONE)
161 EM_DEBUG_LOG("emcore_send_task_status_signal failed [%d]", err_for_signal);
165 /* Free task parameter */
166 EM_SAFE_FREE(task_param->mail_id_array);
167 EM_SAFE_FREE(task_param);
169 EM_DEBUG_FUNC_END("err [%d]", err);
172 /*-------------------------------------------------------------------------------------------*/
173 /* to handle EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX */
174 #define task_parameter_format_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX "iiBi"
176 INTERNAL_FUNC int email_encode_task_parameter_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX(void *input_task_parameter_struct, char **output_byte_stream, int *output_stream_size)
178 EM_DEBUG_FUNC_BEGIN("input_task_parameter_struct [%p] output_byte_stream [%p] output_stream_size [%p]", input_task_parameter_struct, output_byte_stream, output_stream_size);
180 int err = EMAIL_ERROR_NONE;
181 task_parameter_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX *task_parameter = input_task_parameter_struct;
184 void *result_data = NULL;
185 size_t result_data_length = 0;
187 if (task_parameter == NULL || output_byte_stream == NULL || output_stream_size == NULL) {
188 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
189 err = EMAIL_ERROR_INVALID_PARAM;
193 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX
194 , &task_parameter->account_id
195 , &task_parameter->mailbox_id_count
197 , &task_parameter->on_server);
199 EM_DEBUG_EXCEPTION("tpl_map failed");
200 err = EMAIL_ERROR_SYSTEM_FAILURE;
204 tb.sz = sizeof(int) * task_parameter->mailbox_id_count;
205 tb.addr = task_parameter->mailbox_id_array;
207 tpl_dump(tn, TPL_MEM, &result_data, &result_data_length);
210 *output_byte_stream = result_data;
211 *output_stream_size = result_data_length;
215 EM_DEBUG_FUNC_END("err [%d]", err);
219 INTERNAL_FUNC int email_decode_task_parameter_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX(char *input_byte_stream, int input_stream_size, void **output_task_parameter_struct)
221 EM_DEBUG_FUNC_BEGIN("input_byte_stream [%p] input_stream_size [%d] output_task_parameter_struct [%p]", input_byte_stream, input_stream_size, output_task_parameter_struct);
222 int err = EMAIL_ERROR_NONE;
225 task_parameter_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX *task_parameter = NULL;
227 if (input_byte_stream == NULL || input_stream_size == 0 || output_task_parameter_struct == NULL) {
228 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
229 err = EMAIL_ERROR_INVALID_PARAM;
233 task_parameter = em_malloc(sizeof(task_parameter_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX));
234 if(task_parameter == NULL) {
235 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
236 err = EMAIL_ERROR_OUT_OF_MEMORY;
240 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX
241 , &task_parameter->account_id
242 , &task_parameter->mailbox_id_count
244 , &task_parameter->on_server);
246 EM_DEBUG_EXCEPTION("tpl_map failed");
247 EM_SAFE_FREE(task_parameter);
248 err = EMAIL_ERROR_SYSTEM_FAILURE;
252 tpl_load(tn, TPL_MEM, input_byte_stream, input_stream_size);
254 if(task_parameter->mailbox_id_count <= 0 || tb.addr == NULL) {
255 EM_DEBUG_LOG("No mail id list. mail_id_count[%d] addr[%p]", task_parameter->mailbox_id_count, tb.addr);
258 task_parameter->mailbox_id_array = tb.addr;
261 *output_task_parameter_struct = task_parameter;
268 EM_DEBUG_FUNC_END("err [%d]", err);
272 INTERNAL_FUNC void* task_handler_EMAIL_ASYNC_TASK_DELETE_MAILBOX_EX(void *input_param)
276 /*-------------------------------------------------------------------------------------------*/
277 /* to handle EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL */
278 #define task_parameter_format_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL "i"
280 INTERNAL_FUNC int email_encode_task_parameter_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL(void *input_task_parameter_struct, char **output_byte_stream, int *output_stream_size)
282 EM_DEBUG_FUNC_BEGIN("input_task_parameter_struct [%p] output_byte_stream [%p] output_stream_size [%p]", input_task_parameter_struct, output_byte_stream, output_stream_size);
284 int err = EMAIL_ERROR_NONE;
285 task_parameter_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL *task_parameter = input_task_parameter_struct;
287 void *result_data = NULL;
288 size_t result_data_length = 0;
290 if (task_parameter == NULL || output_byte_stream == NULL || output_stream_size == NULL) {
291 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
292 err = EMAIL_ERROR_INVALID_PARAM;
296 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL
297 , &task_parameter->mail_id);
299 EM_DEBUG_EXCEPTION("tpl_map failed");
300 err = EMAIL_ERROR_SYSTEM_FAILURE;
305 tpl_dump(tn, TPL_MEM, &result_data, &result_data_length);
308 *output_byte_stream = result_data;
309 *output_stream_size = result_data_length;
313 EM_DEBUG_FUNC_END("err [%d]", err);
317 INTERNAL_FUNC int email_decode_task_parameter_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL(char *input_byte_stream, int input_stream_size, void **output_task_parameter_struct)
319 EM_DEBUG_FUNC_BEGIN("input_byte_stream [%p] input_stream_size [%d] output_task_parameter_struct [%p]", input_byte_stream, input_stream_size, output_task_parameter_struct);
320 int err = EMAIL_ERROR_NONE;
322 task_parameter_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL *task_parameter = NULL;
324 if (input_byte_stream == NULL || input_stream_size == 0 || output_task_parameter_struct == NULL) {
325 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
326 err = EMAIL_ERROR_INVALID_PARAM;
330 task_parameter = em_malloc(sizeof(task_parameter_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL));
331 if (task_parameter == NULL) {
332 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
333 err = EMAIL_ERROR_OUT_OF_MEMORY;
337 tn = tpl_map(task_parameter_format_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL
338 , &task_parameter->mail_id);
340 EM_DEBUG_EXCEPTION("tpl_map failed");
341 EM_SAFE_FREE(task_parameter);
342 err = EMAIL_ERROR_SYSTEM_FAILURE;
346 tpl_load(tn, TPL_MEM, input_byte_stream, input_stream_size);
349 *output_task_parameter_struct = task_parameter;
356 EM_DEBUG_FUNC_END("err [%d]", err);
360 INTERNAL_FUNC void* task_handler_EMAIL_ASYNC_TASK_SEND_MAIL_WITH_DOWNLOADING_ATTACHMENT_OF_ORIGINAL_MAIL(void *input_param)
364 /*-------------------------------------------------------------------------------------------*/
365 /* to handle EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL */
366 #define task_parameter_format_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL "ii"
368 INTERNAL_FUNC int email_encode_task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL(void *input_task_parameter_struct, char **output_byte_stream, int *output_stream_size)
370 EM_DEBUG_FUNC_BEGIN("input_task_parameter_struct [%p] output_byte_stream [%p] output_stream_size [%p]", input_task_parameter_struct, output_byte_stream, output_stream_size);
372 int err = EMAIL_ERROR_NONE;
373 task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL *task_parameter = input_task_parameter_struct;
375 void *result_data = NULL;
376 size_t result_data_length = 0;
378 if (task_parameter == NULL || output_byte_stream == NULL || output_stream_size == NULL) {
379 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
380 err = EMAIL_ERROR_INVALID_PARAM;
384 tn = tpl_map(task_parameter_format_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL
385 , &task_parameter->mail_id, &task_parameter->scheduled_time);
387 EM_DEBUG_EXCEPTION("tpl_map failed");
388 err = EMAIL_ERROR_SYSTEM_FAILURE;
393 tpl_dump(tn, TPL_MEM, &result_data, &result_data_length);
396 *output_byte_stream = result_data;
397 *output_stream_size = result_data_length;
401 EM_DEBUG_FUNC_END("err [%d]", err);
405 INTERNAL_FUNC int email_decode_task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL(char *input_byte_stream, int input_stream_size, void **output_task_parameter_struct)
407 EM_DEBUG_FUNC_BEGIN("input_byte_stream [%p] input_stream_size [%d] output_task_parameter_struct [%p]", input_byte_stream, input_stream_size, output_task_parameter_struct);
408 int err = EMAIL_ERROR_NONE;
410 task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL *task_parameter = NULL;
412 if (input_byte_stream == NULL || input_stream_size == 0 || output_task_parameter_struct == NULL) {
413 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
414 err = EMAIL_ERROR_INVALID_PARAM;
418 task_parameter = em_malloc(sizeof(task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL));
419 if(task_parameter == NULL) {
420 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
421 err = EMAIL_ERROR_OUT_OF_MEMORY;
425 tn = tpl_map(task_parameter_format_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL
426 , &task_parameter->mail_id, &task_parameter->scheduled_time);
428 EM_DEBUG_EXCEPTION("tpl_map failed");
429 EM_SAFE_FREE(task_parameter);
430 err = EMAIL_ERROR_SYSTEM_FAILURE;
434 tpl_load(tn, TPL_MEM, input_byte_stream, input_stream_size);
437 *output_task_parameter_struct = task_parameter;
444 EM_DEBUG_FUNC_END("err [%d]", err);
448 INTERNAL_FUNC void* task_handler_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL(void *input_param)
450 EM_DEBUG_FUNC_BEGIN("input_param [%p]", input_param);
452 int err = EMAIL_ERROR_NONE;
453 int *return_err = NULL;
454 task_parameter_EMAIL_SYNC_TASK_SCHEDULE_SENDING_MAIL *task_param = input_param;
456 if ((err = emcore_schedule_sending_mail(task_param->multi_user_name,
458 task_param->scheduled_time)) != EMAIL_ERROR_NONE) {
459 EM_DEBUG_EXCEPTION("emcore_schedule_sending_mail [%d]", err);
460 err = EMAIL_ERROR_OUT_OF_MEMORY;
464 return_err = em_malloc(sizeof(int));
465 if (return_err == NULL) {
466 EM_DEBUG_EXCEPTION("em_malloc failed");
467 err = EMAIL_ERROR_OUT_OF_MEMORY;
475 EM_SAFE_FREE(task_param);
476 emcore_close_smtp_stream_list();
477 EM_DEBUG_FUNC_END("err [%d]", err);
479 return (void *)return_err;
481 /*-------------------------------------------------------------------------------------------*/
482 /* to handle EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE */
483 #define task_parameter_format_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE "iiBiiB"
485 INTERNAL_FUNC int email_encode_task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE(void *input_task_parameter_struct, char **output_byte_stream, int *output_stream_size)
487 EM_DEBUG_FUNC_BEGIN("input_task_parameter_struct [%p] output_byte_stream [%p] output_stream_size [%p]", input_task_parameter_struct, output_byte_stream, output_stream_size);
489 int err = EMAIL_ERROR_NONE;
490 task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE *task_parameter = input_task_parameter_struct;
491 email_mail_attribute_value_type attribute_value_type = EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE;
492 tpl_bin tb_mail_id_array;
495 void *result_data = NULL;
496 size_t result_data_length = 0;
498 if (task_parameter == NULL || output_byte_stream == NULL || output_stream_size == NULL) {
499 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
500 err = EMAIL_ERROR_INVALID_PARAM;
504 if ((err = emcore_get_mail_attribute_value_type(task_parameter->attribute_type, &attribute_value_type)) != EMAIL_ERROR_NONE) {
505 EM_DEBUG_EXCEPTION("emcore_get_mail_attribute_value_type failed [%d]", err);
509 tn = tpl_map(task_parameter_format_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE
510 , &task_parameter->account_id
511 , &task_parameter->mail_id_count
513 , &task_parameter->attribute_type
514 , &task_parameter->value_length
517 EM_DEBUG_EXCEPTION("tpl_map failed");
518 err = EMAIL_ERROR_SYSTEM_FAILURE;
522 tb_mail_id_array.sz = sizeof(int) * task_parameter->mail_id_count;
523 tb_mail_id_array.addr = task_parameter->mail_id_array;
525 switch(attribute_value_type) {
526 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_INTEGER :
527 task_parameter->value_length = 4;
528 tb_value.sz = task_parameter->value_length;
529 tb_value.addr = &task_parameter->value.integer_type_value;
531 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_STRING :
532 task_parameter->value_length = EM_SAFE_STRLEN(task_parameter->value.string_type_value);
533 tb_value.sz = task_parameter->value_length;
534 tb_value.addr = task_parameter->value.string_type_value;
536 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_TIME :
537 task_parameter->value_length = 4;
538 tb_value.sz = task_parameter->value_length;
539 tb_value.addr = &task_parameter->value.datetime_type_value;
541 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE :
543 EM_DEBUG_EXCEPTION("invalid attribute value type [%d]", attribute_value_type);
544 err = EMAIL_ERROR_INVALID_PARAM;
549 tpl_dump(tn, TPL_MEM, &result_data, &result_data_length);
551 *output_byte_stream = result_data;
552 *output_stream_size = result_data_length;
559 EM_DEBUG_FUNC_END("err [%d]", err);
560 return EMAIL_ERROR_NONE;
563 INTERNAL_FUNC int email_decode_task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE(char *input_byte_stream, int input_stream_size, void **output_task_parameter_struct)
565 EM_DEBUG_FUNC_BEGIN("input_byte_stream [%p] input_stream_size [%d] output_task_parameter_struct [%p]", input_byte_stream, input_stream_size, output_task_parameter_struct);
566 int err = EMAIL_ERROR_NONE;
568 tpl_bin tb_mail_id_array;
570 task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE *task_parameter = NULL;
571 email_mail_attribute_value_type attribute_value_type = EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE;
573 if (input_byte_stream == NULL || input_stream_size == 0 || output_task_parameter_struct == NULL) {
574 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
575 err = EMAIL_ERROR_INVALID_PARAM;
579 task_parameter = em_malloc(sizeof(task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE));
581 if(task_parameter == NULL) {
582 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
583 err = EMAIL_ERROR_OUT_OF_MEMORY;
587 tn = tpl_map(task_parameter_format_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE
588 , &task_parameter->account_id
589 , &task_parameter->mail_id_count
591 , &task_parameter->attribute_type
592 , &task_parameter->value_length
595 EM_DEBUG_EXCEPTION("tpl_map failed");
596 err = EMAIL_ERROR_SYSTEM_FAILURE;
600 tpl_load(tn, TPL_MEM, input_byte_stream, input_stream_size);
603 if(task_parameter->mail_id_count <= 0 || tb_mail_id_array.addr == NULL) {
604 EM_DEBUG_LOG("No mail id list. mail_id_count[%d] addr[%p]", task_parameter->mail_id_count, tb_mail_id_array.addr);
607 task_parameter->mail_id_array = tb_mail_id_array.addr;
611 if ((err = emcore_get_mail_attribute_value_type(task_parameter->attribute_type, &attribute_value_type)) != EMAIL_ERROR_NONE) {
612 EM_DEBUG_EXCEPTION("emcore_get_mail_attribute_value_type failed [%d]", err);
616 switch(attribute_value_type) {
617 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_INTEGER :
618 memcpy(&task_parameter->value.integer_type_value, tb_value.addr, tb_value.sz);
620 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_STRING :
621 task_parameter->value.string_type_value = em_malloc(tb_value.sz + 1);
622 if(task_parameter->value.string_type_value == NULL) {
623 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
624 err = EMAIL_ERROR_OUT_OF_MEMORY;
627 memcpy(&task_parameter->value.string_type_value, tb_value.addr, tb_value.sz);
629 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_TIME :
630 memcpy(&task_parameter->value.datetime_type_value, tb_value.addr, tb_value.sz);
632 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE :
634 EM_DEBUG_EXCEPTION("invalid attribute value type [%d]", attribute_value_type);
635 err = EMAIL_ERROR_INVALID_PARAM;
640 *output_task_parameter_struct = task_parameter;
647 EM_DEBUG_FUNC_END("err [%d]", err);
648 return EMAIL_ERROR_NONE;
651 INTERNAL_FUNC void *task_handler_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE(void *input_param)
653 EM_DEBUG_FUNC_BEGIN("input_param [%p]", input_param);
654 if (!input_param) { /*prevent 43681*/
655 EM_DEBUG_EXCEPTION("NULL parameter");
659 int err = EMAIL_ERROR_NONE;
660 int *return_err = NULL;
661 char *field_name = NULL;
662 task_parameter_EMAIL_SYNC_TASK_UPDATE_ATTRIBUTE *task_param = input_param;
663 email_mail_attribute_value_type attribute_value_type = EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE; /*prevent 43700*/
665 if ((field_name = emcore_get_mail_field_name_by_attribute_type(task_param->attribute_type)) == NULL) {
666 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
667 err = EMAIL_ERROR_INVALID_PARAM;
671 if ((err = emcore_get_mail_attribute_value_type(task_param->attribute_type,
672 &attribute_value_type)) != EMAIL_ERROR_NONE) {
673 EM_DEBUG_EXCEPTION("emcore_get_mail_attribute_value_type failed [%d]", err);
677 switch(attribute_value_type) {
678 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_INTEGER :
679 if (!emstorage_set_field_of_mails_with_integer_value(task_param->multi_user_name,
680 task_param->account_id,
681 task_param->mail_id_array,
682 task_param->mail_id_count,
684 task_param->value.integer_type_value,
687 EM_DEBUG_EXCEPTION("emstorage_set_field_of_mails_with_integer_value failed [%d]", err);
691 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_STRING :
692 err = EMAIL_ERROR_NOT_SUPPORTED;
693 EM_DEBUG_LOG("EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_STRING is not supported");
695 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_TIME :
696 if (!emstorage_set_field_of_mails_with_integer_value(task_param->multi_user_name,
697 task_param->account_id,
698 task_param->mail_id_array,
699 task_param->mail_id_count,
701 task_param->value.datetime_type_value,
704 EM_DEBUG_EXCEPTION("emstorage_set_field_of_mails_with_integer_value failed [%d]", err);
708 case EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE :
710 EM_DEBUG_LOG("EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_NONE or default");
711 err = EMAIL_ERROR_INVALID_PARAM;
715 return_err = em_malloc(sizeof(int));
716 if (return_err == NULL) {
717 EM_DEBUG_EXCEPTION("em_malloc failed");
718 err = EMAIL_ERROR_OUT_OF_MEMORY;
726 EM_SAFE_FREE(task_param->multi_user_name);
727 EM_SAFE_FREE(task_param->mail_id_array);
728 if (attribute_value_type == EMAIL_MAIL_ATTRIBUTE_VALUE_TYPE_STRING) {
729 EM_SAFE_FREE(task_param->value.string_type_value);
732 EM_SAFE_FREE (task_param);
734 EM_DEBUG_FUNC_END("err [%d]", err);
736 return (void *)return_err;
738 /*-------------------------------------------------------------------------------------------*/