aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/abstract/MCMessageHeader.cc36
-rw-r--r--src/core/abstract/MCMessageHeader.h9
-rw-r--r--src/core/basetypes/MCHashMap.cc9
-rw-r--r--src/core/basetypes/MCHashMap.h12
-rw-r--r--src/objc/abstract/MCOMessageHeader.h3
-rw-r--r--src/objc/abstract/MCOMessageHeader.mm8
-rw-r--r--tests/test-all.mm1
7 files changed, 64 insertions, 14 deletions
diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc
index ac792111..a91396e5 100644
--- a/src/core/abstract/MCMessageHeader.cc
+++ b/src/core/abstract/MCMessageHeader.cc
@@ -45,6 +45,7 @@ MessageHeader::MessageHeader(MessageHeader * other)
setDate(other->date());
setReceivedDate(other->receivedDate());
setUserAgent(other->mUserAgent);
+ setExtraHeaders(other->mExtraHeaders);
}
void MessageHeader::init(bool generateDate, bool generateMessageID)
@@ -62,6 +63,7 @@ void MessageHeader::init(bool generateDate, bool generateMessageID)
mDate = (time_t) -1;
mReceivedDate = (time_t) -1;
mUserAgent = NULL;
+ mExtraHeaders = NULL;
if (generateDate) {
time_t date;
@@ -113,6 +115,7 @@ MessageHeader::~MessageHeader()
MC_SAFE_RELEASE(mReplyTo);
MC_SAFE_RELEASE(mSubject);
MC_SAFE_RELEASE(mUserAgent);
+ MC_SAFE_RELEASE(mExtraHeaders);
}
String * MessageHeader::description()
@@ -292,6 +295,24 @@ String * MessageHeader::userAgent()
return mUserAgent;
}
+void MessageHeader::setExtraHeaders(HashMap * headers) {
+ MC_SAFE_REPLACE_COPY(HashMap, mExtraHeaders, headers);
+}
+
+void MessageHeader::addHeader(String * header, String * value) {
+ if (!mExtraHeaders) {
+ mExtraHeaders = new HashMap();
+ }
+ mExtraHeaders->setObjectForKey(header, value);
+}
+
+String * MessageHeader::getHeader(String *header) {
+ if (mExtraHeaders) {
+ return (String *)mExtraHeaders->objectForKey(header);
+ }
+ return NULL;
+}
+
String * MessageHeader::extractedSubject()
{
if (subject() == NULL)
@@ -822,6 +843,21 @@ struct mailimf_fields * MessageHeader::createIMFFieldsAndFilterBcc(bool filterBc
field = mailimf_field_new_custom(strdup("X-Mailer"), strdup(mUserAgent->UTF8Characters()));
mailimf_fields_add(fields, field);
}
+
+ if (mExtraHeaders != NULL) {
+ HashMapIter *iter;
+
+ for (iter = mExtraHeaders->iteratorBegin(); iter != NULL; iter = mExtraHeaders->iteratorNext(iter)) {
+ struct mailimf_field * field;
+ String * key;
+ String * value;
+
+ key = (String *)iter->key;
+ value = (String *)iter->value;
+ field = mailimf_field_new_custom(strdup(key->UTF8Characters()), strdup(value->UTF8Characters()));
+ mailimf_fields_add(fields, field);
+ }
+ }
return fields;
}
diff --git a/src/core/abstract/MCMessageHeader.h b/src/core/abstract/MCMessageHeader.h
index f90c1c2d..b48c461e 100644
--- a/src/core/abstract/MCMessageHeader.h
+++ b/src/core/abstract/MCMessageHeader.h
@@ -54,8 +54,12 @@ namespace mailcore {
virtual void setUserAgent(String * userAgent);
virtual String * userAgent();
-
- virtual String * extractedSubject();
+
+ virtual void addHeader(String *header, String *value);
+ virtual void setExtraHeaders(HashMap *headers);
+ virtual String * getHeader(String *header);
+
+ String * extractedSubject();
virtual String * partialExtractedSubject();
virtual void importHeadersData(Data * data);
@@ -89,6 +93,7 @@ namespace mailcore {
time_t mDate;
time_t mReceivedDate;
String * mUserAgent;
+ HashMap * mExtraHeaders;
void init(bool generateDate, bool generateMessageID);
Array * recipientWithReplyAll(bool replyAll, bool includeTo, bool includeCc, Array * senderEmails);
};
diff --git a/src/core/basetypes/MCHashMap.cc b/src/core/basetypes/MCHashMap.cc
index 164198f5..524221fa 100644
--- a/src/core/basetypes/MCHashMap.cc
+++ b/src/core/basetypes/MCHashMap.cc
@@ -10,15 +10,6 @@
using namespace mailcore;
-namespace mailcore {
- struct HashMapCell {
- unsigned int func;
- Object * key;
- Object * value;
- HashMapCell * next;
- };
-}
-
#define CHASH_DEFAULTSIZE 13
#define CHASH_MAXDEPTH 3
diff --git a/src/core/basetypes/MCHashMap.h b/src/core/basetypes/MCHashMap.h
index 40751b8e..75bcab47 100644
--- a/src/core/basetypes/MCHashMap.h
+++ b/src/core/basetypes/MCHashMap.h
@@ -10,7 +10,12 @@ namespace mailcore {
class String;
class Array;
- struct HashMapCell;
+ struct HashMapCell {
+ unsigned int func;
+ Object * key;
+ Object * value;
+ HashMapCell * next;
+ };
typedef HashMapCell HashMapIter;
class HashMap : public Object {
@@ -28,6 +33,9 @@ namespace mailcore {
virtual Array * allValues();
virtual void removeAllObjects();
+ HashMapIter * iteratorBegin();
+ HashMapIter * iteratorNext(HashMapIter * iter);
+
public: // subclass behavior
HashMap(HashMap * o);
virtual String * description();
@@ -37,8 +45,6 @@ namespace mailcore {
unsigned int mAllocated;
unsigned int mCount;
void ** mCells;
- HashMapIter * iteratorBegin();
- HashMapIter * iteratorNext(HashMapIter * iter);
void allocate(unsigned int size);
void init();
};
diff --git a/src/objc/abstract/MCOMessageHeader.h b/src/objc/abstract/MCOMessageHeader.h
index 6e8eb9bf..67a94362 100644
--- a/src/objc/abstract/MCOMessageHeader.h
+++ b/src/objc/abstract/MCOMessageHeader.h
@@ -57,6 +57,9 @@
/** User-Agent.*/
@property (nonatomic, copy) NSString * userAgent;
+- (void)addHeader:(NSString *)header value:(NSString *)value;
+- (NSString *)getHeader:(NSString *)header;
+
/** Extracted subject (also remove square brackets).*/
- (NSString *) extractedSubject;
diff --git a/src/objc/abstract/MCOMessageHeader.mm b/src/objc/abstract/MCOMessageHeader.mm
index 6729894d..4dd9b35e 100644
--- a/src/objc/abstract/MCOMessageHeader.mm
+++ b/src/objc/abstract/MCOMessageHeader.mm
@@ -94,6 +94,14 @@ MCO_OBJC_SYNTHESIZE_ARRAY(setReplyTo, replyTo)
MCO_OBJC_SYNTHESIZE_STRING(setSubject, subject)
MCO_OBJC_SYNTHESIZE_STRING(setUserAgent, userAgent)
+- (void)addHeader:(NSString *)header value:(NSString *)value {
+ _nativeHeader->addHeader(MCO_FROM_OBJC(mailcore::String, header), MCO_FROM_OBJC(mailcore::String, value));
+}
+
+- (NSString *)getHeader:(NSString *)header {
+ return MCO_TO_OBJC(_nativeHeader->getHeader(MCO_FROM_OBJC(mailcore::String, header)));
+}
+
- (NSString *) extractedSubject
{
return MCO_OBJC_BRIDGE_GET(extractedSubject);
diff --git a/tests/test-all.mm b/tests/test-all.mm
index 2201d6d5..d4b00762 100644
--- a/tests/test-all.mm
+++ b/tests/test-all.mm
@@ -53,6 +53,7 @@ static mailcore::Data * testMessageBuilder()
bcc->addObject(mailcore::Address::addressWithDisplayName(MCSTR("Hidden Recipient"), MCSTR("foobar@bcc-recipient.org")));
msg->header()->setTo(to);
msg->header()->setBcc(bcc);
+ msg->header()->addHeader(MCSTR("X-Custom-Header"), MCSTR("Custom Header Value"));
to->release();
bcc->release();
msg->header()->setSubject(MCSTR("Mon projet d'été"));