From 6280c6a3d1daad83b8054730d430edbc91bc6d2d Mon Sep 17 00:00:00 2001 From: Ryan Johnson Date: Thu, 27 Jun 2013 23:56:19 -0700 Subject: Allows for custom headers to be set in message * Adds setHeaders, addHeader, getHeader to {MCO,MC}MessageHeader * Exposes MCHashMap iterator for more effecient iteration --- src/core/abstract/MCMessageHeader.cc | 36 +++++++++++++++++++++++++++++++++++ src/core/abstract/MCMessageHeader.h | 9 +++++++-- src/core/basetypes/MCHashMap.cc | 9 --------- src/core/basetypes/MCHashMap.h | 12 +++++++++--- src/objc/abstract/MCOMessageHeader.h | 3 +++ src/objc/abstract/MCOMessageHeader.mm | 8 ++++++++ tests/test-all.mm | 1 + 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é")); -- cgit v1.2.3