Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into Providers-API
Browse files Browse the repository at this point in the history
Merge upstream/master
  • Loading branch information
CodaFi committed Apr 28, 2013
2 parents 6216eee + 9a5c778 commit 10c9d0a
Show file tree
Hide file tree
Showing 33 changed files with 1,304 additions and 506 deletions.
229 changes: 24 additions & 205 deletions build-mac/mailcore2.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions src/core/abstract/MCAbstractPart.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <string.h>
#include <stdlib.h>
#include <libetpan/libetpan.h>
#include "MCData.h"

using namespace mailcore;

Expand Down Expand Up @@ -249,3 +250,15 @@ AbstractPart * AbstractPart::partForUniqueID(String * uniqueID)
}
}

String * AbstractPart::decodedStringForData(Data * data)
{
String *lowerMimeType = mMimeType ? mMimeType->lowercaseString() : NULL;

if (lowerMimeType && lowerMimeType->hasPrefix(MCSTR("text/"))) {
bool isHTML = lowerMimeType->isEqual(MCSTR("text/html"));
return data->stringWithDetectedCharset(mCharset, isHTML);
}
else {
return NULL;
}
}
2 changes: 2 additions & 0 deletions src/core/abstract/MCAbstractPart.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ namespace mailcore {
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);

virtual String * decodedStringForData(Data * data);

public: // subclass behavior
AbstractPart(AbstractPart * other);
virtual String * description();
Expand Down
26 changes: 26 additions & 0 deletions src/core/abstract/MCAddress.cc
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,32 @@ Array * Address::addressesWithNonEncodedRFC822String(String * string)
return result;
}

String * Address::RFC822StringForAddresses(Array * addresses)
{
String * result = String::string();
for(unsigned int i = 0 ; i < addresses->count() ; i ++) {
Address * address = (Address *) addresses->objectAtIndex(i);
if (i != 0) {
result->appendString(MCSTR(", "));
}
result->appendString(address->RFC822String());
}
return result;
}

String * Address::nonEncodedRFC822StringForAddresses(Array * addresses)
{
String * result = String::string();
for(unsigned int i = 0 ; i < addresses->count() ; i ++) {
Address * address = (Address *) addresses->objectAtIndex(i);
if (i != 0) {
result->appendString(MCSTR(", "));
}
result->appendString(address->nonEncodedRFC822String());
}
return result;
}

String * Address::description()
{
String * result = String::string();
Expand Down
3 changes: 3 additions & 0 deletions src/core/abstract/MCAddress.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ namespace mailcore {
static Array * addressesWithRFC822String(String * string);
static Array * addressesWithNonEncodedRFC822String(String * string);

static String * RFC822StringForAddresses(Array * addresses);
static String * nonEncodedRFC822StringForAddresses(Array * addresses);

virtual void setDisplayName(String * displayName);
virtual String * displayName();

Expand Down
49 changes: 34 additions & 15 deletions src/core/abstract/MCMessageHeader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1070,8 +1070,9 @@ Array * MessageHeader::recipientWithReplyAll(bool replyAll, bool includeTo, bool
hasCc = false;
addedAddresses = new Set();

if (senderEmails->containsObject(from()->mailbox()->lowercaseString()) ||
senderEmails->containsObject(sender()->mailbox()->lowercaseString())) {
if (senderEmails != NULL &&
(senderEmails->containsObject(from()->mailbox()->lowercaseString()) ||
senderEmails->containsObject(sender()->mailbox()->lowercaseString()))) {
Array * recipient;

recipient = new Array();
Expand Down Expand Up @@ -1130,7 +1131,7 @@ Array * MessageHeader::recipientWithReplyAll(bool replyAll, bool includeTo, bool
else {
addedAddresses->addObjectsFromArray(senderEmails);

if (replyTo()->count() > 0) {
if (replyTo() != NULL && replyTo()->count() > 0) {
hasTo = true;
toField = replyTo();
for(unsigned int i = 0 ; i < replyTo()->count() ; i ++) {
Expand All @@ -1141,7 +1142,7 @@ Array * MessageHeader::recipientWithReplyAll(bool replyAll, bool includeTo, bool
}
}
else {
if (from()->mailbox() != NULL) {
if (from() != NULL && from()->mailbox() != NULL) {
hasTo = true;
toField = Array::arrayWithObject(from());
addedAddresses->addObject(from()->mailbox()->lowercaseString());
Expand Down Expand Up @@ -1201,14 +1202,23 @@ MessageHeader * MessageHeader::replyHeader(bool replyAll, Array * addressesExclu
Array * inReplyTo;
Array * toValue;
Array * ccValue;


referencesValue = NULL;
inReplyTo = NULL;

result = new MessageHeader();
subjectValue = MCSTR("Re: ")->stringByAppendingString(subject());
referencesValue = (Array *) (references()->copy());
referencesValue->autorelease();
referencesValue->addObject(messageID());
inReplyTo = Array::array();
inReplyTo->addObject(messageID());
if (references() != NULL) {
referencesValue = (Array *) (references()->copy());
referencesValue->autorelease();
if (messageID() != NULL ) {
referencesValue->addObject(messageID());
}
}
if (messageID()) {
inReplyTo = Array::array();
inReplyTo->addObject(messageID());
}
toValue = recipientWithReplyAll(replyAll, true, false, addressesExcludedFromRecipient);
ccValue = recipientWithReplyAll(replyAll, false, true, addressesExcludedFromRecipient);;

Expand All @@ -1229,13 +1239,22 @@ MessageHeader * MessageHeader::forwardHeader()
Array * referencesValue;
Array * inReplyTo;

referencesValue = NULL;
inReplyTo = NULL;

result = new MessageHeader();
subjectValue = MCSTR("Fw: ")->stringByAppendingString(subject());
referencesValue = (Array *) (references()->copy());
referencesValue->autorelease();
referencesValue->addObject(messageID());
inReplyTo = Array::array();
inReplyTo->addObject(messageID());
if (references() != NULL) {
referencesValue = (Array *) (references()->copy());
referencesValue->autorelease();
if (messageID() != NULL ) {
referencesValue->addObject(messageID());
}
}
if (messageID()) {
inReplyTo = Array::array();
inReplyTo->addObject(messageID());
}
result->setSubject(subjectValue);
result->setReferences(referencesValue);
result->setInReplyTo(inReplyTo);
Expand Down
6 changes: 3 additions & 3 deletions src/core/basetypes/MCArray.cc
Original file line number Diff line number Diff line change
Expand Up @@ -204,21 +204,21 @@ static int sortCompare(Object ** pa, Object ** pb, struct sortData * data)
return data->compare(a, b, data->context);
}

Array * Array::sortedArray(int (* compare)(void *, void *, void *), void * context)
Array * Array::sortedArray(int (* compare)(void * a, void * b, void * context), void * context)
{
struct sortData data;
Array * result = (Array *) this->copy()->autorelease();
data.compare = compare;
data.context = context;
#ifdef __MACH__
qsort_r(carray_data(result->mArray), carray_count(result->mArray),
sizeof(* carray_data(result->mArray)), this,
sizeof(* carray_data(result->mArray)), &data,
(int (*)(void *, const void *, const void *)) sortCompare);
#else
qsort_r(carray_data(result->mArray), carray_count(result->mArray),
sizeof(* carray_data(result->mArray)),
(int (*)(const void *, const void *, void *)) sortCompare,
this);
&data);
#endif
return result;
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/basetypes/MCArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ namespace mailcore {
virtual Object * lastObject();
virtual bool containsObject(Object * obj);

virtual Array * sortedArray(int (* compare)(void *, void *, void *), void * context);
virtual Array * sortedArray(int (* compare)(void * a, void * b, void * context), void * context);
virtual String * componentsJoinedByString(String * delimiter);

public: // subclass behavior
Expand Down
2 changes: 2 additions & 0 deletions src/core/basetypes/MCBaseTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,7 @@
#include <MailCore/MCOperationQueue.h>
#include <MailCore/MCOperationCallback.h>
#include <MailCore/MCLibetpanTypes.h>
#include <MailCore/MCICUTypes.h>
#include <MailCore/MCIterator.h>

#endif
18 changes: 18 additions & 0 deletions src/core/basetypes/MCICUTypes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// MCICUTypes.h
// mailcore2
//
// Created by DINH Viêt Hoà on 4/18/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//

#ifndef __MAILCORE_MCICUTYPES_H_
#define __MAILCORE_MCICUTYPES_H_

#if defined(__CHAR16_TYPE__)
typedef __CHAR16_TYPE__ UChar;
#else
typedef uint16_t UChar;
#endif

#endif
128 changes: 128 additions & 0 deletions src/core/basetypes/MCIterator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
//
// MCIterator.h
// mailcore2
//
// Created by DINH Viêt Hoà on 4/18/13.
// Copyright (c) 2013 MailCore. All rights reserved.
//

#ifndef __MAILCORE_ITERATOR_H_
#define __MAILCORE_ITERATOR_H_

#include <MailCore/MCArray.h>
#include <MailCore/MCHashMap.h>
#include <MailCore/MCAutoreleasePool.h>
#include <string.h>

#ifdef __cplusplus

#define mc_foreacharray(type, __variable, __array) \
type * __variable; \
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \
for (; NULL != (__variable = (type *) mailcore::ArrayIteratorNext(&__variable##__iterator)); )

#define mc_foreacharrayIndex(__index, type, __variable, __array) \
type * __variable; \
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \
for (unsigned int __index = 0; NULL != (__variable = mailcore::ArrayIteratorNext(&__variable##__iterator)); __index++)

#define mc_foreachdictionaryKey(keyType, __key, __dictionary) \
keyType * __key; \
DictionaryIterator __key##__iterator = DictionaryIteratorInit(__dictionary, true, false); \
while (DictionaryIteratorRun(&__key##__iterator)) \
while (DictionaryIteratorNext(&__key##__iterator, &__key, NULL))

#define mc_foreachdictionaryValue(valueType, __value, __dictionary) \
valueType * __value; \
DictionaryIterator __value##__iterator = DictionaryIteratorInit(__dictionary, false, true); \
while (DictionaryIteratorRun(&__value##__iterator)) \
while (DictionaryIteratorNext(&__value##__iterator, NULL, &__value))

#define mc_foreachdictionaryKeyAndValue(__key, __value, __dictionary) \
keyType * __key; \
valueType * __value; \
DictionaryIterator __key##__value##__iterator = DictionaryIteratorInit(__dictionary, true, true); \
while (DictionaryIteratorRun(&__key##__value##__iterator)) \
while (DictionaryIteratorNext(&__key##__value##__iterator, &__key, &__value))

namespace mailcore {

struct ArrayIterator {
unsigned index;
unsigned count;
Array * array;
};

static inline ArrayIterator ArrayIteratorInit(Array * array)
{
ArrayIterator iterator = { 0, array->count(), array };
return iterator;
}

static inline Object * ArrayIteratorNext(ArrayIterator * iterator)
{
if (iterator->index >= iterator->count) {
return NULL;
}

Object * result = iterator->array->objectAtIndex(iterator->index);
++ iterator->index;
return result;
}


struct HashMapIterator {
bool cleanup;
unsigned index;
unsigned count;
Array * keys;
Array * values;
};

static inline HashMapIterator FastDictionaryIteratorInit(HashMap * hashmap, bool useKeys, bool useValues)
{
AutoreleasePool * pool = new AutoreleasePool();
Array * keys = useKeys ? hashmap->allKeys() : NULL;
Array * values = useValues ? hashmap->allValues() : NULL;
keys->retain();
values->retain();
HashMapIterator iterator = { false, 0, hashmap->count(), keys, values };
pool->release();

return iterator;
}

static inline bool HashMapIteratorNext(HashMapIterator * iterator, Object ** keyp, Object ** valuep)
{
if (iterator->index >= iterator->count) {
return false;
}

if (keyp != NULL) {
* keyp = iterator->keys->objectAtIndex(iterator->index);
}
if (valuep != NULL) {
* valuep = iterator->values->objectAtIndex(iterator->index);
}
iterator->index ++;
return true;
}


static inline bool DictionaryIteratorRun(HashMapIterator * iterator)
{
if (iterator->cleanup) {
iterator->cleanup = true;
return true;
} else {
iterator->keys->release();
iterator->values->release();
return false;
}
}

};

#endif

#endif
Loading

0 comments on commit 10c9d0a

Please sign in to comment.