aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-07-11 19:37:58 -0700
committerGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-07-11 19:37:58 -0700
commit3b37fa0450e691af93dac0621a0bc964cffa0c2b (patch)
tree43a0961e2153533ee0e6dee0bc45d4ae2539cbb8
parentc6a4ffd8dc6a3f9e4a0c385a284a155081b7df79 (diff)
parent6594f1527f9392ed74201d726b0c6aa6897e372b (diff)
Merge pull request #161 from thusfresh/CustomHeaders
Allows for custom headers to be set for message builder.
-rw-r--r--src/core/abstract/MCMessageHeader.cc45
-rw-r--r--src/core/abstract/MCMessageHeader.h167
-rw-r--r--src/objc/abstract/MCOMessageHeader.h5
-rw-r--r--src/objc/abstract/MCOMessageHeader.mm15
-rw-r--r--tests/test-all.mm2
5 files changed, 154 insertions, 80 deletions
diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc
index ac792111..bdeb6907 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,39 @@ String * MessageHeader::userAgent()
return mUserAgent;
}
+void MessageHeader::setExtraHeaders(HashMap * headers)
+{
+ MC_SAFE_REPLACE_COPY(HashMap, mExtraHeaders, headers);
+}
+
+Array * MessageHeader::allExtraHeadersNames()
+{
+ if (mExtraHeaders == NULL)
+ return Array::array();
+ return mExtraHeaders->allKeys();
+}
+
+void MessageHeader::addHeader(String * name, String * object)
+{
+ if (mExtraHeaders == NULL)
+ mExtraHeaders = new HashMap();
+ mExtraHeaders->setObjectForKey(name, object);
+}
+
+void MessageHeader::removeHeader(String * name)
+{
+ if (mExtraHeaders == NULL)
+ return;
+ mExtraHeaders->removeObjectForKey(name);
+}
+
+String * MessageHeader::headerValueForName(String * name)
+{
+ if (mExtraHeaders == NULL)
+ return NULL;
+ return (String *) mExtraHeaders->objectForKey(name);
+}
+
String * MessageHeader::extractedSubject()
{
if (subject() == NULL)
@@ -822,6 +858,15 @@ 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) {
+ mc_foreachdictionaryKeyAndValue(String, header, String, value, mExtraHeaders) {
+ struct mailimf_field * field;
+
+ field = mailimf_field_new_custom(strdup(header->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..8da5f980 100644
--- a/src/core/abstract/MCMessageHeader.h
+++ b/src/core/abstract/MCMessageHeader.h
@@ -8,91 +8,98 @@
#ifdef __cplusplus
namespace mailcore {
-
- class Address;
-
- class MessageHeader : public Object {
- public:
- MessageHeader();
- virtual ~MessageHeader();
-
- virtual void setMessageID(String * messageID);
- virtual String * messageID();
-
- virtual void setReferences(Array * /* String */ references);
- virtual Array * /* String */ references();
-
- virtual void setInReplyTo(Array * /* String */ inReplyTo);
- virtual Array * /* String */ inReplyTo();
-
- virtual void setDate(time_t date);
- virtual time_t date();
-
- virtual void setReceivedDate(time_t date);
- virtual time_t receivedDate();
-
- virtual void setSender(Address * sender);
- virtual Address * sender();
-
- virtual void setFrom(Address * from);
- virtual Address * from();
-
- virtual void setTo(Array * /* Address */ to);
- virtual Array * /* Address */ to();
-
- virtual void setCc(Array * /* Address */ cc);
- virtual Array * /* Address */ cc();
-
- virtual void setBcc(Array * /* Address */ bcc);
- virtual Array * /* Address */ bcc();
-
- virtual void setReplyTo(Array * /* Address */ replyTo);
- virtual Array * /* Address */ replyTo();
-
- virtual void setSubject(String * subject);
- virtual String * subject();
-
- virtual void setUserAgent(String * userAgent);
- virtual String * userAgent();
-
- virtual String * extractedSubject();
- virtual String * partialExtractedSubject();
- virtual void importHeadersData(Data * data);
-
+
+ class Address;
+
+ class MessageHeader : public Object {
+ public:
+ MessageHeader();
+ virtual ~MessageHeader();
+
+ virtual void setMessageID(String * messageID);
+ virtual String * messageID();
+
+ virtual void setReferences(Array * /* String */ references);
+ virtual Array * /* String */ references();
+
+ virtual void setInReplyTo(Array * /* String */ inReplyTo);
+ virtual Array * /* String */ inReplyTo();
+
+ virtual void setDate(time_t date);
+ virtual time_t date();
+
+ virtual void setReceivedDate(time_t date);
+ virtual time_t receivedDate();
+
+ virtual void setSender(Address * sender);
+ virtual Address * sender();
+
+ virtual void setFrom(Address * from);
+ virtual Address * from();
+
+ virtual void setTo(Array * /* Address */ to);
+ virtual Array * /* Address */ to();
+
+ virtual void setCc(Array * /* Address */ cc);
+ virtual Array * /* Address */ cc();
+
+ virtual void setBcc(Array * /* Address */ bcc);
+ virtual Array * /* Address */ bcc();
+
+ virtual void setReplyTo(Array * /* Address */ replyTo);
+ virtual Array * /* Address */ replyTo();
+
+ virtual void setSubject(String * subject);
+ virtual String * subject();
+
+ virtual void setUserAgent(String * userAgent);
+ virtual String * userAgent();
+
+ virtual void addHeader(String *name, String * value);
+ virtual void removeHeader(String *name);
+ virtual String * headerValueForName(String *name);
+ virtual Array * allExtraHeadersNames();
+
+ String * extractedSubject();
+ virtual String * partialExtractedSubject();
+ virtual void importHeadersData(Data * data);
+
virtual MessageHeader * replyHeader(bool replyAll, Array * addressesExcludedFromRecipient);
virtual MessageHeader * forwardHeader();
-
+
public: // subclass behavior
- MessageHeader(MessageHeader * other);
- virtual String * description();
- virtual Object * copy();
-
+ MessageHeader(MessageHeader * other);
+ virtual String * description();
+ virtual Object * copy();
+
public: // private
- virtual void importIMAPEnvelope(struct mailimap_envelope * env);
- virtual void importIMAPReferences(Data * data);
- virtual void importIMAPInternalDate(struct mailimap_date_time * date);
-
- virtual struct mailimf_fields * createIMFFieldsAndFilterBcc(bool filterBcc);
- virtual void importIMFFields(struct mailimf_fields * fields);
-
- private:
- String * mMessageID;
- Array * /* String */ mReferences;
- Array * /* String */ mInReplyTo;
- Address * mSender;
- Address * mFrom;
- Array * /* Address */ mTo;
- Array * /* Address */ mCc;
- Array * /* Address */ mBcc;
- Array * /* Address */ mReplyTo;
- String * mSubject;
- time_t mDate;
- time_t mReceivedDate;
- String * mUserAgent;
- void init(bool generateDate, bool generateMessageID);
+ virtual void importIMAPEnvelope(struct mailimap_envelope * env);
+ virtual void importIMAPReferences(Data * data);
+ virtual void importIMAPInternalDate(struct mailimap_date_time * date);
+
+ virtual struct mailimf_fields * createIMFFieldsAndFilterBcc(bool filterBcc);
+ virtual void importIMFFields(struct mailimf_fields * fields);
+
+ private:
+ String * mMessageID;
+ Array * /* String */ mReferences;
+ Array * /* String */ mInReplyTo;
+ Address * mSender;
+ Address * mFrom;
+ Array * /* Address */ mTo;
+ Array * /* Address */ mCc;
+ Array * /* Address */ mBcc;
+ Array * /* Address */ mReplyTo;
+ String * mSubject;
+ time_t mDate;
+ time_t mReceivedDate;
+ String * mUserAgent;
+ HashMap * mExtraHeaders;
+ void init(bool generateDate, bool generateMessageID);
+ void setExtraHeaders(HashMap *headers);
Array * recipientWithReplyAll(bool replyAll, bool includeTo, bool includeCc, Array * senderEmails);
- };
-
+ };
+
}
#endif
diff --git a/src/objc/abstract/MCOMessageHeader.h b/src/objc/abstract/MCOMessageHeader.h
index 6e8eb9bf..4177dec9 100644
--- a/src/objc/abstract/MCOMessageHeader.h
+++ b/src/objc/abstract/MCOMessageHeader.h
@@ -57,6 +57,11 @@
/** User-Agent.*/
@property (nonatomic, copy) NSString * userAgent;
+- (void)addHeaderValue:(NSString *)value forName:(NSString *)name;
+- (void)removeHeaderForName:(NSString *)name;
+- (NSString *)headerValueForName:(NSString *)name;
+- (NSArray * /* NSString */)allHeadersNames;
+
/** Extracted subject (also remove square brackets).*/
- (NSString *) extractedSubject;
diff --git a/src/objc/abstract/MCOMessageHeader.mm b/src/objc/abstract/MCOMessageHeader.mm
index 427131b0..9374614f 100644
--- a/src/objc/abstract/MCOMessageHeader.mm
+++ b/src/objc/abstract/MCOMessageHeader.mm
@@ -100,6 +100,21 @@ MCO_OBJC_SYNTHESIZE_ARRAY(setReplyTo, replyTo)
MCO_OBJC_SYNTHESIZE_STRING(setSubject, subject)
MCO_OBJC_SYNTHESIZE_STRING(setUserAgent, userAgent)
+- (void)addHeaderValue:(NSString *)value forName:(NSString *)name {
+ _nativeHeader->addHeader(MCO_FROM_OBJC(mailcore::String, name), MCO_FROM_OBJC(mailcore::String, value));
+}
+
+- (NSString *)headerValueForName:(NSString *)name {
+ return MCO_TO_OBJC(_nativeHeader->headerValueForName((MCO_FROM_OBJC(mailcore::String, name))));
+}
+- (void)removeHeaderForName:(NSString *)name {
+ _nativeHeader->removeHeader(MCO_FROM_OBJC(mailcore::String, name));
+}
+
+- (NSArray * /* NSString */)allHeadersNames {
+ return MCO_TO_OBJC(_nativeHeader->allExtraHeadersNames());
+}
+
- (NSString *) extractedSubject
{
return MCO_OBJC_BRIDGE_GET(extractedSubject);
diff --git a/tests/test-all.mm b/tests/test-all.mm
index c58e5888..552ffe8e 100644
--- a/tests/test-all.mm
+++ b/tests/test-all.mm
@@ -55,6 +55,8 @@ static mailcore::Data * testMessageBuilder()
msg->header()->setBcc(bcc);
to->release();
bcc->release();
+ MCAssert(msg->header()->allExtraHeadersNames()->count() == 0);
+ msg->header()->addHeader(MCSTR("X-Custom-Header"), MCSTR("Custom Header Value"));
msg->header()->setSubject(MCSTR("Mon projet d'été"));
msg->setHTMLBody(MCSTR("<div>Hello <img src=\"cid:1234\"></div>"));
msg->addAttachment(mailcore::Attachment::attachmentWithContentsOfFile(MCSTR("first-filename")));