aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/provider
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/provider')
-rw-r--r--src/core/provider/MCMailProvider.cc211
-rw-r--r--src/core/provider/MCMailProvider.h64
-rw-r--r--src/core/provider/MCMailProvidersManager.cc70
-rw-r--r--src/core/provider/MCMailProvidersManager.h49
-rw-r--r--src/core/provider/MCNetService.cc102
-rw-r--r--src/core/provider/MCNetService.h48
-rw-r--r--src/core/provider/MCProvider.h16
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