diff options
author | 2013-03-25 01:02:04 -0700 | |
---|---|---|
committer | 2013-03-25 01:02:04 -0700 | |
commit | 1353cb0ee96d92192f05e1feb1518e1534ba8cbe (patch) | |
tree | 194daa03c4a4b7e128ec204b3945a64649d32f77 | |
parent | 2bb0d3d94b2d5b3793e3902221901a3727d32d82 (diff) |
headers for reply/reply all/forward
-rw-r--r-- | src/core/abstract/MCMessageHeader.cc | 192 | ||||
-rw-r--r-- | src/core/abstract/MCMessageHeader.h | 4 | ||||
-rw-r--r-- | src/objc/abstract/MCOMessageHeader.h | 4 | ||||
-rw-r--r-- | src/objc/abstract/MCOMessageHeader.mm | 25 |
4 files changed, 219 insertions, 6 deletions
diff --git a/src/core/abstract/MCMessageHeader.cc b/src/core/abstract/MCMessageHeader.cc index 3502ea75..7b8db731 100644 --- a/src/core/abstract/MCMessageHeader.cc +++ b/src/core/abstract/MCMessageHeader.cc @@ -1047,3 +1047,195 @@ void MessageHeader::importIMAPInternalDate(struct mailimap_date_time * date) setReceivedDate(timestamp_from_imap_date(date)); } +Array * MessageHeader::recipientWithReplyAll(bool replyAll, bool includeTo, bool includeCc, Array * senderEmails) +{ + Set * senderEmailsSet; + senderEmailsSet = Set::setWithArray(senderEmails); + + bool hasCc; + bool hasTo; + Set * addedAddresses; + Array * toField; + Array * ccField; + + toField = NULL; + ccField = NULL; + + hasTo = false; + hasCc = false; + addedAddresses = new Set(); + + if (senderEmails->containsObject(from()->mailbox()->lowercaseString()) || + senderEmails->containsObject(sender()->mailbox()->lowercaseString())) { + Array * recipient; + + recipient = new Array(); + for(unsigned int i = 0 ; i < to()->count() ; i ++) { + Address * address = (Address *) to()->objectAtIndex(i); + if (addedAddresses->containsObject(address->mailbox()->lowercaseString())) { + continue; + } + if (address->mailbox()->isEqualCaseInsensitive(from()->mailbox())) { + recipient->addObjectsFromArray(replyTo()); + for(unsigned int j = 0 ; j < to()->count() ; j ++) { + Address * address = (Address *) replyTo()->objectAtIndex(j); + if (addedAddresses->containsObject(address->mailbox()->lowercaseString())) { + continue; + } + if (address->mailbox() == NULL) + continue; + addedAddresses->addObject(address->mailbox()->lowercaseString()); + } + } + else { + if (address->mailbox() != NULL) { + recipient->addObject(address); + addedAddresses->addObject(address->mailbox()->lowercaseString()); + } + } + hasTo = true; + } + toField = recipient; + toField->retain()->autorelease(); + recipient->release(); + + if (replyAll) { + recipient = new Array(); + for(unsigned int i = 0 ; i < cc()->count() ; i ++) { + Address * address = (Address *) cc()->objectAtIndex(i); + if (addedAddresses->containsObject(address->mailbox()->lowercaseString())) { + continue; + } + if (address->mailbox() == NULL) + continue; + recipient->addObject(address); + addedAddresses->addObject(address->mailbox()->lowercaseString()); + hasCc = true; + } + ccField = recipient; + ccField->retain()->autorelease(); + recipient->release(); + } + + if (!hasTo && !hasCc) { + hasTo = true; + toField = Array::arrayWithObject(from()); + } + } + else { + addedAddresses->addObjectsFromArray(senderEmails); + + if (replyTo()->count() > 0) { + hasTo = true; + toField = replyTo(); + for(unsigned int i = 0 ; i < replyTo()->count() ; i ++) { + Address * address = (Address *) replyTo()->objectAtIndex(i); + if (address->mailbox() == NULL) + continue; + addedAddresses->addObject(address->mailbox()->lowercaseString()); + } + } + else { + if (from()->mailbox() != NULL) { + hasTo = true; + toField = Array::arrayWithObject(from()); + addedAddresses->addObject(from()->mailbox()->lowercaseString()); + } + } + + if (replyAll) { + Array * recipient; + + recipient = new Array(); + for(unsigned int i = 0 ; i < to()->count() ; i ++) { + Address * address = (Address *) to()->objectAtIndex(i); + if (addedAddresses->containsObject(address->mailbox()->lowercaseString())) { + continue; + } + if (address->mailbox() == NULL) + continue; + recipient->addObject(address); + addedAddresses->addObject(address->mailbox()->lowercaseString()); + } + for(unsigned int i = 0 ; i < cc()->count() ; i ++) { + Address * address = (Address *) cc()->objectAtIndex(i); + if (addedAddresses->containsObject(address->mailbox()->lowercaseString())) { + continue; + } + if (address->mailbox() == NULL) + continue; + recipient->addObject(address); + addedAddresses->addObject(address->mailbox()->lowercaseString()); + } + if (recipient->count() > 0) { + hasCc = true; + } + ccField = recipient; + ccField->retain()->autorelease(); + recipient->release(); + } + } + + addedAddresses->release(); + + Array * result; + result = Array::array(); + if (hasTo && includeTo) + result->addObjectsFromArray(toField); + if (hasCc && includeCc) + result->addObjectsFromArray(ccField); + + return result; +} + +MessageHeader * MessageHeader::replyHeader(bool replyAll, Array * addressesExcludedFromRecipient) +{ + MessageHeader * result; + String * subjectValue; + Array * referencesValue; + Array * inReplyTo; + Array * toValue; + Array * ccValue; + + result = new MessageHeader(); + subjectValue = MCSTR("Re: ")->stringByAppendingString(subject()); + referencesValue = (Array *) (references()->copy()); + referencesValue->autorelease(); + referencesValue->addObject(messageID()); + inReplyTo = Array::array(); + inReplyTo->addObject(messageID()); + toValue = recipientWithReplyAll(replyAll, true, false, addressesExcludedFromRecipient); + ccValue = recipientWithReplyAll(replyAll, false, true, addressesExcludedFromRecipient);; + + result->setSubject(subjectValue); + result->setReferences(referencesValue); + result->setInReplyTo(inReplyTo); + result->setTo(toValue); + result->setCc(ccValue); + + result->autorelease(); + return result; +} + +MessageHeader * MessageHeader::forwardHeader() +{ + MessageHeader * result; + String * subjectValue; + Array * referencesValue; + Array * inReplyTo; + + result = new MessageHeader(); + subjectValue = MCSTR("Fw: ")->stringByAppendingString(subject()); + referencesValue = (Array *) (references()->copy()); + referencesValue->autorelease(); + referencesValue->addObject(messageID()); + inReplyTo = Array::array(); + inReplyTo->addObject(messageID()); + result->setSubject(subjectValue); + result->setReferences(referencesValue); + result->setInReplyTo(inReplyTo); + + result->autorelease(); + return result; +} + diff --git a/src/core/abstract/MCMessageHeader.h b/src/core/abstract/MCMessageHeader.h index 33569204..c8e2c5f6 100644 --- a/src/core/abstract/MCMessageHeader.h +++ b/src/core/abstract/MCMessageHeader.h @@ -59,6 +59,9 @@ namespace mailcore { 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(); @@ -87,6 +90,7 @@ namespace mailcore { time_t mReceivedDate; String * mUserAgent; void init(bool generateDate, bool generateMessageID); + Array * recipientWithReplyAll(bool replyAll, bool includeTo, bool includeCc, Array * senderEmails); }; } diff --git a/src/objc/abstract/MCOMessageHeader.h b/src/objc/abstract/MCOMessageHeader.h index 873c45d8..a0eca023 100644 --- a/src/objc/abstract/MCOMessageHeader.h +++ b/src/objc/abstract/MCOMessageHeader.h @@ -35,6 +35,10 @@ - (void) importHeadersData:(NSData *)data; +- (MCOMessageHeader *) replyHeaderWithExcludedRecipients:(NSArray *)excludedRecipients; +- (MCOMessageHeader *) replyAllHeaderWithExcludedRecipients:(NSArray *)excludedRecipients; +- (MCOMessageHeader *) forwardHeader; + @end #endif diff --git a/src/objc/abstract/MCOMessageHeader.mm b/src/objc/abstract/MCOMessageHeader.mm index 3d31f758..6729894d 100644 --- a/src/objc/abstract/MCOMessageHeader.mm +++ b/src/objc/abstract/MCOMessageHeader.mm @@ -12,14 +12,12 @@ #include <typeinfo> #include "MCMessageHeader.h" -#include "NSString+MCO.h" -#include "NSArray+MCO.h" -#include "NSObject+MCO.h" -#include "NSData+MCO.h" -#include "MCOAddress.h" -#include "MCOAddress+Private.h" #include "MCAddress.h" +#import "MCOUtils.h" +#import "MCOAddress.h" +#import "MCOAddress+Private.h" + @implementation MCOMessageHeader { mailcore::MessageHeader * _nativeHeader; } @@ -111,4 +109,19 @@ MCO_OBJC_SYNTHESIZE_STRING(setUserAgent, userAgent) _nativeHeader->importHeadersData([data mco_mcData]); } +- (MCOMessageHeader *) replyHeaderWithExcludedRecipients:(NSArray *)excludedRecipients +{ + return MCO_TO_OBJC(_nativeHeader->replyHeader(false, MCO_FROM_OBJC(mailcore::Array, excludedRecipients))); +} + +- (MCOMessageHeader *) replyAllHeaderWithExcludedRecipients:(NSArray *)excludedRecipients +{ + return MCO_TO_OBJC(_nativeHeader->replyHeader(true, MCO_FROM_OBJC(mailcore::Array, excludedRecipients))); +} + +- (MCOMessageHeader *) forwardHeader +{ + return MCO_TO_OBJC(_nativeHeader->forwardHeader()); +} + @end |