aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xbuild-mac/mailcore2.xcodeproj/project.pbxproj30
-rw-r--r--src/async/MCAsync.h1
-rw-r--r--src/cmake/async.cmake6
-rw-r--r--src/cmake/core.cmake1
-rw-r--r--src/cmake/public-headers.cmake2
-rw-r--r--src/core/provider/MCAccountValidator.cpp245
-rw-r--r--src/core/provider/MCAccountValidator.h32
-rw-r--r--src/core/provider/MCMXRecordResolverOperation.cpp (renamed from src/async/mx/MCResolveProviderUsingMXRecord.cpp)40
-rw-r--r--src/core/provider/MCMXRecordResolverOperation.h (renamed from src/async/mx/MCResolveProviderUsingMXRecord.h)12
9 files changed, 175 insertions, 194 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj
index 00f18501..91c25a17 100755
--- a/build-mac/mailcore2.xcodeproj/project.pbxproj
+++ b/build-mac/mailcore2.xcodeproj/project.pbxproj
@@ -7,8 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
- 2744B16A1A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2744B1681A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp */; };
- 2744B16B1A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2744B1681A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp */; };
+ 2744B16A1A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2744B1681A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp */; };
+ 2744B16B1A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2744B1681A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp */; };
27478E801A764698004AE621 /* MCAccountValidator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27478E7E1A764698004AE621 /* MCAccountValidator.cpp */; };
27478E811A764699004AE621 /* MCAccountValidator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27478E7E1A764698004AE621 /* MCAccountValidator.cpp */; };
27478E841A7646F8004AE621 /* MCOAccountValidator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27478E831A7646F8004AE621 /* MCOAccountValidator.mm */; };
@@ -17,12 +17,13 @@
27478E871A76475F004AE621 /* MCAccountValidator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 27478E7F1A764698004AE621 /* MCAccountValidator.h */; };
27478E881A7647AC004AE621 /* MCOAccountValidator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 27478E821A7646F8004AE621 /* MCOAccountValidator.h */; };
27478E891A7647AC004AE621 /* MCAccountValidator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 27478E7F1A764698004AE621 /* MCAccountValidator.h */; };
- 276A65D01A7B7E7D008722C2 /* MCResolveProviderUsingMXRecord.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2744B1691A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.h */; };
+ 276A65D01A7B7E7D008722C2 /* MCMXRecordResolverOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2744B1691A7A4637009E9E67 /* MCMXRecordResolverOperation.h */; };
27780C2E19CF9CD100C77E44 /* MCOFramework.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6BD28A9170BDB6B00A91AC1 /* MCOFramework.mm */; };
27780C3219CF9CD100C77E44 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6ED6D1917A1919500A4A14C /* Security.framework */; };
27780C3619CF9CD100C77E44 /* providers.json in Resources */ = {isa = PBXBuildFile; fileRef = 84AF9E7D172DBAF600E60AA3 /* providers.json */; };
27780C3D19CF9D9800C77E44 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27780C3C19CF9D9800C77E44 /* CFNetwork.framework */; };
27780C3E19CF9DDF00C77E44 /* libMailCore-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C6BA2C191705F4E6003F0E9E /* libMailCore-ios.a */; };
+ 27E91D601A80D3F4005A3244 /* MCMXRecordResolverOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2744B1691A7A4637009E9E67 /* MCMXRecordResolverOperation.h */; };
4B3C1BDE17ABF309008BBF4C /* MCOIMAPQuotaOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B3C1BDD17ABF307008BBF4C /* MCOIMAPQuotaOperation.mm */; };
4B3C1BE117ABF4BC008BBF4C /* MCIMAPQuotaOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B3C1BDF17ABF4BB008BBF4C /* MCIMAPQuotaOperation.cpp */; };
4B3C1BE217ABFF7C008BBF4C /* MCOIMAPQuotaOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4B3C1BDC17ABF306008BBF4C /* MCOIMAPQuotaOperation.h */; };
@@ -1003,6 +1004,7 @@
dstPath = include/MailCore;
dstSubfolderSpec = 16;
files = (
+ 27E91D601A80D3F4005A3244 /* MCMXRecordResolverOperation.h in CopyFiles */,
27478E861A76475F004AE621 /* MCOAccountValidator.h in CopyFiles */,
27478E871A76475F004AE621 /* MCAccountValidator.h in CopyFiles */,
C673EBF01A46B45300A53F7F /* MCIMAPFolderInfo.h in CopyFiles */,
@@ -1234,7 +1236,7 @@
dstPath = include/MailCore;
dstSubfolderSpec = 16;
files = (
- 276A65D01A7B7E7D008722C2 /* MCResolveProviderUsingMXRecord.h in CopyFiles */,
+ 276A65D01A7B7E7D008722C2 /* MCMXRecordResolverOperation.h in CopyFiles */,
27478E881A7647AC004AE621 /* MCOAccountValidator.h in CopyFiles */,
27478E891A7647AC004AE621 /* MCAccountValidator.h in CopyFiles */,
C673EBEF1A46B44E00A53F7F /* MCIMAPFolderInfo.h in CopyFiles */,
@@ -1454,8 +1456,8 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 2744B1681A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MCResolveProviderUsingMXRecord.cpp; path = mx/MCResolveProviderUsingMXRecord.cpp; sourceTree = "<group>"; };
- 2744B1691A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCResolveProviderUsingMXRecord.h; path = mx/MCResolveProviderUsingMXRecord.h; sourceTree = "<group>"; };
+ 2744B1681A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCMXRecordResolverOperation.cpp; sourceTree = "<group>"; };
+ 2744B1691A7A4637009E9E67 /* MCMXRecordResolverOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCMXRecordResolverOperation.h; sourceTree = "<group>"; };
27478E7E1A764698004AE621 /* MCAccountValidator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCAccountValidator.cpp; sourceTree = "<group>"; };
27478E7F1A764698004AE621 /* MCAccountValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCAccountValidator.h; sourceTree = "<group>"; };
27478E821A7646F8004AE621 /* MCOAccountValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOAccountValidator.h; sourceTree = "<group>"; };
@@ -2149,15 +2151,6 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 2744B1671A7A459C009E9E67 /* mx */ = {
- isa = PBXGroup;
- children = (
- 2744B1681A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp */,
- 2744B1691A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.h */,
- );
- name = mx;
- sourceTree = "<group>";
- };
8491899A18C93F6E002063A3 /* nntp */ = {
isa = PBXGroup;
children = (
@@ -2174,6 +2167,8 @@
84AF9E72172DACC900E60AA3 /* provider */ = {
isa = PBXGroup;
children = (
+ 2744B1681A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp */,
+ 2744B1691A7A4637009E9E67 /* MCMXRecordResolverOperation.h */,
27478E7E1A764698004AE621 /* MCAccountValidator.cpp */,
27478E7F1A764698004AE621 /* MCAccountValidator.h */,
C6CF62BF175324F0006398B9 /* MCMailProvider.cpp */,
@@ -2490,7 +2485,6 @@
C64EA68D169E847800778456 /* pop */,
84D73728199BF61B005124E5 /* nntp */,
C64EA68E169E847800778456 /* smtp */,
- 2744B1671A7A459C009E9E67 /* mx */,
C64EA7E416A14A4500778456 /* MCAsync.h */,
);
path = async;
@@ -3489,7 +3483,7 @@
C64EA7DA16A1386600778456 /* MCSMTPOperation.cpp in Sources */,
C64EA7EA16A154B300778456 /* MCSMTPCheckAccountOperation.cpp in Sources */,
C64EA7F116A15A4D00778456 /* MCIMAPOperation.cpp in Sources */,
- 2744B16A1A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp in Sources */,
+ 2744B16A1A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp in Sources */,
BDCD7CDB1A70771B0001DCC3 /* ucln_in.cpp in Sources */,
C64EA7F816A15A7800778456 /* MCIMAPCheckAccountOperation.cpp in Sources */,
943F1A9A17D964F600F0C798 /* MCIMAPConnectOperation.cpp in Sources */,
@@ -3760,7 +3754,7 @@
C6BA2BC01705F4E6003F0E9E /* MCSMTPSendWithDataOperation.cpp in Sources */,
C6BA2BC11705F4E6003F0E9E /* MCSMTPOperation.cpp in Sources */,
C6BA2BC21705F4E6003F0E9E /* MCSMTPCheckAccountOperation.cpp in Sources */,
- 2744B16B1A7A4637009E9E67 /* MCResolveProviderUsingMXRecord.cpp in Sources */,
+ 2744B16B1A7A4637009E9E67 /* MCMXRecordResolverOperation.cpp in Sources */,
BDCD7CDC1A70771B0001DCC3 /* ucln_in.cpp in Sources */,
C6BA2BC31705F4E6003F0E9E /* MCIMAPOperation.cpp in Sources */,
C6BA2BC41705F4E6003F0E9E /* MCIMAPCheckAccountOperation.cpp in Sources */,
diff --git a/src/async/MCAsync.h b/src/async/MCAsync.h
index b68ed422..90b3e263 100644
--- a/src/async/MCAsync.h
+++ b/src/async/MCAsync.h
@@ -14,6 +14,5 @@
#include <MailCore/MCAsyncIMAP.h>
#include <MailCore/MCAsyncPOP.h>
#include <MailCore/MCAsyncNNTP.h>
-#include <MailCore/MCResolveProviderUsingMXRecord.h>
#endif
diff --git a/src/cmake/async.cmake b/src/cmake/async.cmake
index f829ab02..c1eb3faf 100644
--- a/src/cmake/async.cmake
+++ b/src/cmake/async.cmake
@@ -68,16 +68,11 @@ set(async_nntp_files
async/nntp/MCNNTPOperation.cpp
)
-set(async_mx_files
- async/mx/MCResolveProviderUsingMXRecord.cpp
-)
-
set(async_files
${async_imap_files}
${async_pop_files}
${async_smtp_files}
${async_nntp_files}
- ${async_mx_files}
)
# Includes for build
@@ -88,5 +83,4 @@ set(async_includes
"${CMAKE_CURRENT_SOURCE_DIR}/async/pop"
"${CMAKE_CURRENT_SOURCE_DIR}/async/smtp"
"${CMAKE_CURRENT_SOURCE_DIR}/async/nntp"
- "${CMAKE_CURRENT_SOURCE_DIR}/async/mx"
)
diff --git a/src/cmake/core.cmake b/src/cmake/core.cmake
index 24e1a266..ac2e6ea8 100644
--- a/src/cmake/core.cmake
+++ b/src/cmake/core.cmake
@@ -118,6 +118,7 @@ set(provider_files
core/provider/MCMailProvidersManager.cpp
core/provider/MCNetService.cpp
core/provider/MCAccountValidator.cpp
+ core/provider/MCMXRecordResolverOperation.cpp
)
set(renderer_files
diff --git a/src/cmake/public-headers.cmake b/src/cmake/public-headers.cmake
index 6829c3f2..e0df8756 100644
--- a/src/cmake/public-headers.cmake
+++ b/src/cmake/public-headers.cmake
@@ -74,6 +74,7 @@ core/provider/MCMailProvidersManager.h
core/provider/MCMailProvider.h
core/provider/MCNetService.h
core/provider/MCAccountValidator.h
+core/provider/MCMXRecordResolverOperation.h
async/MCAsync.h
async/smtp/MCAsyncSMTP.h
async/smtp/MCSMTPAsyncSession.h
@@ -116,7 +117,6 @@ async/nntp/MCNNTPListNewsgroupsOperation.h
async/nntp/MCNNTPFetchOverviewOperation.h
async/nntp/MCNNTPFetchServerTimeOperation.h
async/nntp/MCNNTPOperationCallback.h
-async/mx/MCResolveProviderUsingMXRecord.h
objc/MCObjC.h
objc/utils/MCOUtils.h
objc/utils/MCOObjectWrapper.h
diff --git a/src/core/provider/MCAccountValidator.cpp b/src/core/provider/MCAccountValidator.cpp
index 9b6e234b..84385e09 100644
--- a/src/core/provider/MCAccountValidator.cpp
+++ b/src/core/provider/MCAccountValidator.cpp
@@ -17,8 +17,7 @@
#include "MCIMAPOperation.h"
#include "MCPOPOperation.h"
#include "MCSMTPOperation.h"
-#include "MCResolveProviderUsingMXRecord.h"
-#include "MCOperationQueueCallback.h"
+#include "MCMXRecordResolverOperation.h"
using namespace mailcore;
@@ -30,35 +29,6 @@ enum {
SERVICE_SMTP, /* SMTP service */
};
-namespace mailcore {
-
- class ValidatorOperationQueueCallback : public Object, public OperationQueueCallback {
- public:
- ValidatorOperationQueueCallback(AccountValidator * validator) {
- mValidator = validator;
- }
-
- virtual ~ValidatorOperationQueueCallback() {
- }
-
- virtual void queueStartRunning() {
- if (mValidator->operationQueueCallback() != NULL) {
- mValidator->operationQueueCallback()->queueStartRunning();
- }
- }
-
- virtual void queueStoppedRunning() {
- if (mValidator->operationQueueCallback() != NULL) {
- mValidator->operationQueueCallback()->queueStoppedRunning();
- }
-
- mValidator->setup();
- }
- private:
- AccountValidator * mValidator;
- };
-}
-
void AccountValidator::init()
{
mEmail = NULL;
@@ -83,10 +53,13 @@ void AccountValidator::init()
mProvider = NULL;
- mQueue = new OperationQueue();
- mQueueCallback = new ValidatorOperationQueueCallback(this);
- mQueue->setCallback(mQueueCallback);
- mOperationQueueCallback = NULL;
+ mOperation = NULL;
+ mQueue = NULL;
+ mResolveMX = NULL;
+
+ mImapSession = NULL;
+ mPopSession = NULL;
+ mSmtpSession = NULL;
}
AccountValidator::AccountValidator()
@@ -105,6 +78,12 @@ AccountValidator::~AccountValidator()
MC_SAFE_RELEASE(mPopServices);
MC_SAFE_RELEASE(mIdentifier);
MC_SAFE_RELEASE(mProvider);
+ MC_SAFE_RELEASE(mOperation);
+ MC_SAFE_RELEASE(mQueue);
+ MC_SAFE_RELEASE(mResolveMX);
+ MC_SAFE_RELEASE(mImapSession);
+ MC_SAFE_RELEASE(mPopSession);
+ MC_SAFE_RELEASE(mSmtpSession);
}
void AccountValidator::start()
@@ -124,39 +103,82 @@ void AccountValidator::start()
mProvider = MailProvidersManager::sharedManager()->providerForEmail(mUsername);
if (mProvider == NULL) {
- Array * components;
- String * domain;
-
- components = mUsername->componentsSeparatedByString(MCSTR("@"));
- if (components->count() >= 2) {
- domain = (String *) components->lastObject();
- mResolveMX = new ResolveProviderUsingMXRecord();
- mResolveMX->setHostname(domain);
- mQueue->addOperation(mResolveMX);
- }
+ resolveMX();
}
else{
- setup();
+ startCheckingHosts();
}
}
void AccountValidator::cancel()
{
- mOperation->cancel();
+ if(mOperation != NULL)
+ mOperation->cancel();
+
+ if(mResolveMX != NULL)
+ mResolveMX->cancel();
+
+ if (mQueue != NULL)
+ mQueue->cancelAllOperations();
+
+ MC_SAFE_RELEASE(mImapSession);
+ MC_SAFE_RELEASE(mPopSession);
+ MC_SAFE_RELEASE(mSmtpSession);
+
Operation::cancel();
}
void AccountValidator::operationFinished(Operation * op)
{
- opCompleted();
+ if (op == mResolveMX) {
+ resolveMXDone();
+ }
+ else {
+ checkNextHostDone();
+ }
+}
+
+void AccountValidator::resolveMX()
+{
+ Array * components;
+ String * domain;
+
+ components = mUsername->componentsSeparatedByString(MCSTR("@"));
+ if (components->count() >= 2) {
+ domain = (String *) components->lastObject();
+ mResolveMX = new MXRecordResolverOperation();
+ mResolveMX->setHostname(domain);
+ mResolveMX->setCallback((OperationCallback *)this);
+
+ mQueue = new OperationQueue();
+ mQueue->addOperation(mResolveMX);
+ }
}
-void AccountValidator::setup()
+void AccountValidator::resolveMXDone()
{
- if (mResolveMX != NULL) {
- mProvider = mResolveMX->provider();
+ Array * mxRecords = mResolveMX->mxRecords();
+
+ CFURLRef imageURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("providers"), CFSTR("json"), NULL);
+ CFStringRef imagePath = CFURLCopyFileSystemPath(imageURL, kCFURLPOSIXPathStyle);
+ const char *path = CFStringGetCStringPtr(imagePath, CFStringGetSystemEncoding());
+ String * sPath = String::stringWithUTF8Characters(path);
+
+ MailProvidersManager::sharedManager()->registerProvidersWithFilename(sPath);
+
+ mc_foreacharray(String, mxRecord, mxRecords) {
+ MailProvider *provider = MailProvidersManager::sharedManager()->providerForMX(mxRecord);
+ if (provider){
+ mProvider = provider;
+ break;
+ }
}
+ startCheckingHosts();
+}
+
+void AccountValidator::startCheckingHosts()
+{
if (mProvider != NULL) {
mIdentifier = mProvider->identifier();
@@ -179,65 +201,41 @@ void AccountValidator::setup()
if (mSmtpServices->count() == 0)
mSmtpError = ErrorNoValidServerFound;
- test();
-}
-
-void AccountValidator::opCompleted()
-{
- ErrorCode error = ErrorNone;
-
- if (mCurrentServiceTested == SERVICE_IMAP) {
- mImapError = ((IMAPOperation *)mOperation)->error();
- error = mImapError;
- }
- else if (mCurrentServiceTested == SERVICE_POP) {
- mPopError = ((POPOperation *)mOperation)->error();
- error = mPopError;
- }
- else if (mCurrentServiceTested == SERVICE_SMTP) {
- mSmtpError = ((SMTPOperation *)mOperation)->error();
- error = mSmtpError;
- }
-
- if (error == ErrorNone) {
- mCurrentServiceTested ++;
- }
- else {
- mCurrentServiceIndex ++;
- }
-
- test();
+ checkNextHost();
}
/**
Each service(IMAP/POP/SMTP) is tested one after the other.
For each service we test each server details (NetService),
Until either:
- we find on that works and returns ErrorNone in opCompleted().
- we have gone trough the Array of NetService for that service and test() is recalled for the next service.
+ we find on that works and returns ErrorNone in checkNextHostDone().
+ we have gone trough the Array of NetService for that service and checkNextHost() is then called for the next service.
*/
-void AccountValidator::test()
+void AccountValidator::checkNextHost()
{
if (mCurrentServiceTested == SERVICE_IMAP) {
if (mCurrentServiceIndex < mImapServices->count()) {
- IMAPAsyncSession *imapSession = new IMAPAsyncSession();
- imapSession->setUsername(mUsername);
- imapSession->setPassword(mPassword);
-
+
+ if (mImapSession == NULL) {
+ mImapSession = new IMAPAsyncSession();
+ mImapSession->setUsername(mUsername);
+ mImapSession->setPassword(mPassword);
+ }
+
mImapServer = (NetService *) mImapServices->objectAtIndex(mCurrentServiceIndex);
- imapSession->setHostname(mImapServer->hostname());
- imapSession->setPort(mImapServer->port());
- imapSession->setConnectionType(mImapServer->connectionType());
+ mImapSession->setHostname(mImapServer->hostname());
+ mImapSession->setPort(mImapServer->port());
+ mImapSession->setConnectionType(mImapServer->connectionType());
- mOperation = (IMAPOperation *)imapSession->checkAccountOperation();
- mOperation->setCallback(this);
+ mOperation = (IMAPOperation *)mImapSession->checkAccountOperation();
+ mOperation->setCallback((OperationCallback *)this);
mOperation->start();
}
else {
- mCurrentServiceTested = SERVICE_POP;
+ mCurrentServiceTested ++;
mCurrentServiceIndex = 0;
- test();
+ checkNextHost();
}
}
else if (mCurrentServiceTested == SERVICE_POP){
@@ -252,13 +250,13 @@ void AccountValidator::test()
popSession->setConnectionType(mPopServer->connectionType());
mOperation = (POPOperation *)popSession->checkAccountOperation();
- mOperation->setCallback(this);
+ mOperation->setCallback((OperationCallback *)this);
mOperation->start();
}
else {
- mCurrentServiceTested = SERVICE_SMTP;
+ mCurrentServiceTested ++;
mCurrentServiceIndex = 0;
- test();
+ checkNextHost();
}
}
else if (mCurrentServiceTested == SERVICE_SMTP){
@@ -273,19 +271,50 @@ void AccountValidator::test()
smtpSession->setConnectionType(mSmtpServer->connectionType());
mOperation = (SMTPOperation *)smtpSession->checkAccountOperation(Address::addressWithMailbox(mEmail));
- mOperation->setCallback(this);
+ mOperation->setCallback((OperationCallback *)this);
mOperation->start();
}
else {
- callback()->operationFinished(this);
+ mCurrentServiceTested ++;
+ mCurrentServiceIndex = 0;
+ checkNextHost();
}
}
else {
+ MC_SAFE_RELEASE(mPopSession);
+ MC_SAFE_RELEASE(mSmtpSession);
callback()->operationFinished(this);
}
}
+void AccountValidator::checkNextHostDone()
+{
+ ErrorCode error = ErrorNone;
+
+ if (mCurrentServiceTested == SERVICE_IMAP) {
+ mImapError = ((IMAPOperation *)mOperation)->error();
+ error = mImapError;
+ }
+ else if (mCurrentServiceTested == SERVICE_POP) {
+ mPopError = ((POPOperation *)mOperation)->error();
+ error = mPopError;
+ }
+ else if (mCurrentServiceTested == SERVICE_SMTP) {
+ mSmtpError = ((SMTPOperation *)mOperation)->error();
+ error = mSmtpError;
+ }
+
+ if (error == ErrorNone) {
+ mCurrentServiceTested ++;
+ }
+ else {
+ mCurrentServiceIndex ++;
+ }
+
+ checkNextHost();
+}
+
void AccountValidator::setEmail(String * email)
{
MC_SAFE_REPLACE_COPY(String, mEmail, email);
@@ -390,23 +419,3 @@ ErrorCode AccountValidator::smtpError()
{
return mSmtpError;
}
-
-void POPAsyncSession::setOperationQueueCallback(OperationQueueCallback * callback)
-{
- mOperationQueueCallback = callback;
-}
-
-OperationQueueCallback * POPAsyncSession::operationQueueCallback()
-{
- return mOperationQueueCallback;
-}
-
-bool POPAsyncSession::isOperationQueueRunning()
-{
- return mQueue->count() > 0;
-}
-
-void POPAsyncSession::cancelAllOperations()
-{
- mQueue->cancelAllOperations();
-}
diff --git a/src/core/provider/MCAccountValidator.h b/src/core/provider/MCAccountValidator.h
index 9db5ff83..74447ac3 100644
--- a/src/core/provider/MCAccountValidator.h
+++ b/src/core/provider/MCAccountValidator.h
@@ -15,12 +15,13 @@
#ifdef __cplusplus
namespace mailcore {
-
+
class NetService;
class MailProvider;
- class IMAPOperation;
- class ValidatorOperationQueueCallback;
- class ResolveProviderUsingMXRecord;
+ class MXRecordResolverOperation;
+ class IMAPAsyncSession;
+ class POPAsyncSession;
+ class SMTPAsyncSession;
class MAILCORE_EXPORT AccountValidator : public Operation, public OperationCallback {
public:
@@ -55,11 +56,6 @@ namespace mailcore {
virtual void start();
virtual void cancel();
- virtual void setOperationQueueCallback(OperationQueueCallback * callback);
- virtual OperationQueueCallback * operationQueueCallback();
- virtual bool isOperationQueueRunning();
- virtual void cancelAllOperations();
-
private:
String * mEmail; /* for SMTP */
String * mUsername;
@@ -81,8 +77,13 @@ namespace mailcore {
MailProvider * mProvider;
- void test();
+ void resolveMX();
+ void resolveMXDone();
+ void startCheckingHosts();
+ void checkNextHost();
+ void checkNextHostDone();
+
//indexs for services being tested
int mCurrentServiceIndex;
int mCurrentServiceTested;
@@ -90,17 +91,14 @@ namespace mailcore {
void init();
Operation * mOperation;
- void opCompleted();
virtual void operationFinished(Operation * op);
OperationQueue * mQueue;
- ValidatorOperationQueueCallback * mQueueCallback;
- OperationQueueCallback * mOperationQueueCallback;
- ResolveProviderUsingMXRecord * mResolveMX;
+ MXRecordResolverOperation * mResolveMX;
- public://private
- void setup();
-
+ IMAPAsyncSession * mImapSession;
+ POPAsyncSession * mPopSession;
+ SMTPAsyncSession * mSmtpSession;
};
}
diff --git a/src/async/mx/MCResolveProviderUsingMXRecord.cpp b/src/core/provider/MCMXRecordResolverOperation.cpp
index 00d3e036..6f8226cd 100644
--- a/src/async/mx/MCResolveProviderUsingMXRecord.cpp
+++ b/src/core/provider/MCMXRecordResolverOperation.cpp
@@ -6,44 +6,42 @@
// Copyright (c) 2015 MailCore. All rights reserved.
//
-#include "MCResolveProviderUsingMXRecord.h"
-
-#include "MCMailProvider.h"
-#include "MCMailProvidersManager.h"
+#include "MCMXRecordResolverOperation.h"
#include <arpa/inet.h>
#include <resolv.h>
using namespace mailcore;
-ResolveProviderUsingMXRecord::ResolveProviderUsingMXRecord()
+MXRecordResolverOperation::MXRecordResolverOperation()
{
mHostname = NULL;
- mProvider = NULL;
+ mMXRecords = NULL;
}
-ResolveProviderUsingMXRecord::~ResolveProviderUsingMXRecord()
+MXRecordResolverOperation::~MXRecordResolverOperation()
{
- MC_SAFE_RELEASE(mProvider);
+ MC_SAFE_RELEASE(mMXRecords);
}
-void ResolveProviderUsingMXRecord::setHostname(String * hostname)
+void MXRecordResolverOperation::setHostname(String * hostname)
{
MC_SAFE_REPLACE_COPY(String, mHostname, hostname);
}
-String * ResolveProviderUsingMXRecord::hostname()
+String * MXRecordResolverOperation::hostname()
{
return mHostname;
}
-MailProvider * ResolveProviderUsingMXRecord::provider()
+Array * MXRecordResolverOperation::mxRecords()
{
- return mProvider;
+ return mMXRecords;
}
-void ResolveProviderUsingMXRecord::main()
+void MXRecordResolverOperation::main()
{
+ mMXRecords = new Array();
unsigned char response[NS_PACKETSZ];
ns_msg handle;
ns_rr rr;
@@ -54,16 +52,8 @@ void ResolveProviderUsingMXRecord::main()
(ns_initparse(response, len, &handle) >= 0) and
(ns_msg_count(handle, ns_s_an) >= 0)) {
- CFBundleRef mainBundle = CFBundleGetMainBundle();
- CFURLRef imageURL = CFBundleCopyResourceURL(mainBundle, CFSTR("providers"), CFSTR("json"), NULL);
- CFStringRef imagePath = CFURLCopyFileSystemPath(imageURL, kCFURLPOSIXPathStyle);
- CFStringEncoding encodingMethod = CFStringGetSystemEncoding();
- const char *path = CFStringGetCStringPtr(imagePath, encodingMethod);
-
- String * sPath = String::stringWithUTF8Characters(path);
-
- MailProvidersManager::sharedManager()->registerProvidersWithFilename(sPath);
-
+
+
for (int ns_index = 0; ns_index < len; ns_index++) {
if (ns_parserr(&handle, ns_s_an, ns_index, &rr)) {
/* WARN: ns_parserr failed */
@@ -74,9 +64,7 @@ void ResolveProviderUsingMXRecord::main()
char mxname[4096];
dn_expand(ns_msg_base(handle), ns_msg_base(handle) + ns_msg_size(handle), ns_rr_rdata(rr) + NS_INT16SZ, mxname, sizeof(mxname));
String * str = String::stringWithUTF8Characters(mxname);
- MailProvider *provider = MailProvidersManager::sharedManager()->providerForMX(str);
- if (provider)
- mProvider = provider;
+ mMXRecords->addObject(str);
}
}
}
diff --git a/src/async/mx/MCResolveProviderUsingMXRecord.h b/src/core/provider/MCMXRecordResolverOperation.h
index d8c014f1..7d8a6fc8 100644
--- a/src/async/mx/MCResolveProviderUsingMXRecord.h
+++ b/src/core/provider/MCMXRecordResolverOperation.h
@@ -17,23 +17,21 @@
namespace mailcore {
- class MailProvider;
-
- class MAILCORE_EXPORT ResolveProviderUsingMXRecord : public Operation {
+ class MAILCORE_EXPORT MXRecordResolverOperation : public Operation {
public:
- ResolveProviderUsingMXRecord();
- virtual ~ResolveProviderUsingMXRecord();
+ MXRecordResolverOperation();
+ virtual ~MXRecordResolverOperation();
virtual void setHostname(String * hostname);
virtual String * hostname();
- virtual MailProvider * provider();
+ virtual Array * mxRecords();
public: // subclass behavior
virtual void main();
private:
- MailProvider * mProvider;
+ Array * mMXRecords;
String * mHostname;
};
}