aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/MCCore.h1
-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
-rw-r--r--src/objc/provider/MCOMailProvider.h32
-rw-r--r--src/objc/provider/MCOMailProvider.mm113
-rw-r--r--src/objc/provider/MCOMailProvidersManager.h23
-rw-r--r--src/objc/provider/MCOMailProvidersManager.mm69
-rw-r--r--src/objc/provider/MCONetService.h29
-rw-r--r--src/objc/provider/MCONetService.mm90
14 files changed, 917 insertions, 0 deletions
diff --git a/src/core/MCCore.h b/src/core/MCCore.h
index 952ae1b5..24351281 100644
--- a/src/core/MCCore.h
+++ b/src/core/MCCore.h
@@ -16,5 +16,6 @@
#include <MailCore/MCRFC822.h>
#include <MailCore/MCSMTP.h>
#include <MailCore/MCRenderer.h>
+#include <MailCore/MCProvider.h>
#endif
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
diff --git a/src/objc/provider/MCOMailProvider.h b/src/objc/provider/MCOMailProvider.h
new file mode 100644
index 00000000..6a5ed9b4
--- /dev/null
+++ b/src/objc/provider/MCOMailProvider.h
@@ -0,0 +1,32 @@
+//
+// MCOMailProvider.h
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface MCOMailProvider : NSObject
+
+@property (nonatomic, copy) NSString * identifier;
+
+- (id) initWithInfo:(NSDictionary *)info;
+
+- (NSArray *) imapServices;
+- (NSArray *) smtpServices;
+- (NSArray *) popServices;
+
+- (BOOL) matchEmail:(NSString *)email;
+- (BOOL) matchMX:(NSString *)hostname;
+
+- (NSString *) sentMailFolderPath;
+- (NSString *) starredFolderPath;
+- (NSString *) allMailFolderPath;
+- (NSString *) trashFolderPath;
+- (NSString *) draftsFolderPath;
+- (NSString *) spamFolderPath;
+- (NSString *) importantFolderPath;
+
+@end
diff --git a/src/objc/provider/MCOMailProvider.mm b/src/objc/provider/MCOMailProvider.mm
new file mode 100644
index 00000000..4eb5f9fb
--- /dev/null
+++ b/src/objc/provider/MCOMailProvider.mm
@@ -0,0 +1,113 @@
+//
+// MCOMailProvider.m
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import "MCOMailProvider.h"
+#include "MCMailProvider.h"
+
+#import "NSDictionary+MCO.h"
+#import "NSArray+MCO.h"
+#import "NSString+MCO.h"
+
+@implementation MCOMailProvider {
+ mailcore::MailProvider * _provider;
+}
+
+- (mailcore::Object *) mco_mcObject
+{
+ return _provider;
+}
+
++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object
+{
+ mailcore::MailProvider * provider = (mailcore::MailProvider *) object;
+ return [[self alloc] initWithProvider:provider];
+}
+
+- (id) initWithInfo:(NSDictionary *)info
+{
+ self = [super init];
+
+ _provider = new mailcore::MailProvider([info mco_mcHashMap]);
+
+ return self;
+}
+
+- (id) initWithProvider:(mailcore::MailProvider *)provider
+{
+ self = [super init];
+
+ _provider = provider;
+
+ return self;
+}
+
+- (NSArray *) imapServices
+{
+ return [NSArray mco_arrayWithMCArray:_provider->imapServices()];
+}
+
+- (NSArray *) smtpServices
+{
+ return [NSArray mco_arrayWithMCArray:_provider->smtpServices()];
+}
+
+- (NSArray *) popServices
+{
+ return [NSArray mco_arrayWithMCArray:_provider->popServices()];
+}
+
+- (BOOL) matchEmail:(NSString *)email
+{
+ return _provider->matchEmail(email.mco_mcString);
+}
+
+- (BOOL) matchMX:(NSString *)hostname
+{
+ return _provider->matchMX(hostname.mco_mcString);
+}
+
+- (NSString *) sentMailFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->sentMailFolderPath()];
+}
+
+- (NSString *) starredFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->starredFolderPath()];
+}
+
+- (NSString *) allMailFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->allMailFolderPath()];
+}
+
+- (NSString *) trashFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->trashFolderPath()];
+}
+
+- (NSString *) draftsFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->draftsFolderPath()];
+}
+
+- (NSString *) spamFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->spamFolderPath()];
+}
+
+- (NSString *) importantFolderPath
+{
+ return [NSString mco_stringWithMCString:_provider->spamFolderPath()];
+}
+
+- (BOOL) isMainFolder:(NSString *)folderPath prefix:(NSString *)prefix {
+ return _provider->isMainFolder(folderPath.mco_mcString, prefix.mco_mcString);
+}
+
+@end
diff --git a/src/objc/provider/MCOMailProvidersManager.h b/src/objc/provider/MCOMailProvidersManager.h
new file mode 100644
index 00000000..55b5e6af
--- /dev/null
+++ b/src/objc/provider/MCOMailProvidersManager.h
@@ -0,0 +1,23 @@
+//
+// MCOMailProvidersManager.h
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class MCOMailProvider;
+
+@interface MCOMailProvidersManager : NSObject
+
++ (MCOMailProvidersManager *) sharedManager;
+
+- (MCOMailProvider *) providerForEmail:(NSString *)email;
+- (MCOMailProvider *) providerForMX:(NSString *)hostname;
+- (MCOMailProvider *) providerForIdentifier:(NSString *)identifier;
+- (void) registerProviders:(NSDictionary *)providers;
+- (void) registerProvidersFilename:(NSString *)filename;
+
+@end
diff --git a/src/objc/provider/MCOMailProvidersManager.mm b/src/objc/provider/MCOMailProvidersManager.mm
new file mode 100644
index 00000000..f7b11cb9
--- /dev/null
+++ b/src/objc/provider/MCOMailProvidersManager.mm
@@ -0,0 +1,69 @@
+//
+// MCOMailProvidersManager.m
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import "MCOMailProvidersManager.h"
+#include "MCMailProvidersManager.h"
+#import "MCOMailProvider.h"
+
+#import "NSString+MCO.h"
+#import "NSDictionary+MCO.h"
+#import "NSObject+MCO.h"
+
+@implementation MCOMailProvidersManager
+
++ (MCOMailProvidersManager *) sharedManager
+{
+ static MCOMailProvidersManager *sharedInstance = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ sharedInstance = [[self alloc] init]; \
+ });
+ return sharedInstance;
+}
+
+- (id) init
+{
+ NSString * filename;
+
+ self = [super init];
+
+ filename = [[NSBundle bundleForClass:[self class]] pathForResource:@"providers" ofType:@"json"];
+ [self registerProvidersFilename:filename];
+
+ return self;
+}
+
+- (void) registerProviders:(NSDictionary *)providers
+{
+ mailcore::MailProvidersManager::sharedManager()->registerProviders(providers.mco_mcHashMap);
+}
+
+- (void) registerProvidersFilename:(NSString *)filename
+{
+ mailcore::MailProvidersManager::sharedManager()->registerProvidersFilename(filename.mco_mcString);
+}
+
+- (MCOMailProvider *) providerForEmail:(NSString *)email
+{
+ mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForEmail(email.mco_mcString);
+ return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider];
+}
+
+- (MCOMailProvider *) providerForMX:(NSString *)hostname
+{
+ mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForMX(hostname.mco_mcString);
+ return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider];
+}
+
+- (MCOMailProvider *) providerForIdentifier:(NSString *)identifier
+{
+ mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForIdentifier(identifier.mco_mcString);
+ return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider];
+}
+
+@end
diff --git a/src/objc/provider/MCONetService.h b/src/objc/provider/MCONetService.h
new file mode 100644
index 00000000..e1e02141
--- /dev/null
+++ b/src/objc/provider/MCONetService.h
@@ -0,0 +1,29 @@
+//
+// MCONetService.h
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef enum {
+ MCONetServiceConnectionTypeClear = 1 << 0,
+ MCONetServiceConnectionTypeStartTLS = 1 << 1,
+ MCONetServiceConnectionTypeTLS = 1 << 2,
+ MCONetServiceConnectionTypeMask = (MCONetServiceConnectionTypeClear | MCONetServiceConnectionTypeStartTLS | MCONetServiceConnectionTypeTLS)
+} MCONetServiceConnectionType;
+
+@interface MCONetService : NSObject
+
+@property (nonatomic, copy) NSString * hostname;
+@property (nonatomic, assign) unsigned int port;
+@property (nonatomic, assign) MCONetServiceConnectionType connectionType;
+
++ (MCONetService *) netServiceWithInfo:(NSDictionary *)info;
+
+- (id) initWithInfo:(NSDictionary *)info;
+- (NSDictionary *) info;
+
+@end
diff --git a/src/objc/provider/MCONetService.mm b/src/objc/provider/MCONetService.mm
new file mode 100644
index 00000000..eb2ad6f5
--- /dev/null
+++ b/src/objc/provider/MCONetService.mm
@@ -0,0 +1,90 @@
+//
+// MCONetService.m
+// mailcore2
+//
+// Created by Robert Widmann on 4/28/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import "MCONetService.h"
+#include "MCNetService.h"
+
+#import "NSDictionary+MCO.h"
+#import "NSString+MCO.h"
+
+@implementation MCONetService {
+ mailcore::NetService * _netService;
+}
+
+- (mailcore::Object *) mco_mcObject
+{
+ return _netService;
+}
+
++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object
+{
+ mailcore::NetService * netService = (mailcore::NetService *) object;
+ return [[self alloc] initWithNetService:netService];
+}
+
++ (MCONetService *) netServiceWithInfo:(NSDictionary *)info
+{
+ return [[[MCONetService alloc] initWithInfo:info] autorelease];
+}
+
+- (id) initWithInfo:(NSDictionary *)info
+{
+ self = [super init];
+
+ _netService = new mailcore::NetService(info.mco_mcHashMap);
+
+ return self;
+}
+
+- (id) initWithNetService:(mailcore::NetService *)netService
+{
+ self = [super init];
+
+ _netService = netService;
+
+ return self;
+}
+
+- (void) setHostname:(NSString *)hostname {
+ _netService->setHostname(hostname.mco_mcString);
+}
+
+- (NSString *) hostname {
+ return [NSString mco_stringWithMCString:_netService->hostname()];
+}
+
+- (void) setPort:(unsigned int)port {
+ _netService->setPort(port);
+}
+
+- (unsigned int) port {
+ return _netService->port();
+}
+
+- (MCONetServiceConnectionType) connectionType {
+ return (MCONetServiceConnectionType) _netService->connectionType();
+}
+
+- (NSDictionary *) info
+{
+ return [NSDictionary mco_dictionaryWithMCHashMap:_netService->info()];
+}
+
+- (NSString*)hostnameWithEmail:(NSString*)email
+{
+ NSString *result = nil;
+ NSArray *components = [email componentsSeparatedByString:@"@"];
+ if (components.count == 0) {
+ return self.hostname;
+ } else {
+ result = [self.hostname stringByReplacingOccurrencesOfString:@"{domain}" withString:[components lastObject]];
+ }
+ return [NSString mco_stringWithMCString:_netService->normalizedHostnameWithEmail(email.mco_mcString)];
+}
+
+@end