aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/imap/MCIMAPSession.cc
diff options
context:
space:
mode:
authorGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-07-20 21:50:10 -0700
committerGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-07-20 21:50:10 -0700
commitbe49d5c6ecba1d06e4969b0a3895bd840fb3f480 (patch)
tree8e8fd5100a410bee1085f9d147c4db80e5c42af1 /src/core/imap/MCIMAPSession.cc
parent1e319987c2d5f533aac37831026aab22d84a6ebd (diff)
parentc2141d30d2feecd694620efc01692934816b4968 (diff)
Merge pull request #204 from thusfresh/CustomReceiveHeaders
Allows for requesting optional headers when fetching messages.
Diffstat (limited to 'src/core/imap/MCIMAPSession.cc')
-rw-r--r--src/core/imap/MCIMAPSession.cc62
1 files changed, 55 insertions, 7 deletions
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc
index f4069b7d..fb82cea1 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, Array * extraHeaders, ErrorCode * pError)
{
struct mailimap_fetch_type * fetch_type;
clist * fetch_result;
@@ -1986,6 +1987,28 @@ 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;
+
+ 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 +2109,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, extraHeaders, pError);
if (result != NULL) {
if (result->modifiedOrAddedMessages() != NULL) {
if (result->modifiedOrAddedMessages()->count() > 0) {
@@ -2107,9 +2130,17 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest
Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
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);
+ progressCallback, extraHeaders, pError);
if (syncResult == NULL)
return NULL;
Array * result = syncResult->modifiedOrAddedMessages();
@@ -2119,11 +2150,19 @@ 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)
+{
+ 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);
+ progressCallback, extraHeaders, pError);
if (syncResult == NULL)
return NULL;
Array * result = syncResult->modifiedOrAddedMessages();
@@ -2916,13 +2955,22 @@ IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesReq
IndexSet * uids, uint64_t modseq,
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);
+ progressCallback, extraHeaders, pError);
mailimap_set_free(imapset);
return result;
+
}
IndexSet * IMAPSession::capability(ErrorCode * pError)