4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include "email-convert.h"
26 #include "email-core-mail.h"
27 #include "email-debug-log.h"
28 #include "email-core-utils.h"
29 #include "email-utilities.h"
30 #include "email-storage.h"
39 #define fATTACHMENT 0x40
43 INTERNAL_FUNC int em_convert_account_to_account_tbl(email_account_t *account, emstorage_account_tbl_t *account_tbl)
45 EM_DEBUG_FUNC_BEGIN("account[%p], account_tbl[%p]", account, account_tbl);
48 account_tbl->account_name = EM_SAFE_STRDUP(account->account_name);
49 account_tbl->incoming_server_type = account->incoming_server_type;
50 account_tbl->incoming_server_address = EM_SAFE_STRDUP(account->incoming_server_address);
51 account_tbl->user_email_address = EM_SAFE_STRDUP(account->user_email_address);
52 account_tbl->incoming_server_user_name = EM_SAFE_STRDUP(account->incoming_server_user_name);
53 account_tbl->incoming_server_password = EM_SAFE_STRDUP(account->incoming_server_password);
54 account_tbl->retrieval_mode = account->retrieval_mode;
55 account_tbl->incoming_server_port_number = account->incoming_server_port_number;
56 account_tbl->incoming_server_secure_connection = account->incoming_server_secure_connection;
57 account_tbl->outgoing_server_type = account->outgoing_server_type;
58 account_tbl->outgoing_server_address = EM_SAFE_STRDUP(account->outgoing_server_address);
59 account_tbl->outgoing_server_port_number = account->outgoing_server_port_number;
60 account_tbl->outgoing_server_need_authentication = account->outgoing_server_need_authentication;
61 account_tbl->outgoing_server_secure_connection = account->outgoing_server_secure_connection;
62 account_tbl->outgoing_server_user_name = EM_SAFE_STRDUP(account->outgoing_server_user_name);
63 account_tbl->outgoing_server_password = EM_SAFE_STRDUP(account->outgoing_server_password);
64 account_tbl->user_display_name = EM_SAFE_STRDUP(account->user_display_name);
65 account_tbl->reply_to_address = EM_SAFE_STRDUP(account->reply_to_address);
66 account_tbl->return_address = EM_SAFE_STRDUP(account->return_address);
67 account_tbl->account_id = account->account_id;
68 account_tbl->keep_mails_on_pop_server_after_download = account->keep_mails_on_pop_server_after_download;
69 account_tbl->auto_download_size = account->auto_download_size;
70 account_tbl->peak_interval = account->peak_interval;
71 account_tbl->peak_days = account->peak_days;
72 account_tbl->peak_start_time = account->peak_start_time;
73 account_tbl->peak_end_time = account->peak_end_time;
76 account_tbl->outgoing_server_use_same_authenticator = account->outgoing_server_use_same_authenticator;
77 account_tbl->auto_resend_times = account->auto_resend_times;
78 account_tbl->pop_before_smtp = account->pop_before_smtp;
79 account_tbl->incoming_server_requires_apop = account->incoming_server_requires_apop;
80 account_tbl->incoming_server_authentication_method = account->incoming_server_authentication_method;
81 account_tbl->logo_icon_path = EM_SAFE_STRDUP(account->logo_icon_path);
83 account_tbl->roaming_option = account->roaming_option;
84 account_tbl->color_label = account->color_label;
85 account_tbl->user_data = em_memdup(account->user_data, account->user_data_length);
86 account_tbl->user_data_length = account->user_data_length;
88 account_tbl->options.priority = account->options.priority;
89 account_tbl->options.keep_local_copy = account->options.keep_local_copy;
90 account_tbl->options.req_delivery_receipt = account->options.req_delivery_receipt;
91 account_tbl->options.req_read_receipt = account->options.req_read_receipt;
92 account_tbl->options.download_limit = account->options.download_limit;
93 account_tbl->options.block_address = account->options.block_address;
94 account_tbl->options.block_subject = account->options.block_subject;
95 account_tbl->options.display_name_from = EM_SAFE_STRDUP(account->options.display_name_from);
96 account_tbl->options.reply_with_body = account->options.reply_with_body;
97 account_tbl->options.forward_with_files = account->options.forward_with_files;
98 account_tbl->options.add_myname_card = account->options.add_myname_card;
99 account_tbl->options.add_signature = account->options.add_signature;
100 account_tbl->options.signature = EM_SAFE_STRDUP(account->options.signature);
101 account_tbl->options.add_my_address_to_bcc = account->options.add_my_address_to_bcc;
102 account_tbl->options.notification_status = account->options.notification_status;
103 account_tbl->options.vibrate_status = account->options.vibrate_status;
104 account_tbl->options.display_content_status = account->options.display_content_status;
105 account_tbl->options.default_ringtone_status = account->options.default_ringtone_status;
106 account_tbl->options.alert_ringtone_path = EM_SAFE_STRDUP(account->options.alert_ringtone_path);
108 account_tbl->check_interval = account->check_interval;
109 account_tbl->account_svc_id = account->account_svc_id;
110 account_tbl->sync_status = account->sync_status;
111 account_tbl->sync_disabled = account->sync_disabled;
112 account_tbl->default_mail_slot_size = account->default_mail_slot_size;
113 account_tbl->smime_type = account->smime_type;
114 account_tbl->certificate_path = EM_SAFE_STRDUP(account->certificate_path);
115 account_tbl->cipher_type = account->cipher_type;
116 account_tbl->digest_type = account->digest_type;
117 account_tbl->outgoing_server_size_limit = account->outgoing_server_size_limit;
118 account_tbl->wifi_auto_download = account->wifi_auto_download;
120 account_tbl->user_name = EM_SAFE_STRDUP(account->user_name);
125 INTERNAL_FUNC int em_convert_account_tbl_to_account(emstorage_account_tbl_t *account_tbl, email_account_t *account)
127 EM_DEBUG_FUNC_BEGIN("account_tbl[%p], account[%p]", account_tbl, account);
130 account->account_name = EM_SAFE_STRDUP(account_tbl->account_name);
131 account->incoming_server_type = account_tbl->incoming_server_type;
132 account->incoming_server_address = EM_SAFE_STRDUP(account_tbl->incoming_server_address);
133 account->user_email_address = EM_SAFE_STRDUP(account_tbl->user_email_address);
134 account->incoming_server_user_name = EM_SAFE_STRDUP(account_tbl->incoming_server_user_name);
135 account->incoming_server_password = EM_SAFE_STRDUP(account_tbl->incoming_server_password);
136 account->retrieval_mode = account_tbl->retrieval_mode;
137 account->incoming_server_port_number = account_tbl->incoming_server_port_number;
138 account->incoming_server_secure_connection = account_tbl->incoming_server_secure_connection;
139 account->outgoing_server_type = account_tbl->outgoing_server_type;
140 account->outgoing_server_address = EM_SAFE_STRDUP(account_tbl->outgoing_server_address);
141 account->outgoing_server_port_number = account_tbl->outgoing_server_port_number;
142 account->outgoing_server_need_authentication = account_tbl->outgoing_server_need_authentication;
143 account->outgoing_server_secure_connection = account_tbl->outgoing_server_secure_connection;
144 account->outgoing_server_user_name = EM_SAFE_STRDUP(account_tbl->outgoing_server_user_name);
145 account->outgoing_server_password = EM_SAFE_STRDUP(account_tbl->outgoing_server_password);
146 account->user_display_name = EM_SAFE_STRDUP(account_tbl->user_display_name);
147 account->reply_to_address = EM_SAFE_STRDUP(account_tbl->reply_to_address);
148 account->return_address = EM_SAFE_STRDUP(account_tbl->return_address);
149 account->account_id = account_tbl->account_id;
150 account->keep_mails_on_pop_server_after_download = account_tbl->keep_mails_on_pop_server_after_download;
151 account->auto_download_size = account_tbl->auto_download_size;
152 account->peak_interval = account_tbl->peak_interval;
153 account->peak_days = account_tbl->peak_days;
154 account->peak_start_time = account_tbl->peak_start_time;
155 account->peak_end_time = account_tbl->peak_end_time;
156 account->outgoing_server_use_same_authenticator = account_tbl->outgoing_server_use_same_authenticator;
157 account->pop_before_smtp = account_tbl->pop_before_smtp;
158 account->auto_resend_times = account_tbl->auto_resend_times;
159 account->incoming_server_requires_apop = account_tbl->incoming_server_requires_apop;
160 account->incoming_server_authentication_method = account_tbl->incoming_server_authentication_method;
161 account->logo_icon_path = EM_SAFE_STRDUP(account_tbl->logo_icon_path);
162 account->user_data = em_memdup(account_tbl->user_data, account_tbl->user_data_length);
163 account->user_data_length = account_tbl->user_data_length;
164 account->roaming_option = account_tbl->roaming_option;
165 account->color_label = account_tbl->color_label;
166 account->options.priority = account_tbl->options.priority;
167 account->options.keep_local_copy = account_tbl->options.keep_local_copy;
168 account->options.req_delivery_receipt = account_tbl->options.req_delivery_receipt;
169 account->options.req_read_receipt = account_tbl->options.req_read_receipt;
170 account->options.download_limit = account_tbl->options.download_limit;
171 account->options.block_address = account_tbl->options.block_address;
172 account->options.block_subject = account_tbl->options.block_subject;
173 account->options.display_name_from = EM_SAFE_STRDUP(account_tbl->options.display_name_from);
174 account->options.reply_with_body = account_tbl->options.reply_with_body;
175 account->options.forward_with_files = account_tbl->options.forward_with_files;
176 account->options.add_myname_card = account_tbl->options.add_myname_card;
177 account->options.add_signature = account_tbl->options.add_signature;
178 account->options.signature = EM_SAFE_STRDUP(account_tbl->options.signature);
179 account->options.add_my_address_to_bcc = account_tbl->options.add_my_address_to_bcc;
180 account->options.notification_status = account_tbl->options.notification_status;
181 account->options.vibrate_status = account_tbl->options.vibrate_status;
182 account->options.display_content_status = account_tbl->options.display_content_status;
183 account->options.default_ringtone_status = account_tbl->options.default_ringtone_status;
184 account->options.alert_ringtone_path = EM_SAFE_STRDUP(account_tbl->options.alert_ringtone_path);
185 account->check_interval = account_tbl->check_interval;
186 account->account_svc_id = account_tbl->account_svc_id;
187 account->sync_status = account_tbl->sync_status;
188 account->sync_disabled = account_tbl->sync_disabled;
189 account->default_mail_slot_size = account_tbl->default_mail_slot_size;
190 account->smime_type = account_tbl->smime_type;
191 account->certificate_path = EM_SAFE_STRDUP(account_tbl->certificate_path);
192 account->cipher_type = account_tbl->cipher_type;
193 account->digest_type = account_tbl->digest_type;
194 account->outgoing_server_size_limit = account_tbl->outgoing_server_size_limit;
195 account->wifi_auto_download = account_tbl->wifi_auto_download;
196 account->user_name = EM_SAFE_STRDUP(account_tbl->user_name);
202 INTERNAL_FUNC int em_convert_mailbox_to_mailbox_tbl(email_mailbox_t *mailbox, emstorage_mailbox_tbl_t *mailbox_tbl)
204 EM_DEBUG_FUNC_BEGIN("mailbox[%p], mailbox_tbl[%p]", mailbox, mailbox_tbl);
207 mailbox_tbl->account_id = mailbox->account_id;
208 mailbox_tbl->mailbox_id = mailbox->mailbox_id;
209 mailbox_tbl->mailbox_name = EM_SAFE_STRDUP(mailbox->mailbox_name);
210 mailbox_tbl->alias = EM_SAFE_STRDUP(mailbox->alias);
211 mailbox_tbl->local_yn = mailbox->local;
212 mailbox_tbl->mailbox_type = mailbox->mailbox_type;
213 mailbox_tbl->unread_count = mailbox->unread_count;
214 mailbox_tbl->total_mail_count_on_local = mailbox->total_mail_count_on_local;
215 mailbox_tbl->total_mail_count_on_server = mailbox->total_mail_count_on_server;
216 mailbox_tbl->mail_slot_size = mailbox->mail_slot_size;
217 mailbox_tbl->no_select = mailbox->no_select;
218 mailbox_tbl->last_sync_time = mailbox->last_sync_time;
219 mailbox_tbl->deleted_flag = mailbox->deleted_flag;
220 mailbox_tbl->eas_data_length = mailbox->eas_data_length;
222 if ((mailbox->eas_data_length>0) && mailbox->eas_data) {
223 if ((mailbox_tbl->eas_data = em_malloc(mailbox->eas_data_length)) == NULL) {
224 EM_DEBUG_EXCEPTION("em_malloc failed");
225 return 0; /*prevent 53448*/
227 memcpy(mailbox_tbl->eas_data, mailbox->eas_data, mailbox->eas_data_length);
235 INTERNAL_FUNC int em_convert_mailbox_tbl_to_mailbox(emstorage_mailbox_tbl_t *mailbox_tbl, email_mailbox_t *mailbox)
237 EM_DEBUG_FUNC_BEGIN("mailbox_tbl[%p], mailbox[%p]", mailbox_tbl, mailbox);
240 mailbox->account_id = mailbox_tbl->account_id;
241 mailbox->mailbox_id = mailbox_tbl->mailbox_id;
242 mailbox->mailbox_name = EM_SAFE_STRDUP(mailbox_tbl->mailbox_name);
243 mailbox->alias = EM_SAFE_STRDUP(mailbox_tbl->alias);
244 mailbox->local = mailbox_tbl->local_yn;
245 mailbox->mailbox_type = mailbox_tbl->mailbox_type;
246 mailbox->unread_count = mailbox_tbl->unread_count;
247 mailbox->total_mail_count_on_local = mailbox_tbl->total_mail_count_on_local;
248 mailbox->total_mail_count_on_server = mailbox_tbl->total_mail_count_on_server;
249 mailbox->mail_slot_size = mailbox_tbl->mail_slot_size;
250 mailbox->no_select = mailbox_tbl->no_select;
251 mailbox->last_sync_time = mailbox_tbl->last_sync_time;
252 mailbox->deleted_flag = mailbox_tbl->deleted_flag;
253 mailbox->eas_data_length = mailbox_tbl->eas_data_length;
255 if ((mailbox_tbl->eas_data_length >0) && mailbox_tbl->eas_data) {
256 if ((mailbox->eas_data = em_malloc(mailbox_tbl->eas_data_length)) == NULL) {
257 EM_DEBUG_EXCEPTION("em_malloc failed");
258 return 0; /*prevent 53445*/
260 memcpy(mailbox->eas_data, mailbox_tbl->eas_data, mailbox_tbl->eas_data_length);
268 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)
270 EM_DEBUG_FUNC_BEGIN("mail_table_data[%p], item_count [%d], mail_data[%p]", mail_table_data, item_count, mail_data);
271 int i, ret = false, err_code = EMAIL_ERROR_NONE;
272 email_mail_data_t *temp_mail_data = NULL;
274 if (!mail_table_data || !mail_data || !item_count) {
275 EM_DEBUG_EXCEPTION("Invalid parameter");
276 err_code = EMAIL_ERROR_INVALID_PARAM;
280 temp_mail_data = em_malloc(sizeof(email_mail_data_t) * item_count);
282 if(!temp_mail_data) {
283 EM_DEBUG_EXCEPTION("em_malloc failed");
284 err_code = EMAIL_ERROR_OUT_OF_MEMORY;
288 for(i = 0; i < item_count; i++) {
289 temp_mail_data[i].mail_id = mail_table_data[i].mail_id;
290 temp_mail_data[i].account_id = mail_table_data[i].account_id;
291 temp_mail_data[i].mailbox_id = mail_table_data[i].mailbox_id;
292 temp_mail_data[i].mailbox_type = mail_table_data[i].mailbox_type;
293 temp_mail_data[i].subject = EM_SAFE_STRDUP(mail_table_data[i].subject);
294 temp_mail_data[i].date_time = mail_table_data[i].date_time;
295 temp_mail_data[i].server_mail_status = mail_table_data[i].server_mail_status;
296 temp_mail_data[i].server_mailbox_name = EM_SAFE_STRDUP(mail_table_data[i].server_mailbox_name);
297 temp_mail_data[i].server_mail_id = EM_SAFE_STRDUP(mail_table_data[i].server_mail_id);
298 temp_mail_data[i].message_id = EM_SAFE_STRDUP(mail_table_data[i].message_id);
299 temp_mail_data[i].reference_mail_id = mail_table_data[i].reference_mail_id;
300 temp_mail_data[i].full_address_from = EM_SAFE_STRDUP(mail_table_data[i].full_address_from);
301 temp_mail_data[i].full_address_reply = EM_SAFE_STRDUP(mail_table_data[i].full_address_reply);
302 temp_mail_data[i].full_address_to = EM_SAFE_STRDUP(mail_table_data[i].full_address_to);
303 temp_mail_data[i].full_address_cc = EM_SAFE_STRDUP(mail_table_data[i].full_address_cc);
304 temp_mail_data[i].full_address_bcc = EM_SAFE_STRDUP(mail_table_data[i].full_address_bcc);
305 temp_mail_data[i].full_address_return = EM_SAFE_STRDUP(mail_table_data[i].full_address_return);
306 temp_mail_data[i].email_address_sender = EM_SAFE_STRDUP(mail_table_data[i].email_address_sender);
307 temp_mail_data[i].email_address_recipient = EM_SAFE_STRDUP(mail_table_data[i].email_address_recipient);
308 temp_mail_data[i].alias_sender = EM_SAFE_STRDUP(mail_table_data[i].alias_sender);
309 temp_mail_data[i].alias_recipient = EM_SAFE_STRDUP(mail_table_data[i].alias_recipient);
310 temp_mail_data[i].body_download_status = mail_table_data[i].body_download_status;
311 temp_mail_data[i].file_path_plain = EM_SAFE_STRDUP(mail_table_data[i].file_path_plain);
312 temp_mail_data[i].file_path_html = EM_SAFE_STRDUP(mail_table_data[i].file_path_html);
313 temp_mail_data[i].file_path_mime_entity = EM_SAFE_STRDUP(mail_table_data[i].file_path_mime_entity);
314 temp_mail_data[i].mail_size = mail_table_data[i].mail_size;
315 temp_mail_data[i].flags_seen_field = mail_table_data[i].flags_seen_field;
316 temp_mail_data[i].flags_deleted_field = mail_table_data[i].flags_deleted_field;
317 temp_mail_data[i].flags_flagged_field = mail_table_data[i].flags_flagged_field;
318 temp_mail_data[i].flags_answered_field = mail_table_data[i].flags_answered_field;
319 temp_mail_data[i].flags_recent_field = mail_table_data[i].flags_recent_field;
320 temp_mail_data[i].flags_draft_field = mail_table_data[i].flags_draft_field;
321 temp_mail_data[i].flags_forwarded_field = mail_table_data[i].flags_forwarded_field;
322 temp_mail_data[i].DRM_status = mail_table_data[i].DRM_status;
323 temp_mail_data[i].priority = mail_table_data[i].priority;
324 temp_mail_data[i].save_status = mail_table_data[i].save_status;
325 temp_mail_data[i].lock_status = mail_table_data[i].lock_status;
326 temp_mail_data[i].report_status = mail_table_data[i].report_status;
327 temp_mail_data[i].attachment_count = mail_table_data[i].attachment_count;
328 temp_mail_data[i].inline_content_count = mail_table_data[i].inline_content_count;
329 temp_mail_data[i].thread_id = mail_table_data[i].thread_id;
330 temp_mail_data[i].thread_item_count = mail_table_data[i].thread_item_count;
331 temp_mail_data[i].preview_text = EM_SAFE_STRDUP(mail_table_data[i].preview_text);
332 temp_mail_data[i].meeting_request_status = mail_table_data[i].meeting_request_status;
333 temp_mail_data[i].message_class = mail_table_data[i].message_class;
334 temp_mail_data[i].digest_type = mail_table_data[i].digest_type;
335 temp_mail_data[i].smime_type = mail_table_data[i].smime_type;
336 temp_mail_data[i].scheduled_sending_time = mail_table_data[i].scheduled_sending_time;
337 temp_mail_data[i].remaining_resend_times = mail_table_data[i].remaining_resend_times;
338 temp_mail_data[i].tag_id = mail_table_data[i].tag_id;
339 temp_mail_data[i].replied_time = mail_table_data[i].replied_time;
340 temp_mail_data[i].forwarded_time = mail_table_data[i].forwarded_time;
341 temp_mail_data[i].eas_data_length = mail_table_data[i].eas_data_length;
342 if(mail_table_data[i].eas_data_length && mail_table_data[i].eas_data) {
343 if((temp_mail_data[i].eas_data = em_malloc(mail_table_data[i].eas_data_length)) == NULL) {
344 EM_DEBUG_EXCEPTION("em_malloc failed");
345 err_code = EMAIL_ERROR_OUT_OF_MEMORY;
349 memcpy(temp_mail_data[i].eas_data, mail_table_data[i].eas_data, mail_table_data[i].eas_data_length);
350 temp_mail_data[i].pgp_password = EM_SAFE_STRDUP(mail_table_data[i].pgp_password);
351 temp_mail_data[i].user_name = EM_SAFE_STRDUP(mail_table_data[i].user_name);
354 *mail_data = temp_mail_data;
359 if(ret == false && temp_mail_data) {
360 emcore_free_mail_data_list(&temp_mail_data, item_count);
371 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)
373 EM_DEBUG_FUNC_BEGIN("mail_data[%p], item_count [%d], mail_table_data[%p]", mail_data, item_count, mail_table_data);
374 int i, ret = false, err_code = EMAIL_ERROR_NONE;
375 emstorage_mail_tbl_t *temp_mail_tbl = NULL;
377 if (!mail_data || !mail_table_data || !item_count) {
378 EM_DEBUG_EXCEPTION("Invalid parameter");
379 err_code = EMAIL_ERROR_INVALID_PARAM;
383 temp_mail_tbl = em_malloc(sizeof(emstorage_mail_tbl_t) * item_count);
386 EM_DEBUG_EXCEPTION("em_malloc failed");
387 err_code = EMAIL_ERROR_OUT_OF_MEMORY;
391 for(i = 0; i < item_count; i++) {
392 temp_mail_tbl[i].mail_id = mail_data[i].mail_id;
393 temp_mail_tbl[i].account_id = mail_data[i].account_id;
394 temp_mail_tbl[i].mailbox_id = mail_data[i].mailbox_id;
395 temp_mail_tbl[i].mailbox_type = mail_data[i].mailbox_type;
396 temp_mail_tbl[i].date_time = mail_data[i].date_time;
397 temp_mail_tbl[i].subject = EM_SAFE_STRDUP(mail_data[i].subject);
398 temp_mail_tbl[i].server_mail_status = mail_data[i].server_mail_status;
399 temp_mail_tbl[i].server_mailbox_name = EM_SAFE_STRDUP(mail_data[i].server_mailbox_name);
400 temp_mail_tbl[i].server_mail_id = EM_SAFE_STRDUP(mail_data[i].server_mail_id);
401 temp_mail_tbl[i].message_id = EM_SAFE_STRDUP(mail_data[i].message_id);
402 temp_mail_tbl[i].reference_mail_id = mail_data[i].reference_mail_id;
403 temp_mail_tbl[i].full_address_from = EM_SAFE_STRDUP(mail_data[i].full_address_from);
404 temp_mail_tbl[i].full_address_reply = EM_SAFE_STRDUP(mail_data[i].full_address_reply);
405 temp_mail_tbl[i].full_address_to = EM_SAFE_STRDUP(mail_data[i].full_address_to);
406 temp_mail_tbl[i].full_address_cc = EM_SAFE_STRDUP(mail_data[i].full_address_cc);
407 temp_mail_tbl[i].full_address_bcc = EM_SAFE_STRDUP(mail_data[i].full_address_bcc);
408 temp_mail_tbl[i].full_address_return = EM_SAFE_STRDUP(mail_data[i].full_address_return);
409 temp_mail_tbl[i].email_address_sender = EM_SAFE_STRDUP(mail_data[i].email_address_sender);
410 temp_mail_tbl[i].email_address_recipient = EM_SAFE_STRDUP(mail_data[i].email_address_recipient);
411 temp_mail_tbl[i].alias_sender = EM_SAFE_STRDUP(mail_data[i].alias_sender);
412 temp_mail_tbl[i].alias_recipient = EM_SAFE_STRDUP(mail_data[i].alias_recipient);
413 temp_mail_tbl[i].body_download_status = mail_data[i].body_download_status;
414 temp_mail_tbl[i].file_path_plain = EM_SAFE_STRDUP(mail_data[i].file_path_plain);
415 temp_mail_tbl[i].file_path_html = EM_SAFE_STRDUP(mail_data[i].file_path_html);
416 temp_mail_tbl[i].file_path_mime_entity = EM_SAFE_STRDUP(mail_data[i].file_path_mime_entity);
417 temp_mail_tbl[i].mail_size = mail_data[i].mail_size;
418 temp_mail_tbl[i].flags_seen_field = mail_data[i].flags_seen_field;
419 temp_mail_tbl[i].flags_deleted_field = mail_data[i].flags_deleted_field;
420 temp_mail_tbl[i].flags_flagged_field = mail_data[i].flags_flagged_field;
421 temp_mail_tbl[i].flags_answered_field = mail_data[i].flags_answered_field;
422 temp_mail_tbl[i].flags_recent_field = mail_data[i].flags_recent_field;
423 temp_mail_tbl[i].flags_draft_field = mail_data[i].flags_draft_field;
424 temp_mail_tbl[i].flags_forwarded_field = mail_data[i].flags_forwarded_field;
425 temp_mail_tbl[i].DRM_status = mail_data[i].DRM_status;
426 temp_mail_tbl[i].priority = mail_data[i].priority;
427 temp_mail_tbl[i].save_status = mail_data[i].save_status;
428 temp_mail_tbl[i].lock_status = mail_data[i].lock_status;
429 temp_mail_tbl[i].report_status = mail_data[i].report_status;
430 temp_mail_tbl[i].attachment_count = mail_data[i].attachment_count;
431 temp_mail_tbl[i].inline_content_count = mail_data[i].inline_content_count;
432 temp_mail_tbl[i].thread_id = mail_data[i].thread_id;
433 temp_mail_tbl[i].thread_item_count = mail_data[i].thread_item_count;
434 temp_mail_tbl[i].preview_text = EM_SAFE_STRDUP(mail_data[i].preview_text);
435 temp_mail_tbl[i].meeting_request_status = mail_data[i].meeting_request_status;
436 temp_mail_tbl[i].message_class = mail_data[i].message_class;
437 temp_mail_tbl[i].digest_type = mail_data[i].digest_type;
438 temp_mail_tbl[i].smime_type = mail_data[i].smime_type;
439 temp_mail_tbl[i].scheduled_sending_time = mail_data[i].scheduled_sending_time;
440 temp_mail_tbl[i].remaining_resend_times = mail_data[i].remaining_resend_times;
441 temp_mail_tbl[i].tag_id = mail_data[i].tag_id;
442 temp_mail_tbl[i].replied_time = mail_data[i].replied_time;
443 temp_mail_tbl[i].forwarded_time = mail_data[i].forwarded_time;
444 temp_mail_tbl[i].eas_data_length = mail_data[i].eas_data_length;
445 if(mail_data[i].eas_data_length && mail_data[i].eas_data) {
446 if((temp_mail_tbl[i].eas_data = em_malloc(mail_data[i].eas_data_length)) == NULL) {
447 EM_DEBUG_EXCEPTION("em_malloc failed");
448 err_code = EMAIL_ERROR_OUT_OF_MEMORY;
451 emstorage_free_mail(&temp_mail_tbl, i, NULL);
453 EM_SAFE_FREE(temp_mail_tbl);
457 memcpy(temp_mail_tbl[i].eas_data, mail_data[i].eas_data, mail_data[i].eas_data_length);
458 temp_mail_tbl[i].pgp_password = EM_SAFE_STRDUP(mail_data[i].pgp_password);
459 temp_mail_tbl[i].user_name = EM_SAFE_STRDUP(mail_data[i].user_name);
462 *mail_table_data = temp_mail_tbl;
477 INTERNAL_FUNC int em_convert_string_to_time_t(char *input_datetime_string, time_t *output_time)
479 EM_DEBUG_FUNC_BEGIN("input_datetime_string[%s], output_time[%p]", input_datetime_string, output_time);
481 char buf[16] = { 0, };
482 struct tm temp_time_info = { 0 };
484 if (!input_datetime_string || !output_time) {
485 EM_DEBUG_EXCEPTION("input_datetime_string[%p], output_time[%p]", input_datetime_string, output_time);
486 return EMAIL_ERROR_INVALID_PARAM;
489 memset(buf, 0x00, sizeof(buf));
490 SNPRINTF(buf, sizeof(buf), "%.4s", input_datetime_string);
491 temp_time_info.tm_year = atoi(buf) - 1970;
493 memset(buf, 0x00, sizeof(buf));
494 SNPRINTF(buf, sizeof(buf), "%.2s", input_datetime_string + 4);
495 temp_time_info.tm_mon = atoi(buf) - 1;
497 memset(buf, 0x00, sizeof(buf));
498 SNPRINTF(buf, sizeof(buf), "%.2s", input_datetime_string + 6);
499 temp_time_info.tm_mday = atoi(buf);
501 memset(buf, 0x00, sizeof(buf));
502 SNPRINTF(buf, sizeof(buf), "%.2s", input_datetime_string + 8);
503 temp_time_info.tm_hour = atoi(buf);
505 memset(buf, 0x00, sizeof(buf));
506 SNPRINTF(buf, sizeof(buf), "%.2s", input_datetime_string + 10);
507 temp_time_info.tm_min = atoi(buf);
509 memset(buf, 0x00, sizeof(buf));
510 SNPRINTF(buf, sizeof(buf), "%.2s", input_datetime_string + 12);
511 temp_time_info.tm_sec = atoi(buf);
513 *output_time = timegm(&temp_time_info);
515 EM_DEBUG_LOG("*output_time [%d", *output_time);
517 EM_DEBUG_FUNC_END("err %d", EMAIL_ERROR_NONE);
518 return EMAIL_ERROR_NONE;
521 INTERNAL_FUNC int em_convert_time_t_to_string(time_t *input_time, char **output_datetime_string)
523 EM_DEBUG_FUNC_BEGIN("input_time[%p], output_datetime_string[%p]", input_time, output_datetime_string);
524 char temp_buffer[20] = { 0, };
525 struct tm *temp_time_info;
527 if (!input_time || !output_datetime_string) {
528 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
529 return EMAIL_ERROR_INVALID_PARAM;
532 temp_time_info = localtime(input_time);
534 if(!temp_time_info) {
535 EM_DEBUG_EXCEPTION("localtime failed.");
536 return EMAIL_ERROR_SYSTEM_FAILURE;
538 SNPRINTF(temp_buffer, sizeof(temp_buffer), "%04d%02d%02d%02d%02d%02d",
539 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);
541 *output_datetime_string = EM_SAFE_STRDUP(temp_buffer);
543 EM_DEBUG_FUNC_END("err %d", EMAIL_ERROR_NONE);
544 return EMAIL_ERROR_NONE;
547 static char* append_sized_data_to_stream(char *stream, int *stream_len, char *src, int src_len)
549 /* 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); */
550 char *new_stream = NULL;
552 if( !stream_len || src_len == 0 || src == NULL || (stream != NULL && *stream_len == 0) ||
553 (stream == NULL && *stream_len != 0) ) {
554 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
558 int old_stream_len = *stream_len;
560 /*TODO: don't increase stream buffer incrementally when appending new data */
561 new_stream = (char*)em_malloc(old_stream_len + src_len);
564 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
569 memcpy(new_stream, stream, old_stream_len);
571 memcpy(new_stream + old_stream_len, src, src_len);
573 *stream_len = old_stream_len + src_len;
575 EM_SAFE_FREE(stream);
576 /* EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length); */
581 static char* append_string_to_stream(char *input_stream, int *input_output_stream_length, char *input_source_string)
583 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);
584 char *new_stream = NULL;
587 if( !input_output_stream_length || (input_stream != NULL && *input_output_stream_length == 0) ||
588 (input_stream == NULL && *input_output_stream_length != 0) ) {
589 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
593 int source_stream_length = *input_output_stream_length;
595 data_length = EM_SAFE_STRLEN(input_source_string);
597 new_stream = (char*)em_malloc(source_stream_length + data_length + sizeof(int));
600 EM_DEBUG_EXCEPTION("EMAIL_ERROR_OUT_OF_MEMORY");
604 if(input_stream != NULL)
605 memcpy(new_stream, input_stream, source_stream_length);
607 /* write string length */
608 memcpy(new_stream + source_stream_length, (char*)&data_length, sizeof(int));
611 if(input_source_string)
612 memcpy(new_stream + source_stream_length + sizeof(int), input_source_string, data_length);
614 /* for example, "abc" is written to stream buffer with "3abc" */
615 *input_output_stream_length = source_stream_length + sizeof(int) + data_length;
617 EM_SAFE_FREE(input_stream);
618 EM_DEBUG_FUNC_END("*input_output_stream_length [%d]", *input_output_stream_length);
622 static int fetch_sized_data_from_stream(char *input_stream, int *input_output_stream_offset, int input_data_size, char *output_data)
624 /* 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); */
625 int stream_offset = 0;
627 if( !input_stream || !input_output_stream_offset || !input_data_size || !output_data) {
628 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
629 return EMAIL_ERROR_INVALID_PARAM;
632 stream_offset = *input_output_stream_offset;
634 memcpy(output_data, input_stream + stream_offset, input_data_size);
635 stream_offset += input_data_size;
637 *input_output_stream_offset = stream_offset;
639 /* EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset); */
640 return EMAIL_ERROR_NONE;
644 static int fetch_string_from_stream(char *input_stream, int *input_output_stream_offset, char **output_string)
646 /* EM_DEBUG_FUNC_BEGIN("input_stream [%p], input_output_stream_offset [%p] output_string[%p]", input_stream, input_output_stream_offset, output_string); */
647 int string_length = 0;
648 int stream_offset = 0;
649 char *result_string = NULL;
651 if( !input_stream || !input_output_stream_offset || !output_string) {
652 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
653 return EMAIL_ERROR_INVALID_PARAM;
656 stream_offset = *input_output_stream_offset;
657 /* EM_DEBUG_LOG("stream_offset [%d]", stream_offset); */
659 memcpy(&string_length, input_stream + stream_offset, sizeof(int));
660 stream_offset += sizeof(int);
662 /* EM_DEBUG_LOG("string_length [%d]", string_length); */
664 if(string_length != 0) {
665 result_string = (char*)em_malloc(string_length + 1);
667 memcpy(result_string, input_stream + stream_offset, string_length);
668 stream_offset += string_length;
673 EM_DEBUG_LOG("result_string [%s]", result_string);
676 *output_string = result_string;
677 *input_output_stream_offset = stream_offset;
679 /* EM_DEBUG_FUNC_END("stream_offset [%d]", stream_offset); */
680 return EMAIL_ERROR_NONE;
682 /* divide struct at binary field (void* user_data)*/
683 #define EMAIL_ACCOUNT_FMT "S(" "isiii" "isii" ")" "B" "S(" "issss" "isiss" "iiiii" "iiiii" "isiss" "iii"\
684 "$(" "iiiii" "iisii" "iisi" "iiiis" ")" "iiiiiisiis" ")"
686 /* For converting fmt : to distinguish between 64bit or 32bit */
687 static char *convert_format(char *fmt)
689 EM_DEBUG_FUNC_BEGIN();
692 EM_DEBUG_EXCEPTION("Invalid parameter");
700 char *converted_fmt = NULL;
702 string_size = strlen(fmt);
703 converted_fmt = em_malloc(string_size);
704 if (converted_fmt == NULL) {
705 EM_DEBUG_EXCEPTION("em_malloc failed");
725 case '$': /* nested structure */
728 strncat(converted_fmt, c, 1);
730 case 't': /* special charater for time_t */
732 size = sizeof(time_t);
735 strncat(converted_fmt, "i", 1);
736 } else if (size == 8) {
738 strncat(converted_fmt, "I", 1);
740 EM_DEBUG_LOG("size : [%d]", size);
745 EM_DEBUG_EXCEPTION("unsupported option %c\n", *c);
751 EM_DEBUG_LOG("original fmt : [%s]", fmt);
752 EM_DEBUG_LOG("converted_fmt : [%s]", converted_fmt);
759 EM_SAFE_FREE(converted_fmt);
763 return converted_fmt;
766 INTERNAL_FUNC char* em_convert_account_to_byte_stream(email_account_t* account, int *stream_len)
769 EM_IF_NULL_RETURN_VALUE(account, NULL);
773 char *converted_fmt = NULL;
775 converted_fmt = convert_format(EMAIL_ACCOUNT_FMT);
776 if (converted_fmt == NULL) {
777 EM_DEBUG_EXCEPTION("converting failed");
781 tn = tpl_map(EMAIL_ACCOUNT_FMT, account, &tb, &(account->user_data_length));
783 EM_SAFE_FREE(converted_fmt);
784 EM_DEBUG_EXCEPTION("tpl_map failed");
787 EM_SAFE_FREE(converted_fmt);
789 tb.sz = account->user_data_length;
790 tb.addr = account->user_data;
793 /* write account to buffer */
796 tpl_dump(tn, TPL_MEM, &buf, &len);
806 INTERNAL_FUNC void em_convert_byte_stream_to_account(char *stream, int stream_len, email_account_t *account)
809 EM_NULL_CHECK_FOR_VOID(stream);
810 EM_NULL_CHECK_FOR_VOID(account);
814 char *converted_fmt = NULL;
816 converted_fmt = convert_format(EMAIL_ACCOUNT_FMT);
817 if (converted_fmt == NULL) {
818 EM_DEBUG_EXCEPTION("converting failed");
822 tn = tpl_map(converted_fmt, account, &tb, &(account->user_data_length));
824 EM_SAFE_FREE(converted_fmt);
825 EM_DEBUG_EXCEPTION("tpl_map failed");
828 EM_SAFE_FREE(converted_fmt);
830 tpl_load(tn, TPL_MEM, stream, stream_len);
834 /* tb will be destroyed at end of func, but tb.addr remains */
835 account->user_data = tb.addr;
840 #define EMAIL_MAIL_DATA_FMT "S(" "iiiis" "tisss" "issss" "sssss" "sisss"\
841 "icccc" "cccii" "iiiii" "iisii" "iitii" "ttsss" "si" ")B"
843 INTERNAL_FUNC char* em_convert_mail_data_to_byte_stream(email_mail_data_t *mail_data, int *stream_len)
845 EM_DEBUG_FUNC_BEGIN("mail_data[%p] stream_len[%p]", mail_data, stream_len);
846 EM_IF_NULL_RETURN_VALUE(mail_data, NULL);
847 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
851 char *converted_fmt = NULL;
853 converted_fmt = convert_format(EMAIL_MAIL_DATA_FMT);
854 if (converted_fmt == NULL) {
855 EM_DEBUG_EXCEPTION("converting failed");
859 EM_DEBUG_LOG("eas_data_length[%d]", mail_data->eas_data_length); /*prevent 44369*/
861 tn = tpl_map(converted_fmt, mail_data, &tb);
863 EM_SAFE_FREE(converted_fmt);
864 EM_DEBUG_EXCEPTION("tpl_map failed");
867 EM_SAFE_FREE(converted_fmt);
868 tb.sz = mail_data->eas_data_length;
869 tb.addr = mail_data->eas_data;
872 /* write account to buffer */
875 tpl_dump(tn, TPL_MEM, &buf, &len);
884 INTERNAL_FUNC void em_convert_byte_stream_to_mail_data(char *stream, int stream_len, email_mail_data_t *mail_data)
886 EM_DEBUG_FUNC_BEGIN("stream[%p] stream_len[%d] mail_data[%p]", stream, stream_len, mail_data);
887 EM_NULL_CHECK_FOR_VOID(stream);
888 EM_NULL_CHECK_FOR_VOID(mail_data);
892 char *converted_fmt = NULL;
894 converted_fmt = convert_format(EMAIL_MAIL_DATA_FMT);
895 if (converted_fmt == NULL) {
896 EM_DEBUG_EXCEPTION("converting failed");
900 tn = tpl_map(converted_fmt, mail_data, &tb);
902 EM_SAFE_FREE(converted_fmt);
903 EM_DEBUG_EXCEPTION("tpl_map failed");
906 EM_SAFE_FREE(converted_fmt);
908 tpl_load(tn, TPL_MEM, stream, stream_len);
911 if(mail_data->eas_data_length <= 0 || tb.addr == NULL) {
912 EM_DEBUG_LOG("No eas data. eas_data_length[%d] addr[%p]", mail_data->eas_data_length, tb.addr);
915 EM_DEBUG_LOG("eas_data_length[%d] addr[%p]", mail_data->eas_data_length, tb.addr);
916 mail_data->eas_data = tb.addr;
926 #define EMAIL_ATTACHMENT_DATA_FMT "A(S(" "isssi" "iicii" "is" "))"
928 INTERNAL_FUNC char* em_convert_attachment_data_to_byte_stream(email_attachment_data_t *attachment, int attachment_count, int* stream_len)
930 EM_DEBUG_FUNC_BEGIN();
931 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
933 email_attachment_data_t cur = {0};
935 char *converted_fmt = NULL;
937 converted_fmt = convert_format(EMAIL_ATTACHMENT_DATA_FMT);
938 if (converted_fmt == NULL) {
939 EM_DEBUG_EXCEPTION("convertinf failed");
943 /* tpl_map adds value at 2nd param addr to packing buffer iterately */
944 /* 2nd param value (not addr via pointer) should be modified at each iteration */
945 tn = tpl_map(converted_fmt, &cur);
947 EM_SAFE_FREE(converted_fmt);
948 EM_DEBUG_EXCEPTION("tpl_map failed");
951 EM_SAFE_FREE(converted_fmt);
953 /* if attachment_count is zero, for loop is skipped */
955 for( ; (i < attachment_count) && (attachment+i) ; i++ ) {
956 memcpy(&cur, attachment + i, sizeof(email_attachment_data_t));
960 /* write data to buffer */
963 tpl_dump(tn, TPL_MEM, &buf, &len);
968 EM_DEBUG_LOG("stream_len: %d", len);
974 INTERNAL_FUNC void em_convert_byte_stream_to_attachment_data(char *stream, int stream_len, email_attachment_data_t **attachment_data, int *attachment_count)
976 EM_DEBUG_FUNC_BEGIN();
977 EM_NULL_CHECK_FOR_VOID(stream);
978 EM_NULL_CHECK_FOR_VOID(attachment_data);
979 EM_NULL_CHECK_FOR_VOID(attachment_count);
982 email_attachment_data_t cur = {0};
984 char *converted_fmt = NULL;
986 converted_fmt = convert_format(EMAIL_ATTACHMENT_DATA_FMT);
987 if (converted_fmt == NULL) {
988 EM_DEBUG_EXCEPTION("converting failed");
992 tn = tpl_map(converted_fmt, &cur);
994 EM_SAFE_FREE(converted_fmt);
995 EM_DEBUG_EXCEPTION("tpl_map failed");
998 EM_SAFE_FREE(converted_fmt);
999 tpl_load(tn, TPL_MEM, stream, stream_len);
1001 /* tpl does not return the size of variable-length array, but we need variable-length array */
1002 /* so, make list and get list count in the first phase, */
1003 /* and then copy list to var array after allocating memory */
1005 int num_element = tpl_Alen (tn, 1);
1006 email_attachment_data_t *attached = NULL;
1007 if (num_element > 0)
1008 attached = (email_attachment_data_t*) em_malloc(sizeof(email_attachment_data_t)*num_element);
1011 while( tpl_unpack(tn, 1) > 0) {
1012 if (!(attached+i)) {
1013 EM_DEBUG_EXCEPTION ("num element mismatched [%d] vs [%d]", num_element, i);
1017 email_attachment_data_t* pdata = attached+i;
1018 memcpy(pdata, &cur, sizeof(email_attachment_data_t)); /* copy unpacked data to list item */
1019 pdata->attachment_name = EM_SAFE_STRDUP(cur.attachment_name);
1020 pdata->attachment_path = EM_SAFE_STRDUP(cur.attachment_path);
1021 pdata->content_id = EM_SAFE_STRDUP(cur.content_id);
1022 pdata->attachment_mime_type = EM_SAFE_STRDUP(cur.attachment_mime_type);
1023 memset(&cur, 0, sizeof(email_attachment_data_t)); /* initialize variable, used for unpacking */
1028 *attachment_count = num_element;
1029 *attachment_data = attached;
1031 EM_DEBUG_FUNC_END();
1035 #define EMAIL_MAILBOX_FMT "S(" "isisi" "iiiii" "itii" ")B"
1037 INTERNAL_FUNC char* em_convert_mailbox_to_byte_stream(email_mailbox_t *mailbox_data, int *stream_len)
1039 EM_DEBUG_FUNC_BEGIN();
1040 EM_IF_NULL_RETURN_VALUE(mailbox_data, NULL);
1041 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
1043 tpl_node *tn = NULL;
1045 char *converted_fmt = NULL;
1047 converted_fmt = convert_format(EMAIL_MAILBOX_FMT);
1048 if (converted_fmt == NULL) {
1049 EM_DEBUG_EXCEPTION("converting failed");
1053 EM_DEBUG_LOG("eas_data_length[%d]", mailbox_data->eas_data_length);
1055 tn = tpl_map(converted_fmt, mailbox_data, &tb);
1057 EM_SAFE_FREE(converted_fmt);
1058 EM_DEBUG_EXCEPTION("tpl_map failed");
1061 EM_SAFE_FREE(converted_fmt);
1062 tb.sz = mailbox_data->eas_data_length;
1063 tb.addr = mailbox_data->eas_data;
1066 /* write account to buffer */
1069 tpl_dump(tn, TPL_MEM, &buf, &len);
1076 EM_DEBUG_FUNC_END("serialized len: %d", len);
1081 INTERNAL_FUNC void em_convert_byte_stream_to_mailbox(char *stream, int stream_len, email_mailbox_t *mailbox_data)
1083 EM_DEBUG_FUNC_BEGIN();
1084 EM_NULL_CHECK_FOR_VOID(stream);
1085 EM_NULL_CHECK_FOR_VOID(mailbox_data);
1087 tpl_node *tn = NULL;
1089 char *converted_fmt = NULL;
1091 converted_fmt = convert_format(EMAIL_MAILBOX_FMT);
1092 if (converted_fmt == NULL) {
1093 EM_DEBUG_EXCEPTION("converting failed");
1097 tn = tpl_map(converted_fmt, mailbox_data, &tb);
1099 EM_SAFE_FREE(converted_fmt);
1100 EM_DEBUG_EXCEPTION("tpl_map failed");
1103 EM_SAFE_FREE(converted_fmt);
1104 tpl_load(tn, TPL_MEM, stream, stream_len);
1107 if(mailbox_data->eas_data_length <= 0 || tb.addr == NULL) {
1108 EM_DEBUG_LOG("No eas data. eas_data_length[%d] addr[%p]", mailbox_data->eas_data_length, tb.addr);
1111 EM_DEBUG_LOG("eas_data_length[%d] addr[%p]", mailbox_data->eas_data_length, tb.addr);
1112 mailbox_data->eas_data = tb.addr;
1118 EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
1121 #define EMAIL_OPTION_FMT "S(" "iiiii" "iisii" "iisi" ")"
1123 INTERNAL_FUNC char* em_convert_option_to_byte_stream(email_option_t* option, int* stream_len)
1125 EM_DEBUG_FUNC_BEGIN();
1126 EM_IF_NULL_RETURN_VALUE(option, NULL);
1127 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
1129 tpl_node *tn = NULL;
1130 char *converted_fmt = NULL;
1132 converted_fmt = convert_format(EMAIL_OPTION_FMT);
1133 if (converted_fmt == NULL) {
1134 EM_DEBUG_EXCEPTION("converting failed");
1138 tn = tpl_map(converted_fmt, option);
1140 EM_SAFE_FREE(converted_fmt);
1141 EM_DEBUG_EXCEPTION("tpl_map failed");
1144 EM_SAFE_FREE(converted_fmt);
1147 /* write account to buffer */
1150 tpl_dump(tn, TPL_MEM, &buf, &len);
1155 EM_DEBUG_FUNC_END("serialized len: %d", len);
1159 INTERNAL_FUNC void em_convert_byte_stream_to_option(char *stream, int stream_len, email_option_t *option)
1161 EM_DEBUG_FUNC_BEGIN();
1162 EM_NULL_CHECK_FOR_VOID(stream);
1163 EM_NULL_CHECK_FOR_VOID(option);
1165 tpl_node *tn = NULL;
1166 char *converted_fmt = NULL;
1168 converted_fmt = convert_format(EMAIL_OPTION_FMT);
1169 if (converted_fmt == NULL) {
1170 EM_DEBUG_EXCEPTION("converting failed");
1174 tn = tpl_map(converted_fmt, option);
1176 EM_SAFE_FREE(converted_fmt);
1177 EM_DEBUG_EXCEPTION("tpl_map failed");
1180 EM_SAFE_FREE(converted_fmt);
1181 tpl_load(tn, TPL_MEM, stream, stream_len);
1185 EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
1189 #define EMAIL_RULE_FMT "S(" "iisis" "siiii" ")"
1191 INTERNAL_FUNC char* em_convert_rule_to_byte_stream(email_rule_t *rule, int *stream_len)
1193 EM_DEBUG_FUNC_BEGIN();
1194 EM_IF_NULL_RETURN_VALUE(rule, NULL);
1195 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
1197 tpl_node *tn = NULL;
1198 char *converted_fmt = NULL;
1200 converted_fmt = convert_format(EMAIL_RULE_FMT);
1201 if (converted_fmt == NULL) {
1202 EM_DEBUG_EXCEPTION("converting failed");
1206 tn = tpl_map(converted_fmt, rule);
1208 EM_SAFE_FREE(converted_fmt);
1209 EM_DEBUG_EXCEPTION("tpl_map failed");
1212 EM_SAFE_FREE(converted_fmt);
1215 /* write account to buffer */
1218 tpl_dump(tn, TPL_MEM, &buf, &len);
1223 EM_DEBUG_FUNC_END("serialized len: %d", len);
1227 INTERNAL_FUNC void em_convert_byte_stream_to_rule(char *stream, int stream_len, email_rule_t *rule)
1229 EM_DEBUG_FUNC_BEGIN();
1230 EM_NULL_CHECK_FOR_VOID(stream);
1231 EM_NULL_CHECK_FOR_VOID(rule);
1233 tpl_node *tn = NULL;
1234 char *converted_fmt = NULL;
1236 converted_fmt = convert_format(EMAIL_RULE_FMT);
1237 if (converted_fmt == NULL) {
1238 EM_DEBUG_EXCEPTION("converting failed");
1242 tn = tpl_map(converted_fmt, rule);
1244 EM_SAFE_FREE(converted_fmt);
1245 EM_DEBUG_EXCEPTION("tpl_map failed");
1248 EM_SAFE_FREE(converted_fmt);
1249 tpl_load(tn, TPL_MEM, stream, stream_len);
1253 EM_DEBUG_FUNC_END("deserialized len %d", stream_len);
1256 #define EMAIL_MEETING_REQUEST_FMT "iiBBs" "sic#Bi" "c#Bi"
1258 INTERNAL_FUNC char* em_convert_meeting_req_to_byte_stream(email_meeting_request_t *meeting_req, int *stream_len)
1261 EM_DEBUG_FUNC_END();
1262 EM_IF_NULL_RETURN_VALUE(meeting_req, NULL);
1264 tpl_node *tn = NULL;
1266 char *converted_fmt = NULL;
1268 converted_fmt = convert_format(EMAIL_MEETING_REQUEST_FMT);
1269 if (converted_fmt == NULL) {
1270 EM_DEBUG_EXCEPTION("converting failed");
1274 tn = tpl_map(converted_fmt,
1275 &meeting_req->mail_id,
1276 &meeting_req->meeting_response,
1279 &meeting_req->location,
1280 &meeting_req->global_object_id,
1281 &meeting_req->time_zone.offset_from_GMT,
1282 meeting_req->time_zone.standard_name, 32,
1284 &meeting_req->time_zone.standard_bias,
1285 meeting_req->time_zone.daylight_name, 32,
1287 &meeting_req->time_zone.daylight_bias
1290 EM_SAFE_FREE(converted_fmt);
1291 EM_DEBUG_EXCEPTION("tpl_map failed");
1294 EM_SAFE_FREE(converted_fmt);
1295 tb[0].sz = tb[1].sz = tb[2].sz = tb[3].sz = sizeof(struct tm);
1296 tb[0].addr = &meeting_req->start_time;
1297 tb[1].addr = &meeting_req->end_time;
1298 tb[2].addr = &meeting_req->time_zone.standard_time_start_date;
1299 tb[3].addr = &meeting_req->time_zone.daylight_time_start_date;
1303 /* write account to buffer */
1306 tpl_dump(tn, TPL_MEM, &buf, &len);
1311 EM_DEBUG_FUNC_END();
1316 INTERNAL_FUNC void em_convert_byte_stream_to_meeting_req(char *stream, int stream_len, email_meeting_request_t *meeting_req)
1318 EM_DEBUG_FUNC_END();
1319 EM_NULL_CHECK_FOR_VOID(stream);
1320 EM_NULL_CHECK_FOR_VOID(meeting_req);
1322 tpl_node *tn = NULL;
1324 char *converted_fmt = NULL;
1326 converted_fmt = convert_format(EMAIL_MEETING_REQUEST_FMT);
1327 if (converted_fmt == NULL) {
1328 EM_DEBUG_EXCEPTION("converting failed");
1332 tn = tpl_map(converted_fmt,
1333 &meeting_req->mail_id,
1334 &meeting_req->meeting_response,
1337 &meeting_req->location,
1338 &meeting_req->global_object_id,
1339 &meeting_req->time_zone.offset_from_GMT,
1340 meeting_req->time_zone.standard_name, 32,
1342 &meeting_req->time_zone.standard_bias,
1343 meeting_req->time_zone.daylight_name, 32,
1345 &meeting_req->time_zone.daylight_bias
1348 EM_SAFE_FREE(converted_fmt);
1349 EM_DEBUG_EXCEPTION("tpl_map failed");
1352 tpl_load(tn, TPL_MEM, stream, stream_len);
1355 EM_SAFE_FREE(converted_fmt);
1357 /* tb will be destroyed at end of func, but tb.addr remains */
1358 memcpy(&meeting_req->start_time, tb[0].addr, sizeof(struct tm));
1359 memcpy(&meeting_req->end_time, tb[1].addr, sizeof(struct tm));
1360 memcpy(&meeting_req->time_zone.standard_time_start_date, tb[2].addr, sizeof(struct tm));
1361 memcpy(&meeting_req->time_zone.daylight_time_start_date, tb[3].addr, sizeof(struct tm));
1364 for(i=0; i< 4 ; i++)
1365 EM_SAFE_FREE(tb[i].addr);
1367 EM_DEBUG_FUNC_END();
1370 INTERNAL_FUNC char* em_convert_search_filter_to_byte_stream(email_search_filter_t *input_search_filter_list,
1371 int input_search_filter_count, int *output_stream_size)
1373 EM_DEBUG_FUNC_BEGIN("input_search_filter_list [%p] input_search_filter_count [%d]", input_search_filter_list, input_search_filter_count);
1375 char *result_stream = NULL;
1376 int stream_size = 0;
1379 EM_IF_NULL_RETURN_VALUE(input_search_filter_list, NULL);
1381 result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_search_filter_count), sizeof(int));
1383 for( i = 0; i < input_search_filter_count; i++) {
1384 result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_search_filter_list[i].search_filter_type), sizeof(int));
1385 switch(input_search_filter_list[i].search_filter_type) {
1386 case EMAIL_SEARCH_FILTER_TYPE_MESSAGE_NO :
1387 case EMAIL_SEARCH_FILTER_TYPE_UID :
1388 case EMAIL_SEARCH_FILTER_TYPE_ALL :
1389 case EMAIL_SEARCH_FILTER_TYPE_SIZE_LARSER :
1390 case EMAIL_SEARCH_FILTER_TYPE_SIZE_SMALLER :
1391 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_ANSWERED :
1392 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_NEW :
1393 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_DELETED :
1394 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_OLD :
1395 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_DRAFT :
1396 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_FLAGED :
1397 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_RECENT :
1398 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_SEEN :
1399 case EMAIL_SEARCH_FILTER_TYPE_HEADER_PRIORITY :
1400 result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_search_filter_list[i].search_filter_key_value.integer_type_key_value), sizeof(int));
1403 case EMAIL_SEARCH_FILTER_TYPE_BCC :
1404 case EMAIL_SEARCH_FILTER_TYPE_BODY :
1405 case EMAIL_SEARCH_FILTER_TYPE_CC :
1406 case EMAIL_SEARCH_FILTER_TYPE_FROM :
1407 case EMAIL_SEARCH_FILTER_TYPE_KEYWORD :
1408 case EMAIL_SEARCH_FILTER_TYPE_TEXT :
1409 case EMAIL_SEARCH_FILTER_TYPE_SUBJECT :
1410 case EMAIL_SEARCH_FILTER_TYPE_TO :
1411 case EMAIL_SEARCH_FILTER_TYPE_MESSAGE_ID :
1412 case EMAIL_SEARCH_FILTER_TYPE_ATTACHMENT_NAME :
1413 result_stream = append_string_to_stream(result_stream, &stream_size, input_search_filter_list[i].search_filter_key_value.string_type_key_value);
1416 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_BEFORE :
1417 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_ON :
1418 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_SINCE :
1419 result_stream = append_sized_data_to_stream(result_stream, &stream_size, (char*)&(input_search_filter_list[i].search_filter_key_value.time_type_key_value), sizeof(time_t));
1422 EM_DEBUG_EXCEPTION("Invalid filter type [%d]", input_search_filter_list[i].search_filter_type);
1427 *output_stream_size = stream_size;
1429 EM_DEBUG_FUNC_END();
1430 return result_stream;
1433 INTERNAL_FUNC void em_convert_byte_stream_to_search_filter(char *input_stream,
1434 email_search_filter_t **output_search_filter_list, int *output_search_filter_count)
1436 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);
1438 int stream_offset = 0;
1440 int local_search_filter_count = 0;
1441 email_search_filter_t *local_search_filter = NULL;
1443 EM_NULL_CHECK_FOR_VOID(input_stream);
1444 EM_NULL_CHECK_FOR_VOID(output_search_filter_list);
1445 EM_NULL_CHECK_FOR_VOID(output_search_filter_count);
1447 fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(local_search_filter_count));
1449 if(local_search_filter_count == 0) {
1450 EM_DEBUG_EXCEPTION("local_search_filter_count is 0.");
1454 local_search_filter = em_malloc(sizeof(email_search_filter_t) * local_search_filter_count);
1456 if(local_search_filter == NULL) {
1457 EM_DEBUG_EXCEPTION("em_malloc for local_search_filter failed");
1461 *output_search_filter_count = local_search_filter_count;
1463 for( i = 0; i < local_search_filter_count; i++) {
1464 fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(local_search_filter[i].search_filter_type));
1465 switch(local_search_filter[i].search_filter_type) {
1466 case EMAIL_SEARCH_FILTER_TYPE_MESSAGE_NO :
1467 case EMAIL_SEARCH_FILTER_TYPE_UID :
1468 case EMAIL_SEARCH_FILTER_TYPE_ALL :
1469 case EMAIL_SEARCH_FILTER_TYPE_SIZE_LARSER :
1470 case EMAIL_SEARCH_FILTER_TYPE_SIZE_SMALLER :
1471 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_ANSWERED :
1472 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_NEW :
1473 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_DELETED :
1474 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_OLD :
1475 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_DRAFT :
1476 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_FLAGED :
1477 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_RECENT :
1478 case EMAIL_SEARCH_FILTER_TYPE_FLAGS_SEEN :
1479 case EMAIL_SEARCH_FILTER_TYPE_HEADER_PRIORITY :
1480 fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(int), (char*)&(local_search_filter[i].search_filter_key_value.integer_type_key_value));
1483 case EMAIL_SEARCH_FILTER_TYPE_BCC :
1484 case EMAIL_SEARCH_FILTER_TYPE_BODY :
1485 case EMAIL_SEARCH_FILTER_TYPE_CC :
1486 case EMAIL_SEARCH_FILTER_TYPE_FROM :
1487 case EMAIL_SEARCH_FILTER_TYPE_KEYWORD :
1488 case EMAIL_SEARCH_FILTER_TYPE_TEXT :
1489 case EMAIL_SEARCH_FILTER_TYPE_SUBJECT :
1490 case EMAIL_SEARCH_FILTER_TYPE_TO :
1491 case EMAIL_SEARCH_FILTER_TYPE_MESSAGE_ID :
1492 case EMAIL_SEARCH_FILTER_TYPE_ATTACHMENT_NAME :
1493 fetch_string_from_stream(input_stream, &stream_offset, &(local_search_filter[i].search_filter_key_value.string_type_key_value));
1496 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_BEFORE :
1497 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_ON :
1498 case EMAIL_SEARCH_FILTER_TYPE_SENT_DATE_SINCE :
1499 fetch_sized_data_from_stream(input_stream, &stream_offset, sizeof(time_t), (char*)&(local_search_filter[i].search_filter_key_value.time_type_key_value));
1502 EM_DEBUG_EXCEPTION("Invalid filter type [%d]", local_search_filter[i].search_filter_type);
1507 *output_search_filter_list = local_search_filter;
1511 EM_DEBUG_FUNC_END();
1515 #define EMAIL_JOB_INFORMATION_FMT "A(S(iiii))"
1517 INTERNAL_FUNC char* em_convert_task_information_to_byte_stream(email_task_information_t *input_task_information, int input_task_information_count, int *stream_len)
1519 EM_DEBUG_FUNC_BEGIN("input_task_information[%p] input_task_information_count[%d] stream_len[%p]", input_task_information, input_task_information_count, stream_len);
1520 EM_IF_NULL_RETURN_VALUE(input_task_information, NULL);
1521 EM_IF_NULL_RETURN_VALUE(stream_len, NULL);
1523 email_task_information_t cur = {0};
1524 tpl_node *tn = NULL;
1527 tn = tpl_map(EMAIL_JOB_INFORMATION_FMT, &cur);
1529 EM_DEBUG_EXCEPTION("tpl_map failed");
1533 for( ; i < input_task_information_count ; i++ ) {
1534 memcpy(&cur, input_task_information + i, sizeof(email_task_information_t));
1538 /* write data to buffer */
1541 tpl_dump(tn, TPL_MEM, &buf, &len);
1546 EM_DEBUG_FUNC_END("serialized len: %d", len);
1550 INTERNAL_FUNC void em_convert_byte_stream_to_task_information(char *input_stream, int input_stream_len, email_task_information_t **output_task_information, int *output_task_information_count)
1552 EM_DEBUG_FUNC_BEGIN("input_stream[%p] input_stream_len[%d] output_task_information[%p] output_task_information_count[%p]", input_stream, input_stream_len, output_task_information, output_task_information_count);
1553 EM_NULL_CHECK_FOR_VOID(input_stream);
1554 EM_NULL_CHECK_FOR_VOID(output_task_information);
1556 email_task_information_t cur = {0};
1557 tpl_node *tn = NULL;
1560 tn = tpl_map(EMAIL_JOB_INFORMATION_FMT, &cur);
1562 EM_DEBUG_EXCEPTION("tpl_map failed");
1565 tpl_load(tn, TPL_MEM, input_stream, input_stream_len);
1566 int num_element = tpl_Alen (tn, 1);
1567 email_task_information_t* deserialized = NULL;
1568 if (num_element > 0)
1569 deserialized = (email_task_information_t*) em_malloc(sizeof(email_task_information_t)*num_element);
1571 while( tpl_unpack(tn, 1) > 0) {
1572 if (!(deserialized+i)) {
1573 EM_DEBUG_EXCEPTION ("num element mismatched [%d] vs [%d]", num_element, i);
1577 email_task_information_t* pdata = deserialized+i;
1578 memcpy(pdata, &cur, sizeof(email_task_information_t));
1579 memset(&cur, 0, sizeof(email_task_information_t));
1585 *output_task_information_count = num_element;
1586 *output_task_information = deserialized;
1588 EM_DEBUG_FUNC_END();
1591 INTERNAL_FUNC int em_convert_certificate_tbl_to_certificate(emstorage_certificate_tbl_t *certificate_tbl, email_certificate_t **certificate, int *error)
1593 EM_DEBUG_FUNC_BEGIN("certficate_tbl[%p], certificate[%p]", certificate_tbl, certificate);
1595 int err_code = EMAIL_ERROR_NONE;
1597 email_certificate_t *temp_certificate = NULL;
1599 if (!certificate_tbl || !certificate) {
1600 EM_DEBUG_EXCEPTION("Invalid parameter");
1601 err_code = EMAIL_ERROR_INVALID_PARAM;
1605 temp_certificate = em_malloc(sizeof(email_certificate_t)) ;
1606 if (!temp_certificate) {
1607 EM_DEBUG_EXCEPTION("em_malloc failed");
1608 err_code = EMAIL_ERROR_OUT_OF_MEMORY;
1612 temp_certificate->certificate_id = certificate_tbl->certificate_id;
1613 temp_certificate->issue_year = certificate_tbl->issue_year;
1614 temp_certificate->issue_month = certificate_tbl->issue_month;
1615 temp_certificate->issue_day = certificate_tbl->issue_day;
1616 temp_certificate->expiration_year = certificate_tbl->expiration_year;
1617 temp_certificate->expiration_month = certificate_tbl->expiration_month;
1618 temp_certificate->expiration_day = certificate_tbl->expiration_day;
1619 temp_certificate->issue_organization_name = EM_SAFE_STRDUP(certificate_tbl->issue_organization_name);
1620 temp_certificate->email_address = EM_SAFE_STRDUP(certificate_tbl->email_address);
1621 temp_certificate->subject_str = EM_SAFE_STRDUP(certificate_tbl->subject_str);
1622 temp_certificate->filepath = EM_SAFE_STRDUP(certificate_tbl->filepath);
1624 *certificate = temp_certificate;
1630 EM_DEBUG_FUNC_END();
1634 INTERNAL_FUNC int em_convert_certificate_to_certificate_tbl(email_certificate_t *certificate, emstorage_certificate_tbl_t *certificate_tbl)
1636 EM_DEBUG_FUNC_BEGIN("certficate[%p], certificate_tbl[%p]", certificate, certificate_tbl);
1638 certificate_tbl->certificate_id = certificate->certificate_id;
1639 certificate_tbl->issue_year = certificate->issue_year;
1640 certificate_tbl->issue_month = certificate->issue_month;
1641 certificate_tbl->issue_day = certificate->issue_day;
1642 certificate_tbl->expiration_year = certificate->expiration_year;
1643 certificate_tbl->expiration_month = certificate->expiration_month;
1644 certificate_tbl->expiration_day = certificate->expiration_day;
1645 certificate_tbl->issue_organization_name = EM_SAFE_STRDUP(certificate->issue_organization_name);
1646 certificate_tbl->email_address = EM_SAFE_STRDUP(certificate->email_address);
1647 certificate_tbl->subject_str = EM_SAFE_STRDUP(certificate->subject_str);
1648 certificate_tbl->filepath = EM_SAFE_STRDUP(certificate->filepath);
1650 EM_DEBUG_FUNC_END();