diff options
-rwxr-xr-x | build-mac/mailcore2.xcodeproj/project.pbxproj | 30 | ||||
-rw-r--r-- | src/async/MCAsync.h | 1 | ||||
-rw-r--r-- | src/cmake/async.cmake | 6 | ||||
-rw-r--r-- | src/cmake/core.cmake | 1 | ||||
-rw-r--r-- | src/cmake/public-headers.cmake | 2 | ||||
-rw-r--r-- | src/core/provider/MCAccountValidator.cpp | 245 | ||||
-rw-r--r-- | src/core/provider/MCAccountValidator.h | 32 | ||||
-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; }; } |