2.0_alpha release commit
[framework/messaging/email-service.git] / email-common-use / email-convert.c
index 7b11f77..07834af 100755 (executable)
@@ -4,7 +4,7 @@
 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
-* 
+*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
@@ -28,7 +28,7 @@
 #include "email-core-utils.h"
 #include "email-utilities.h"
 #include "email-storage.h"
-
+#include "tpl.h"
 
 #define fSEEN 0x1
 #define fDELETED 0x2
 #define fATTACHMENT 0x40
 #define fFORWARD    0x80
 
-INTERNAL_FUNC int em_convert_mail_flag_to_int(emf_mail_flag_t flag, int *i_flag, int *err_code)
+INTERNAL_FUNC int em_convert_mail_flag_to_int(email_mail_flag_t flag, int *i_flag, int *err_code)
 {
        EM_DEBUG_FUNC_BEGIN("i_flag[%p], err_code[%p]", i_flag, err_code);
        
        if (!i_flag)  {
                if (err_code != NULL)
-                       *err_code = EMF_ERROR_INVALID_PARAM;
+                       *err_code = EMAIL_ERROR_INVALID_PARAM;
                return false;
                
        }
 
-       *i_flag = 
+       *i_flag =
                        (flag.seen           ? fSEEN       : 0) |
                        (flag.deleted        ? fDELETED    : 0) |
                        (flag.flagged        ? fFLAGGED    : 0) |
@@ -64,17 +64,17 @@ INTERNAL_FUNC int em_convert_mail_flag_to_int(emf_mail_flag_t flag, int *i_flag,
        return true;
 }
 
-INTERNAL_FUNC int em_convert_mail_int_to_flag(int i_flag, emf_mail_flag_t* flag, int* err_code)
+INTERNAL_FUNC int em_convert_mail_int_to_flag(int i_flag, email_mail_flag_t* flag, int* err_code)
 {
        EM_DEBUG_FUNC_BEGIN("i_flag[0x%02x], flag[%p], err_code[%p]", i_flag, flag, err_code);
-       
+
        if (!flag) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
                if (err_code != NULL)
-                       *err_code = EMF_ERROR_INVALID_PARAM;
+                       *err_code = EMAIL_ERROR_INVALID_PARAM;
                return false;
        }
-       
+
        flag->seen           = (i_flag & fSEEN ? 1 : 0);
        flag->deleted        = (i_flag & fDELETED ? 1 : 0);
        flag->flagged        = (i_flag & fFLAGGED ? 1 : 0);
@@ -93,15 +93,15 @@ INTERNAL_FUNC int em_convert_mail_int_to_flag(int i_flag, emf_mail_flag_t* flag,
 INTERNAL_FUNC int em_convert_mail_tbl_to_mail_status(emstorage_mail_tbl_t *mail_tbl_data, int *result_mail_status, int* err_code)
 {
        EM_DEBUG_FUNC_BEGIN("mail_tbl_data[%p], result_mail_status [%p], err_code[%p]", mail_tbl_data, result_mail_status, err_code);
-       int ret = false, error_code = EMF_ERROR_NONE;
+       int ret = false, error_code = EMAIL_ERROR_NONE;
        int has_attachment = 0;
-       
+
        if(!mail_tbl_data || !result_mail_status) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               error_code = EMF_ERROR_INVALID_PARAM;
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               error_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
-                               
+
        has_attachment = (mail_tbl_data->attachment_count > mail_tbl_data->inline_content_count) ? 1 : 0;
 
        *result_mail_status = (mail_tbl_data->flags_seen_field      ? fSEEN       : 0) |
@@ -117,19 +117,19 @@ INTERNAL_FUNC int em_convert_mail_tbl_to_mail_status(emstorage_mail_tbl_t *mail_
 FINISH_OFF:
                if (err_code != NULL)
                *err_code = error_code;
-               
+
        EM_DEBUG_FUNC_END("ret [%d]", ret);
        return ret;
        }
-       
+
 INTERNAL_FUNC int em_convert_mail_status_to_mail_tbl(int mail_status, emstorage_mail_tbl_t *result_mail_tbl_data, int* err_code)
 {
        EM_DEBUG_FUNC_BEGIN("mail_status[%d], result_mail_tbl_data [%p], err_code[%p]", mail_status, result_mail_tbl_data, err_code);
-       int ret = false, error_code = EMF_ERROR_NONE;
+       int ret = false, error_code = EMAIL_ERROR_NONE;
 
        if(!result_mail_tbl_data) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               error_code = EMF_ERROR_INVALID_PARAM;
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               error_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
 
@@ -145,19 +145,19 @@ INTERNAL_FUNC int em_convert_mail_status_to_mail_tbl(int mail_status, emstorage_
 FINISH_OFF:
        if (err_code != NULL)
                *err_code = error_code;
-       
+
        EM_DEBUG_FUNC_END("ret [%d]", ret);
        return ret;
 }
 
-INTERNAL_FUNC int em_convert_mail_tbl_to_mail_flag(emstorage_mail_tbl_t *mail_tbl_data, emf_mail_flag_t *result_flag, int* err_code)
+INTERNAL_FUNC int em_convert_mail_tbl_to_mail_flag(emstorage_mail_tbl_t *mail_tbl_data, email_mail_flag_t *result_flag, int* err_code)
 {
        EM_DEBUG_FUNC_BEGIN("mail_tbl_data[%p], result_flag [%p], err_code[%p]", mail_tbl_data, result_flag, err_code);
-       int ret = false, error_code = EMF_ERROR_NONE;
+       int ret = false, error_code = EMAIL_ERROR_NONE;
 
        if(!mail_tbl_data || !result_flag) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               error_code = EMF_ERROR_INVALID_PARAM;
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               error_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
 
@@ -174,19 +174,19 @@ INTERNAL_FUNC int em_convert_mail_tbl_to_mail_flag(emstorage_mail_tbl_t *mail_tb
 FINISH_OFF:
        if (err_code != NULL)
                *err_code = error_code;
-       
+
        EM_DEBUG_FUNC_END("ret [%d]", ret);
        return ret;
 }
 
-INTERNAL_FUNC int em_convert_mail_flag_to_mail_tbl(emf_mail_flag_t *flag, emstorage_mail_tbl_t *result_mail_tbl_data,  int* err_code)
+INTERNAL_FUNC int em_convert_mail_flag_to_mail_tbl(email_mail_flag_t *flag, emstorage_mail_tbl_t *result_mail_tbl_data,  int* err_code)
 {
        EM_DEBUG_FUNC_BEGIN("flag[%p], result_mail_tbl_data [%p], err_code[%p]", flag, result_mail_tbl_data, err_code);
-       int ret = false, error_code = EMF_ERROR_NONE;
+       int ret = false, error_code = EMAIL_ERROR_NONE;
 
        if(!flag || !result_mail_tbl_data) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               error_code = EMF_ERROR_INVALID_PARAM;
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               error_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
 
@@ -202,148 +202,203 @@ INTERNAL_FUNC int em_convert_mail_flag_to_mail_tbl(emf_mail_flag_t *flag, emstor
 FINISH_OFF:
        if (err_code != NULL)
                *err_code = error_code;
-       
+
        EM_DEBUG_FUNC_END("ret [%d]", ret);
        return ret;
 }
 
 
-INTERNAL_FUNC int em_convert_account_to_account_tbl(emf_account_t *account, emstorage_account_tbl_t *account_tbl)
+INTERNAL_FUNC int em_convert_account_to_account_tbl(email_account_t *account, emstorage_account_tbl_t *account_tbl)
 {
        EM_DEBUG_FUNC_BEGIN("account[%p], account_tbl[%p]", account, account_tbl);
        int ret = 1;
 
-       account_tbl->account_bind_type = account->account_bind_type;
-       account_tbl->account_name = EM_SAFE_STRDUP(account->account_name);
-       account_tbl->receiving_server_type = account->receiving_server_type;
-       account_tbl->receiving_server_addr = EM_SAFE_STRDUP(account->receiving_server_addr);
-       account_tbl->email_addr = EM_SAFE_STRDUP(account->email_addr);
-       account_tbl->user_name = EM_SAFE_STRDUP(account->user_name);
-       account_tbl->password = EM_SAFE_STRDUP(account->password);
-       account_tbl->retrieval_mode = account->retrieval_mode;
-       account_tbl->port_num = account->port_num;
-       account_tbl->use_security = account->use_security;
-       account_tbl->sending_server_type = account->sending_server_type;
-       account_tbl->sending_server_addr = EM_SAFE_STRDUP(account->sending_server_addr);
-       account_tbl->sending_port_num = account->sending_port_num;
-       account_tbl->sending_auth = account->sending_auth;
-       account_tbl->sending_security = account->sending_security;
-       account_tbl->sending_user = EM_SAFE_STRDUP(account->sending_user);
-       account_tbl->sending_password = EM_SAFE_STRDUP(account->sending_password);
-       account_tbl->display_name = EM_SAFE_STRDUP(account->display_name);
-       account_tbl->reply_to_addr = EM_SAFE_STRDUP(account->reply_to_addr);
-       account_tbl->return_addr = EM_SAFE_STRDUP(account->return_addr);
-       account_tbl->account_id = account->account_id;
-       account_tbl->keep_on_server = account->keep_on_server;
-       account_tbl->flag1 = account->flag1;
-       account_tbl->flag2 = account->flag2;
-       account_tbl->pop_before_smtp = account->pop_before_smtp;
-       account_tbl->apop =  account->apop;
-       account_tbl->logo_icon_path = EM_SAFE_STRDUP(account->logo_icon_path);
-       account_tbl->preset_account = account->preset_account;
-       account_tbl->options.priority = account->options.priority;
-       account_tbl->options.keep_local_copy = account->options.keep_local_copy;
-       account_tbl->options.req_delivery_receipt = account->options.req_delivery_receipt;
-       account_tbl->options.req_read_receipt = account->options.req_read_receipt;
-       account_tbl->options.download_limit = account->options.download_limit;
-       account_tbl->options.block_address = account->options.block_address;
-       account_tbl->options.block_subject = account->options.block_subject;
-       account_tbl->options.display_name_from = EM_SAFE_STRDUP(account->options.display_name_from);
-       account_tbl->options.reply_with_body = account->options.reply_with_body;
-       account_tbl->options.forward_with_files = account->options.forward_with_files;
-       account_tbl->options.add_myname_card = account->options.add_myname_card;
-       account_tbl->options.add_signature = account->options.add_signature;
-       account_tbl->options.signature = EM_SAFE_STRDUP(account->options.signature);
-       account_tbl->options.add_my_address_to_bcc = account->options.add_my_address_to_bcc;
-       account_tbl->target_storage = account->target_storage;
-       account_tbl->check_interval = account->check_interval;
-       account_tbl->my_account_id = account->my_account_id;
-       account_tbl->index_color = account->index_color;
-       
+       account_tbl->account_name                             = EM_SAFE_STRDUP(account->account_name);
+       account_tbl->incoming_server_type                     = account->incoming_server_type;
+       account_tbl->incoming_server_address                  = EM_SAFE_STRDUP(account->incoming_server_address);
+       account_tbl->user_email_address                       = EM_SAFE_STRDUP(account->user_email_address);
+       account_tbl->incoming_server_user_name                = EM_SAFE_STRDUP(account->incoming_server_user_name);
+       account_tbl->incoming_server_password                 = EM_SAFE_STRDUP(account->incoming_server_password);
+       account_tbl->retrieval_mode                           = account->retrieval_mode;
+       account_tbl->incoming_server_port_number              = account->incoming_server_port_number;
+       account_tbl->incoming_server_secure_connection        = account->incoming_server_secure_connection;
+       account_tbl->outgoing_server_type                     = account->outgoing_server_type;
+       account_tbl->outgoing_server_address                  = EM_SAFE_STRDUP(account->outgoing_server_address);
+       account_tbl->outgoing_server_port_number              = account->outgoing_server_port_number;
+       account_tbl->outgoing_server_need_authentication      = account->outgoing_server_need_authentication;
+       account_tbl->outgoing_server_secure_connection        = account->outgoing_server_secure_connection;
+       account_tbl->outgoing_server_user_name                = EM_SAFE_STRDUP(account->outgoing_server_user_name);
+       account_tbl->outgoing_server_password                 = EM_SAFE_STRDUP(account->outgoing_server_password);
+       account_tbl->user_display_name                        = EM_SAFE_STRDUP(account->user_display_name);
+       account_tbl->reply_to_address                         = EM_SAFE_STRDUP(account->reply_to_address);
+       account_tbl->return_address                           = EM_SAFE_STRDUP(account->return_address);
+       account_tbl->account_id                               = account->account_id;
+       account_tbl->keep_mails_on_pop_server_after_download  = account->keep_mails_on_pop_server_after_download;
+       account_tbl->auto_download_size                       = account->auto_download_size;
+       account_tbl->outgoing_server_use_same_authenticator   = account->outgoing_server_use_same_authenticator;
+       account_tbl->pop_before_smtp                          = account->pop_before_smtp;
+       account_tbl->incoming_server_requires_apop            = account->incoming_server_requires_apop;
+       account_tbl->logo_icon_path                           = EM_SAFE_STRDUP(account->logo_icon_path);
+
+       account_tbl->user_data                                = em_memdup(account->user_data, account->user_data_length);
+       account_tbl->user_data_length                         = account->user_data_length;
+
+       account_tbl->options.priority                         = account->options.priority;
+       account_tbl->options.keep_local_copy                  = account->options.keep_local_copy;
+       account_tbl->options.req_delivery_receipt             = account->options.req_delivery_receipt;
+       account_tbl->options.req_read_receipt                 = account->options.req_read_receipt;
+       account_tbl->options.download_limit                   = account->options.download_limit;
+       account_tbl->options.block_address                    = account->options.block_address;
+       account_tbl->options.block_subject                    = account->options.block_subject;
+       account_tbl->options.display_name_from                = EM_SAFE_STRDUP(account->options.display_name_from);
+       account_tbl->options.reply_with_body                  = account->options.reply_with_body;
+       account_tbl->options.forward_with_files               = account->options.forward_with_files;
+       account_tbl->options.add_myname_card                  = account->options.add_myname_card;
+       account_tbl->options.add_signature                    = account->options.add_signature;
+       account_tbl->options.signature                        = EM_SAFE_STRDUP(account->options.signature);
+       account_tbl->options.add_my_address_to_bcc            = account->options.add_my_address_to_bcc;
+       account_tbl->check_interval                           = account->check_interval;
+       account_tbl->account_svc_id                           = account->account_svc_id;
+       account_tbl->sync_status                              = account->sync_status;
+       account_tbl->sync_disabled                            = account->sync_disabled;
+       account_tbl->default_mail_slot_size                   = account->default_mail_slot_size;
+       account_tbl->smime_type                               = account->smime_type;
+       account_tbl->certificate_path                         = EM_SAFE_STRDUP(account->certificate_path);
+       account_tbl->cipher_type                              = account->cipher_type;
+       account_tbl->digest_type                              = account->digest_type;
+
+
        EM_DEBUG_FUNC_END();
        return ret;
 }
 
-INTERNAL_FUNC int em_convert_account_tbl_to_account(emstorage_account_tbl_t *account_tbl, emf_account_t *account)
+INTERNAL_FUNC int em_convert_account_tbl_to_account(emstorage_account_tbl_t *account_tbl, email_account_t *account)
 {
        EM_DEBUG_FUNC_BEGIN("account_tbl[%p], account[%p]", account_tbl, account);
        int ret = 1;
 
-       account->account_bind_type             = account_tbl->account_bind_type;
-       account->account_name                  = EM_SAFE_STRDUP(account_tbl->account_name);
-       account->receiving_server_type         = account_tbl->receiving_server_type;
-       account->receiving_server_addr         = EM_SAFE_STRDUP(account_tbl->receiving_server_addr);
-       account->email_addr                    = EM_SAFE_STRDUP(account_tbl->email_addr);
-       account->user_name                     = EM_SAFE_STRDUP(account_tbl->user_name);
-       account->password                      = EM_SAFE_STRDUP(account_tbl->password);
-       account->retrieval_mode                = account_tbl->retrieval_mode;
-       account->port_num                      = account_tbl->port_num;
-       account->use_security                  = account_tbl->use_security;
-       account->sending_server_type           = account_tbl->sending_server_type;
-       account->sending_server_addr           = EM_SAFE_STRDUP(account_tbl->sending_server_addr);
-       account->sending_port_num              = account_tbl->sending_port_num;
-       account->sending_auth                  = account_tbl->sending_auth;
-       account->sending_security              = account_tbl->sending_security;
-       account->sending_user                  = EM_SAFE_STRDUP(account_tbl->sending_user);
-       account->sending_password              = EM_SAFE_STRDUP(account_tbl->sending_password);
-       account->display_name                  = EM_SAFE_STRDUP(account_tbl->display_name);
-       account->reply_to_addr                 = EM_SAFE_STRDUP(account_tbl->reply_to_addr);
-       account->return_addr                   = EM_SAFE_STRDUP(account_tbl->return_addr);
-       account->account_id                    = account_tbl->account_id;
-       account->keep_on_server                = account_tbl->keep_on_server;
-       account->flag1                         = account_tbl->flag1;
-       account->flag2                         = account_tbl->flag2;
-       account->pop_before_smtp               = account_tbl->pop_before_smtp;
-       account->apop                          = account_tbl->apop;
-       account->logo_icon_path                = EM_SAFE_STRDUP(account_tbl->logo_icon_path);
-       account->preset_account                = account_tbl->preset_account;
-       account->options.priority              = account_tbl->options.priority;
-       account->options.keep_local_copy       = account_tbl->options.keep_local_copy;
-       account->options.req_delivery_receipt  = account_tbl->options.req_delivery_receipt;
-       account->options.req_read_receipt      = account_tbl->options.req_read_receipt;
-       account->options.download_limit        = account_tbl->options.download_limit;
-       account->options.block_address         = account_tbl->options.block_address;
-       account->options.block_subject         = account_tbl->options.block_subject;
-       account->options.display_name_from     = EM_SAFE_STRDUP(account_tbl->options.display_name_from);
-       account->options.reply_with_body       = account_tbl->options.reply_with_body;
-       account->options.forward_with_files    = account_tbl->options.forward_with_files;
-       account->options.add_myname_card       = account_tbl->options.add_myname_card;
-       account->options.add_signature         = account_tbl->options.add_signature;
-       account->options.signature             = EM_SAFE_STRDUP(account_tbl->options.signature);
-       account->options.add_my_address_to_bcc = account_tbl->options.add_my_address_to_bcc;
-       account->target_storage                = account_tbl->target_storage;
-       account->check_interval                = account_tbl->check_interval;
-       account->my_account_id                 = account_tbl->my_account_id;
-       account->index_color                   = account_tbl->index_color;
-       
+       account->account_name                             = EM_SAFE_STRDUP(account_tbl->account_name);
+       account->incoming_server_type                     = account_tbl->incoming_server_type;
+       account->incoming_server_address                  = EM_SAFE_STRDUP(account_tbl->incoming_server_address);
+       account->user_email_address                       = EM_SAFE_STRDUP(account_tbl->user_email_address);
+       account->incoming_server_user_name                = EM_SAFE_STRDUP(account_tbl->incoming_server_user_name);
+       account->incoming_server_password                 = EM_SAFE_STRDUP(account_tbl->incoming_server_password);
+       account->retrieval_mode                           = account_tbl->retrieval_mode;
+       account->incoming_server_port_number              = account_tbl->incoming_server_port_number;
+       account->incoming_server_secure_connection        = account_tbl->incoming_server_secure_connection;
+       account->outgoing_server_type                     = account_tbl->outgoing_server_type;
+       account->outgoing_server_address                  = EM_SAFE_STRDUP(account_tbl->outgoing_server_address);
+       account->outgoing_server_port_number              = account_tbl->outgoing_server_port_number;
+       account->outgoing_server_need_authentication      = account_tbl->outgoing_server_need_authentication;
+       account->outgoing_server_secure_connection        = account_tbl->outgoing_server_secure_connection;
+       account->outgoing_server_user_name                = EM_SAFE_STRDUP(account_tbl->outgoing_server_user_name);
+       account->outgoing_server_password                 = EM_SAFE_STRDUP(account_tbl->outgoing_server_password);
+       account->user_display_name                        = EM_SAFE_STRDUP(account_tbl->user_display_name);
+       account->reply_to_address                         = EM_SAFE_STRDUP(account_tbl->reply_to_address);
+       account->return_address                           = EM_SAFE_STRDUP(account_tbl->return_address);
+       account->account_id                               = account_tbl->account_id;
+       account->keep_mails_on_pop_server_after_download  = account_tbl->keep_mails_on_pop_server_after_download;
+       account->auto_download_size                       = account_tbl->auto_download_size;
+       account->outgoing_server_use_same_authenticator   = account_tbl->outgoing_server_use_same_authenticator;
+       account->pop_before_smtp                          = account_tbl->pop_before_smtp;
+       account->incoming_server_requires_apop            = account_tbl->incoming_server_requires_apop;
+       account->logo_icon_path                           = EM_SAFE_STRDUP(account_tbl->logo_icon_path);
+       account->user_data                     = em_memdup(account_tbl->user_data, account_tbl->user_data_length);
+       account->user_data_length              = account_tbl->user_data_length;
+       account->options.priority                         = account_tbl->options.priority;
+       account->options.keep_local_copy                  = account_tbl->options.keep_local_copy;
+       account->options.req_delivery_receipt             = account_tbl->options.req_delivery_receipt;
+       account->options.req_read_receipt                 = account_tbl->options.req_read_receipt;
+       account->options.download_limit                   = account_tbl->options.download_limit;
+       account->options.block_address                    = account_tbl->options.block_address;
+       account->options.block_subject                    = account_tbl->options.block_subject;
+       account->options.display_name_from                = EM_SAFE_STRDUP(account_tbl->options.display_name_from);
+       account->options.reply_with_body                  = account_tbl->options.reply_with_body;
+       account->options.forward_with_files               = account_tbl->options.forward_with_files;
+       account->options.add_myname_card                  = account_tbl->options.add_myname_card;
+       account->options.add_signature                    = account_tbl->options.add_signature;
+       account->options.signature                        = EM_SAFE_STRDUP(account_tbl->options.signature);
+       account->options.add_my_address_to_bcc            = account_tbl->options.add_my_address_to_bcc;
+       account->check_interval                           = account_tbl->check_interval;
+       account->account_svc_id                           = account_tbl->account_svc_id;
+       account->sync_status                              = account_tbl->sync_status;
+       account->sync_disabled                            = account_tbl->sync_disabled;
+       account->default_mail_slot_size                   = account_tbl->default_mail_slot_size;
+       account->smime_type                               = account_tbl->smime_type;
+       account->certificate_path                         = EM_SAFE_STRDUP(account_tbl->certificate_path);
+       account->cipher_type                              = account_tbl->cipher_type;
+       account->digest_type                              = account_tbl->digest_type;
+
+       EM_DEBUG_FUNC_END();
+       return ret;
+}
+
+INTERNAL_FUNC int em_convert_mailbox_to_mailbox_tbl(email_mailbox_t *mailbox, emstorage_mailbox_tbl_t *mailbox_tbl)
+{
+       EM_DEBUG_FUNC_BEGIN("mailbox[%p], mailbox_tbl[%p]", mailbox, mailbox_tbl);
+       int ret = 1;
+
+       mailbox_tbl->account_id                 = mailbox->account_id;
+       mailbox_tbl->mailbox_id                 = mailbox->mailbox_id;
+       mailbox_tbl->mailbox_name               = EM_SAFE_STRDUP(mailbox->mailbox_name);
+       mailbox_tbl->alias                      = EM_SAFE_STRDUP(mailbox->alias);
+       mailbox_tbl->local_yn                   = mailbox->local;
+       mailbox_tbl->mailbox_type               = mailbox->mailbox_type;
+       mailbox_tbl->unread_count               = mailbox->unread_count;
+       mailbox_tbl->total_mail_count_on_local  = mailbox->total_mail_count_on_local;
+       mailbox_tbl->total_mail_count_on_server = mailbox->total_mail_count_on_server;
+       mailbox_tbl->mail_slot_size             = mailbox->mail_slot_size;
+
        EM_DEBUG_FUNC_END();
        return ret;
 }
 
-INTERNAL_FUNC int em_convert_mail_tbl_to_mail_data(emstorage_mail_tbl_t *mail_table_data, int item_count, emf_mail_data_t **mail_data, int *error)
+INTERNAL_FUNC int em_convert_mailbox_tbl_to_mailbox(emstorage_mailbox_tbl_t *mailbox_tbl, email_mailbox_t *mailbox)
+{
+       EM_DEBUG_FUNC_BEGIN("mailbox_tbl[%p], mailbox[%p]", mailbox_tbl, mailbox);
+       int ret = 1;
+
+       mailbox->account_id                 = mailbox_tbl->account_id;
+       mailbox->mailbox_id                 = mailbox_tbl->mailbox_id;
+       mailbox->mailbox_name               = EM_SAFE_STRDUP(mailbox_tbl->mailbox_name);
+       mailbox->alias                      = EM_SAFE_STRDUP(mailbox_tbl->alias);
+       mailbox->local                      = mailbox_tbl->local_yn;
+       mailbox->mailbox_type               = mailbox_tbl->mailbox_type;
+       mailbox->unread_count               = mailbox_tbl->unread_count;
+       mailbox->total_mail_count_on_local  = mailbox_tbl->total_mail_count_on_local;
+       mailbox->total_mail_count_on_server = mailbox_tbl->total_mail_count_on_server;
+       mailbox->mail_slot_size             = mailbox_tbl->mail_slot_size;
+       mailbox->last_sync_time             = mailbox_tbl->last_sync_time;
+
+       EM_DEBUG_FUNC_END();
+       return ret;
+}
+
+
+INTERNAL_FUNC int em_convert_mail_tbl_to_mail_data(emstorage_mail_tbl_t *mail_table_data, int item_count, email_mail_data_t **mail_data, int *error)
 {
        EM_DEBUG_FUNC_BEGIN("mail_table_data[%p], item_count [%d], mail_data[%p]", mail_table_data, item_count, mail_data);
-       int i, ret = false, err_code = EMF_ERROR_NONE;
-       emf_mail_data_t *temp_mail_data = NULL;
+       int i, ret = false, err_code = EMAIL_ERROR_NONE;
+       email_mail_data_t *temp_mail_data = NULL;
 
        if (!mail_table_data || !mail_data || !item_count) {
                EM_DEBUG_EXCEPTION("Invalid parameter");
-               err_code = EMF_ERROR_INVALID_PARAM;
+               err_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
 
-       temp_mail_data = em_malloc(sizeof(emf_mail_data_t) * item_count);
-       
+       temp_mail_data = em_malloc(sizeof(email_mail_data_t) * item_count);
+
        if(!temp_mail_data) {
                EM_DEBUG_EXCEPTION("em_malloc failed");
-               err_code = EMF_ERROR_OUT_OF_MEMORY;
+               err_code = EMAIL_ERROR_OUT_OF_MEMORY;
                goto FINISH_OFF;
        }
 
        for(i = 0; i < item_count; i++) {
                temp_mail_data[i].mail_id                 = mail_table_data[i].mail_id;
                temp_mail_data[i].account_id              = mail_table_data[i].account_id;
-               temp_mail_data[i].mailbox_name            = EM_SAFE_STRDUP(mail_table_data[i].mailbox_name);
+               temp_mail_data[i].mailbox_id              = mail_table_data[i].mailbox_id;
                temp_mail_data[i].mailbox_type            = mail_table_data[i].mailbox_type;
                temp_mail_data[i].subject                 = EM_SAFE_STRDUP(mail_table_data[i].subject);
                temp_mail_data[i].date_time               = mail_table_data[i].date_time;
@@ -364,6 +419,7 @@ INTERNAL_FUNC int em_convert_mail_tbl_to_mail_data(emstorage_mail_tbl_t *mail_ta
                temp_mail_data[i].body_download_status    = mail_table_data[i].body_download_status;
                temp_mail_data[i].file_path_plain         = EM_SAFE_STRDUP(mail_table_data[i].file_path_plain);
                temp_mail_data[i].file_path_html          = EM_SAFE_STRDUP(mail_table_data[i].file_path_html);
+               temp_mail_data[i].file_path_mime_entity   = EM_SAFE_STRDUP(mail_table_data[i].file_path_mime_entity);
                temp_mail_data[i].mail_size               = mail_table_data[i].mail_size;
                temp_mail_data[i].flags_seen_field        = mail_table_data[i].flags_seen_field;
                temp_mail_data[i].flags_deleted_field     = mail_table_data[i].flags_deleted_field;
@@ -383,6 +439,9 @@ INTERNAL_FUNC int em_convert_mail_tbl_to_mail_data(emstorage_mail_tbl_t *mail_ta
                temp_mail_data[i].thread_item_count       = mail_table_data[i].thread_item_count;
                temp_mail_data[i].preview_text            = EM_SAFE_STRDUP(mail_table_data[i].preview_text);
                temp_mail_data[i].meeting_request_status  = mail_table_data[i].meeting_request_status;
+               temp_mail_data[i].message_class           = mail_table_data[i].message_class;
+               temp_mail_data[i].digest_type             = mail_table_data[i].digest_type;
+               temp_mail_data[i].smime_type              = mail_table_data[i].smime_type;
        }
 
        *mail_data = temp_mail_data;
@@ -391,36 +450,36 @@ INTERNAL_FUNC int em_convert_mail_tbl_to_mail_data(emstorage_mail_tbl_t *mail_ta
 FINISH_OFF:
 
        if(error)
-                       *error = err_code;
+               *error = err_code;
 
        EM_DEBUG_FUNC_END();
        return ret;
 }
 
-INTERNAL_FUNC int   em_convert_mail_data_to_mail_tbl(emf_mail_data_t *mail_data, int item_count, emstorage_mail_tbl_t **mail_table_data, int *error)
+INTERNAL_FUNC int   em_convert_mail_data_to_mail_tbl(email_mail_data_t *mail_data, int item_count, emstorage_mail_tbl_t **mail_table_data, int *error)
 {
        EM_DEBUG_FUNC_BEGIN("mail_data[%p], item_count [%d], mail_table_data[%p]", mail_data, item_count, mail_table_data);
-       int i, ret = false, err_code = EMF_ERROR_NONE;
+       int i, ret = false, err_code = EMAIL_ERROR_NONE;
        emstorage_mail_tbl_t *temp_mail_tbl = NULL;
 
        if (!mail_data || !mail_table_data || !item_count) {
                EM_DEBUG_EXCEPTION("Invalid parameter");
-               err_code = EMF_ERROR_INVALID_PARAM;
+               err_code = EMAIL_ERROR_INVALID_PARAM;
                goto FINISH_OFF;
        }
 
        temp_mail_tbl = em_malloc(sizeof(emstorage_mail_tbl_t) * item_count);
-       
+
        if(!temp_mail_tbl) {
                EM_DEBUG_EXCEPTION("em_malloc failed");
-               err_code = EMF_ERROR_OUT_OF_MEMORY;
+               err_code = EMAIL_ERROR_OUT_OF_MEMORY;
                goto FINISH_OFF;
        }
 
        for(i = 0; i < item_count; i++) {
                temp_mail_tbl[i].mail_id                 = mail_data[i].mail_id;
                temp_mail_tbl[i].account_id              = mail_data[i].account_id;
-               temp_mail_tbl[i].mailbox_name            = EM_SAFE_STRDUP(mail_data[i].mailbox_name);
+               temp_mail_tbl[i].mailbox_id              = mail_data[i].mailbox_id;
                temp_mail_tbl[i].mailbox_type            = mail_data[i].mailbox_type;
                temp_mail_tbl[i].date_time               = mail_data[i].date_time;
                temp_mail_tbl[i].subject                 = EM_SAFE_STRDUP(mail_data[i].subject);
@@ -441,6 +500,7 @@ INTERNAL_FUNC int   em_convert_mail_data_to_mail_tbl(emf_mail_data_t *mail_data,
                temp_mail_tbl[i].body_download_status    = mail_data[i].body_download_status;
                temp_mail_tbl[i].file_path_plain         = EM_SAFE_STRDUP(mail_data[i].file_path_plain);
                temp_mail_tbl[i].file_path_html          = EM_SAFE_STRDUP(mail_data[i].file_path_html);
+               temp_mail_tbl[i].file_path_mime_entity   = EM_SAFE_STRDUP(mail_data[i].file_path_mime_entity);
                temp_mail_tbl[i].mail_size               = mail_data[i].mail_size;
                temp_mail_tbl[i].flags_seen_field        = mail_data[i].flags_seen_field;
                temp_mail_tbl[i].flags_deleted_field     = mail_data[i].flags_deleted_field;
@@ -460,6 +520,9 @@ INTERNAL_FUNC int   em_convert_mail_data_to_mail_tbl(emf_mail_data_t *mail_data,
                temp_mail_tbl[i].thread_item_count       = mail_data[i].thread_item_count;
                temp_mail_tbl[i].preview_text            = EM_SAFE_STRDUP(mail_data[i].preview_text);
                temp_mail_tbl[i].meeting_request_status  = mail_data[i].meeting_request_status;
+               temp_mail_tbl[i].message_class           = mail_data[i].message_class;
+               temp_mail_tbl[i].digest_type             = mail_data[i].digest_type;
+               temp_mail_tbl[i].smime_type              = mail_data[i].smime_type;
        }
 
        *mail_table_data = temp_mail_tbl;
@@ -472,7 +535,7 @@ FINISH_OFF:
 
        EM_DEBUG_FUNC_END();
        return ret;
-       
+
 }
 
 
@@ -486,7 +549,7 @@ INTERNAL_FUNC int em_convert_string_to_time_t(char *input_datetime_string, time_
 
        if (!input_datetime_string || !output_time) {
                EM_DEBUG_EXCEPTION("input_datetime_string[%p], output_time[%p]", input_datetime_string, output_time);
-               return EMF_ERROR_INVALID_PARAM;
+               return EMAIL_ERROR_INVALID_PARAM;
        }
 
        memset(buf, 0x00, sizeof(buf));
@@ -517,8 +580,8 @@ INTERNAL_FUNC int em_convert_string_to_time_t(char *input_datetime_string, time_
 
        EM_DEBUG_LOG("*output_time [%d", *output_time);
 
-       EM_DEBUG_FUNC_END("err %d", EMF_ERROR_NONE);
-       return EMF_ERROR_NONE;
+       EM_DEBUG_FUNC_END("err %d", EMAIL_ERROR_NONE);
+       return EMAIL_ERROR_NONE;
 }
 
 INTERNAL_FUNC int em_convert_time_t_to_string(time_t *input_time, char **output_datetime_string)
@@ -528,105 +591,146 @@ INTERNAL_FUNC int em_convert_time_t_to_string(time_t *input_time, char **output_
        struct tm *temp_time_info;
 
        if (!input_time || !output_datetime_string) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               return EMF_ERROR_INVALID_PARAM;
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return EMAIL_ERROR_INVALID_PARAM;
        }
 
        temp_time_info = localtime(input_time);
 
        if(!temp_time_info) {
                EM_DEBUG_EXCEPTION("localtime failed.");
-               return EMF_ERROR_SYSTEM_FAILURE;
+               return EMAIL_ERROR_SYSTEM_FAILURE;
        }
        SNPRINTF(temp_buffer, sizeof(temp_buffer), "%04d%02d%02d%02d%02d%02d",
                temp_time_info->tm_year + 1970, temp_time_info->tm_mon, temp_time_info->tm_mday, temp_time_info->tm_hour, temp_time_info->tm_min, temp_time_info->tm_sec);
 
        *output_datetime_string = EM_SAFE_STRDUP(temp_buffer);
 
-       EM_DEBUG_FUNC_END("err %d", EMF_ERROR_NONE);
-       return EMF_ERROR_NONE;
+       EM_DEBUG_FUNC_END("err %d", EMAIL_ERROR_NONE);
+       return EMAIL_ERROR_NONE;
 }
 
-static char* append_sized_data_to_stream(char *input_stream, int *input_output_stream_length, char *input_sized_data, int input_data_size)
+static char* append_sized_data_to_stream(char *stream, int *stream_len, char *src, int src_len)
 {
-       EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_length [%p], input_sized_data [%p], input_data_size [%d]", input_stream, input_output_stream_length, input_sized_data, input_data_size);
+       /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_length [%p], input_sized_data [%p], input_data_size [%d]", input_stream, input_output_stream_length, input_sized_data, input_data_size); */
        char *new_stream = NULL;
-       int source_stream_length = 0;
 
-       if( !input_output_stream_length || input_data_size == 0 || input_sized_data == NULL|| 
-                       (input_stream != NULL && *input_output_stream_length == 0) || (input_stream == NULL && *input_output_stream_length != 0) ) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               return NULL;    
+       if( !stream_len || src_len == 0 || src == NULL || (stream != NULL && *stream_len == 0) ||
+                       (stream == NULL && *stream_len != 0) ) {
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return NULL;
        }
 
-       source_stream_length = *input_output_stream_length;
+       int old_stream_len = *stream_len;
 
-       new_stream = (char*)em_malloc((source_stream_length) * sizeof(char) + input_data_size); 
+       /*TODO: don't increase stream buffer incrementally when appending new data */
+       new_stream = (char*)em_malloc(old_stream_len + src_len);
 
        if(!new_stream) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_OUT_OF_MEMORY");
-               return NULL;    
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
+               return NULL;
        }
 
-       if(input_stream != NULL)
-               memcpy(new_stream, input_stream, source_stream_length * sizeof(char));
+       if(stream != NULL)
+               memcpy(new_stream, stream, old_stream_len);
 
-       memcpy(new_stream + source_stream_length, input_sized_data, input_data_size);
+       memcpy(new_stream + old_stream_len, src, src_len);
 
-       *input_output_stream_length = source_stream_length + input_data_size;
-       
-       EM_SAFE_FREE(input_stream);     
-       EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length);
-       return new_stream;      
+       *stream_len = old_stream_len + src_len;
+
+       EM_SAFE_FREE(stream);
+       /* EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length); */
+       return new_stream;
 }
 
+
 static char* append_string_to_stream(char *input_stream, int *input_output_stream_length, char *input_source_string)
 {
        EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_length [%p] input_source_string[%p]", input_stream, input_output_stream_length, input_source_string);
        char *new_stream = NULL;
        int   data_length = 0;
-       int   source_stream_length = 0;
 
-       if( !input_output_stream_length || (input_stream != NULL && *input_output_stream_length == 0) || (input_stream == NULL && *input_output_stream_length != 0)) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               return NULL;    
+       if( !input_output_stream_length || (input_stream != NULL && *input_output_stream_length == 0) ||
+               (input_stream == NULL && *input_output_stream_length != 0) ) {
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return NULL;
        }
 
-       source_stream_length = *input_output_stream_length;
+       int source_stream_length = *input_output_stream_length;
 
-       if(input_source_string != NULL)
-               data_length = EM_SAFE_STRLEN(input_source_string);
+       data_length = EM_SAFE_STRLEN(input_source_string);
 
-       new_stream = (char*)em_malloc((source_stream_length + data_length) * sizeof(char) + sizeof(int));       
+       new_stream = (char*)em_malloc(source_stream_length + data_length + sizeof(int));
 
        if(!new_stream) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_OUT_OF_MEMORY");
-               return NULL;    
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
+               return NULL;
        }
 
        if(input_stream != NULL)
-               memcpy(new_stream, input_stream, source_stream_length * sizeof(char));
+               memcpy(new_stream, input_stream, source_stream_length);
 
+       /* write string length */
        memcpy(new_stream + source_stream_length, (char*)&data_length, sizeof(int));
 
-       if(input_source_string) 
+       /* write string */
+       if(input_source_string)
                memcpy(new_stream + source_stream_length + sizeof(int), input_source_string, data_length);
 
+       /* for example, "abc" is written to stream buffer with "3abc" */
        *input_output_stream_length = source_stream_length + sizeof(int) + data_length;
-       
-       EM_SAFE_FREE(input_stream);     
+
+       EM_SAFE_FREE(input_stream);
        EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length);
-       return new_stream;      
+       return new_stream;
+}
+
+#if 0
+static char* append_binary_to_stream(char *stream, int *stream_length, char *src, int src_size)
+{
+       /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_length [%p], input_sized_data [%p], input_data_size [%d]", input_stream, input_output_stream_length, input_sized_data, input_data_size); */
+       char *new_stream = NULL;
+
+       if( !stream_length || (stream && *stream_length == 0) || (!stream && *stream_length != 0) ||
+               src_size < 0 ) {
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return NULL;
+       }
+
+       /*TODO: don't increase stream buffer incrementally when appending new data */
+       new_stream = (char*)em_malloc(*stream_length + sizeof(int) + src_size);
+
+       if(!new_stream) {
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
+               return NULL;
+       }
+
+
+       if(stream != NULL)
+               memcpy(new_stream, stream, *stream_length);
+
+       memcpy(new_stream + *stream_length, &src_size, sizeof(int));
+
+       if( src_size > 0 )
+               memcpy(new_stream + *stream_length + sizeof(int), src, src_size);
+
+       *stream_length = *stream_length + sizeof(int) + src_size;
+
+       EM_SAFE_FREE(stream);
+       /* EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length); */
+
+       return new_stream;
 }
+#endif
 
-static int fetch_sized_data_from_stream(char *input_stream, int *input_output_stream_offset, int input_data_size, char *output_data) 
+static int fetch_sized_data_from_stream(char *input_stream, int *input_output_stream_offset, int input_data_size, char *output_data)
 {
-       EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] input_data_size [%d], output_data[%p]", input_stream, input_output_stream_offset, input_data_size, output_data);
+       /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] input_data_size [%d], output_data[%p]", input_stream, input_output_stream_offset, input_data_size, output_data); */
        int stream_offset = 0;
 
        if( !input_stream || !input_output_stream_offset || !input_data_size || !output_data) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               return EMF_ERROR_INVALID_PARAM; 
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return EMAIL_ERROR_INVALID_PARAM;
        }
 
        stream_offset = *input_output_stream_offset;
@@ -636,33 +740,30 @@ static int fetch_sized_data_from_stream(char *input_stream, int *input_output_st
 
        *input_output_stream_offset = stream_offset;
 
-       EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset);
-       return EMF_ERROR_NONE;
+       /* EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset); */
+       return EMAIL_ERROR_NONE;
 }
 
-static int fetch_string_from_stream(char *input_stream, int *input_output_stream_offset, char **output_string) 
+
+static int fetch_string_from_stream(char *input_stream, int *input_output_stream_offset, char **output_string)
 {
-       EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] output_string[%p]", input_stream, input_output_stream_offset, output_string);
+       /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] output_string[%p]", input_stream, input_output_stream_offset, output_string); */
        int string_length = 0;
        int stream_offset = 0;
        char *result_string = NULL;
 
        if( !input_stream || !input_output_stream_offset || !output_string) {
-               EM_DEBUG_EXCEPTION("EMF_ERROR_INVALID_PARAM");
-               return EMF_ERROR_INVALID_PARAM; 
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return EMAIL_ERROR_INVALID_PARAM;
        }
 
        stream_offset = *input_output_stream_offset;
-       /*
-       EM_DEBUG_LOG("stream_offset [%d]", stream_offset);
-       */
+       /*      EM_DEBUG_LOG("stream_offset [%d]", stream_offset);      */
 
        memcpy(&string_length, input_stream + stream_offset, sizeof(int));
        stream_offset +=  sizeof(int);
 
-       /*
-       EM_DEBUG_LOG("string_length [%d]", string_length);
-       */
+       /*      EM_DEBUG_LOG("string_length [%d]", string_length);      */
 
        if(string_length != 0) {
                result_string = (char*)em_malloc(string_length + 1);
@@ -678,47 +779,107 @@ static int fetch_string_from_stream(char *input_stream, int *input_output_stream
 
        *output_string              = result_string;
        *input_output_stream_offset = stream_offset;
-       
-       EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset);
-       return EMF_ERROR_NONE;
+
+       /* EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset); */
+       return EMAIL_ERROR_NONE;
 }
 
-INTERNAL_FUNC char* em_convert_account_to_byte_stream(emf_account_t* input_account, int *output_stream_size)
+#if 0
+static int fetch_binary_from_stream(char *stream, int *stream_offset, void **dest)
 {
+       /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] output_string[%p]", input_stream, input_output_stream_offset, output_string); */
+       int length = 0;
+
+       if( !stream || !stream_offset || !dest) {
+               EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
+               return EMAIL_ERROR_INVALID_PARAM;
+       }
+
+       int offset = *stream_offset;
+
+       memcpy((void*)&length, (void*) stream + offset, sizeof(int));
+       offset +=  sizeof(int);
+
+       *dest = NULL;
+       if(length > 0) {
+               *dest = (void*)em_malloc(length);
+               if(!*dest) {
+                       EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
+                       return EMAIL_ERROR_OUT_OF_MEMORY;
+               }
+
+               memcpy(*dest, (void*) stream + offset, length);
+               offset += length;
+       }
+
+       *stream_offset = offset;
+
+       return EMAIL_ERROR_NONE;
+}
+#endif
+                                    /* divide struct at binary field (void* user_data)*/
+#define EMAIL_ACCOUNT_FMT   "S(" "isiii" "is" ")" "B" "S(" "issss"  "isiss" "iiiii" "isiss" "iii"\
+                                 "$(" "iiiii" "iisii" "iisi" ")" "iiisii" ")"
+
+
+INTERNAL_FUNC char* em_convert_account_to_byte_stream(email_account_t* account, int *stream_len)
+{
+       EM_DEBUG_FUNC_END();
+       EM_IF_NULL_RETURN_VALUE(account, NULL);
+
+       tpl_node *tn = NULL;
+       tpl_bin tb;
+
+       tn = tpl_map(EMAIL_ACCOUNT_FMT, account, &tb, &(account->user_data_length));
+       tb.sz = account->user_data_length;
+       tb.addr = account->user_data;
+       tpl_pack(tn, 0);
+
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+       EM_DEBUG_FUNC_END();
+       return (char*) buf;
+
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_account [%p], output_stream_size [%p]", input_account, output_stream_size);
        char *result_stream = NULL;
        int stream_size = 0;
 
        EM_IF_NULL_RETURN_VALUE(input_account, NULL);
-       
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->account_bind_type), sizeof(int));
+
        result_stream = append_string_to_stream(result_stream, &stream_size, input_account->account_name);
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->receiving_server_type), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->receiving_server_addr);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->email_addr);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->user_name);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->password);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->incoming_server_type), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->incoming_server_address);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->user_email_address);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->incoming_server_user_name);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->incoming_server_password);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->retrieval_mode), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->port_num), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->use_security), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sending_server_type), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->sending_server_addr);
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sending_port_num), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sending_auth), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sending_security), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->sending_user);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->sending_password);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->display_name);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->reply_to_addr);
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->return_addr);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->incoming_server_port_number), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->incoming_server_secure_connection), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->outgoing_server_type), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->outgoing_server_address);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->outgoing_server_port_number), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->outgoing_server_need_authentication), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->outgoing_server_secure_connection), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->outgoing_server_user_name);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->outgoing_server_password);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->user_display_name);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->reply_to_address);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->return_address);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->account_id), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->keep_on_server), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->flag1), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->flag2), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->keep_mails_on_pop_server_after_download), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->auto_download_size), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->outgoing_server_use_same_authenticator), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->pop_before_smtp), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->apop), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->incoming_server_requires_apop), sizeof(int));
        result_stream = append_string_to_stream(result_stream, &stream_size, input_account->logo_icon_path);
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->preset_account), sizeof(int));
+       result_stream = append_binary_to_stream(result_stream, &stream_size, input_account->user_data, input_account->user_data_length);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*) &input_account->user_data_length, sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->options.priority), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->options.keep_local_copy), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->options.req_delivery_receipt), sizeof(int));
@@ -733,54 +894,78 @@ INTERNAL_FUNC char* em_convert_account_to_byte_stream(emf_account_t* input_accou
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->options.add_signature), sizeof(int));
        result_stream = append_string_to_stream(result_stream, &stream_size, input_account->options.signature);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->options.add_my_address_to_bcc), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->target_storage), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->check_interval), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->my_account_id), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->index_color), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->account_svc_id), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sync_status), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->sync_disabled), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->default_mail_slot_size), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->smime_type), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_account->certificate_path);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->cipher_type), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_account->digest_type), sizeof(int));
 
        *output_stream_size = stream_size;
 
+
        EM_DEBUG_FUNC_END("stream_size [%d]", stream_size);
        return result_stream;
+#endif
 }
 
 
-INTERNAL_FUNC void em_convert_byte_stream_to_account(char *input_stream,  emf_account_t *output_account)
+INTERNAL_FUNC void em_convert_byte_stream_to_account(char *stream, int stream_len, email_account_t *account)
 {
+       EM_DEBUG_FUNC_END();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(account);
+
+       tpl_node *tn = NULL;
+       tpl_bin tb;
+
+       tn = tpl_map(EMAIL_ACCOUNT_FMT, account, &tb, &(account->user_data_length));
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       /* tb will be destroyed at end of func, but tb.addr remains */
+       account->user_data = tb.addr;
+
+       EM_DEBUG_FUNC_END();
+#if 0
        EM_DEBUG_FUNC_BEGIN();
        int stream_offset = 0;
 
        EM_NULL_CHECK_FOR_VOID(input_stream);
        EM_NULL_CHECK_FOR_VOID(output_account);
 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->account_bind_type);
        fetch_string_from_stream(input_stream, &stream_offset, &output_account->account_name);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->receiving_server_type);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->receiving_server_addr);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->email_addr);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->user_name);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->password);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->incoming_server_type);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->incoming_server_address);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->user_email_address);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->incoming_server_user_name);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->incoming_server_password);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->retrieval_mode);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->port_num);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->use_security);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sending_server_type);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->sending_server_addr);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sending_port_num);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sending_auth);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sending_security);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->sending_user);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->sending_password);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->display_name);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->reply_to_addr);
-       fetch_string_from_stream(input_stream, &stream_offset, &output_account->return_addr);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->incoming_server_port_number);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->incoming_server_secure_connection);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->outgoing_server_type);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->outgoing_server_address);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->outgoing_server_port_number);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->outgoing_server_need_authentication);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->outgoing_server_secure_connection);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->outgoing_server_user_name);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->outgoing_server_password);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->user_display_name);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->reply_to_address);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->return_address);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->account_id);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->keep_on_server);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->flag1);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->flag2);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->keep_mails_on_pop_server_after_download);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->auto_download_size);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->outgoing_server_use_same_authenticator);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->pop_before_smtp);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->apop);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->incoming_server_requires_apop);
        fetch_string_from_stream(input_stream, &stream_offset, &output_account->logo_icon_path);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->preset_account);
+       fetch_binary_from_stream(input_stream, &stream_offset, &output_account->user_data);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->user_data_length);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->options.priority);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->options.keep_local_copy);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->options.req_delivery_receipt);
@@ -795,85 +980,51 @@ INTERNAL_FUNC void em_convert_byte_stream_to_account(char *input_stream,  emf_ac
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->options.add_signature);
        fetch_string_from_stream(input_stream, &stream_offset, &output_account->options.signature);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->options.add_my_address_to_bcc);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->target_storage);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->check_interval);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->my_account_id);
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->index_color);
-       
-       EM_DEBUG_FUNC_END();
-}
-
-INTERNAL_FUNC char* em_convert_attachment_info_to_byte_stream(emf_attachment_info_t *input_attachment_info, int *output_stream_size)
-{
-       EM_DEBUG_FUNC_BEGIN();
-
-       char *result_stream = NULL;
-       int stream_size = 0;
-
-       EM_IF_NULL_RETURN_VALUE(input_attachment_info, NULL);
-       EM_IF_NULL_RETURN_VALUE(output_stream_size, NULL);
-
-       while(input_attachment_info) {
-               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_info->inline_content, sizeof(int));
-               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_info->attachment_id, sizeof(int)); 
-               result_stream = append_string_to_stream(result_stream, &stream_size, input_attachment_info->name);
-               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_info->size, sizeof(int));
-               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_info->downloaded, sizeof(int));
-               result_stream = append_string_to_stream(result_stream, &stream_size, input_attachment_info->savename);
-               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_info->drm, sizeof(int)); 
-
-               input_attachment_info = input_attachment_info->next;
-       }
-
-       *output_stream_size = stream_size;
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->account_svc_id);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sync_status);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->sync_disabled);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->default_mail_slot_size);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->smime_type);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_account->certificate_path);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->cipher_type);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&output_account->digest_type);
 
        EM_DEBUG_FUNC_END();
-       return result_stream;
+#endif
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_attachment_info(char *input_stream, int attachment_count, emf_attachment_info_t **output_attachment_info)
+#define EMAIL_MAIL_DATA_FMT  "S(" "iiiis" "iisss" "sssss" "sssss" "isssi"\
+                            "ccccc" "cciii" "iiiii" "isiii" "i" ")"
+
+INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(email_mail_data_t *mail_data, int *stream_len)
 {
-       EM_DEBUG_FUNC_BEGIN();
+       EM_DEBUG_FUNC_END();
+       EM_IF_NULL_RETURN_VALUE(mail_data, NULL);
+       EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
 
-       int i = 0;
-       int stream_offset = 0;
-       emf_attachment_info_t *temp_attachment_info = NULL;
-       emf_attachment_info_t *current_attachment_info = NULL;
+       tpl_node *tn = NULL;
 
-       EM_NULL_CHECK_FOR_VOID(input_stream);
+       tn = tpl_map(EMAIL_MAIL_DATA_FMT, mail_data);
+       tpl_pack(tn, 0);
 
-       for(i = 0; i < attachment_count; i++) { 
-               temp_attachment_info = (emf_attachment_info_t*)malloc(sizeof(emf_attachment_info_t));
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
 
-               if(i == 0)
-                       *output_attachment_info = current_attachment_info = temp_attachment_info;
-               else {
-                       current_attachment_info->next = temp_attachment_info;
-                       current_attachment_info = temp_attachment_info;
-               }
-               
-               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&temp_attachment_info->inline_content);
-               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&temp_attachment_info->attachment_id); 
-               fetch_string_from_stream(input_stream, &stream_offset, &temp_attachment_info->name);
-               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&temp_attachment_info->size);
-               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&temp_attachment_info->downloaded);
-               fetch_string_from_stream(input_stream, &stream_offset, &temp_attachment_info->savename);
-               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&temp_attachment_info->drm); 
-
-               temp_attachment_info->next = NULL;
-       }
-       
+       *stream_len = len;
        EM_DEBUG_FUNC_END();
-}
+       return (char*) buf;
 
-INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(emf_mail_data_t *input_mail_data, int input_mail_data_count, int *output_stream_size)
-{
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_mail_data [%p], input_mail_data_count[%d], output_stream_size[%p]", input_mail_data, input_mail_data_count, output_stream_size);
-       
+
        char *result_stream = NULL;
        int stream_size = 0;
        int i = 0;
-       
+
        EM_IF_NULL_RETURN_VALUE(input_mail_data, NULL);
        EM_IF_NULL_RETURN_VALUE(output_stream_size, NULL);
 
@@ -882,7 +1033,7 @@ INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(emf_mail_data_t *input_m
        for(i = 0; i < input_mail_data_count; i++) {
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].mail_id), sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].account_id), sizeof(int));
-               result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].mailbox_name);
+               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].mailbox_id), sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].mailbox_type), sizeof(int));
                result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].subject);
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].date_time), sizeof(int));
@@ -903,6 +1054,7 @@ INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(emf_mail_data_t *input_m
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].body_download_status), sizeof(int));
                result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].file_path_plain);
                result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].file_path_html);
+               result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].file_path_mime_entity);
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].mail_size), sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].flags_seen_field), sizeof(char));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].flags_deleted_field), sizeof(char));
@@ -922,16 +1074,32 @@ INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(emf_mail_data_t *input_m
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].thread_item_count), sizeof(int));
                result_stream = append_string_to_stream(result_stream, &stream_size, input_mail_data[i].preview_text);
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].meeting_request_status), sizeof(int));
+               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].message_class), sizeof(int));
+               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].digest_type), sizeof(int));
+               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mail_data[i].smime_type), sizeof(int));
        }
 
        *output_stream_size = stream_size;
 
        EM_DEBUG_FUNC_END("stream_size [%d]", stream_size);
        return result_stream;
+#endif
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *input_stream, emf_mail_data_t **output_mail_data, int *output_mail_data_count)
+INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *stream, int stream_len, email_mail_data_t *mail_data)
 {
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(mail_data);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_MAIL_DATA_FMT, mail_data);
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       EM_DEBUG_FUNC_END();
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_stream [%p], output_mail_data[%p], output_mail_data_count[%p]", input_stream, output_mail_data, output_mail_data_count);
 
        int stream_offset = 0;
@@ -950,7 +1118,7 @@ INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *input_stream, emf_m
                return;
        }
 
-       *output_mail_data = (emf_mail_data_t*)em_malloc(sizeof(emf_mail_data_t) * (*output_mail_data_count));
+       *output_mail_data = (email_mail_data_t*)em_malloc(sizeof(email_mail_data_t) * (*output_mail_data_count));
 
        if(!*output_mail_data) {
                EM_DEBUG_EXCEPTION("em_malloc failed");
@@ -960,7 +1128,7 @@ INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *input_stream, emf_m
        for(i = 0; i < *output_mail_data_count; i++) {
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].mail_id);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].account_id);
-               fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].mailbox_name);
+               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].mailbox_id);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].mailbox_type);
                fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].subject);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].date_time);
@@ -981,6 +1149,7 @@ INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *input_stream, emf_m
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].body_download_status);
                fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].file_path_plain);
                fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].file_path_html);
+               fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].file_path_mime_entity);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].mail_size);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(char), (char*)&(*output_mail_data)[i].flags_seen_field);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(char), (char*)&(*output_mail_data)[i].flags_deleted_field);
@@ -1000,15 +1169,57 @@ INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *input_stream, emf_m
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].thread_item_count);
                fetch_string_from_stream(input_stream, &stream_offset, &(*output_mail_data)[i].preview_text);
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].meeting_request_status);
+               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].message_class);
+               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].digest_type);
+               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(*output_mail_data)[i].smime_type);
        }
 
        EM_DEBUG_FUNC_END();
+#endif
 }
 
-INTERNAL_FUNC char* em_convert_attachment_data_to_byte_stream(emf_attachment_data_t *input_attachment_data, int input_attachment_count, int* output_stream_size)
+
+#define EMAIL_ATTACHMENT_DATA_FMT "A(S(" "issii" "iciii" "s" "))"
+
+INTERNAL_FUNC char* em_convert_attachment_data_to_byte_stream(email_attachment_data_t *attachment, int attachment_count, int* stream_len)
 {
+       EM_DEBUG_FUNC_BEGIN();
+       EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
+       if(!attachment) {
+               EM_DEBUG_LOG("no attachment to be included");
+               *stream_len = 0;
+               return NULL;
+       }
+
+
+       email_attachment_data_t cur = {0};
+       tpl_node *tn = NULL;
+
+       /* tpl_map adds value at 2nd param addr to packing buffer iterately */
+       /* 2nd param value (not addr via pointer) should be modified at each iteration */
+       tn = tpl_map(EMAIL_ATTACHMENT_DATA_FMT, &cur);
+       int i=0;
+       for( ; i < attachment_count ; i++ ) {
+               memcpy(&cur, attachment+i, sizeof(cur)); /* copy data to cur : swallow copy */
+               tpl_pack(tn, 1);                        /* pack data at &cur: deep copy */
+       }
+
+       /* write data to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+
+       EM_DEBUG_LOG("stream_len: %d", len);
+
+       EM_DEBUG_FUNC_END();
+       return (char*) buf;
+
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_attachment_data [%p], input_attachment_count [%d], output_stream_size [%p]", input_attachment_data, input_attachment_count, output_stream_size);
-       
+
        char *result_stream = NULL;
        int stream_size = 0;
        int i = 0;
@@ -1026,7 +1237,7 @@ INTERNAL_FUNC char* em_convert_attachment_data_to_byte_stream(emf_attachment_dat
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].attachment_size, sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].mail_id, sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].account_id, sizeof(int));
-               result_stream = append_string_to_stream(result_stream, &stream_size, input_attachment_data[i].mailbox_name);
+               result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].mailbox_id, sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].save_status, sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].drm_status, sizeof(int));
                result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_attachment_data[i].inline_content_status,sizeof(int));
@@ -1036,10 +1247,55 @@ INTERNAL_FUNC char* em_convert_attachment_data_to_byte_stream(emf_attachment_dat
 
        EM_DEBUG_FUNC_END("stream_size [%d]", stream_size);
        return result_stream;
+#endif
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_attachment_data(char *input_stream, emf_attachment_data_t **output_attachment_data, int *output_attachment_count)
+INTERNAL_FUNC void em_convert_byte_stream_to_attachment_data(char *stream, int stream_len, email_attachment_data_t **attachment_data, int *attachment_count)
 {
+       EM_DEBUG_FUNC_BEGIN();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(attachment_data);
+       EM_NULL_CHECK_FOR_VOID(attachment_count);
+
+
+       email_attachment_data_t cur = {0};
+       tpl_node *tn = NULL;
+       tn = tpl_map(EMAIL_ATTACHMENT_DATA_FMT, &cur);
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+
+       /* tpl does not return the size of variable-length array, but we need variable-length array */
+       /* so, make list and get list count in the first phase, */
+       /* and then copy list to var array after allocating memory */
+       GList *head = NULL;
+       int count = 0;
+       while( tpl_unpack(tn, 1) > 0) {
+               email_attachment_data_t* pdata = (email_attachment_data_t*) em_malloc(sizeof(email_attachment_data_t));
+               memcpy(pdata, &cur, sizeof(email_attachment_data_t)); /* copy unpacked data to list item */
+               head = g_list_prepend(head, pdata);                   /* add it to list */
+               memset(&cur, 0, sizeof(email_attachment_data_t));     /* initialize variable, used for unpacking */
+               count++;
+       }
+       tpl_free(tn);
+
+       /*finally we get the list count and allocate var length array */
+       email_attachment_data_t *attached = (email_attachment_data_t*) em_malloc(sizeof(email_attachment_data_t)*count);
+
+       /*write glist item into variable array*/
+       head = g_list_reverse(head);
+       GList *p = g_list_first(head);
+       int i=0;
+       for( ; p ; p = g_list_next(p), i++ ) {
+               email_attachment_data_t* pdata = (email_attachment_data_t*) g_list_nth_data(p, 0);
+               memcpy( attached+i, pdata, sizeof(email_attachment_data_t));
+               EM_SAFE_FREE(pdata);    /*now, list item is useless */
+       }
+
+       g_list_free(head);
+
+       *attachment_count = count;
+       *attachment_data = attached;
+       EM_DEBUG_FUNC_END();
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_stream [%p], output_attachment_data[%p]", input_stream, output_attachment_data);
 
        int stream_offset = 0;
@@ -1058,7 +1314,7 @@ INTERNAL_FUNC void em_convert_byte_stream_to_attachment_data(char *input_stream,
                return;
        }
 
-       *output_attachment_data = (emf_attachment_data_t*)em_malloc(sizeof(emf_attachment_data_t) * (*output_attachment_count));
+       *output_attachment_data = (email_attachment_data_t*)em_malloc(sizeof(email_attachment_data_t) * (*output_attachment_count));
 
        if(!*output_attachment_data) {
                EM_DEBUG_EXCEPTION("em_malloc failed");
@@ -1072,19 +1328,41 @@ INTERNAL_FUNC void em_convert_byte_stream_to_attachment_data(char *input_stream,
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].attachment_size));
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].mail_id));
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].account_id));
-               fetch_string_from_stream(input_stream, &stream_offset, &(*output_attachment_data)[i].mailbox_name);
+               fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].mailbox_id));
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].save_status));
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].drm_status));
                fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&((*output_attachment_data)[i].inline_content_status));
        }
 
        EM_DEBUG_FUNC_END();
+#endif
 }
 
 
+#define EMAIL_MAILBOX_FMT  "S(" "isisi" "iiiii" "i" ")"
 
-INTERNAL_FUNC char* em_convert_mailbox_to_byte_stream(emf_mailbox_t *input_mailbox_data, int *output_stream_size)
+INTERNAL_FUNC char* em_convert_mailbox_to_byte_stream(email_mailbox_t *mailbox_data, int *stream_len)
 {
+       EM_DEBUG_FUNC_BEGIN();
+       EM_IF_NULL_RETURN_VALUE(mailbox_data, NULL);
+       EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_MAILBOX_FMT, mailbox_data);
+       tpl_pack(tn, 0);
+
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+       EM_DEBUG_FUNC_END("serialized len: %d", len);
+       return (char*) buf;
+
+#if 0
        EM_DEBUG_FUNC_BEGIN("input_mailbox_data [%p], output_stream_size [%p]", input_mailbox_data, output_stream_size);
        
        char *result_stream = NULL;
@@ -1094,115 +1372,178 @@ INTERNAL_FUNC char* em_convert_mailbox_to_byte_stream(emf_mailbox_t *input_mailb
        EM_IF_NULL_RETURN_VALUE(output_stream_size, NULL);
 
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->mailbox_id), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_mailbox_data->name);
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_mailbox_data->mailbox_name);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->mailbox_type), sizeof(int));
        result_stream = append_string_to_stream(result_stream, &stream_size, input_mailbox_data->alias);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->unread_count), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->total_mail_count_on_local), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->total_mail_count_on_server), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->hold_connection), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->local), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->synchronous), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->account_id), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->user_data), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->mail_stream), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->has_archived_mails), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_mailbox_data->mail_slot_size), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_mailbox_data->account_name);
        
        *output_stream_size = stream_size;
 
        EM_DEBUG_FUNC_END();
 
        return result_stream;
+#endif
 }
 
 
-INTERNAL_FUNC void em_convert_byte_stream_to_mailbox(char *input_stream, emf_mailbox_t *output_mailbox_data)
+INTERNAL_FUNC void em_convert_byte_stream_to_mailbox(char *stream, int stream_len, email_mailbox_t *mailbox_data)
 {
-       EM_DEBUG_FUNC_BEGIN("input_stream [%p], output_mailbox_data [%p]", input_stream, output_mailbox_data);
+       EM_DEBUG_FUNC_BEGIN();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(mailbox_data);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_MAILBOX_FMT, mailbox_data);
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
+
+/*     EM_DEBUG_FUNC_BEGIN("input_stream [%p], output_mailbox_data [%p]", input_stream, output_mailbox_data);
        int             stream_offset   = 0;
 
        EM_NULL_CHECK_FOR_VOID(input_stream);
        EM_NULL_CHECK_FOR_VOID(output_mailbox_data);
 
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->mailbox_id));
-       fetch_string_from_stream(input_stream, &stream_offset, &output_mailbox_data->name);
+       fetch_string_from_stream(input_stream, &stream_offset, &output_mailbox_data->mailbox_name);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->mailbox_type));
        fetch_string_from_stream(input_stream, &stream_offset, &output_mailbox_data->alias);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->unread_count));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->total_mail_count_on_local));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->total_mail_count_on_server));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->hold_connection));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->local));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->synchronous));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->account_id));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->user_data));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->mail_stream));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->has_archived_mails));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_mailbox_data->mail_slot_size));
-       fetch_string_from_stream(input_stream, &stream_offset, &output_mailbox_data->account_name);
        EM_DEBUG_FUNC_END();
+*/
 }
 
+#define EMAIL_OPTION_FMT "S(" "iiiii" "iisii" "iisi" ")"
 
-INTERNAL_FUNC char* em_convert_option_to_byte_stream(emf_option_t* input_option, int* output_stream_size)
+INTERNAL_FUNC char* em_convert_option_to_byte_stream(email_option_t* option, int* stream_len)
 {
        EM_DEBUG_FUNC_BEGIN();
+       EM_IF_NULL_RETURN_VALUE(option, NULL);
+       EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_OPTION_FMT, option);
+       tpl_pack(tn, 0);
+
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+       EM_DEBUG_FUNC_END("serialized len: %d", len);
+       return (char*) buf;
+
+
+#if 0
+       EM_DEBUG_FUNC_BEGIN();
        char *result_stream = NULL;
        int stream_size = 0;
 
        EM_IF_NULL_RETURN_VALUE(input_option, NULL);
 
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->priority), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->keep_local_copy), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->keep_local_copy), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->req_delivery_receipt), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->req_read_receipt), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->download_limit), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->block_address), sizeof(int)); 
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->block_subject), sizeof(int)); 
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_option->display_name_from); 
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->reply_with_body), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->block_address), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->block_subject), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_option->display_name_from);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->reply_with_body), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->forward_with_files), sizeof(int));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_myname_card), sizeof(int)); 
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_signature), sizeof(int)); 
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_option->signature); 
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_my_address_to_bcc), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_myname_card), sizeof(int));
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_signature), sizeof(int));
+       result_stream = append_string_to_stream(result_stream, &stream_size, input_option->signature);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_option->add_my_address_to_bcc), sizeof(int));
        *output_stream_size = stream_size;
 
        EM_DEBUG_FUNC_END();
        return result_stream;
-
+#endif
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_option(char *input_stream, emf_option_t *output_option)
+INTERNAL_FUNC void em_convert_byte_stream_to_option(char *stream, int stream_len, email_option_t *option)
 {
        EM_DEBUG_FUNC_BEGIN();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(option);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_OPTION_FMT, option);
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
+
+#if 0
+       EM_DEBUG_FUNC_BEGIN();
        int stream_offset = 0;
 
        EM_NULL_CHECK_FOR_VOID(input_stream);
 
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->priority));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->keep_local_copy)); 
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->keep_local_copy));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->req_delivery_receipt));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->req_read_receipt));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->download_limit));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->block_address)); 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->block_subject)); 
-       fetch_string_from_stream(input_stream, &stream_offset, &output_option->display_name_from); 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->reply_with_body)); 
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->block_address));
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->block_subject));
+       fetch_string_from_stream(input_stream, &stream_offset, &output_option->display_name_from);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->reply_with_body));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->forward_with_files));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_myname_card)); 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_signature)); 
-       fetch_string_from_stream(input_stream, &stream_offset, &output_option->signature); 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_my_address_to_bcc)); 
-       
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_myname_card));
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_signature));
+       fetch_string_from_stream(input_stream, &stream_offset, &output_option->signature);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_option->add_my_address_to_bcc));
        EM_DEBUG_FUNC_END();
+#endif
 }
 
-INTERNAL_FUNC char* em_convert_rule_to_byte_stream(emf_rule_t *input_rule, int *output_stream_size)
+
+#define EMAIL_RULE_FMT "S(" "iiisi" "iii" ")"
+
+INTERNAL_FUNC char* em_convert_rule_to_byte_stream(email_rule_t *rule, int *stream_len)
 {
        EM_DEBUG_FUNC_BEGIN();
+       EM_IF_NULL_RETURN_VALUE(rule, NULL);
+       EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_RULE_FMT, rule);
+       tpl_pack(tn, 0);
+
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+       EM_DEBUG_FUNC_END("serialized len: %d", len);
+       return (char*) buf;
+
+
+#if 0
+       EM_DEBUG_FUNC_BEGIN();
        char *result_stream = NULL;
        int stream_size = 0;
 
@@ -1214,7 +1555,7 @@ INTERNAL_FUNC char* em_convert_rule_to_byte_stream(emf_rule_t *input_rule, int *
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_rule->type), sizeof(int));
        result_stream = append_string_to_stream(result_stream, &stream_size, input_rule->value);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_rule->faction), sizeof(int));
-       result_stream = append_string_to_stream(result_stream, &stream_size, input_rule->mailbox);
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_rule->target_mailbox_id), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_rule->flag1), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_rule->flag2), sizeof(int));
 
@@ -1222,11 +1563,28 @@ INTERNAL_FUNC char* em_convert_rule_to_byte_stream(emf_rule_t *input_rule, int *
 
        EM_DEBUG_FUNC_END();
        return result_stream;
+#endif
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_rule(char *input_stream, emf_rule_t *output_rule)
+INTERNAL_FUNC void em_convert_byte_stream_to_rule(char *stream, int stream_len, email_rule_t *rule)
 {
        EM_DEBUG_FUNC_BEGIN();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(rule);
+
+       tpl_node *tn = NULL;
+
+       tn = tpl_map(EMAIL_RULE_FMT, rule);
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
+
+
+
+#if 0
+       EM_DEBUG_FUNC_BEGIN();
        int stream_offset = 0;
 
        EM_NULL_CHECK_FOR_VOID(input_stream);
@@ -1237,14 +1595,17 @@ INTERNAL_FUNC void em_convert_byte_stream_to_rule(char *input_stream, emf_rule_t
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_rule->type));
        fetch_string_from_stream(input_stream, &stream_offset, &output_rule->value);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_rule->faction));
-       fetch_string_from_stream(input_stream, &stream_offset, &output_rule->mailbox);
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_rule->target_mailbox_id));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_rule->flag1));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_rule->flag2));
-       
+
        EM_DEBUG_FUNC_END();
+#endif
 }
 
-INTERNAL_FUNC char* em_convert_extra_flags_to_byte_stream(emf_extra_flag_t input_extra_flag, int *output_stream_size)
+
+#if 0
+INTERNAL_FUNC char* em_convert_extra_flags_to_byte_stream(email_extra_flag_t extra_flag, int *stream_len)
 {
        EM_DEBUG_FUNC_BEGIN();
        char *result_stream = NULL;
@@ -1275,7 +1636,8 @@ INTERNAL_FUNC char* em_convert_extra_flags_to_byte_stream(emf_extra_flag_t input
        return result_stream;
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_extra_flags(char *input_stream, emf_extra_flag_t *output_extra_flag)
+
+INTERNAL_FUNC void em_convert_byte_stream_to_extra_flags(char *input_stream, email_extra_flag_t *output_extra_flag)
 {
        EM_DEBUG_FUNC_BEGIN();
 
@@ -1302,9 +1664,56 @@ INTERNAL_FUNC void em_convert_byte_stream_to_extra_flags(char *input_stream, emf
 
        EM_DEBUG_FUNC_END();
 }
+#endif
+
 
-INTERNAL_FUNC char* em_convert_meeting_req_to_byte_stream(emf_meeting_request_t *input_meeting_req, int *output_stream_size)
+#define EMAIL_MEETING_REQUEST_FMT   "iiBBs" "sic#Bi" "c#Bi"
+
+INTERNAL_FUNC char* em_convert_meeting_req_to_byte_stream(email_meeting_request_t *meeting_req, int *stream_len)
 {
+
+       EM_DEBUG_FUNC_END();
+       EM_IF_NULL_RETURN_VALUE(meeting_req, NULL);
+
+       tpl_node *tn = NULL;
+       tpl_bin tb[4];
+
+       tn = tpl_map(EMAIL_MEETING_REQUEST_FMT,
+                                               &meeting_req->mail_id,
+                                               &meeting_req->meeting_response,
+                                               &tb[0],
+                                               &tb[1],
+                                               &meeting_req->location,
+                                               &meeting_req->global_object_id,
+                                               &meeting_req->time_zone.offset_from_GMT,
+                                               meeting_req->time_zone.standard_name, 32,
+                                               &tb[2],
+                                               &meeting_req->time_zone.standard_bias,
+                                               meeting_req->time_zone.daylight_name, 32,
+                                               &tb[3],
+                                               &meeting_req->time_zone.daylight_bias
+                               );
+       tb[0].sz = tb[1].sz = tb[2].sz = tb[3].sz = sizeof(struct tm);
+       tb[0].addr = &meeting_req->start_time;
+       tb[1].addr = &meeting_req->end_time;
+       tb[2].addr = &meeting_req->time_zone.standard_time_start_date;
+       tb[3].addr = &meeting_req->time_zone.daylight_time_start_date;
+
+
+       tpl_pack(tn, 0);
+
+       /* write account to buffer */
+       void *buf = NULL;
+       size_t len = 0;
+       tpl_dump(tn, TPL_MEM, &buf, &len);
+       tpl_free(tn);
+
+       *stream_len = len;
+       EM_DEBUG_FUNC_END();
+       return (char*) buf;
+
+
+#if 0
        EM_DEBUG_FUNC_BEGIN();
 
        char *result_stream = NULL;
@@ -1312,7 +1721,7 @@ INTERNAL_FUNC char* em_convert_meeting_req_to_byte_stream(emf_meeting_request_t
 
        EM_IF_NULL_RETURN_VALUE(input_meeting_req, NULL);
 
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->mail_id), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->mail_id), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->meeting_response), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->start_time), sizeof(struct tm));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->end_time), sizeof(struct tm));
@@ -1321,27 +1730,67 @@ INTERNAL_FUNC char* em_convert_meeting_req_to_byte_stream(emf_meeting_request_t
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.offset_from_GMT), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_meeting_req->time_zone.standard_name, 32);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.standard_time_start_date), sizeof(struct tm));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.standard_bias), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.standard_bias), sizeof(int));
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&input_meeting_req->time_zone.daylight_name, 32);
        result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.daylight_time_start_date), sizeof(struct tm));
-       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.daylight_bias), sizeof(int)); 
+       result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_meeting_req->time_zone.daylight_bias), sizeof(int));
 
        *output_stream_size = stream_size;
 
        EM_DEBUG_FUNC_END();
        return result_stream;
+#endif
 }
 
 
-INTERNAL_FUNC void em_convert_byte_stream_to_meeting_req(char *input_stream,  emf_meeting_request_t *output_meeting_req)
+INTERNAL_FUNC void em_convert_byte_stream_to_meeting_req(char *stream, int stream_len, email_meeting_request_t *meeting_req)
 {
+       EM_DEBUG_FUNC_END();
+       EM_NULL_CHECK_FOR_VOID(stream);
+       EM_NULL_CHECK_FOR_VOID(meeting_req);
+
+       tpl_node *tn = NULL;
+       tpl_bin tb[4];
+
+       tn = tpl_map(EMAIL_MEETING_REQUEST_FMT,
+                                               &meeting_req->mail_id,
+                                               &meeting_req->meeting_response,
+                                               &tb[0],
+                                               &tb[1],
+                                               &meeting_req->location,
+                                               &meeting_req->global_object_id,
+                                               &meeting_req->time_zone.offset_from_GMT,
+                                               meeting_req->time_zone.standard_name, 32,
+                                               &tb[2],
+                                               &meeting_req->time_zone.standard_bias,
+                                               meeting_req->time_zone.daylight_name, 32,
+                                               &tb[3],
+                                               &meeting_req->time_zone.daylight_bias
+                               );
+       tpl_load(tn, TPL_MEM, stream, stream_len);
+       tpl_unpack(tn, 0);
+       tpl_free(tn);
+
+       /* tb will be destroyed at end of func, but tb.addr remains */
+       memcpy(&meeting_req->start_time, tb[0].addr, sizeof(struct tm));
+       memcpy(&meeting_req->end_time, tb[1].addr, sizeof(struct tm));
+       memcpy(&meeting_req->time_zone.standard_time_start_date, tb[2].addr, sizeof(struct tm));
+       memcpy(&meeting_req->time_zone.daylight_time_start_date, tb[3].addr, sizeof(struct tm));
+
+       int i=0;
+       for(i=0; i< 4 ; i++)
+               EM_SAFE_FREE(tb[i].addr);
+
+       EM_DEBUG_FUNC_END();
+
+#if 0
        EM_DEBUG_FUNC_BEGIN();
        int stream_offset = 0;
 
        EM_NULL_CHECK_FOR_VOID(input_stream);
        EM_NULL_CHECK_FOR_VOID(output_meeting_req);
 
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->mail_id)); 
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->mail_id));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->meeting_response));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(struct tm), (char*)&(output_meeting_req->start_time));
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(struct tm), (char*)&(output_meeting_req->end_time));
@@ -1350,15 +1799,17 @@ INTERNAL_FUNC void em_convert_byte_stream_to_meeting_req(char *input_stream,  em
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->time_zone.offset_from_GMT));
        fetch_sized_data_from_stream(input_stream, &stream_offset, 32, output_meeting_req->time_zone.standard_name);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(struct tm), (char*)&(output_meeting_req->time_zone.standard_time_start_date));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->time_zone.standard_bias)); 
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->time_zone.standard_bias));
        fetch_sized_data_from_stream(input_stream, &stream_offset, 32, output_meeting_req->time_zone.daylight_name);
        fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(struct tm), (char*)&(output_meeting_req->time_zone.daylight_time_start_date));
-       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->time_zone.daylight_bias)); 
+       fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(output_meeting_req->time_zone.daylight_bias));
 
        EM_DEBUG_FUNC_END();
+#endif
 }
 
-INTERNAL_FUNC char* em_convert_search_filter_to_byte_stream(email_search_filter_t *input_search_filter_list, int input_search_filter_count, int *output_stream_size)
+INTERNAL_FUNC char* em_convert_search_filter_to_byte_stream(email_search_filter_t *input_search_filter_list,
+                                                                       int input_search_filter_count, int *output_stream_size)
 {
        EM_DEBUG_FUNC_BEGIN("input_search_filter_list [%p] input_search_filter_count [%d]", input_search_filter_list, input_search_filter_count);
 
@@ -1413,7 +1864,8 @@ INTERNAL_FUNC char* em_convert_search_filter_to_byte_stream(email_search_filter_
        return result_stream;
 }
 
-INTERNAL_FUNC void em_convert_byte_stream_to_search_filter(char *input_stream, email_search_filter_t **output_search_filter_list, int *output_search_filter_count)
+INTERNAL_FUNC void em_convert_byte_stream_to_search_filter(char *input_stream,
+                               email_search_filter_t **output_search_filter_list, int *output_search_filter_count)
 {
        EM_DEBUG_FUNC_BEGIN("input_stream [%p] output_search_filter_list [%p] output_search_filter_count [%p]", input_stream, output_search_filter_list, output_search_filter_count);
 
@@ -1485,3 +1937,68 @@ FINISH_OFF:
 
        EM_DEBUG_FUNC_END();
 }
+
+INTERNAL_FUNC int em_convert_certificate_tbl_to_certificate(emstorage_certificate_tbl_t *certificate_tbl, email_certificate_t **certificate, int *error)
+{
+       EM_DEBUG_FUNC_BEGIN("certficate_tbl[%p], certificate[%p]", certificate_tbl, certificate);
+
+       int err_code = EMAIL_ERROR_NONE;
+       int ret = false;
+       email_certificate_t *temp_certificate = NULL;
+
+       if (!certificate_tbl || !certificate)  {
+               EM_DEBUG_EXCEPTION("Invalid parameter");
+               err_code = EMAIL_ERROR_INVALID_PARAM;
+               goto FINISH_OFF;
+       }
+
+       temp_certificate = em_malloc(sizeof(email_certificate_t)) ;
+       if (!temp_certificate) {
+               EM_DEBUG_EXCEPTION("em_malloc failed");
+               err_code = EMAIL_ERROR_OUT_OF_MEMORY;
+               goto FINISH_OFF;
+       }
+
+       temp_certificate->certificate_id = certificate_tbl->certificate_id;
+       temp_certificate->issue_year = certificate_tbl->issue_year;
+       temp_certificate->issue_month = certificate_tbl->issue_month;
+       temp_certificate->issue_day = certificate_tbl->issue_day;
+       temp_certificate->expiration_year = certificate_tbl->expiration_year;
+       temp_certificate->expiration_month = certificate_tbl->expiration_month;
+       temp_certificate->expiration_day = certificate_tbl->expiration_day;
+       temp_certificate->issue_organization_name = EM_SAFE_STRDUP(certificate_tbl->issue_organization_name);
+       temp_certificate->email_address = EM_SAFE_STRDUP(certificate_tbl->email_address);
+       temp_certificate->subject_str = EM_SAFE_STRDUP(certificate_tbl->subject_str);
+       temp_certificate->filepath = EM_SAFE_STRDUP(certificate_tbl->filepath);
+
+       *certificate = temp_certificate;
+
+       ret = true;
+FINISH_OFF:
+       if (error)
+               *error = err_code;
+
+       EM_DEBUG_FUNC_END();
+       return true;
+}
+
+INTERNAL_FUNC int em_convert_certificate_to_certificate_tbl(email_certificate_t *certificate, emstorage_certificate_tbl_t *certificate_tbl)
+{
+       EM_DEBUG_FUNC_BEGIN("certficate[%p], certificate_tbl[%p]", certificate, certificate_tbl);
+
+       certificate_tbl->certificate_id = certificate->certificate_id;
+       certificate_tbl->issue_year = certificate->issue_year;
+       certificate_tbl->issue_month = certificate->issue_month;
+       certificate_tbl->issue_day = certificate->issue_day;
+       certificate_tbl->expiration_year = certificate->expiration_year;
+       certificate_tbl->expiration_month = certificate->expiration_month;
+       certificate_tbl->expiration_day = certificate->expiration_day;
+       certificate_tbl->issue_organization_name = EM_SAFE_STRDUP(certificate->issue_organization_name);
+       certificate_tbl->email_address = EM_SAFE_STRDUP(certificate->email_address);
+       certificate_tbl->subject_str = EM_SAFE_STRDUP(certificate->subject_str);
+       certificate_tbl->filepath = EM_SAFE_STRDUP(certificate->filepath);
+
+       EM_DEBUG_FUNC_END();
+       return true;
+}
+