diff options
author | marcopifferi <marcopifferi@users.noreply.github.com> | 2014-03-20 10:14:37 +0100 |
---|---|---|
committer | marcopifferi <marcopifferi@users.noreply.github.com> | 2014-03-20 10:14:37 +0100 |
commit | ac745ea4778b2602c366cb328f87d14f2ee46399 (patch) | |
tree | 5a74cb347c7d572c2a7403985f6a7ddb93b6482f | |
parent | f262b42e781de2d68ae4adbbf14f44b14b901fc4 (diff) | |
parent | 8871a6cb9ac3e2713e03c78ee0275a35f1835efb (diff) |
Merge pull request #1 from MailCore/master
merging latest mail core 2
23 files changed, 179 insertions, 74 deletions
diff --git a/resources/providers.json b/resources/providers.json index 7286330a..91d14182 100644 --- a/resources/providers.json +++ b/resources/providers.json @@ -66,15 +66,15 @@ } ] }, - "mx":[ - "mx1.sub3.homie.mail.dreamhost.com", - "mx2.sub3.homie.mail.dreamhost.com", - "mx1.sub4.homie.mail.dreamhost.com", - "mx2.sub4.homie.mail.dreamhost.com", - "mx1.sub5.homie.mail.dreamhost.com", - "mx2.sub5.homie.mail.dreamhost.com", - "mx1.balanced.homie.mail.dreamhost.com", - "mx2.balanced.homie.mail.dreamhost.com" + "mx-match":[ + "mx1\\.sub3\\.homie\\.mail\\.dreamhost\\.com", + "mx2\\.sub3\\.homie\\.mail\\.dreamhost\\.com", + "mx1\\.sub4\\.homie\\.mail\\.dreamhost\\.com", + "mx2\\.sub4\\.homie\\.mail\\.dreamhost\\.com", + "mx1\\.sub5\\.homie\\.mail\\.dreamhost\\.com", + "mx2\\.sub5\\.homie\\.mail\\.dreamhost\\.com", + "mx1\\.balanced\\.homie\\.mail\\.dreamhost\\.com", + "mx2\\.balanced\\.homie\\.mail\\.dreamhost\\.com" ], "mailboxes":{ "drafts":"Drafts", @@ -318,12 +318,12 @@ } ] }, - "mx":[ - "aspmx2.googlemail.com", - "aspmx.l.google.com", - "aspmx3.googlemail.com", - "alt1.aspmx.l.google.com", - "alt2.aspmx.l.google.com" + "mx-match":[ + "aspmx2\\.googlemail\\.com", + "aspmx\\.l\\.google\\.com", + "aspmx3\\.googlemail\\.com", + "alt1\\.aspmx\\.l\\.google\\.com", + "alt2\\.aspmx\\.l\\.google\\.com" ], "domain-match":[ "googlemail\\.com", @@ -634,9 +634,9 @@ } ] }, - "mx":[ - "mx1.emailsrvr.com", - "mx2.emailsrvr.com" + "mx-match":[ + "mx1\\.emailsrvr\\.com", + "mx2\\.emailsrvr\\.com" ], "mailboxes":{ "drafts":"Drafts", @@ -710,12 +710,8 @@ } ] }, - "mx":[ - "mx0.ovh.net", - "mx1.ovh.net", - "mx2.ovh.net", - "mx3.ovh.net", - "mx4.ovh.net" + "mx-match":[ + "mx\\d\\.ovh\\.net" ], "mailboxes":{ "drafts":"Drafts", @@ -769,6 +765,9 @@ } ] }, + "mx-match":[ + ".*\\.mail\\.outlook\\.com" + ], "domain-match":[ "outlook\\.com", "outlook\\.com\\.ar", @@ -865,4 +864,4 @@ "trash": "Trash" } } -}
\ No newline at end of file +} diff --git a/scripts/prepare-libetpan-ios.sh b/scripts/prepare-libetpan-ios.sh index d4de737b..8e839978 100755 --- a/scripts/prepare-libetpan-ios.sh +++ b/scripts/prepare-libetpan-ios.sh @@ -15,7 +15,7 @@ else fi url="https://github.com/dinhviethoa/libetpan.git" -rev=b6f16696b39aafcd4a4e5b6183d4cf1d97197203 +rev=f1307f3bb156b28629efe2c8339b522af58898f5 pushd `dirname $0` > /dev/null scriptpath=`pwd` diff --git a/scripts/prepare-libetpan-macos.sh b/scripts/prepare-libetpan-macos.sh index 9fe80a19..02489156 100755 --- a/scripts/prepare-libetpan-macos.sh +++ b/scripts/prepare-libetpan-macos.sh @@ -1,7 +1,7 @@ #!/bin/sh url="https://github.com/dinhviethoa/libetpan.git" -rev=b6f16696b39aafcd4a4e5b6183d4cf1d97197203 +rev=f1307f3bb156b28629efe2c8339b522af58898f5 pushd `dirname $0` > /dev/null scriptpath=`pwd` diff --git a/src/core/abstract/MCAbstractMessage.cc b/src/core/abstract/MCAbstractMessage.cc index cf3fd6c4..1d1d7efc 100644 --- a/src/core/abstract/MCAbstractMessage.cc +++ b/src/core/abstract/MCAbstractMessage.cc @@ -80,6 +80,11 @@ Array * AbstractMessage::htmlInlineAttachments() return HTMLRenderer::htmlInlineAttachmentsForMessage(this); } +Array * AbstractMessage::requiredPartsForRendering() +{ + return HTMLRenderer::requiredPartsForRendering(this); +} + HashMap * AbstractMessage::serializable() { HashMap * result = Object::serializable(); diff --git a/src/core/abstract/MCAbstractMessage.h b/src/core/abstract/MCAbstractMessage.h index f7edd0c9..b03d5f2a 100644 --- a/src/core/abstract/MCAbstractMessage.h +++ b/src/core/abstract/MCAbstractMessage.h @@ -24,6 +24,7 @@ namespace mailcore { virtual Array * /* AbstractPart */ attachments(); virtual Array * /* AbstractPart */ htmlInlineAttachments(); + virtual Array * /* AbstractPart */ requiredPartsForRendering(); public: //subclass behavior AbstractMessage(AbstractMessage * other); diff --git a/src/core/abstract/MCMessageConstants.h b/src/core/abstract/MCMessageConstants.h index 20be3e31..dcc1c7cd 100644 --- a/src/core/abstract/MCMessageConstants.h +++ b/src/core/abstract/MCMessageConstants.h @@ -23,6 +23,7 @@ namespace mailcore { AuthTypeSASLNTLM = 1 << 6, AuthTypeSASLKerberosV4 = 1 << 7, AuthTypeXOAuth2 = 1 << 8, + AuthTypeXOAuth2Outlook = 1 << 9, }; enum IMAPFolderFlag { diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index 6840a279..3619530b 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -125,7 +125,7 @@ void OperationQueue::runOperations() if (needsCheckRunning) { retain(); // (1) - MCLog("check running %p", this); + //MCLog("check running %p", this); #if __APPLE__ performMethodOnDispatchQueue((Object::Method) &OperationQueue::checkRunningOnMainThread, this, mDispatchQueue); #else diff --git a/src/core/basetypes/MCSet.cc b/src/core/basetypes/MCSet.cc index ad615388..ceccbdcc 100644 --- a/src/core/basetypes/MCSet.cc +++ b/src/core/basetypes/MCSet.cc @@ -45,7 +45,7 @@ Set * Set::setWithArray(Array * objects) String * Set::description() { String * result = String::string(); - result->appendUTF8Format("<%s:%p ", className(), this); + result->appendUTF8Format("<%s:%p ", MCUTF8(className()), this); result->appendString(mHash->allKeys()->description()); result->appendUTF8Characters(">"); return result; diff --git a/src/core/basetypes/MCString.cc b/src/core/basetypes/MCString.cc index 054cbb80..3f0338db 100644 --- a/src/core/basetypes/MCString.cc +++ b/src/core/basetypes/MCString.cc @@ -1795,6 +1795,24 @@ String * String::flattenHTML() return flattenHTMLAndShowBlockquote(true); } +String * String::stripWhitespace() +{ + String *str = (String *)copy(); + + str->replaceOccurrencesOfString(MCSTR("\t"), MCSTR(" ")); + str->replaceOccurrencesOfString(MCSTR("\n"), MCSTR(" ")); + str->replaceOccurrencesOfString(MCSTR("\v"), MCSTR(" ")); + str->replaceOccurrencesOfString(MCSTR("\f"), MCSTR(" ")); + str->replaceOccurrencesOfString(MCSTR("\r"), MCSTR(" ")); + + while (str->replaceOccurrencesOfString(MCSTR(" "), MCSTR(" ")) > 0) { + /* do nothing */ + } + + return str; +} + + bool String::hasSuffix(String * suffix) { if (mLength >= suffix->mLength) { diff --git a/src/core/basetypes/MCString.h b/src/core/basetypes/MCString.h index 7fd07570..25439cf2 100644 --- a/src/core/basetypes/MCString.h +++ b/src/core/basetypes/MCString.h @@ -86,6 +86,8 @@ namespace mailcore { virtual String * flattenHTMLAndShowBlockquote(bool showBlockquote); virtual String * flattenHTMLAndShowBlockquoteAndLink(bool showBlockquote, bool showLink); + virtual String * stripWhitespace(); + virtual String * lastPathComponent(); virtual String * pathExtension(); virtual Data * dataUsingEncoding(const char * charset = NULL); diff --git a/src/core/imap/MCIMAPMessage.cc b/src/core/imap/MCIMAPMessage.cc index 6845d19a..dfb26752 100644 --- a/src/core/imap/MCIMAPMessage.cc +++ b/src/core/imap/MCIMAPMessage.cc @@ -5,6 +5,7 @@ #include "MCIMAPMessagePart.h" #include "MCIMAPMultipart.h" #include "MCHTMLRenderer.h" +#include "MCHTMLRendererCallback.h" using namespace mailcore; @@ -242,7 +243,9 @@ HashMap * IMAPMessage::serializable() if (customFlags() != NULL) { result->setObjectForKey(MCSTR("customFlags"), customFlags()); } - result->setObjectForKey(MCSTR("mainPart"), mMainPart->serializable()); + if (mMainPart != NULL) { + result->setObjectForKey(MCSTR("mainPart"), mMainPart->serializable()); + } if (gmailLabels() != NULL) { result->setObjectForKey(MCSTR("gmailLabels"), gmailLabels()); } diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 9cdf0ce9..b387e48f 100755 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -837,6 +837,7 @@ void IMAPSession::login(ErrorCode * pError) break; case AuthTypeXOAuth2: + case AuthTypeXOAuth2Outlook: r = mailimap_oauth2_authenticate(mImap, utf8username, MCUTF8(mOAuth2Token)); break; } @@ -3751,17 +3752,8 @@ String * IMAPSession::plainTextBodyRendering(IMAPMessage * message, String * fol } String * plainTextBodyString = htmlBodyString->flattenHTML(); - if (stripWhitespace) { - plainTextBodyString->replaceOccurrencesOfString(MCSTR("\t"), MCSTR(" ")); - plainTextBodyString->replaceOccurrencesOfString(MCSTR("\n"), MCSTR(" ")); - plainTextBodyString->replaceOccurrencesOfString(MCSTR("\v"), MCSTR(" ")); - plainTextBodyString->replaceOccurrencesOfString(MCSTR("\f"), MCSTR(" ")); - plainTextBodyString->replaceOccurrencesOfString(MCSTR("\r"), MCSTR(" ")); - - while (plainTextBodyString->replaceOccurrencesOfString(MCSTR(" "), MCSTR(" ")) > 0) { - /* do nothing */ - } + return plainTextBodyString->stripWhitespace(); } return plainTextBodyString; diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc index 7a8cb4cb..aec6f348 100644 --- a/src/core/provider/MCMailProvider.cc +++ b/src/core/provider/MCMailProvider.cc @@ -22,7 +22,7 @@ void MailProvider::init() mSmtpServices = new Array(); mPopServices = new Array(); mDomainMatch = new Array(); - mMxSet = new Set(); + mMxMatch = new Array(); mMailboxPaths = NULL; } @@ -39,7 +39,7 @@ MailProvider::MailProvider(MailProvider * other) MC_SAFE_REPLACE_COPY(Array, mSmtpServices, other->mSmtpServices); MC_SAFE_REPLACE_COPY(Array, mPopServices, other->mPopServices); MC_SAFE_REPLACE_COPY(Array, mDomainMatch, other->mDomainMatch); - MC_SAFE_REPLACE_COPY(Set, mMxSet, other->mMxSet); + MC_SAFE_REPLACE_COPY(Array, mMxMatch, other->mMxMatch); MC_SAFE_REPLACE_COPY(HashMap, mMailboxPaths, other->mMailboxPaths); } @@ -48,7 +48,7 @@ MailProvider::~MailProvider() MC_SAFE_RELEASE(mImapServices); MC_SAFE_RELEASE(mSmtpServices); MC_SAFE_RELEASE(mPopServices); - MC_SAFE_RELEASE(mMxSet); + MC_SAFE_RELEASE(mMxMatch); MC_SAFE_RELEASE(mDomainMatch); MC_SAFE_RELEASE(mMailboxPaths); MC_SAFE_RELEASE(mIdentifier); @@ -68,7 +68,6 @@ void MailProvider::fillWithInfo(HashMap * info) Array * smtpInfos; Array * popInfos; HashMap * serverInfo; - Array * mxs; MC_SAFE_RELEASE(mDomainMatch); if (info->objectForKey(MCSTR("domain-match")) != NULL) { @@ -78,10 +77,9 @@ void MailProvider::fillWithInfo(HashMap * info) if (info->objectForKey(MCSTR("mailboxes")) != NULL) { mMailboxPaths = (HashMap *) info->objectForKey(MCSTR("mailboxes"))->retain(); } - mxs = (Array *) info->objectForKey(MCSTR("mx")); - mMxSet->removeAllObjects(); - mc_foreacharray(String, mx, mxs) { - mMxSet->addObject(mx->lowercaseString()); + MC_SAFE_RELEASE(mMxMatch); + if (info->objectForKey(MCSTR("mx-match")) != NULL) { + mMxMatch = (Array *) info->objectForKey(MCSTR("mx-match"))->retain(); } serverInfo = (HashMap *) info->objectForKey(MCSTR("servers")); @@ -148,25 +146,11 @@ bool MailProvider::matchEmail(String * email) return false; domain = (String *) components->lastObject(); - cDomain = domain->UTF8Characters(); - + mc_foreacharray(String, match, mDomainMatch) { - regex_t r; - bool matched; - - match = String::stringWithUTF8Format("^%s$", match->UTF8Characters()); - if (regcomp(&r, match->UTF8Characters(), REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0) - continue; - - matched = false; - if (regexec(&r, cDomain, 0, NULL, 0) == 0) { - matched = true; - } - - regfree(&r); - - if (matched) + if (matchDomain(match, domain)){ return true; + } } return false; @@ -174,7 +158,36 @@ bool MailProvider::matchEmail(String * email) bool MailProvider::matchMX(String * hostname) { - return mMxSet->containsObject(hostname->lowercaseString()); + mc_foreacharray(String, match, mMxMatch) { + if (matchDomain(match, hostname)){ + return true; + } + } + + return false; +} + +bool MailProvider::matchDomain(String * match, String * domain) +{ + const char * cDomain; + regex_t r; + bool matched; + + cDomain = domain->UTF8Characters(); + match = String::stringWithUTF8Format("^%s$", match->UTF8Characters()); + matched = false; + + if (regcomp(&r, match->UTF8Characters(), REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0){ + return matched; + } + + if (regexec(&r, cDomain, 0, NULL, 0) == 0) { + matched = true; + } + + regfree(&r); + + return matched; } String * MailProvider::sentMailFolderPath() @@ -232,7 +245,7 @@ bool MailProvider::isMainFolder(String * folderPath, String * prefix) } String * MailProvider::description() -{ +{ return String::stringWithUTF8Format("<%s:%p, %s>", className()->UTF8Characters(), this, MCUTF8(mIdentifier)); } diff --git a/src/core/provider/MCMailProvider.h b/src/core/provider/MCMailProvider.h index 026482b3..29ab4fa6 100644 --- a/src/core/provider/MCMailProvider.h +++ b/src/core/provider/MCMailProvider.h @@ -57,12 +57,13 @@ namespace mailcore { private: String * mIdentifier; Array * /* String */ mDomainMatch; + Array * /* String */ mMxMatch; Array * /* NetService */ mImapServices; Array * /* NetService */ mSmtpServices; Array * /* NetService */ mPopServices; HashMap * mMailboxPaths; - Set * mMxSet; + virtual bool matchDomain(String * match, String * domain); void init(); }; @@ -70,4 +71,4 @@ namespace mailcore { #endif -#endif
\ No newline at end of file +#endif diff --git a/src/core/renderer/MCHTMLRenderer.cc b/src/core/renderer/MCHTMLRenderer.cc index 45c3a77a..bbc0d591 100644 --- a/src/core/renderer/MCHTMLRenderer.cc +++ b/src/core/renderer/MCHTMLRenderer.cc @@ -17,8 +17,33 @@ using namespace mailcore; class HTMLRendererIMAPDummyCallback : public HTMLRendererIMAPCallback { +private: + Array *mRequiredParts; + public: - virtual Data * dataForIMAPPart(String * folder, IMAPPart * part) { return Data::data(); } + HTMLRendererIMAPDummyCallback() + { + mRequiredParts = Array::array(); + mRequiredParts->retain(); + } + + virtual ~HTMLRendererIMAPDummyCallback() + { + MC_SAFE_RELEASE(mRequiredParts); + } + + + virtual Data * dataForIMAPPart(String * folder, IMAPPart * part) + { + mRequiredParts->addObject(part); + return Data::data(); + } + + Array * requiredParts() + { + return mRequiredParts; + } + }; enum { @@ -178,11 +203,12 @@ static String * htmlForAbstractMessage(String * folder, AbstractMessage * messag context.firstRendered = 0; context.folder = folder; context.state = RENDER_STATE_NONE; - + context.hasMixedTextAndAttachments = false; context.pass = 0; context.firstAttachment = false; context.hasTextPart = false; + htmlForAbstractPart(mainPart, &context); context.relatedAttachments = relatedAttachments; @@ -414,7 +440,9 @@ static String * htmlForAbstractMultipartRelated(AbstractMultipart * part, htmlRe if (context->relatedAttachments != NULL) { for(unsigned int i = 1 ; i < part->parts()->count() ; i ++) { AbstractPart * otherSubpart = (AbstractPart *) part->parts()->objectAtIndex(i); - context->relatedAttachments->addObject(otherSubpart); + if (context->relatedAttachments != NULL) { + context->relatedAttachments->addObject(otherSubpart); + } } } return htmlForAbstractPart(subpart, context); @@ -509,3 +537,16 @@ Array * HTMLRenderer::htmlInlineAttachmentsForMessage(AbstractMessage * message) (void) ignoredResult; // remove unused variable warning. return htmlInlineAttachments; } + +Array * HTMLRenderer::requiredPartsForRendering(AbstractMessage * message) +{ + HTMLRendererIMAPDummyCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); + String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, NULL, NULL, NULL); + + Array *requiredParts = dataCallback->requiredParts(); + + delete dataCallback; + dataCallback = NULL; + (void) ignoredResult; // remove unused variable warning. + return requiredParts; +} diff --git a/src/core/renderer/MCHTMLRenderer.h b/src/core/renderer/MCHTMLRenderer.h index 47a21acc..6d59cb67 100644 --- a/src/core/renderer/MCHTMLRenderer.h +++ b/src/core/renderer/MCHTMLRenderer.h @@ -34,6 +34,7 @@ namespace mailcore { static Array * /* AbstractPart */ attachmentsForMessage(AbstractMessage * message); static Array * /* AbstractPart */ htmlInlineAttachmentsForMessage(AbstractMessage * message); + static Array * /* AbstractPart */ requiredPartsForRendering(AbstractMessage * message); }; }; diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc index b9f71cb9..c6f28ff9 100644 --- a/src/core/smtp/MCSMTPSession.cc +++ b/src/core/smtp/MCSMTPSession.cc @@ -400,7 +400,8 @@ void SMTPSession::login(ErrorCode * pError) { int r; - if ((authType() != AuthTypeXOAuth2) && ((username() == NULL) || (password() == NULL))) { + if ((authType() != AuthTypeXOAuth2) && (authType() != AuthTypeXOAuth2Outlook) && + ((username() == NULL) || (password() == NULL))) { mState = STATE_LOGGEDIN; * pError = ErrorNone; return; @@ -525,6 +526,15 @@ void SMTPSession::login(ErrorCode * pError) r = mailsmtp_oauth2_authenticate(mSmtp, utf8Username, MCUTF8(mOAuth2Token)); break; } + + case AuthTypeXOAuth2Outlook: { + const char * utf8Username = MCUTF8(mUsername); + if (utf8Username == NULL) { + utf8Username = ""; + } + r = mailsmtp_oauth2_outlook_authenticate(mSmtp, utf8Username, MCUTF8(mOAuth2Token)); + break; + } } if (r == MAILSMTP_ERROR_STREAM) { * pError = ErrorConnection; diff --git a/src/objc/abstract/MCOAbstractMessage.h b/src/objc/abstract/MCOAbstractMessage.h index f15975dd..d917d82f 100644 --- a/src/objc/abstract/MCOAbstractMessage.h +++ b/src/objc/abstract/MCOAbstractMessage.h @@ -38,6 +38,12 @@ It will return an array of MCOAttachment for MCOMessageBuilder. */ - (NSArray * /* MCOAbstractPart */) htmlInlineAttachments; +/** + Returns parts required to render the message as plain text or html. + This does not include inline images and attachments, but only the text content + */ +- (NSArray *) requiredPartsForRendering; + @end #endif diff --git a/src/objc/abstract/MCOAbstractMessage.mm b/src/objc/abstract/MCOAbstractMessage.mm index 637d6172..a1eb4250 100644 --- a/src/objc/abstract/MCOAbstractMessage.mm +++ b/src/objc/abstract/MCOAbstractMessage.mm @@ -85,4 +85,9 @@ MCO_OBJC_SYNTHESIZE(MessageHeader, setHeader, header) return MCO_OBJC_BRIDGE_GET(htmlInlineAttachments); } +- (NSArray *) requiredPartsForRendering +{ + return MCO_OBJC_BRIDGE_GET(requiredPartsForRendering); +} + @end diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h index e5ab8184..eb276e0f 100644 --- a/src/objc/abstract/MCOConstants.h +++ b/src/objc/abstract/MCOConstants.h @@ -35,6 +35,8 @@ typedef enum { MCOAuthTypeSASLKerberosV4 = 1 << 7, /** OAuth2 authentication.*/ MCOAuthTypeXOAuth2 = 1 << 8, + /** OAuth2 authentication on outlook.com.*/ + MCOAuthTypeXOAuth2Outlook = 1 << 9, } MCOAuthType; /** It's the IMAP flags of the folder.*/ diff --git a/src/objc/smtp/MCOSMTPSession.mm b/src/objc/smtp/MCOSMTPSession.mm index b6ae6a4f..17dc5057 100644 --- a/src/objc/smtp/MCOSMTPSession.mm +++ b/src/objc/smtp/MCOSMTPSession.mm @@ -124,7 +124,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, return result; } -- (MCOOperation *) checkAccountOperationWithFrom:(MCOAddress *)from +- (MCOSMTPOperation *) checkAccountOperationWithFrom:(MCOAddress *)from { mailcore::SMTPOperation *coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation(MCO_FROM_OBJC(mailcore::Address, from)); MCOSMTPOperation * result = [[[MCOSMTPOperation alloc] initWithMCOperation:coreOp] autorelease]; diff --git a/src/objc/utils/NSString+MCO.h b/src/objc/utils/NSString+MCO.h index ac374bf7..71e99a44 100644 --- a/src/objc/utils/NSString+MCO.h +++ b/src/objc/utils/NSString+MCO.h @@ -34,6 +34,7 @@ namespace mailcore { - (NSString *) mco_htmlEncodedString; - (NSString *) mco_cleanedHTMLString; +- (NSString *) mco_strippedWhitespace; @end diff --git a/src/objc/utils/NSString+MCO.mm b/src/objc/utils/NSString+MCO.mm index e9933fab..68f75302 100644 --- a/src/objc/utils/NSString+MCO.mm +++ b/src/objc/utils/NSString+MCO.mm @@ -65,5 +65,9 @@ return [NSString mco_stringWithMCString:[self mco_mcString]->cleanedHTMLString()]; } +- (NSString *) mco_strippedWhitespace +{ + return [NSString mco_stringWithMCString:[self mco_mcString]->stripWhitespace()]; +} @end |