From 73ea92fd846adbb4e3b25d8c12c04916da25b340 Mon Sep 17 00:00:00 2001 From: Ryan Johnson Date: Tue, 2 Jul 2013 14:30:09 -0700 Subject: Allows for request custom headers when fetching messages * Defines new request kind ExtraHeaders * Exposes extraHeaders property on fetch messages operations * Modifies MessageHeader::importIMFFields for handling any headers --- src/core/imap/MCIMAPSession.cc | 46 +++++++++++++++++++++++++++++++++--------- src/core/imap/MCIMAPSession.h | 16 +++++++++------ 2 files changed, 47 insertions(+), 15 deletions(-) (limited to 'src/core/imap') diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index b44efdfd..f2b9ccdc 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -1722,7 +1722,8 @@ static void msg_att_handler(struct mailimap_msg_att * msg_att, void * context) hasHeader = true; } else if (att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { - if ((requestKind & IMAPMessagesRequestKindFullHeaders) != 0) { + if ((requestKind & IMAPMessagesRequestKindFullHeaders) != 0 || + (requestKind & IMAPMessagesRequestKindExtraHeaders) != 0) { char * bytes; size_t length; @@ -1849,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) + IMAPProgressCallback * progressCallback, ErrorCode * pError, Array *extraHeaders) { struct mailimap_fetch_type * fetch_type; clist * fetch_result; @@ -1986,6 +1987,30 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest fetch_att = mailimap_fetch_att_new_internaldate(); mailimap_fetch_type_new_fetch_att_list_add(fetch_type, fetch_att); } + if ((requestKind & IMAPMessagesRequestKindExtraHeaders) != 0) { + // custom header request + clist * hdrlist; + char * header; + 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++) { + String *headerString = (String *)extraHeaders->objectAtIndex(i); + header = strdup(headerString->UTF8Characters()); + clist_append(hdrlist, header); + } + + imap_hdrlist = mailimap_header_list_new(hdrlist); + section = mailimap_section_new_header_fields(imap_hdrlist); + fetch_att = mailimap_fetch_att_new_body_peek_section(section); + mailimap_fetch_type_new_fetch_att_list_add(fetch_type, fetch_att); + needsHeader = true; + } + } struct msg_att_handler_data msg_att_data; @@ -2086,7 +2111,7 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest requestKind = (IMAPMessagesRequestKind) (requestKind | IMAPMessagesRequestKindFullHeaders); result = fetchMessages(folder, requestKind, fetchByUID, - imapset, modseq, NULL, startUid, progressCallback, pError); + imapset, modseq, NULL, startUid, progressCallback, pError, extraHeaders); if (result != NULL) { if (result->modifiedOrAddedMessages() != NULL) { if (result->modifiedOrAddedMessages()->count() > 0) { @@ -2105,11 +2130,12 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest } Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError) + IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError, + Array * extraHeaders) { struct mailimap_set * imapset = setFromIndexSet(uids); IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, true, imapset, 0, NULL, 0, - progressCallback, pError); + progressCallback, pError, extraHeaders); if (syncResult == NULL) return NULL; Array * result = syncResult->modifiedOrAddedMessages(); @@ -2119,11 +2145,12 @@ Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind } Array * IMAPSession::fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError) + IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError, + Array * extraHeaders) { struct mailimap_set * imapset = setFromIndexSet(numbers); IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, false, imapset, 0, NULL, 0, - progressCallback, pError); + progressCallback, pError, extraHeaders); if (syncResult == NULL) return NULL; Array * result = syncResult->modifiedOrAddedMessages(); @@ -2914,13 +2941,14 @@ uint32_t IMAPSession::firstUnseenUid() IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError) + IMAPProgressCallback * progressCallback, ErrorCode * pError, + Array * extraHeaders) { 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); + progressCallback, pError, extraHeaders); mailimap_set_free(imapset); return result; } diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 09732edd..82abd311 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -88,9 +88,11 @@ namespace mailcore { virtual void expunge(String * folder, ErrorCode * pError); virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError); + IndexSet * uids, IMAPProgressCallback * progressCallback, + ErrorCode * pError, Array * extraHeaders = NULL); virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, - IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError); + IndexSet * numbers, IMAPProgressCallback * progressCallback, + ErrorCode * pError, Array * extraHeaders = NULL); virtual Data * fetchMessageByUID(String * folder, uint32_t uid, IMAPProgressCallback * progressCallback, ErrorCode * pError); @@ -102,7 +104,8 @@ namespace mailcore { /* When CONDSTORE or QRESYNC is available */ virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError); + IMAPProgressCallback * progressCallback, ErrorCode * pError, + Array * extraHeaders = NULL); 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); @@ -207,9 +210,10 @@ namespace mailcore { void unsetup(); void selectIfNeeded(String * folder, ErrorCode * pError); char fetchDelimiterIfNeeded(char defaultDelimiter, ErrorCode * pError); - IMAPSyncResult * fetchMessages(String * folder, IMAPMessagesRequestKind requestKind, bool fetchByUID, - struct mailimap_set * imapset, uint64_t modseq, HashMap * mapping, uint32_t startUid, - IMAPProgressCallback * progressCallback, ErrorCode * pError); + 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); }; } -- cgit v1.2.3