aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/async/imap/MCIMAPFetchMessagesOperation.cc10
-rw-r--r--src/core/abstract/MCMessageHeader.cc51
-rw-r--r--src/core/imap/MCIMAPSession.cc46
-rw-r--r--src/core/imap/MCIMAPSession.h28
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);
};
}