diff options
Diffstat (limited to 'src/core/provider/MCMailProvider.cc')
-rw-r--r-- | src/core/provider/MCMailProvider.cc | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc new file mode 100644 index 00000000..e9f64872 --- /dev/null +++ b/src/core/provider/MCMailProvider.cc @@ -0,0 +1,211 @@ +// +// MCMailProvider.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCMailProvider.h" +#include "MCNetService.h" +#include "MCIterator.h" +#include "MCJSON.h" + +#include <regex.h> + +using namespace mailcore; + +void MailProvider::init() +{ + mImapServices = new Array(); + mSmtpServices = new Array(); + mPopServices = new Array(); + mMxSet = new Set(); +} + +void MailProvider::initWihInfo(HashMap * info) +{ + init(); + + Array * imapInfos; + Array * smtpInfos; + Array * popInfos; + HashMap * serverInfo; + Array * mxs; + + mDomainMatch = (Array *) info->objectForKey(MCSTR("domain-match"))->retain(); + mMailboxPaths = (HashMap *) info->objectForKey(MCSTR("mailboxes"))->retain(); + mxs = (Array *) info->objectForKey(MCSTR("mx")); + mc_foreacharray(String, mx, mxs) { + mMxSet->addObject(mx->lowercaseString()); + } + + serverInfo = (HashMap *) info->objectForKey(MCSTR("servers")); + imapInfos = (Array *) serverInfo->objectForKey(MCSTR("imap")); + smtpInfos = (Array *) serverInfo->objectForKey(MCSTR("smtp")); + popInfos = (Array *) serverInfo->objectForKey(MCSTR("pop")); + + mc_foreacharray(HashMap, imapInfo, imapInfos) { + NetService * service; + + service = new NetService(imapInfo); + mImapServices->addObject(service); + service->release(); + } + + mc_foreacharray(HashMap, smtpInfo, smtpInfos) { + NetService * service; + + service = new NetService(smtpInfo); + mSmtpServices->addObject(service); + service->release(); + } + + mc_foreacharray(HashMap, popInfo, popInfos) { + NetService * service; + + service = new NetService(popInfo); + mPopServices->addObject(service); + service->release(); + } +} + +MailProvider::MailProvider(HashMap * info) +{ + initWihInfo(info); +} + +MailProvider::MailProvider(Data * infoData) { + initWihInfo((HashMap *) JSON::objectFromJSONData(infoData)); +} + +MailProvider::~MailProvider() { + delete mImapServices; + delete mSmtpServices; + delete mPopServices; + delete mMxSet; + delete mDomainMatch; + delete mMailboxPaths; + delete mIdentifier; +} + +void MailProvider::setIdentifier(String * identifier) { + mIdentifier = identifier; +} + +String * MailProvider::identifier() { + return mIdentifier; +} + +Array * MailProvider::imapServices() +{ + return mImapServices; +} + +Array * MailProvider::smtpServices() +{ + return mSmtpServices; +} + +Array * MailProvider::popServices() +{ + return mPopServices; +} + +bool MailProvider::matchEmail(String * email) +{ + Array * components; + String * domain; + const char * cDomain; + + components = email->componentsSeparatedByString(MCSTR("@")); + if (components->count() < 2) + 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) + return true; + } + + return false; +} + +bool MailProvider::matchMX(String * hostname) +{ + return mMxSet->containsObject(hostname->lowercaseString()); +} + +String * MailProvider::sentMailFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("sentmail")); +} + +String * MailProvider::starredFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("starred")); +} + +String * MailProvider::allMailFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("allmail")); +} + +String * MailProvider::trashFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("trash")); +} + +String * MailProvider::draftsFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("drafts")); +} + +String * MailProvider::spamFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("spam")); +} + +String * MailProvider::importantFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("important")); +} + +bool MailProvider::isMainFolder(String * folderPath, String * prefix) +{ + mc_foreachdictionaryValue(Object, path, mMailboxPaths) { + String * fullPath; + + if (prefix != NULL) { + fullPath = prefix->stringByAppendingString((String *) path); + } + else { + fullPath = (String *) path; + } + + if (fullPath->isEqual(folderPath)) + return true; + } + + return false; +} + +String * MailProvider::description() { + return String::stringWithUTF8Format("<%s:%p, %s>", className()->UTF8Characters(), this, identifier()); +} |