aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/provider
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-05-04 23:17:33 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-05-04 23:17:33 -0700
commit55f998e5076e6ee5607580a56bdac68e605e1050 (patch)
tree8313b526775f494806ff82f67d0f6e31e39ab6bb /src/core/provider
parentcf0e72e7f751413c57b0a2dd1c7adcf7e1a37c38 (diff)
Cleaned provider implementation
Diffstat (limited to 'src/core/provider')
-rw-r--r--src/core/provider/MCMailProvider.cc84
-rw-r--r--src/core/provider/MCMailProvider.h47
-rw-r--r--src/core/provider/MCMailProvidersManager.cc15
-rw-r--r--src/core/provider/MCMailProvidersManager.h25
-rw-r--r--src/core/provider/MCNetService.cc44
-rw-r--r--src/core/provider/MCNetService.h31
6 files changed, 138 insertions, 108 deletions
diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc
index 40d4abf7..08cedfd6 100644
--- a/src/core/provider/MCMailProvider.cc
+++ b/src/core/provider/MCMailProvider.cc
@@ -17,31 +17,57 @@ using namespace mailcore;
void MailProvider::init()
{
+ mIdentifier = NULL;
mImapServices = new Array();
mSmtpServices = new Array();
mPopServices = new Array();
+ mDomainMatch = new Array();
mMxSet = new Set();
+ mMailboxPaths = NULL;
}
-void MailProvider::initWihInfo(HashMap * info)
+MailProvider::MailProvider()
+{
+ init();
+}
+
+MailProvider::~MailProvider()
+{
+ MC_SAFE_RELEASE(mImapServices);
+ MC_SAFE_RELEASE(mSmtpServices);
+ MC_SAFE_RELEASE(mPopServices);
+ MC_SAFE_RELEASE(mMxSet);
+ MC_SAFE_RELEASE(mDomainMatch);
+ MC_SAFE_RELEASE(mMailboxPaths);
+ MC_SAFE_RELEASE(mIdentifier);
+}
+
+MailProvider * MailProvider::providerWithInfo(HashMap * info)
+{
+ MailProvider * provider = new MailProvider();
+ provider->fillWithInfo(info);
+ provider->autorelease();
+ return provider;
+}
+
+void MailProvider::fillWithInfo(HashMap * info)
{
- init();
-
Array * imapInfos;
Array * smtpInfos;
Array * popInfos;
HashMap * serverInfo;
Array * mxs;
-
- mDomainMatch = NULL;
+
+ MC_SAFE_RELEASE(mDomainMatch);
if (info->objectForKey(MCSTR("domain-match")) != NULL) {
mDomainMatch = (Array *) info->objectForKey(MCSTR("domain-match"))->retain();
}
- mMailboxPaths = NULL;
+ MC_SAFE_RELEASE(mMailboxPaths);
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());
}
@@ -51,55 +77,34 @@ void MailProvider::initWihInfo(HashMap * info)
smtpInfos = (Array *) serverInfo->objectForKey(MCSTR("smtp"));
popInfos = (Array *) serverInfo->objectForKey(MCSTR("pop"));
+ mImapServices->removeAllObjects();
mc_foreacharray(HashMap, imapInfo, imapInfos) {
- NetService * service;
-
- service = new NetService(imapInfo);
+ NetService * service = NetService::serviceWithInfo(imapInfo);
mImapServices->addObject(service);
- service->release();
}
+ mSmtpServices->removeAllObjects();
mc_foreacharray(HashMap, smtpInfo, smtpInfos) {
- NetService * service;
-
- service = new NetService(smtpInfo);
+ NetService * service = NetService::serviceWithInfo(smtpInfo);
mSmtpServices->addObject(service);
service->release();
}
+ mPopServices->removeAllObjects();
mc_foreacharray(HashMap, popInfo, popInfos) {
- NetService * service;
-
- service = new NetService(popInfo);
+ NetService * service = NetService::serviceWithInfo(popInfo);
mPopServices->addObject(service);
service->release();
}
}
-MailProvider::MailProvider(HashMap * info)
+void MailProvider::setIdentifier(String * identifier)
{
- 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;
+ MC_SAFE_REPLACE_COPY(String, mIdentifier, identifier);
}
-void MailProvider::setIdentifier(String * identifier) {
- mIdentifier = identifier;
-}
-
-String * MailProvider::identifier() {
+String * MailProvider::identifier()
+{
return mIdentifier;
}
@@ -212,6 +217,7 @@ bool MailProvider::isMainFolder(String * folderPath, String * prefix)
return false;
}
-String * MailProvider::description() {
- return String::stringWithUTF8Format("<%s:%p, %s>", className()->UTF8Characters(), this, identifier());
+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 04f46750..da8b2fa3 100644
--- a/src/core/provider/MCMailProvider.h
+++ b/src/core/provider/MCMailProvider.h
@@ -6,8 +6,8 @@
// Copyright (c) 2013 MailCore. All rights reserved.
//
-#ifndef __MAILCORE__MCMailProvider__
-#define __MAILCORE__MCMailProvider__
+#ifndef __MAILCORE_MCMAILPROVIDER_H_
+#define __MAILCORE_MCMAILPROVIDER_H_
#include <MailCore/MCBaseTypes.h>
@@ -19,32 +19,38 @@ namespace mailcore {
class MailProvider : public Object {
public:
- MailProvider(HashMap * info);
- MailProvider(Data * infoData);
- ~MailProvider();
+ static MailProvider * providerWithInfo(HashMap * info);
+
+ MailProvider();
+ virtual ~MailProvider();
- void setIdentifier(String * identifier);
- String * identifier();
+ virtual String * identifier();
- Array * imapServices();
- Array * smtpServices();
- Array * popServices();
+ virtual Array * imapServices();
+ virtual Array * smtpServices();
+ virtual Array * popServices();
- bool matchEmail(String * email);
- bool matchMX(String * hostname);
+ virtual bool matchEmail(String * email);
+ virtual bool matchMX(String * hostname);
- String * sentMailFolderPath();
- String * starredFolderPath();
- String * allMailFolderPath();
- String * trashFolderPath();
- String * draftsFolderPath();
- String * spamFolderPath();
- String * importantFolderPath();
+ virtual String * sentMailFolderPath();
+ virtual String * starredFolderPath();
+ virtual String * allMailFolderPath();
+ virtual String * trashFolderPath();
+ virtual String * draftsFolderPath();
+ virtual String * spamFolderPath();
+ virtual String * importantFolderPath();
- bool isMainFolder(String * folderPath, String * prefix);
+ // Returns true if one of the folders above matches the given one.
+ virtual bool isMainFolder(String * folderPath, String * prefix);
+ public: // subclass behavior
virtual String * description();
+ public: // private
+ virtual void setIdentifier(String * identifier);
+ virtual void fillWithInfo(HashMap * info);
+
private:
String * mIdentifier;
Array * mDomainMatch;
@@ -55,7 +61,6 @@ namespace mailcore {
Set* mMxSet;
void init();
- void initWihInfo(HashMap * info);
};
};
diff --git a/src/core/provider/MCMailProvidersManager.cc b/src/core/provider/MCMailProvidersManager.cc
index 9924a911..71041c06 100644
--- a/src/core/provider/MCMailProvidersManager.cc
+++ b/src/core/provider/MCMailProvidersManager.cc
@@ -21,6 +21,13 @@ MailProvidersManager::MailProvidersManager() {
init();
}
+MailProvidersManager * MailProvidersManager::sharedManager()
+{
+ static MailProvidersManager * instance = new MailProvidersManager();
+ return instance;
+}
+
+
MailProvider * MailProvidersManager::providerForEmail(String * email)
{
mc_foreachdictionaryValue(MailProvider, provider, mProviders) {
@@ -49,19 +56,17 @@ MailProvider * MailProvidersManager::providerForIdentifier(String * identifier)
void MailProvidersManager::registerProviders(HashMap * providers)
{
mc_foreachdictionaryKeyAndValue(String, identifier, HashMap, providerInfo, providers) {
- MailProvider * provider = new MailProvider(providerInfo);
+ MailProvider * provider = MailProvider::providerWithInfo(providerInfo);
provider->setIdentifier(identifier);
- MCLog("register %s", MCUTF8DESC(identifier));
+ //MCLog("register %s", MCUTF8DESC(identifier));
mProviders->setObjectForKey(identifier, provider);
- provider->release();
}
}
-void MailProvidersManager::registerProvidersFilename(String * filename)
+void MailProvidersManager::registerProvidersWithFilename(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
index 6dc33b2b..d91f89a1 100644
--- a/src/core/provider/MCMailProvidersManager.h
+++ b/src/core/provider/MCMailProvidersManager.h
@@ -6,8 +6,8 @@
// Copyright (c) 2013 MailCore. All rights reserved.
//
-#ifndef __MAILCORE__MCMailProvidersManager__
-#define __MAILCORE__MCMailProvidersManager__
+#ifndef __MAILCORE_MCMAILPROVIDERSMANAGER_H_
+#define __MAILCORE_MCMAILPROVIDERSMANAGER_H_
#include <MailCore/MCBaseTypes.h>
@@ -17,26 +17,19 @@ namespace mailcore {
class MailProvider;
class MailProvidersManager : public Object {
-
+
public:
- static MailProvidersManager * sharedManager()
- {
- static MailProvidersManager * instance = new MailProvidersManager();
- instance->init();
- return instance;
- }
+ static MailProvidersManager * sharedManager();
- MailProvider * providerForEmail(String * email);
- MailProvider * providerForMX(String * hostname);
- MailProvider * providerForIdentifier(String * identifier);
+ virtual MailProvider * providerForEmail(String * email);
+ virtual MailProvider * providerForMX(String * hostname);
+ virtual MailProvider * providerForIdentifier(String * identifier);
- void registerProviders(HashMap * providers);
- void registerProvidersFilename(String * filename);
+ virtual void registerProvidersWithFilename(String * filename);
private:
MailProvidersManager();
- MailProvidersManager(MailProvidersManager const&);
- void operator=(MailProvidersManager const&);
+ void registerProviders(HashMap * providers);
HashMap * mProviders;
diff --git a/src/core/provider/MCNetService.cc b/src/core/provider/MCNetService.cc
index aef092e1..53ae7475 100644
--- a/src/core/provider/MCNetService.cc
+++ b/src/core/provider/MCNetService.cc
@@ -10,19 +10,39 @@
using namespace mailcore;
-void NetService::init() {
-
+void NetService::init()
+{
+ mHostname = NULL;
+ mPort = 0;
+ mConnectionType = ConnectionTypeClear;
}
-NetService::NetService(HashMap * info) {
+NetService::NetService()
+{
init();
-
+}
+
+NetService::~NetService()
+{
+ MC_SAFE_RELEASE(mHostname);
+}
+
+NetService * NetService::serviceWithInfo(HashMap * info)
+{
+ NetService * service = new NetService();
+ service->fillWithInfo(info);
+ service->autorelease();
+ return service;
+}
+
+void NetService::fillWithInfo(HashMap * info)
+{
bool ssl = false;
bool starttls = false;
- this->setHostname((String *) info->objectForKey(MCSTR("hostname")));
+ setHostname((String *) info->objectForKey(MCSTR("hostname")));
if (info->objectForKey(MCSTR("port")) != NULL) {
- this->setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue());
+ setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue());
}
if (info->objectForKey(MCSTR("ssl")) != NULL) {
ssl = ((Value *) info->objectForKey(MCSTR("ssl")))->boolValue();
@@ -41,13 +61,9 @@ NetService::NetService(HashMap * info) {
}
}
-NetService::~NetService() {
- delete mHostname;
-}
-
void NetService::setHostname(String *hostname)
{
- mHostname = hostname;
+ MC_SAFE_REPLACE_COPY(String, mHostname, hostname);
}
String * NetService::hostname()
@@ -75,7 +91,8 @@ ConnectionType NetService::connectionType()
return mConnectionType;
}
-String * NetService::normalizedHostnameWithEmail(String * email) {
+String * NetService::normalizedHostnameWithEmail(String * email)
+{
Array *components = email->componentsSeparatedByString(MCSTR("@"));
String *hostname = (String *) mHostname->copy();
if (components->count() != 0) {
@@ -85,7 +102,8 @@ String * NetService::normalizedHostnameWithEmail(String * email) {
return mHostname;
}
-HashMap * NetService::info() {
+HashMap * NetService::info()
+{
HashMap * result;
result = new HashMap();
diff --git a/src/core/provider/MCNetService.h b/src/core/provider/MCNetService.h
index c2560ec3..42c884f8 100644
--- a/src/core/provider/MCNetService.h
+++ b/src/core/provider/MCNetService.h
@@ -6,8 +6,8 @@
// Copyright (c) 2013 MailCore. All rights reserved.
//
-#ifndef __MAILCORE__MCNetService__
-#define __MAILCORE__MCNetService__
+#ifndef __MAILCORE_MCNETSERVICE_H_
+#define __MAILCORE_MCNETSERVICE_H_
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
@@ -18,28 +18,31 @@ namespace mailcore {
class NetService : public Object {
public:
- NetService(HashMap * info);
- ~NetService();
+ NetService();
+ virtual ~NetService();
- void setHostname(String * hostname);
- String * hostname();
+ virtual void setHostname(String * hostname);
+ virtual String * hostname();
- void setPort(unsigned int port);
- unsigned int port();
+ virtual void setPort(unsigned int port);
+ virtual unsigned int port();
- void setConnectionType(ConnectionType connectionType);
- ConnectionType connectionType();
-
- HashMap * info();
-
- String * normalizedHostnameWithEmail(String * email);
+ virtual void setConnectionType(ConnectionType connectionType);
+ virtual ConnectionType connectionType();
+ virtual String * normalizedHostnameWithEmail(String * email);
+
+ public: // serialization
+ static NetService * serviceWithInfo(HashMap * info);
+ virtual HashMap * info();
+
private:
String * mHostname;
unsigned int mPort;
ConnectionType mConnectionType;
void init();
+ void fillWithInfo(HashMap * info);
};
}