aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xbuild-mac/mailcore2.xcodeproj/project.pbxproj4
-rw-r--r--src/async/imap/MCIMAPAppendMessageOperation.cc13
-rw-r--r--src/async/imap/MCIMAPAppendMessageOperation.h4
-rw-r--r--src/core/abstract/MCMessageHeader.cc180
-rw-r--r--src/core/basetypes/MCArray.cc1
-rw-r--r--src/core/basetypes/MCLibetpan.cc202
-rw-r--r--src/core/basetypes/MCLibetpan.h12
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cc16
-rwxr-xr-xsrc/core/imap/MCIMAPSession.h2
-rw-r--r--src/objc/imap/MCOIMAPAppendMessageOperation.h2
-rw-r--r--src/objc/imap/MCOIMAPAppendMessageOperation.mm2
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, &lt);
-
- off = (int) ((mkgmtime(&lt) - 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, &lt);
+
+ off = (int) ((mkgmtime(&lt) - 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, &lt);
+
+ off = (int) ((mkgmtime(&lt) - 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