diff options
author | 2013-07-26 19:33:50 -0700 | |
---|---|---|
committer | 2013-07-26 19:33:58 -0700 | |
commit | 847a213eb74f3a92f4a239ad3ffbdf83a9e216e2 (patch) | |
tree | fef41441c0015580d743c23e7540e0527cafeac9 /src/core | |
parent | f629866657ae7ed4b9b7151f36775853eba46b58 (diff) |
Fixed #233: fixed headers import from libetpan to mailcore data structures regression.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/abstract/MCMessageHeader.cc | 282 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.cc | 2 |
2 files changed, 136 insertions, 148 deletions
diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc index c1ee43f5..abb20fc4 100644 --- a/src/core/abstract/MCMessageHeader.cc +++ b/src/core/abstract/MCMessageHeader.cc @@ -366,158 +366,146 @@ void MessageHeader::importHeadersData(Data * data) void MessageHeader::importIMFFields(struct mailimf_fields * fields) { - clistiter * cur; - cur = clist_begin(fields->fld_list); - while (cur != NULL) { + struct mailimf_single_fields single_fields; + + mailimf_single_fields_init(&single_fields, fields); + + /* date */ + + if (single_fields.fld_orig_date != NULL) { + time_t timestamp; + timestamp = timestamp_from_date(single_fields.fld_orig_date->dt_date_time); + setDate(timestamp); + setReceivedDate(timestamp); + //MCLog("%lu %lu", (unsigned long) timestamp, date()); + } + + /* subject */ + if (single_fields.fld_subject != NULL) { + char * subject; + + subject = single_fields.fld_subject->sbj_value; + setSubject(String::stringByDecodingMIMEHeaderValue(subject)); + } + + /* sender */ + if (single_fields.fld_sender != NULL) { + struct mailimf_mailbox * mb; + Address * address; + + mb = single_fields.fld_sender->snd_mb; + if (mb != NULL) { + address = Address::addressWithIMFMailbox(mb); + setSender(address); + } + } + + /* from */ + if (single_fields.fld_from != NULL) { + struct mailimf_mailbox_list * mb_list; + Array * addresses; + + mb_list = single_fields.fld_from->frm_mb_list; + addresses = lep_address_list_from_lep_mailbox(mb_list); + if (addresses->count() > 0) { + setFrom((Address *) (addresses->objectAtIndex(0))); + } + } + + /* replyto */ + if (single_fields.fld_reply_to != NULL) { + struct mailimf_address_list * addr_list; + Array * addresses; + + addr_list = single_fields.fld_reply_to->rt_addr_list; + addresses = lep_address_list_from_lep_addr(addr_list); + setReplyTo(addresses); + } + + /* to */ + if (single_fields.fld_to != NULL) { + struct mailimf_address_list * addr_list; + Array * addresses; + + addr_list = single_fields.fld_to->to_addr_list; + addresses = lep_address_list_from_lep_addr(addr_list); + setTo(addresses); + } + + /* cc */ + if (single_fields.fld_cc != NULL) { + struct mailimf_address_list * addr_list; + Array * addresses; + + addr_list = single_fields.fld_cc->cc_addr_list; + addresses = lep_address_list_from_lep_addr(addr_list); + setCc(addresses); + } + + /* bcc */ + if (single_fields.fld_bcc != NULL) { + struct mailimf_address_list * addr_list; + Array * addresses; + + addr_list = single_fields.fld_bcc->bcc_addr_list; + addresses = lep_address_list_from_lep_addr(addr_list); + setBcc(addresses); + } + + /* msgid */ + if (single_fields.fld_message_id != NULL) { + char * msgid; + String * str; + + msgid = single_fields.fld_message_id->mid_value; + str = String::stringWithUTF8Characters(msgid); + setMessageID(str); + } + + /* references */ + if (single_fields.fld_references != NULL) { + clist * msg_id_list; + Array * msgids; + + msg_id_list = single_fields.fld_references->mid_list; + msgids = msg_id_to_string_array(msg_id_list); + setReferences(msgids); + } + + /* inreplyto */ + if (single_fields.fld_in_reply_to != NULL) { + clist * msg_id_list; + Array * msgids; + + msg_id_list = single_fields.fld_in_reply_to->mid_list; + msgids = msg_id_to_string_array(msg_id_list); + setInReplyTo(msgids); + } + + // Take care of other headers. + for(clistiter * cur = clist_begin(fields->fld_list) ; cur != NULL ; cur = clist_next(cur)) { struct mailimf_field * field; field = (mailimf_field *)clist_content(cur); - switch (field->fld_type) { - case MAILIMF_FIELD_ORIG_DATE: - // Set only if date is not set - if (date() == (time_t) -1) { - time_t timestamp; - - timestamp = timestamp_from_date(field->fld_data.fld_orig_date->dt_date_time); - setDate(timestamp); - setReceivedDate(timestamp); - } - break; - case MAILIMF_FIELD_SUBJECT: - // Set only if subject is not set - if (subject() == NULL) { - char * subject; - - subject = field->fld_data.fld_subject->sbj_value; - setSubject(String::stringByDecodingMIMEHeaderValue(subject)); - } - break; - case MAILIMF_FIELD_SENDER: - // Set only if sender is not set - if (sender() == NULL) { - struct mailimf_mailbox * mb; - Address * address; - - mb = field->fld_data.fld_sender->snd_mb; - if (mb != NULL) { - address = Address::addressWithIMFMailbox(mb); - setSender(address); - } - } - break; - case MAILIMF_FIELD_FROM: - // Set only if from is not set - if (from() == NULL) { - struct mailimf_mailbox_list * mb_list; - Array * addresses; - - mb_list = field->fld_data.fld_from->frm_mb_list; - addresses = lep_address_list_from_lep_mailbox(mb_list); - if (addresses->count() > 0) { - setFrom((Address *) (addresses->objectAtIndex(0))); - } - } - break; - case MAILIMF_FIELD_REPLY_TO: - // Set only if reply-to is not set - if (replyTo() == NULL) { - struct mailimf_address_list * addr_list; - Array * addresses; - - addr_list = field->fld_data.fld_reply_to->rt_addr_list; - addresses = lep_address_list_from_lep_addr(addr_list); - setReplyTo(addresses); - } - break; - case MAILIMF_FIELD_TO: - // Set only if to is not set - if (to() == NULL) { - struct mailimf_address_list * addr_list; - Array * addresses; - - addr_list = field->fld_data.fld_to->to_addr_list; - addresses = lep_address_list_from_lep_addr(addr_list); - setTo(addresses); - } - break; - case MAILIMF_FIELD_CC: - // Set only if cc is not set - if (cc() == NULL) { - struct mailimf_address_list * addr_list; - Array * addresses; - - addr_list = field->fld_data.fld_cc->cc_addr_list; - addresses = lep_address_list_from_lep_addr(addr_list); - setCc(addresses); - } - break; - case MAILIMF_FIELD_BCC: - // Set only if bcc is not set - if (bcc() == NULL) { - struct mailimf_address_list * addr_list; - Array * addresses; - - addr_list = field->fld_data.fld_bcc->bcc_addr_list; - addresses = lep_address_list_from_lep_addr(addr_list); - setBcc(addresses); - } - break; - case MAILIMF_FIELD_MESSAGE_ID: - // message-id has a default value set by the constructor, so we can't check for NULL here - char * msgid; - String * str; - - msgid = field->fld_data.fld_message_id->mid_value; - str = String::stringWithUTF8Characters(msgid); - setMessageID(str); - break; - case MAILIMF_FIELD_REFERENCES: - // Set only if references is not set - if (references() == NULL) { - clist * msg_id_list; - Array * msgids; - - msg_id_list = field->fld_data.fld_references->mid_list; - msgids = msg_id_to_string_array(msg_id_list); - setReferences(msgids); - } - break; - case MAILIMF_FIELD_IN_REPLY_TO: - // Set only if in-reply-to is not set - if (inReplyTo() == NULL) { - clist * msg_id_list; - Array * msgids; - - msg_id_list = field->fld_data.fld_references->mid_list; - msgids = msg_id_to_string_array(msg_id_list); - setReferences(msgids); - } - break; - case MAILIMF_FIELD_OPTIONAL_FIELD: - char * fieldName; - String * fieldNameStr; - - fieldName = field->fld_data.fld_optional_field->fld_name; - fieldNameStr = String::stringWithUTF8Characters(fieldName); - // Set only if this optional-field is not set - if (headerValueForName(fieldNameStr) == NULL) { - char * fieldValue; - String * fieldValueStr; - - fieldValue = field->fld_data.fld_optional_field->fld_value; - fieldValueStr = String::stringWithUTF8Characters(fieldValue); - addHeader(fieldNameStr, fieldValueStr); - } - break; - default: - // It won't happen with mailimf_envelope_and_optional_fields_parse(). - MCAssert(0); - break; + if (field->fld_type != MAILIMF_FIELD_OPTIONAL_FIELD) { + continue; + } + + char * fieldName; + String * fieldNameStr; + + fieldName = field->fld_data.fld_optional_field->fld_name; + fieldNameStr = String::stringWithUTF8Characters(fieldName); + // Set only if this optional-field is not set + if (headerValueForName(fieldNameStr) == NULL) { + char * fieldValue; + String * fieldValueStr; + + fieldValue = field->fld_data.fld_optional_field->fld_value; + fieldValueStr = String::stringWithUTF8Characters(fieldValue); + addHeader(fieldNameStr, fieldValueStr); } - cur = clist_next(cur); - - } } diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index e2fb4e1d..c95c9a67 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -1805,7 +1805,7 @@ static void msg_att_handler(struct mailimap_msg_att * msg_att, void * context) msg->header()->importIMAPInternalDate(att_static->att_data.att_internal_date); } } - } + } if (fetchByUID) { if (uid < startUid) { |