aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-03-25 01:02:04 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-03-25 01:02:04 -0700
commit1353cb0ee96d92192f05e1feb1518e1534ba8cbe (patch)
tree194daa03c4a4b7e128ec204b3945a64649d32f77
parent2bb0d3d94b2d5b3793e3902221901a3727d32d82 (diff)
headers for reply/reply all/forward
-rw-r--r--src/core/abstract/MCMessageHeader.cc192
-rw-r--r--src/core/abstract/MCMessageHeader.h4
-rw-r--r--src/objc/abstract/MCOMessageHeader.h4
-rw-r--r--src/objc/abstract/MCOMessageHeader.mm25
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