diff options
-rwxr-xr-x | build-mac/mailcore2.xcodeproj/project.pbxproj | 4 | ||||
-rw-r--r-- | src/async/imap/MCIMAPAppendMessageOperation.cc | 13 | ||||
-rw-r--r-- | src/async/imap/MCIMAPAppendMessageOperation.h | 4 | ||||
-rw-r--r-- | src/core/abstract/MCMessageHeader.cc | 180 | ||||
-rw-r--r-- | src/core/basetypes/MCArray.cc | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.cc | 202 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.h | 12 | ||||
-rwxr-xr-x | src/core/imap/MCIMAPSession.cc | 16 | ||||
-rwxr-xr-x | src/core/imap/MCIMAPSession.h | 2 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPAppendMessageOperation.h | 2 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPAppendMessageOperation.mm | 2 |
11 files changed, 258 insertions, 180 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 2aee56b9..4ce9c632 100755 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -57,7 +57,6 @@ 9EF9AB24175F409D0027FA3B /* MCIMAPFolderStatusOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9EF9AB0E175F30C20027FA3B /* MCIMAPFolderStatusOperation.h */; }; 9EF9AB25175F40C70027FA3B /* MCIMAPFolderStatusOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9EF9AB0E175F30C20027FA3B /* MCIMAPFolderStatusOperation.h */; }; BD63713B177DFF080094121B /* MCLibetpan.cc in Sources */ = {isa = PBXBuildFile; fileRef = BD637139177DFF080094121B /* MCLibetpan.cc */; }; - BD63713C177DFF080094121B /* MCLibetpan.cc in Sources */ = {isa = PBXBuildFile; fileRef = BD637139177DFF080094121B /* MCLibetpan.cc */; }; C07AD5D7FD82F8ACAB576231 /* NSError+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD44B013BB42A240B4F04 /* NSError+MCO.h */; }; C07AD99B2E2054C684DB8FF6 /* NSError+MCO.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */; }; C07ADC28B83E7959BF114D46 /* MCOIMAPSession.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */; }; @@ -65,6 +64,7 @@ C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */; }; C608167B177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */; }; C608167C177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */; }; + C61CC25819765763004A28D3 /* MCLibetpan.cc in Sources */ = {isa = PBXBuildFile; fileRef = BD637139177DFF080094121B /* MCLibetpan.cc */; }; C623C58616FD6A50001BBEFC /* MCOConstants.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB26D16FD63F6000DB34C /* MCOConstants.h */; }; C623C58716FD6A61001BBEFC /* MCOOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25716FD3BC2000DB34C /* MCOOperation.h */; }; C623C58816FD6DF6001BBEFC /* NSValue+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25016FC2846000DB34C /* NSValue+MCO.h */; }; @@ -2784,6 +2784,7 @@ C6BA2BAB1705F4E6003F0E9E /* MCMainThread.mm in Sources */, C6BA2BAC1705F4E6003F0E9E /* MCOperation.cc in Sources */, C6BA2BAD1705F4E6003F0E9E /* MCOperationQueue.cc in Sources */, + C61CC25819765763004A28D3 /* MCLibetpan.cc in Sources */, C6BA2BAE1705F4E6003F0E9E /* MCIMAPFolder.cc in Sources */, C6BA2BAF1705F4E6003F0E9E /* MCIMAPMessage.cc in Sources */, C6BA2BB01705F4E6003F0E9E /* MCIMAPMessagePart.cc in Sources */, @@ -2935,7 +2936,6 @@ 9EF9AB1A175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm in Sources */, 9E774D8A1767C7F60065EB9B /* MCIMAPFolderStatus.cc in Sources */, DAD28C8C1783CFFC00F2BB8F /* MCHTMLBodyRendererTemplateCallback.cc in Sources */, - BD63713C177DFF080094121B /* MCLibetpan.cc in Sources */, DAACAD5217886807000B4517 /* MCHTMLRendererIMAPDataCallback.cc in Sources */, DA89896E178A47D200F6D90A /* MCOIMAPMessageRenderingOperation.mm in Sources */, 4B3C1BE317ABFF91008BBF4C /* MCOIMAPQuotaOperation.mm in Sources */, diff --git a/src/async/imap/MCIMAPAppendMessageOperation.cc b/src/async/imap/MCIMAPAppendMessageOperation.cc index 06a42b2d..23eaaea0 100644 --- a/src/async/imap/MCIMAPAppendMessageOperation.cc +++ b/src/async/imap/MCIMAPAppendMessageOperation.cc @@ -18,6 +18,7 @@ IMAPAppendMessageOperation::IMAPAppendMessageOperation() mMessageData = NULL; mFlags = MessageFlagNone; mCustomFlags = NULL; + mDate = (time_t) -1; mCreatedUID = 0; } @@ -57,6 +58,16 @@ Array * IMAPAppendMessageOperation::customFlags() return customFlags(); } +void IMAPAppendMessageOperation::setDate(time_t date) +{ + mDate = date; +} + +time_t IMAPAppendMessageOperation::date() +{ + return mDate; +} + uint32_t IMAPAppendMessageOperation::createdUID() { return mCreatedUID; @@ -65,7 +76,7 @@ uint32_t IMAPAppendMessageOperation::createdUID() void IMAPAppendMessageOperation::main() { ErrorCode error; - session()->session()->appendMessageWithCustomFlags(folder(), mMessageData, mFlags, mCustomFlags, this, &mCreatedUID, &error); + session()->session()->appendMessageWithCustomFlagsAndDate(folder(), mMessageData, mFlags, mCustomFlags, mDate, this, &mCreatedUID, &error); setError(error); } diff --git a/src/async/imap/MCIMAPAppendMessageOperation.h b/src/async/imap/MCIMAPAppendMessageOperation.h index bca461d7..463d65d4 100644 --- a/src/async/imap/MCIMAPAppendMessageOperation.h +++ b/src/async/imap/MCIMAPAppendMessageOperation.h @@ -31,6 +31,9 @@ namespace mailcore { virtual void setCustomFlags(Array * customFlags); virtual Array * customFlags(); + virtual void setDate(time_t date); + virtual time_t date(); + virtual uint32_t createdUID(); public: // subclass behavior @@ -40,6 +43,7 @@ namespace mailcore { Data * mMessageData; MessageFlag mFlags; Array * mCustomFlags; + time_t mDate; uint32_t mCreatedUID; }; diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc index fb3e43cb..6d2d8066 100644 --- a/src/core/abstract/MCMessageHeader.cc +++ b/src/core/abstract/MCMessageHeader.cc @@ -2,6 +2,7 @@ #include "MCAddress.h" #include "MCIterator.h" +#include "MCLibetpan.h" #include <string.h> #include <unistd.h> @@ -9,12 +10,6 @@ using namespace mailcore; -static time_t timestamp_from_date(struct mailimf_date_time * date_time); -static struct mailimf_date_time * get_date_from_timestamp(time_t timeval); -static time_t timestamp_from_imap_date(struct mailimap_date_time * date_time); -static time_t mkgmtime(struct tm * tmp); -static int tmcomp(struct tm * atmp, struct tm * btmp); - static struct mailimf_address_list * lep_address_list_from_array(Array * addresses); static struct mailimf_mailbox_list * lep_mailbox_list_from_array(Array * addresses); static Array * lep_address_list_from_lep_addr(struct mailimf_address_list * addr_list); @@ -388,7 +383,7 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) if (single_fields.fld_orig_date != NULL) { time_t timestamp; - timestamp = timestamp_from_date(single_fields.fld_orig_date->dt_date_time); + timestamp = timestampFromDate(single_fields.fld_orig_date->dt_date_time); setDate(timestamp); setReceivedDate(timestamp); //MCLog("%lu %lu", (unsigned long) timestamp, date()); @@ -523,169 +518,6 @@ void MessageHeader::importIMFFields(struct mailimf_fields * fields) } } -static time_t timestamp_from_date(struct mailimf_date_time * date_time) -{ - struct tm tmval; - time_t timeval; - int zone_min; - int zone_hour; - - tmval.tm_sec = date_time->dt_sec; - tmval.tm_min = date_time->dt_min; - tmval.tm_hour = date_time->dt_hour; - tmval.tm_mday = date_time->dt_day; - tmval.tm_mon = date_time->dt_month - 1; - if (date_time->dt_year < 1000) { - // workaround when century is not given in year - tmval.tm_year = date_time->dt_year + 2000 - 1900; - } - else { - tmval.tm_year = date_time->dt_year - 1900; - } - - timeval = mkgmtime(&tmval); - - if (date_time->dt_zone >= 0) { - zone_hour = date_time->dt_zone / 100; - zone_min = date_time->dt_zone % 100; - } - else { - zone_hour = -((- date_time->dt_zone) / 100); - zone_min = -((- date_time->dt_zone) % 100); - } - timeval -= zone_hour * 3600 + zone_min * 60; - - return timeval; -} - -static struct mailimf_date_time * get_date_from_timestamp(time_t timeval) -{ - struct tm gmt; - struct tm lt; - int off; - struct mailimf_date_time * date_time; - int sign; - int hour; - int min; - - gmtime_r(&timeval, &gmt); - localtime_r(&timeval, <); - - off = (int) ((mkgmtime(<) - mkgmtime(&gmt)) / 60); - if (off < 0) { - sign = -1; - } - else { - sign = 1; - } - off = off * sign; - min = off % 60; - hour = off / 60; - off = hour * 100 + min; - off = off * sign; - - date_time = mailimf_date_time_new(lt.tm_mday, lt.tm_mon + 1, - lt.tm_year + 1900, - lt.tm_hour, lt.tm_min, lt.tm_sec, - off); - - return date_time; -} - -static time_t timestamp_from_imap_date(struct mailimap_date_time * date_time) -{ - struct tm tmval; - time_t timeval; - int zone_min; - int zone_hour; - - tmval.tm_sec = date_time->dt_sec; - tmval.tm_min = date_time->dt_min; - tmval.tm_hour = date_time->dt_hour; - tmval.tm_mday = date_time->dt_day; - tmval.tm_mon = date_time->dt_month - 1; - if (date_time->dt_year < 1000) { - // workaround when century is not given in year - tmval.tm_year = date_time->dt_year + 2000 - 1900; - } - else { - tmval.tm_year = date_time->dt_year - 1900; - } - - timeval = mkgmtime(&tmval); - - if (date_time->dt_zone >= 0) { - zone_hour = date_time->dt_zone / 100; - zone_min = date_time->dt_zone % 100; - } - else { - zone_hour = -((- date_time->dt_zone) / 100); - zone_min = -((- date_time->dt_zone) % 100); - } - timeval -= zone_hour * 3600 + zone_min * 60; - - return timeval; -} - -#define INVALID_TIMESTAMP (-1) - -static int tmcomp(struct tm * atmp, struct tm * btmp) -{ - int result; - - if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && - (result = (atmp->tm_mon - btmp->tm_mon)) == 0 && - (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && - (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && - (result = (atmp->tm_min - btmp->tm_min)) == 0) - result = atmp->tm_sec - btmp->tm_sec; - return result; -} - -static time_t mkgmtime(struct tm * tmp) -{ - int dir; - int bits; - int saved_seconds; - time_t t; - struct tm yourtm, mytm; - - yourtm = *tmp; - saved_seconds = yourtm.tm_sec; - yourtm.tm_sec = 0; - /* - ** Calculate the number of magnitude bits in a time_t - ** (this works regardless of whether time_t is - ** signed or unsigned, though lint complains if unsigned). - */ - for (bits = 0, t = 1; t > 0; ++bits, t <<= 1) - ; - /* - ** If time_t is signed, then 0 is the median value, - ** if time_t is unsigned, then 1 << bits is median. - */ - if(bits > 40) bits = 40; - t = (t < 0) ? 0 : ((time_t) 1 << bits); - for ( ; ; ) { - gmtime_r(&t, &mytm); - dir = tmcomp(&mytm, &yourtm); - if (dir != 0) { - if (bits-- < 0) { - return INVALID_TIMESTAMP; - } - if (bits < 0) - --t; - else if (dir > 0) - t -= (time_t) 1 << bits; - else t += (time_t) 1 << bits; - continue; - } - break; - } - t += saved_seconds; - return t; -} - #pragma mark RFC 2822 mailbox conversion static Array * lep_address_list_from_lep_mailbox(struct mailimf_mailbox_list * mb_list) @@ -851,7 +683,7 @@ struct mailimf_fields * MessageHeader::createIMFFieldsAndFilterBcc(bool filterBc imfDate = NULL; if (date() != (time_t) -1) { //MCLog("%lu", date()); - imfDate = get_date_from_timestamp(date()); + imfDate = dateFromTimestamp(date()); } imfFrom = NULL; if (from() != NULL) { @@ -952,7 +784,7 @@ void MessageHeader::importIMAPEnvelope(struct mailimap_envelope * env) time_t timestamp; // date - timestamp = timestamp_from_date(date_time); + timestamp = timestampFromDate(date_time); setDate(timestamp); setReceivedDate(timestamp); mailimf_date_time_free(date_time); @@ -964,7 +796,7 @@ void MessageHeader::importIMAPEnvelope(struct mailimap_envelope * env) if (r == MAILIMAP_NO_ERROR) { time_t timestamp; - timestamp = timestamp_from_imap_date(imap_date); + timestamp = timestampFromIMAPDate(imap_date); setDate(timestamp); setReceivedDate(timestamp); mailimap_date_time_free(imap_date); @@ -1132,7 +964,7 @@ void MessageHeader::importIMAPReferences(Data * data) void MessageHeader::importIMAPInternalDate(struct mailimap_date_time * date) { - setReceivedDate(timestamp_from_imap_date(date)); + setReceivedDate(timestampFromIMAPDate(date)); } Array * MessageHeader::recipientWithReplyAll(bool replyAll, bool includeTo, bool includeCc, Array * senderEmails) diff --git a/src/core/basetypes/MCArray.cc b/src/core/basetypes/MCArray.cc index 15e9a2be..43ee6bd4 100644 --- a/src/core/basetypes/MCArray.cc +++ b/src/core/basetypes/MCArray.cc @@ -212,7 +212,6 @@ static int sortCompare(Object ** pa, Object ** pb, struct sortData * data) Array * Array::sortedArray(int (* compare)(void * a, void * b, void * context), void * context) { - struct sortData data; Array * result = (Array *) this->copy()->autorelease(); result->sortArray(compare, context); return result; diff --git a/src/core/basetypes/MCLibetpan.cc b/src/core/basetypes/MCLibetpan.cc index fcc1b772..1779d605 100644 --- a/src/core/basetypes/MCLibetpan.cc +++ b/src/core/basetypes/MCLibetpan.cc @@ -10,9 +10,211 @@ #include <libetpan/libetpan.h> +using namespace mailcore; + +static time_t mkgmtime(struct tm * tmp); +static int tmcomp(struct tm * atmp, struct tm * btmp); + __attribute__((constructor)) static void initialize() { // It will enable CFStream on platforms that supports it. mailstream_cfstream_enabled = 1; } + +time_t mailcore::timestampFromDate(struct mailimf_date_time * date_time) +{ + struct tm tmval; + time_t timeval; + int zone_min; + int zone_hour; + + tmval.tm_sec = date_time->dt_sec; + tmval.tm_min = date_time->dt_min; + tmval.tm_hour = date_time->dt_hour; + tmval.tm_mday = date_time->dt_day; + tmval.tm_mon = date_time->dt_month - 1; + if (date_time->dt_year < 1000) { + // workaround when century is not given in year + tmval.tm_year = date_time->dt_year + 2000 - 1900; + } + else { + tmval.tm_year = date_time->dt_year - 1900; + } + + timeval = mkgmtime(&tmval); + + if (date_time->dt_zone >= 0) { + zone_hour = date_time->dt_zone / 100; + zone_min = date_time->dt_zone % 100; + } + else { + zone_hour = -((- date_time->dt_zone) / 100); + zone_min = -((- date_time->dt_zone) % 100); + } + timeval -= zone_hour * 3600 + zone_min * 60; + + return timeval; +} + +struct mailimf_date_time * mailcore::dateFromTimestamp(time_t timeval) +{ + struct tm gmt; + struct tm lt; + int off; + struct mailimf_date_time * date_time; + int sign; + int hour; + int min; + + gmtime_r(&timeval, &gmt); + localtime_r(&timeval, <); + + off = (int) ((mkgmtime(<) - mkgmtime(&gmt)) / 60); + if (off < 0) { + sign = -1; + } + else { + sign = 1; + } + off = off * sign; + min = off % 60; + hour = off / 60; + off = hour * 100 + min; + off = off * sign; + + date_time = mailimf_date_time_new(lt.tm_mday, lt.tm_mon + 1, + lt.tm_year + 1900, + lt.tm_hour, lt.tm_min, lt.tm_sec, + off); + + return date_time; +} + +struct mailimap_date_time * mailcore::imapDateFromTimestamp(time_t timeval) +{ + struct tm gmt; + struct tm lt; + int off; + struct mailimap_date_time * date_time; + int sign; + int hour; + int min; + + gmtime_r(&timeval, &gmt); + localtime_r(&timeval, <); + + off = (int) ((mkgmtime(<) - mkgmtime(&gmt)) / 60); + if (off < 0) { + sign = -1; + } + else { + sign = 1; + } + off = off * sign; + min = off % 60; + hour = off / 60; + off = hour * 100 + min; + off = off * sign; + + date_time = mailimap_date_time_new(lt.tm_mday, lt.tm_mon + 1, + lt.tm_year + 1900, + lt.tm_hour, lt.tm_min, lt.tm_sec, + off); + + return date_time; +} + +time_t mailcore::timestampFromIMAPDate(struct mailimap_date_time * date_time) +{ + struct tm tmval; + time_t timeval; + int zone_min; + int zone_hour; + + tmval.tm_sec = date_time->dt_sec; + tmval.tm_min = date_time->dt_min; + tmval.tm_hour = date_time->dt_hour; + tmval.tm_mday = date_time->dt_day; + tmval.tm_mon = date_time->dt_month - 1; + if (date_time->dt_year < 1000) { + // workaround when century is not given in year + tmval.tm_year = date_time->dt_year + 2000 - 1900; + } + else { + tmval.tm_year = date_time->dt_year - 1900; + } + + timeval = mkgmtime(&tmval); + + if (date_time->dt_zone >= 0) { + zone_hour = date_time->dt_zone / 100; + zone_min = date_time->dt_zone % 100; + } + else { + zone_hour = -((- date_time->dt_zone) / 100); + zone_min = -((- date_time->dt_zone) % 100); + } + timeval -= zone_hour * 3600 + zone_min * 60; + + return timeval; +} + +#define INVALID_TIMESTAMP (-1) + +static int tmcomp(struct tm * atmp, struct tm * btmp) +{ + int result; + + if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && + (result = (atmp->tm_mon - btmp->tm_mon)) == 0 && + (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && + (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && + (result = (atmp->tm_min - btmp->tm_min)) == 0) + result = atmp->tm_sec - btmp->tm_sec; + return result; +} + +static time_t mkgmtime(struct tm * tmp) +{ + int dir; + int bits; + int saved_seconds; + time_t t; + struct tm yourtm, mytm; + + yourtm = *tmp; + saved_seconds = yourtm.tm_sec; + yourtm.tm_sec = 0; + /* + ** Calculate the number of magnitude bits in a time_t + ** (this works regardless of whether time_t is + ** signed or unsigned, though lint complains if unsigned). + */ + for (bits = 0, t = 1; t > 0; ++bits, t <<= 1) + ; + /* + ** If time_t is signed, then 0 is the median value, + ** if time_t is unsigned, then 1 << bits is median. + */ + if(bits > 40) bits = 40; + t = (t < 0) ? 0 : ((time_t) 1 << bits); + for ( ; ; ) { + gmtime_r(&t, &mytm); + dir = tmcomp(&mytm, &yourtm); + if (dir != 0) { + if (bits-- < 0) { + return INVALID_TIMESTAMP; + } + if (bits < 0) + --t; + else if (dir > 0) + t -= (time_t) 1 << bits; + else t += (time_t) 1 << bits; + continue; + } + break; + } + t += saved_seconds; + return t; +} diff --git a/src/core/basetypes/MCLibetpan.h b/src/core/basetypes/MCLibetpan.h index 9670a47b..41024137 100644 --- a/src/core/basetypes/MCLibetpan.h +++ b/src/core/basetypes/MCLibetpan.h @@ -10,6 +10,16 @@ #define MAILCORE_MCLIBETPAN_H -// No API in this file. +#include <time.h> +#include <libetpan/libetpan.h> + +namespace mailcore { + + time_t timestampFromDate(struct mailimf_date_time * date_time); + time_t timestampFromIMAPDate(struct mailimap_date_time * date_time); + struct mailimf_date_time * dateFromTimestamp(time_t timeval); + struct mailimap_date_time * imapDateFromTimestamp(time_t timeval); + +} #endif diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 780012d4..5efc5e12 100755 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -23,6 +23,7 @@ #include "MCHTMLBodyRendererTemplateCallback.h" #include "MCCertificateUtils.h" #include "MCIMAPIdentity.h" +#include "MCLibetpan.h" using namespace mailcore; @@ -1589,6 +1590,12 @@ void IMAPSession::appendMessage(String * folder, Data * messageData, MessageFlag void IMAPSession::appendMessageWithCustomFlags(String * folder, Data * messageData, MessageFlag flags, Array * customFlags, IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError) { + this->appendMessageWithCustomFlagsAndDate(folder, messageData, flags, NULL, (time_t) -1, progressCallback, createdUID, pError); +} + +void IMAPSession::appendMessageWithCustomFlagsAndDate(String * folder, Data * messageData, MessageFlag flags, Array * customFlags, time_t date, + IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError) +{ int r; struct mailimap_flag_list * flag_list; uint32_t uidvalidity; @@ -1612,8 +1619,15 @@ void IMAPSession::appendMessageWithCustomFlags(String * folder, Data * messageDa mailimap_flag_list_add(flag_list, f); } } - r = mailimap_uidplus_append(mImap, MCUTF8(folder), flag_list, NULL, messageData->bytes(), messageData->length(), + struct mailimap_date_time * imap_date = NULL; + if (date != (time_t) -1) { + imap_date = imapDateFromTimestamp(date); + } + r = mailimap_uidplus_append(mImap, MCUTF8(folder), flag_list, imap_date, messageData->bytes(), messageData->length(), &uidvalidity, &uidresult); + if (imap_date != NULL) { + mailimap_date_time_free(imap_date); + } mailimap_flag_list_free(flag_list); bodyProgress(messageData->length(), messageData->length()); diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 9ebe48d6..e52dc74f 100755 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -83,6 +83,8 @@ namespace mailcore { IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError); virtual void appendMessageWithCustomFlags(String * folder, Data * messageData, MessageFlag flags, Array * customFlags, IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError); + virtual void appendMessageWithCustomFlagsAndDate(String * folder, Data * messageData, MessageFlag flags, Array * customFlags, time_t date, + IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError); void copyMessages(String * folder, IndexSet * uidSet, String * destFolder, HashMap ** pUidMapping, ErrorCode * pError); diff --git a/src/objc/imap/MCOIMAPAppendMessageOperation.h b/src/objc/imap/MCOIMAPAppendMessageOperation.h index 04d64594..1e5fbd39 100644 --- a/src/objc/imap/MCOIMAPAppendMessageOperation.h +++ b/src/objc/imap/MCOIMAPAppendMessageOperation.h @@ -17,6 +17,8 @@ @interface MCOIMAPAppendMessageOperation : MCOIMAPBaseOperation +@property (nonatomic, assign) time_t date; + /** This block will be called as bytes are sent */ diff --git a/src/objc/imap/MCOIMAPAppendMessageOperation.mm b/src/objc/imap/MCOIMAPAppendMessageOperation.mm index 042324b3..2dd16ced 100644 --- a/src/objc/imap/MCOIMAPAppendMessageOperation.mm +++ b/src/objc/imap/MCOIMAPAppendMessageOperation.mm @@ -78,4 +78,6 @@ typedef void (^CompletionType)(NSError *error, uint32_t createdUID); } } +MCO_OBJC_SYNTHESIZE_SCALAR(time_t, time_t, setDate, date) + @end |