diff options
author | Hoà V. DINH <dinh.viet.hoa@gmail.com> | 2013-07-11 19:37:58 -0700 |
---|---|---|
committer | Hoà V. DINH <dinh.viet.hoa@gmail.com> | 2013-07-11 19:37:58 -0700 |
commit | 3b37fa0450e691af93dac0621a0bc964cffa0c2b (patch) | |
tree | 43a0961e2153533ee0e6dee0bc45d4ae2539cbb8 | |
parent | c6a4ffd8dc6a3f9e4a0c385a284a155081b7df79 (diff) | |
parent | 6594f1527f9392ed74201d726b0c6aa6897e372b (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.cc | 45 | ||||
-rw-r--r-- | src/core/abstract/MCMessageHeader.h | 167 | ||||
-rw-r--r-- | src/objc/abstract/MCOMessageHeader.h | 5 | ||||
-rw-r--r-- | src/objc/abstract/MCOMessageHeader.mm | 15 | ||||
-rw-r--r-- | tests/test-all.mm | 2 |
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"))); |