diff options
Diffstat (limited to 'src/core/provider')
-rw-r--r-- | src/core/provider/MCMailProvider.cc | 211 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.h | 64 | ||||
-rw-r--r-- | src/core/provider/MCMailProvidersManager.cc | 70 | ||||
-rw-r--r-- | src/core/provider/MCMailProvidersManager.h | 49 | ||||
-rw-r--r-- | src/core/provider/MCNetService.cc | 102 | ||||
-rw-r--r-- | src/core/provider/MCNetService.h | 48 | ||||
-rw-r--r-- | src/core/provider/MCProvider.h | 16 |
7 files changed, 560 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()); +} diff --git a/src/core/provider/MCMailProvider.h b/src/core/provider/MCMailProvider.h new file mode 100644 index 00000000..04f46750 --- /dev/null +++ b/src/core/provider/MCMailProvider.h @@ -0,0 +1,64 @@ +// +// MCMailProvider.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCMailProvider__ +#define __MAILCORE__MCMailProvider__ + +#include <MailCore/MCBaseTypes.h> + +#ifdef __cplusplus + +namespace mailcore { + class NetService; + + class MailProvider : public Object { + + public: + MailProvider(HashMap * info); + MailProvider(Data * infoData); + ~MailProvider(); + + void setIdentifier(String * identifier); + String * identifier(); + + Array * imapServices(); + Array * smtpServices(); + Array * popServices(); + + bool matchEmail(String * email); + bool matchMX(String * hostname); + + String * sentMailFolderPath(); + String * starredFolderPath(); + String * allMailFolderPath(); + String * trashFolderPath(); + String * draftsFolderPath(); + String * spamFolderPath(); + String * importantFolderPath(); + + bool isMainFolder(String * folderPath, String * prefix); + + virtual String * description(); + + private: + String * mIdentifier; + Array * mDomainMatch; + Array * mImapServices; + Array * mSmtpServices; + Array * mPopServices; + HashMap * mMailboxPaths; + Set* mMxSet; + + void init(); + void initWihInfo(HashMap * info); + }; +}; + +#endif + +#endif /* defined(__MAILCORE__MCMailProvider__) */ diff --git a/src/core/provider/MCMailProvidersManager.cc b/src/core/provider/MCMailProvidersManager.cc new file mode 100644 index 00000000..0b45f4da --- /dev/null +++ b/src/core/provider/MCMailProvidersManager.cc @@ -0,0 +1,70 @@ +// +// MCMailProvidersManager.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCMailProvidersManager.h" +#include "MCMailProvider.h" +#include "MCJSON.h" + +using namespace mailcore; + +void MailProvidersManager::init() +{ + mProviders = new HashMap(); +} + +MailProvider * MailProvidersManager::providerForEmail(String * email) +{ + mc_foreachdictionaryValue(Object, identifier, mProviders) { + MailProvider * provider; + + provider = (MailProvider *) mProviders->objectForKey(identifier); + if (provider->matchEmail(email)) + return provider; + } + + return NULL; +} + +MailProvider * MailProvidersManager::providerForMX(String * hostname) +{ + mc_foreachdictionaryValue(Object, identifier, mProviders) { + MailProvider * provider; + + provider = (MailProvider *) mProviders->objectForKey(identifier); + if (provider->matchMX(hostname)) + return provider; + } + + return NULL; +} + +MailProvider * MailProvidersManager::providerForIdentifier(String * identifier) +{ + return (MailProvider *) mProviders->objectForKey(identifier); +} + +void MailProvidersManager::registerProviders(HashMap * providers) +{ + mc_foreachdictionaryValue(Object, identifier, providers) { + MailProvider * provider; + + provider = new MailProvider((HashMap *) providers->objectForKey(identifier)); + provider->setIdentifier((String *) identifier); + mProviders->setObjectForKey(provider, identifier); + provider->release(); + } +} + +void MailProvidersManager::registerProvidersFilename(String * filename) +{ + HashMap * providersInfos; + + providersInfos = (HashMap *) JSON::objectFromJSONData(Data::dataWithContentsOfFile(filename)); + registerProviders(providersInfos); + providersInfos->release(); +} diff --git a/src/core/provider/MCMailProvidersManager.h b/src/core/provider/MCMailProvidersManager.h new file mode 100644 index 00000000..978ec7d9 --- /dev/null +++ b/src/core/provider/MCMailProvidersManager.h @@ -0,0 +1,49 @@ +// +// MCMailProvidersManager.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCMailProvidersManager__ +#define __MAILCORE__MCMailProvidersManager__ + +#include <MailCore/MCBaseTypes.h> + +#ifdef __cplusplus + +namespace mailcore { + class MailProvider; + + class MailProvidersManager : public Object { + + public: + static MailProvidersManager * sharedManager() + { + static MailProvidersManager * instance = new MailProvidersManager(); + instance->init(); + return instance; + } + + MailProvider * providerForEmail(String * email); + MailProvider * providerForMX(String * hostname); + MailProvider * providerForIdentifier(String * identifier); + + void registerProviders(HashMap * providers); + void registerProvidersFilename(String * filename); + + private: + MailProvidersManager() {}; + MailProvidersManager(MailProvidersManager const&); + void operator=(MailProvidersManager const&); + + HashMap * mProviders; + + void init(); + }; +} + +#endif + +#endif /* defined(__MAILCORE__MCMailProvidersManager__) */ diff --git a/src/core/provider/MCNetService.cc b/src/core/provider/MCNetService.cc new file mode 100644 index 00000000..0ffcbaef --- /dev/null +++ b/src/core/provider/MCNetService.cc @@ -0,0 +1,102 @@ +// +// MCNetService.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCNetService.h" + +using namespace mailcore; + +void NetService::init() { + +} + +NetService::NetService(HashMap * info) { + init(); + + bool ssl; + bool starttls; + + this->setHostname((String *) info->objectForKey(MCSTR("hostname"))); + this->setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue()); + ssl = ((Value *) info->objectForKey(MCSTR("ssl")))->boolValue(); + starttls = ((Value *) info->objectForKey(MCSTR("starttls")))->boolValue(); + if (ssl) { + mConnectionType = ConnectionTypeTLS; + } + else if (starttls) { + mConnectionType = ConnectionTypeStartTLS; + } + else { + mConnectionType = ConnectionTypeClear; + } +} + +NetService::~NetService() { + delete mHostname; +} + +void NetService::setHostname(String *hostname) +{ + mHostname = hostname; +} + +String * NetService::hostname() +{ + return mHostname; +} + +void NetService::setPort(unsigned int port) +{ + mPort = port; +} + +unsigned int NetService::port() +{ + return mPort; +} + +void NetService::setConnectionType(ConnectionType connectionType) +{ + mConnectionType = connectionType; +} + +ConnectionType NetService::connectionType() +{ + return mConnectionType; +} + +String * NetService::normalizedHostnameWithEmail(String * email) { + Array *components = email->componentsSeparatedByString(MCSTR("@")); + String *hostname = (String *) mHostname->copy(); + if (components->count() != 0) { + hostname->replaceOccurrencesOfString(MCSTR("{domain}"), (String *) components->lastObject()); + return hostname; + } + return mHostname; +} + +HashMap * NetService::info() { + HashMap * result; + + result = new HashMap(); + if (mHostname != NULL) { + result->setObjectForKey(mHostname, MCSTR("hostname")); + } + if (mPort != 0) { + result->setObjectForKey(Value::valueWithIntValue(mPort), MCSTR("port")); + } + switch (mConnectionType & ConnectionTypeMask) { + case ConnectionTypeTLS: + result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("ssl")); + break; + case ConnectionTypeStartTLS: + result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("starttls")); + break; + } + + return result; +} diff --git a/src/core/provider/MCNetService.h b/src/core/provider/MCNetService.h new file mode 100644 index 00000000..c2560ec3 --- /dev/null +++ b/src/core/provider/MCNetService.h @@ -0,0 +1,48 @@ +// +// MCNetService.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCNetService__ +#define __MAILCORE__MCNetService__ + +#include <MailCore/MCBaseTypes.h> +#include <MailCore/MCMessageConstants.h> + +#ifdef __cplusplus + +namespace mailcore { + class NetService : public Object { + + public: + NetService(HashMap * info); + ~NetService(); + + void setHostname(String * hostname); + String * hostname(); + + void setPort(unsigned int port); + unsigned int port(); + + void setConnectionType(ConnectionType connectionType); + ConnectionType connectionType(); + + HashMap * info(); + + String * normalizedHostnameWithEmail(String * email); + + private: + String * mHostname; + unsigned int mPort; + ConnectionType mConnectionType; + + void init(); + }; +} + +#endif + +#endif /* defined(__MAILCORE__MCNetService__) */ diff --git a/src/core/provider/MCProvider.h b/src/core/provider/MCProvider.h new file mode 100644 index 00000000..ef3c2f8c --- /dev/null +++ b/src/core/provider/MCProvider.h @@ -0,0 +1,16 @@ +// +// MCProvider.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE_MCPROVIDER_H_ +#define __MAILCORE_MCPROVIDER_H_ + +#include <MailCore/MCMailProvidersManager.h> +#include <MailCore/MCMailProvider.h> +#include <MailCore/MCNetService.h> + +#endif |