From f3be74e24f4b460bf309e4b6289973c34b137382 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Mon, 7 Mar 2016 22:14:47 -0800 Subject: Improved error management --- build-mac/mailcore2.xcodeproj/project.pbxproj | 16 ++++-- src/async/imap/MCAsyncIMAP.h | 1 + src/async/imap/MCIMAPAsyncSession.cpp | 2 +- src/async/imap/MCIMAPAsyncSession.h | 3 +- src/async/imap/MCIMAPCheckAccountOperation.cpp | 21 +++++++- src/async/imap/MCIMAPCheckAccountOperation.h | 9 ++++ src/cmake/objc.cmake | 1 + src/cmake/public-headers.cmake | 1 + src/core/imap/MCIMAPSession.cpp | 6 +++ src/core/imap/MCIMAPSession.h | 2 + src/core/provider/MCAccountValidator.cpp | 11 +++- src/core/provider/MCAccountValidator.h | 4 +- src/objc/imap/MCOIMAPCheckAccountOperation.h | 22 ++++++++ src/objc/imap/MCOIMAPCheckAccountOperation.mm | 74 ++++++++++++++++++++++++++ src/objc/imap/MCOIMAPSession.mm | 2 +- 15 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 src/objc/imap/MCOIMAPCheckAccountOperation.h create mode 100644 src/objc/imap/MCOIMAPCheckAccountOperation.mm diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 51f4e1ee..ff3b170a 100755 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -116,8 +116,6 @@ 84D7374F199BFBC8005124E5 /* MCNNTPFetchAllArticlesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D73741199BF963005124E5 /* MCNNTPFetchAllArticlesOperation.h */; }; 84D73750199BFBD9005124E5 /* MCNNTPFetchArticleOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D7373C199BF83B005124E5 /* MCNNTPFetchArticleOperation.h */; }; 84D73751199BFBDF005124E5 /* MCNNTPFetchAllArticlesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D73741199BF963005124E5 /* MCNNTPFetchAllArticlesOperation.h */; }; - 84D73752199BFBE3005124E5 /* MCNNTPCheckAccountOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D73745199BFA8C005124E5 /* MCNNTPCheckAccountOperation.h */; }; - 84D73753199BFBE6005124E5 /* MCNNTPCheckAccountOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D73745199BFA8C005124E5 /* MCNNTPCheckAccountOperation.h */; }; 84D73754199BFBEC005124E5 /* MCNNTPOperationCallback.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D7373F199BF887005124E5 /* MCNNTPOperationCallback.h */; }; 84D73755199BFBF2005124E5 /* MCNNTPOperationCallback.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D7373F199BF887005124E5 /* MCNNTPOperationCallback.h */; }; 84D73758199BFC8A005124E5 /* MCNNTPDisconnectOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84D73756199BFC8A005124E5 /* MCNNTPDisconnectOperation.cpp */; }; @@ -902,6 +900,10 @@ C6EFFBC9182BBF5700CFF656 /* MCIMAPMultiDisconnectOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C6EFFBC6182BBF5700CFF656 /* MCIMAPMultiDisconnectOperation.cpp */; }; C6EFFBCC1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6EFFBCB1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm */; }; C6EFFBCD1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6EFFBCB1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm */; }; + C6F49A8F1C8E96D00087F4B7 /* MCIMAPCheckAccountOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64EA7F716A15A7800778456 /* MCIMAPCheckAccountOperation.h */; }; + C6F49A901C8E96D70087F4B7 /* MCIMAPCheckAccountOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64EA7F716A15A7800778456 /* MCIMAPCheckAccountOperation.h */; }; + C6F49A931C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6F49A921C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm */; settings = {ASSET_TAGS = (); }; }; + C6F49A941C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6F49A921C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm */; settings = {ASSET_TAGS = (); }; }; C6F5B9E216FEA1E800D9DABD /* MCOIMAPMessage.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6F5B9E116FEA1E800D9DABD /* MCOIMAPMessage.mm */; }; C6F5B9E516FEA27500D9DABD /* MCOIMAPMessagePart.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6F5B9E416FEA27500D9DABD /* MCOIMAPMessagePart.mm */; }; C6F5B9E816FEA28600D9DABD /* MCOIMAPMultipart.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6F5B9E716FEA28600D9DABD /* MCOIMAPMultipart.mm */; }; @@ -1041,6 +1043,7 @@ 27E91D601A80D3F4005A3244 /* MCMXRecordResolverOperation.h in CopyFiles */, 27478E861A76475F004AE621 /* MCOAccountValidator.h in CopyFiles */, 27478E871A76475F004AE621 /* MCAccountValidator.h in CopyFiles */, + C6F49A901C8E96D70087F4B7 /* MCIMAPCheckAccountOperation.h in CopyFiles */, C673EBF01A46B45300A53F7F /* MCIMAPFolderInfo.h in CopyFiles */, C6181D3319FE0F8D0088FBBC /* MCIMAPFetchParsedContentOperation.h in CopyFiles */, C6181D3219FE0F8A0088FBBC /* MCOIMAPFetchParsedContentOperation.h in CopyFiles */, @@ -1069,7 +1072,6 @@ C69BA85E17DEFD9F00D601B7 /* NSIndexSet+MCO.h in CopyFiles */, 84391346199C3ABB00FEFCDD /* MCONNTPGroupInfo.h in CopyFiles */, 84D7373A199BF81D005124E5 /* MCNNTPOperation.h in CopyFiles */, - 84D73753199BFBE6005124E5 /* MCNNTPCheckAccountOperation.h in CopyFiles */, 84D73748199BFACA005124E5 /* MCNNTPAsyncSession.h in CopyFiles */, 84D7375F199BFF38005124E5 /* MCNNTPListNewsgroupsOperation.h in CopyFiles */, C6E665001790963E0063F2CF /* MCIMAPMessageRenderingOperation.h in CopyFiles */, @@ -1281,6 +1283,7 @@ 27478E881A7647AC004AE621 /* MCOAccountValidator.h in CopyFiles */, 27478E891A7647AC004AE621 /* MCAccountValidator.h in CopyFiles */, C673EBEF1A46B44E00A53F7F /* MCIMAPFolderInfo.h in CopyFiles */, + C6F49A8F1C8E96D00087F4B7 /* MCIMAPCheckAccountOperation.h in CopyFiles */, 8199FBF719FAF3AF0040BBC3 /* MCOIMAPFetchParsedContentOperation.h in CopyFiles */, 8199FBF819FAF3AF0040BBC3 /* MCIMAPFetchParsedContentOperation.h in CopyFiles */, C6D4FD3619FA9F4F001F7E01 /* MCNNTPFetchServerTimeOperation.h in CopyFiles */, @@ -1309,7 +1312,6 @@ 84D73786199C0118005124E5 /* MCONNTPFetchArticleOperation.h in CopyFiles */, 84391347199C3ABD00FEFCDD /* MCONNTPGroupInfo.h in CopyFiles */, 84D73749199BFACF005124E5 /* MCNNTPAsyncSession.h in CopyFiles */, - 84D73752199BFBE3005124E5 /* MCNNTPCheckAccountOperation.h in CopyFiles */, 4B3C1BE217ABFF7C008BBF4C /* MCOIMAPQuotaOperation.h in CopyFiles */, 84D7374E199BFBBA005124E5 /* MCNNTPFetchHeaderOperation.h in CopyFiles */, 84D7375E199BFF34005124E5 /* MCNNTPListNewsgroupsOperation.h in CopyFiles */, @@ -2066,6 +2068,8 @@ C6EFFBC7182BBF5700CFF656 /* MCIMAPMultiDisconnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPMultiDisconnectOperation.h; sourceTree = ""; }; C6EFFBCA1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPMultiDisconnectOperation.h; sourceTree = ""; }; C6EFFBCB1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPMultiDisconnectOperation.mm; sourceTree = ""; }; + C6F49A911C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPCheckAccountOperation.h; sourceTree = ""; }; + C6F49A921C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPCheckAccountOperation.mm; sourceTree = ""; }; C6F5B9E016FEA1E800D9DABD /* MCOIMAPMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPMessage.h; sourceTree = ""; }; C6F5B9E116FEA1E800D9DABD /* MCOIMAPMessage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPMessage.mm; sourceTree = ""; }; C6F5B9E316FEA27500D9DABD /* MCOIMAPMessagePart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPMessagePart.h; sourceTree = ""; }; @@ -3152,6 +3156,8 @@ C6EFFBCB1833334900CFF656 /* MCOIMAPMultiDisconnectOperation.mm */, 1845356E1BE23FBD000B0D87 /* MCOIMAPCustomCommandOperation.h */, 1845356F1BE23FBD000B0D87 /* MCOIMAPCustomCommandOperation.mm */, + C6F49A911C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.h */, + C6F49A921C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm */, ); path = imap; sourceTree = ""; @@ -3634,6 +3640,7 @@ C64BB22E16E5C1EE000DB34C /* MCIndexSet.cpp in Sources */, 84D73764199BFFC7005124E5 /* MCONNTPSession.mm in Sources */, C64BB23516EDAA17000DB34C /* MCOAbstractMessage.mm in Sources */, + C6F49A931C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm in Sources */, BDCD7CE51A70771B0001DCC3 /* ustring.cpp in Sources */, C64BB23916EDAA3F000DB34C /* MCOAbstractMessagePart.mm in Sources */, C64BB23C16EDAAC7000DB34C /* MCOAbstractMultipart.mm in Sources */, @@ -3912,6 +3919,7 @@ 1820E7D61BD403ED00835D1E /* MCIMAPCustomCommandOperation.cpp in Sources */, C6BA2BEE1705F4E6003F0E9E /* MCIMAPCapabilityOperation.cpp in Sources */, C6BA2BEF1705F4E6003F0E9E /* MCIndexSet.cpp in Sources */, + C6F49A941C8EA1450087F4B7 /* MCOIMAPCheckAccountOperation.mm in Sources */, 84D73765199BFFC7005124E5 /* MCONNTPSession.mm in Sources */, BDCD7CE61A70771B0001DCC3 /* ustring.cpp in Sources */, C6BA2BF01705F4E6003F0E9E /* MCOAbstractMessage.mm in Sources */, diff --git a/src/async/imap/MCAsyncIMAP.h b/src/async/imap/MCAsyncIMAP.h index 1fb51de0..e6d6d367 100755 --- a/src/async/imap/MCAsyncIMAP.h +++ b/src/async/imap/MCAsyncIMAP.h @@ -35,5 +35,6 @@ #include #include #include +#include #endif diff --git a/src/async/imap/MCIMAPAsyncSession.cpp b/src/async/imap/MCIMAPAsyncSession.cpp index 976dce95..aa7be032 100755 --- a/src/async/imap/MCIMAPAsyncSession.cpp +++ b/src/async/imap/MCIMAPAsyncSession.cpp @@ -719,7 +719,7 @@ IMAPOperation * IMAPAsyncSession::connectOperation() return op; } -IMAPOperation * IMAPAsyncSession::checkAccountOperation() +IMAPCheckAccountOperation * IMAPAsyncSession::checkAccountOperation() { IMAPCheckAccountOperation * op = new IMAPCheckAccountOperation(); op->setMainSession(this); diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h index f5129a26..873c3dde 100755 --- a/src/async/imap/MCIMAPAsyncSession.h +++ b/src/async/imap/MCIMAPAsyncSession.h @@ -42,6 +42,7 @@ namespace mailcore { class IMAPIdentity; class OperationQueueCallback; class IMAPCustomCommandOperation; + class IMAPCheckAccountOperation; class MAILCORE_EXPORT IMAPAsyncSession : public Object { public: @@ -163,7 +164,7 @@ namespace mailcore { virtual IMAPIdentityOperation * identityOperation(IMAPIdentity * identity); virtual IMAPOperation * connectOperation(); - virtual IMAPOperation * checkAccountOperation(); + virtual IMAPCheckAccountOperation * checkAccountOperation(); virtual IMAPOperation * disconnectOperation(); virtual IMAPCapabilityOperation * capabilityOperation(); diff --git a/src/async/imap/MCIMAPCheckAccountOperation.cpp b/src/async/imap/MCIMAPCheckAccountOperation.cpp index 5baa89a9..4a833711 100644 --- a/src/async/imap/MCIMAPCheckAccountOperation.cpp +++ b/src/async/imap/MCIMAPCheckAccountOperation.cpp @@ -13,11 +13,30 @@ using namespace mailcore; +IMAPCheckAccountOperation::IMAPCheckAccountOperation() +{ + mLoginResponse = NULL; +} + +IMAPCheckAccountOperation::~IMAPCheckAccountOperation() +{ + MC_SAFE_RELEASE(mLoginResponse); +} + void IMAPCheckAccountOperation::main() { ErrorCode error; session()->session()->connectIfNeeded(&error); - if (error == ErrorNone) + if (error == ErrorNone) { session()->session()->login(&error); + if (error != ErrorNone) { + MC_SAFE_REPLACE_COPY(String, mLoginResponse, session()->session()->loginResponse()); + } + } setError(error); } + +String * IMAPCheckAccountOperation::loginResponse() +{ + return mLoginResponse; +} diff --git a/src/async/imap/MCIMAPCheckAccountOperation.h b/src/async/imap/MCIMAPCheckAccountOperation.h index 9c81f00e..b6ce9dbf 100644 --- a/src/async/imap/MCIMAPCheckAccountOperation.h +++ b/src/async/imap/MCIMAPCheckAccountOperation.h @@ -17,8 +17,17 @@ namespace mailcore { class MAILCORE_EXPORT IMAPCheckAccountOperation : public IMAPOperation { + public: + IMAPCheckAccountOperation(); + virtual ~IMAPCheckAccountOperation(); + + virtual String * loginResponse(); + public: // subclass behavior virtual void main(); + + private: + String * mLoginResponse; }; } diff --git a/src/cmake/objc.cmake b/src/cmake/objc.cmake index aeb01d3b..f4e10b28 100644 --- a/src/cmake/objc.cmake +++ b/src/cmake/objc.cmake @@ -43,6 +43,7 @@ set(objc_imap_files objc/imap/MCOIMAPSearchOperation.mm objc/imap/MCOIMAPNoopOperation.mm objc/imap/MCOIMAPCustomCommandOperation.mm + objc/imap/MCOIMAPCheckAccountOperation.mm objc/imap/MCOIMAPSession.mm ) diff --git a/src/cmake/public-headers.cmake b/src/cmake/public-headers.cmake index bcbdb0b6..a6bd7f93 100644 --- a/src/cmake/public-headers.cmake +++ b/src/cmake/public-headers.cmake @@ -102,6 +102,7 @@ async/imap/MCIMAPQuotaOperation.h async/imap/MCIMAPOperationCallback.h async/imap/MCIMAPMessageRenderingOperation.h async/imap/MCIMAPCustomCommandOperation.h +async/imap/MCIMAPCheckAccountOperation.h async/pop/MCAsyncPOP.h async/pop/MCPOPAsyncSession.h async/pop/MCPOPOperation.h diff --git a/src/core/imap/MCIMAPSession.cpp b/src/core/imap/MCIMAPSession.cpp index 8b8565d9..8f404cc9 100755 --- a/src/core/imap/MCIMAPSession.cpp +++ b/src/core/imap/MCIMAPSession.cpp @@ -480,6 +480,11 @@ bool IMAPSession::isVoIPEnabled() return mVoIPEnabled; } +String * IMAPSession::loginResponse() +{ + return mLoginResponse; +} + static bool hasError(int errorCode) { return ((errorCode != MAILIMAP_NO_ERROR) && (errorCode != MAILIMAP_NO_ERROR_AUTHENTICATED) && @@ -829,6 +834,7 @@ void IMAPSession::login(ErrorCode * pError) if (mImap->imap_response != NULL) { response = String::stringWithUTF8Characters(mImap->imap_response); } + MC_SAFE_REPLACE_COPY(String, mLoginResponse, response); if (response->locationOfString(MCSTR("not enabled for IMAP use")) != -1) { * pError = ErrorGmailIMAPNotEnabled; } diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 9c6ba95b..fa230d40 100755 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -207,6 +207,8 @@ namespace mailcore { /** Check if the automatic query of the capabilities of the IMAP server is enabled. */ virtual bool isAutomaticConfigurationEnabled(); + + virtual String * loginResponse(); public: // private virtual void loginIfNeeded(ErrorCode * pError); diff --git a/src/core/provider/MCAccountValidator.cpp b/src/core/provider/MCAccountValidator.cpp index 1e6ebdd9..d35bd000 100644 --- a/src/core/provider/MCAccountValidator.cpp +++ b/src/core/provider/MCAccountValidator.cpp @@ -18,6 +18,7 @@ #include "MCPOPOperation.h" #include "MCSMTPOperation.h" #include "MCMXRecordResolverOperation.h" +#include "MCIMAPCheckAccountOperation.h" using namespace mailcore; @@ -47,6 +48,7 @@ void AccountValidator::init() mImapError = ErrorNone; mPopError = ErrorNone; mSmtpError = ErrorNone; + mImapLoginResponse = NULL; mCurrentServiceIndex = 0; mCurrentServiceTested = 0; @@ -77,6 +79,7 @@ AccountValidator::AccountValidator() AccountValidator::~AccountValidator() { pthread_mutex_destroy(&mConnectionLoggerLock); + MC_SAFE_RELEASE(mImapLoginResponse); MC_SAFE_RELEASE(mEmail); MC_SAFE_RELEASE(mUsername); MC_SAFE_RELEASE(mPassword); @@ -256,7 +259,7 @@ void AccountValidator::checkNextHost() mImapSession->setConnectionType(mImapServer->connectionType()); mImapSession->setConnectionLogger(this); - mOperation = (IMAPOperation *)mImapSession->checkAccountOperation(); + mOperation = mImapSession->checkAccountOperation(); mOperation->retain(); mOperation->setCallback(this); mOperation->start(); @@ -340,6 +343,7 @@ void AccountValidator::checkNextHostDone() if (mCurrentServiceTested == SERVICE_IMAP) { mImapError = ((IMAPOperation *)mOperation)->error(); + MC_SAFE_REPLACE_COPY(String, mImapLoginResponse, ((IMAPCheckAccountOperation *)mOperation)->loginResponse()); error = mImapError; mImapSession->setConnectionLogger(NULL); MC_SAFE_RELEASE(mImapSession); @@ -506,6 +510,11 @@ ErrorCode AccountValidator::smtpError() return mSmtpError; } +String * AccountValidator::imapLoginResponse() +{ + return mImapLoginResponse; +} + void AccountValidator::setConnectionLogger(ConnectionLogger * logger) { pthread_mutex_lock(&mConnectionLoggerLock); diff --git a/src/core/provider/MCAccountValidator.h b/src/core/provider/MCAccountValidator.h index 788458b6..7029870f 100644 --- a/src/core/provider/MCAccountValidator.h +++ b/src/core/provider/MCAccountValidator.h @@ -64,7 +64,8 @@ namespace mailcore { virtual ErrorCode imapError(); virtual ErrorCode popError(); virtual ErrorCode smtpError(); - + virtual String * imapLoginResponse(); + virtual void start(); virtual void cancel(); @@ -89,6 +90,7 @@ namespace mailcore { ErrorCode mImapError; ErrorCode mPopError; ErrorCode mSmtpError; + String * mImapLoginResponse; MailProvider * mProvider; diff --git a/src/objc/imap/MCOIMAPCheckAccountOperation.h b/src/objc/imap/MCOIMAPCheckAccountOperation.h new file mode 100644 index 00000000..f2ad3340 --- /dev/null +++ b/src/objc/imap/MCOIMAPCheckAccountOperation.h @@ -0,0 +1,22 @@ +// +// MCOIMAPCheckAccountOperation.h +// mailcore2 +// +// Created by Hoa V. DINH on 3/7/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#ifndef MAILCORE_MCOIMAPCHECKACCOUNTOPERATION_H + +#define MAILCORE_MCOIMAPCHECKACCOUNTOPERATION_H + +#import + +NS_ASSUME_NONNULL_BEGIN +/* The class is used to perform a No-Op operation. */ +@interface MCOIMAPCheckAccountOperation : MCOIMAPOperation + +@end +NS_ASSUME_NONNULL_END + +#endif diff --git a/src/objc/imap/MCOIMAPCheckAccountOperation.mm b/src/objc/imap/MCOIMAPCheckAccountOperation.mm new file mode 100644 index 00000000..f1aa59b4 --- /dev/null +++ b/src/objc/imap/MCOIMAPCheckAccountOperation.mm @@ -0,0 +1,74 @@ +// +// MCOIMAPCheckAccountOperation.m +// mailcore2 +// +// Created by Hoa V. DINH on 3/7/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#import "MCOIMAPCheckAccountOperation.h" + +#include "MCIMAPCheckAccountOperation.h" + +#import "MCOOperation+Private.h" +#import "MCOUtils.h" + +typedef void (^CompletionType)(NSError *error); + +@implementation MCOIMAPCheckAccountOperation { + CompletionType _completionBlock; +} + +#define nativeType mailcore::IMAPCheckAccountOperation + ++ (void) load +{ + MCORegisterClass(self, &typeid(nativeType)); +} + ++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object +{ + nativeType * op = (nativeType *) object; + return [[[self alloc] initWithMCOperation:op] autorelease]; +} + +- (void) dealloc +{ + [_completionBlock release]; + [super dealloc]; +} + +- (void) start:(void (^)(NSError *error))completionBlock +{ + _completionBlock = [completionBlock copy]; + [self start]; +} + +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ + if (_completionBlock == NULL) + return; + + nativeType *op = MCO_NATIVE_INSTANCE; + if (op->error() == mailcore::ErrorNone) { + _completionBlock(nil); + } else { + NSError * error = [NSError mco_errorWithErrorCode:op->error()]; + if (op->loginResponse() != NULL) { + NSDictionary * userInfo = @{@"IMAPServerError": MCO_TO_OBJC(op->loginResponse())}; + error = [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo]; + } + _completionBlock(error); + } + [_completionBlock release]; + _completionBlock = nil; +} + +@end diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm index fdd57886..bec998c8 100755 --- a/src/objc/imap/MCOIMAPSession.mm +++ b/src/objc/imap/MCOIMAPSession.mm @@ -616,7 +616,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, - (MCOIMAPOperation *)checkAccountOperation { IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation(); - return OPAQUE_OPERATION(coreOp); + return MCO_TO_OBJC_OP(coreOp); } - (MCOIMAPCapabilityOperation *) capabilityOperation -- cgit v1.2.3