diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/async/imap/MCIMAPFetchMessagesOperation.cc | 10 | ||||
-rw-r--r-- | src/core/abstract/MCMessageHeader.cc | 51 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.cc | 46 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.h | 28 |
4 files changed, 84 insertions, 51 deletions
diff --git a/src/async/imap/MCIMAPFetchMessagesOperation.cc b/src/async/imap/MCIMAPFetchMessagesOperation.cc index 6fa858b2..480f2c1b 100644 --- a/src/async/imap/MCIMAPFetchMessagesOperation.cc +++ b/src/async/imap/MCIMAPFetchMessagesOperation.cc @@ -97,18 +97,22 @@ void IMAPFetchMessagesOperation::main() if (mModSequenceValue != 0) { IMAPSyncResult * syncResult; - syncResult = session()->session()->syncMessagesByUID(folder(), mKind, mIndexes, mModSequenceValue, this, &error, mExtraHeaders); + syncResult = session()->session()->syncMessagesByUIDWithExtraHeaders(folder(), mKind, mIndexes, + mModSequenceValue, this, mExtraHeaders, + &error); if (syncResult != NULL) { mMessages = syncResult->modifiedOrAddedMessages(); mVanishedMessages = syncResult->vanishedMessages(); } } else { - mMessages = session()->session()->fetchMessagesByUID(folder(), mKind, mIndexes, this, &error, mExtraHeaders); + mMessages = session()->session()->fetchMessagesByUIDWithExtraHeaders(folder(), mKind, mIndexes, this, + mExtraHeaders, &error); } } else { - mMessages = session()->session()->fetchMessagesByNumber(folder(), mKind, mIndexes, this, &error, mExtraHeaders); + mMessages = session()->session()->fetchMessagesByNumberWithExtraHeaders(folder(), mKind, mIndexes, this, + mExtraHeaders, &error); } MC_SAFE_RETAIN(mMessages); MC_SAFE_RETAIN(mVanishedMessages); diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc index 18da4214..b45b0a4e 100644 --- a/src/core/abstract/MCMessageHeader.cc +++ b/src/core/abstract/MCMessageHeader.cc @@ -22,9 +22,6 @@ static Array * lep_address_list_from_lep_mailbox(struct mailimf_mailbox_list * m static Array * msg_id_to_string_array(clist * msgids); static clist * msg_id_from_string_array(Array * msgids); -static Array * keyword_to_string_array(clist * keywords); -static Array * clist_to_string_array(clist * cstrs); - #define MAX_HOSTNAME 512 MessageHeader::MessageHeader() @@ -375,24 +372,29 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) 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; @@ -405,6 +407,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_FROM: + // Set only if from is not set if (from() == NULL) { struct mailimf_mailbox_list * mb_list; Array * addresses; @@ -417,6 +420,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } 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; @@ -427,6 +431,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_TO: + // Set only if to is not set if (to() == NULL) { struct mailimf_address_list * addr_list; Array * addresses; @@ -437,6 +442,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_CC: + // Set only if cc is not set if (cc() == NULL) { struct mailimf_address_list * addr_list; Array * addresses; @@ -447,6 +453,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_BCC: + // Set only if bcc is not set if (bcc() == NULL) { struct mailimf_address_list * addr_list; Array * addresses; @@ -457,6 +464,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } 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; @@ -465,6 +473,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) setMessageID(str); break; case MAILIMF_FIELD_REFERENCES: + // Set only if references is not set if (references() == NULL) { clist * msg_id_list; Array * msgids; @@ -475,6 +484,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } 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; @@ -485,6 +495,8 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_COMMENTS: + // Set only if comments is not set + // TODO: Per RFC5322, multiple comments fields are allowed, should that here if (headerValueForName(MCSTR("Comments")) == NULL) { char * comments; String * str; @@ -500,6 +512,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) 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; @@ -510,16 +523,8 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } break; case MAILIMF_FIELD_KEYWORDS: -// TODO: deal with non-string headers in mExtraHeaders -// if (headerForName(MCSTR("Keywords")) == NULL) { -// clist * keywords_list; -// Array * keywords; -// -// keywords_list = field->fld_data.fld_keywords->kw_list; -// keywords = keyword_to_string_array(keywords_list); -// addHeader(MCSTR("Keywords"), keywords); -// } -// break; + // TODO: need deal with non-string headers in mExtraHeaders since Keywords is a list + break; default: break; } @@ -804,27 +809,17 @@ static struct mailimf_address_list * lep_address_list_from_array(Array * address static Array * msg_id_to_string_array(clist * msgids) { - return clist_to_string_array(msgids); -} - -static Array * keyword_to_string_array(clist * keywords) -{ - return clist_to_string_array(keywords); -} - -static Array * clist_to_string_array(clist * cstrs) -{ clistiter * cur; Array * result; result = Array::array(); - for(cur = clist_begin(cstrs) ; cur != NULL ; cur = clist_next(cur)) { - char * cstr; + for(cur = clist_begin(msgids) ; cur != NULL ; cur = clist_next(cur)) { + char * msgid; String * str; - cstr = (char *) clist_content(cur); - str = String::stringWithUTF8Characters(cstr); + msgid = (char *) clist_content(cur); + str = String::stringWithUTF8Characters(msgid); result->addObject(str); } diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index f2b9ccdc..7ef87cc0 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -1850,7 +1850,7 @@ static void msg_att_handler(struct mailimap_msg_att * msg_att, void * context) IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequestKind requestKind, bool fetchByUID, struct mailimap_set * imapset, uint64_t modseq, HashMap * mapping, uint32_t startUid, - IMAPProgressCallback * progressCallback, ErrorCode * pError, Array *extraHeaders) + IMAPProgressCallback * progressCallback, Array * extraHeaders, ErrorCode * pError) { struct mailimap_fetch_type * fetch_type; clist * fetch_result; @@ -1994,8 +1994,6 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest struct mailimap_header_list * imap_hdrlist; struct mailimap_section * section; - MCLog("request extra headers"); - if (extraHeaders && extraHeaders->count() > 0) { hdrlist = clist_new(); for (unsigned int i = 0; i < extraHeaders->count(); i++) { @@ -2111,7 +2109,7 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest requestKind = (IMAPMessagesRequestKind) (requestKind | IMAPMessagesRequestKindFullHeaders); result = fetchMessages(folder, requestKind, fetchByUID, - imapset, modseq, NULL, startUid, progressCallback, pError, extraHeaders); + imapset, modseq, NULL, startUid, progressCallback, extraHeaders, pError); if (result != NULL) { if (result->modifiedOrAddedMessages() != NULL) { if (result->modifiedOrAddedMessages()->count() > 0) { @@ -2130,12 +2128,19 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest } Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError, - Array * extraHeaders) + IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError) +{ + return fetchMessagesByUIDWithExtraHeaders(folder, requestKind, uids, progressCallback, NULL, pError); +} + + +Array * IMAPSession::fetchMessagesByUIDWithExtraHeaders(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * uids, IMAPProgressCallback * progressCallback, + Array * extraHeaders, ErrorCode * pError) { struct mailimap_set * imapset = setFromIndexSet(uids); IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, true, imapset, 0, NULL, 0, - progressCallback, pError, extraHeaders); + progressCallback, extraHeaders, pError); if (syncResult == NULL) return NULL; Array * result = syncResult->modifiedOrAddedMessages(); @@ -2145,12 +2150,19 @@ Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind } Array * IMAPSession::fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError, - Array * extraHeaders) + IndexSet * numbers, IMAPProgressCallback * progressCallback, + ErrorCode * pError) +{ + return fetchMessagesByNumberWithExtraHeaders(folder, requestKind, numbers, progressCallback, NULL, pError); +} + +Array * IMAPSession::fetchMessagesByNumberWithExtraHeaders(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * numbers, IMAPProgressCallback * progressCallback, + Array * extraHeaders, ErrorCode * pError) { struct mailimap_set * imapset = setFromIndexSet(numbers); IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, false, imapset, 0, NULL, 0, - progressCallback, pError, extraHeaders); + progressCallback, extraHeaders, pError); if (syncResult == NULL) return NULL; Array * result = syncResult->modifiedOrAddedMessages(); @@ -2941,16 +2953,24 @@ uint32_t IMAPSession::firstUnseenUid() IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError, - Array * extraHeaders) + IMAPProgressCallback * progressCallback, ErrorCode * pError) +{ + return syncMessagesByUIDWithExtraHeaders(folder, requestKind, uids, modseq, progressCallback, NULL, pError); +} + +IMAPSyncResult * IMAPSession::syncMessagesByUIDWithExtraHeaders(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * uids, uint64_t modseq, + IMAPProgressCallback * progressCallback, Array * extraHeaders, + ErrorCode * pError) { MCAssert(uids->rangesCount() > 0); struct mailimap_set * imapset = setFromIndexSet(uids); IMAPSyncResult * result = fetchMessages(folder, requestKind, true, imapset, modseq, NULL, (uint32_t) uids->allRanges()[0].location, - progressCallback, pError, extraHeaders); + progressCallback, extraHeaders, pError); mailimap_set_free(imapset); return result; + } IndexSet * IMAPSession::capability(ErrorCode * pError) diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 82abd311..470fb0b6 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -89,11 +89,21 @@ namespace mailcore { virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, IMAPProgressCallback * progressCallback, - ErrorCode * pError, Array * extraHeaders = NULL); + ErrorCode * pError); + virtual Array * /* IMAPMessage */ fetchMessagesByUIDWithExtraHeaders(String * folder, + IMAPMessagesRequestKind requestKind, + IndexSet * uids, + IMAPProgressCallback * progressCallback, + Array * extraHeaders, ErrorCode * pError); virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * numbers, IMAPProgressCallback * progressCallback, - ErrorCode * pError, Array * extraHeaders = NULL); - + ErrorCode * pError); + virtual Array * /* IMAPMessage */ fetchMessagesByNumberWithExtraHeaders(String * folder, + IMAPMessagesRequestKind requestKind, + IndexSet * numbers, + IMAPProgressCallback * progressCallback, + Array * extraHeaders, ErrorCode * pError); + virtual Data * fetchMessageByUID(String * folder, uint32_t uid, IMAPProgressCallback * progressCallback, ErrorCode * pError); virtual Data * fetchMessageAttachmentByUID(String * folder, uint32_t uid, String * partID, @@ -104,9 +114,13 @@ namespace mailcore { /* When CONDSTORE or QRESYNC is available */ virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError, - Array * extraHeaders = NULL); - + IMAPProgressCallback * progressCallback, ErrorCode * pError); + /* Same as syncMessagesByUID, allows for extra headers */ + virtual IMAPSyncResult * syncMessagesByUIDWithExtraHeaders(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * uids, uint64_t modseq, + IMAPProgressCallback * progressCallback, + Array * extraHeaders, ErrorCode * pError); + virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError); virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError); @@ -213,7 +227,7 @@ namespace mailcore { IMAPSyncResult * fetchMessages(String * folder, IMAPMessagesRequestKind requestKind, bool fetchByUID, struct mailimap_set * imapset, uint64_t modseq, HashMap * mapping, uint32_t startUid, IMAPProgressCallback * progressCallback, - ErrorCode * pError, Array * extraHeaders); + Array * extraHeaders, ErrorCode * pError); }; } |