From aeb15860575a764dd444108098dcb95c73d4d6df Mon Sep 17 00:00:00 2001 From: robario Date: Wed, 29 Oct 2014 17:32:09 +0900 Subject: Add a new operation for SMTP login. --- build-mac/mailcore2.xcodeproj/project.pbxproj | 20 ++++++++ src/async/smtp/MCSMTPAsyncSession.cc | 8 ++++ src/async/smtp/MCSMTPAsyncSession.h | 1 + src/async/smtp/MCSMTPLoginOperation.cc | 29 ++++++++++++ src/async/smtp/MCSMTPLoginOperation.h | 34 ++++++++++++++ src/cmake/async.cmake | 1 + src/cmake/objc.cmake | 1 + src/cmake/public-headers.cmake | 1 + src/core/smtp/MCSMTPSession.h | 2 +- src/objc/smtp/MCOSMTP.h | 1 + src/objc/smtp/MCOSMTPLoginOperation.h | 32 +++++++++++++ src/objc/smtp/MCOSMTPLoginOperation.mm | 66 +++++++++++++++++++++++++++ src/objc/smtp/MCOSMTPSession.h | 10 ++++ src/objc/smtp/MCOSMTPSession.mm | 9 ++++ 14 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 src/async/smtp/MCSMTPLoginOperation.cc create mode 100644 src/async/smtp/MCSMTPLoginOperation.h create mode 100644 src/objc/smtp/MCOSMTPLoginOperation.h create mode 100644 src/objc/smtp/MCOSMTPLoginOperation.mm diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 4fadc330..07a60469 100755 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -135,6 +135,12 @@ 84E65533199BE15500EC8CC4 /* MCNNTPSession.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189A018C93FB7002063A3 /* MCNNTPSession.h */; }; 84E65534199BE2BF00EC8CC4 /* MCNNTPGroupInfo.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189AA18C94986002063A3 /* MCNNTPGroupInfo.h */; }; 84E65535199BE2C300EC8CC4 /* MCNNTPGroupInfo.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189AA18C94986002063A3 /* MCNNTPGroupInfo.h */; }; + 8B0095C91A00DDC500F84BC0 /* MCSMTPLoginOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cc */; }; + 8B0095CC1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095CB1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm */; }; + 8B0095CD1A00DE2A00F84BC0 /* MCOSMTPLoginOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */; }; + 8B0095CE1A00DE7700F84BC0 /* MCOSMTPLoginOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095CB1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm */; }; + 8B0095CF1A00DE7700F84BC0 /* MCSMTPLoginOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cc */; }; + 8B5764371A00E1B0004868C0 /* MCOSMTPLoginOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */; }; 943F1A9A17D964F600F0C798 /* MCIMAPConnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 943F1A9817D964F600F0C798 /* MCIMAPConnectOperation.cc */; }; 943F1A9E17D96C5500F0C798 /* MCIMAPConnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 943F1A9817D964F600F0C798 /* MCIMAPConnectOperation.cc */; }; 943F1AA017D9736100F0C798 /* MCIMAPConnectOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 943F1A9917D964F600F0C798 /* MCIMAPConnectOperation.h */; }; @@ -975,6 +981,7 @@ C6A81BF01707806800882C15 /* MCOSMTPOperation.h in CopyFiles */, C6A81BED1707806100882C15 /* MCOPOPFetchMessagesOperation.h in CopyFiles */, C6D6F96B1720F92D006F5B28 /* MCICUTypes.h in CopyFiles */, + 8B5764371A00E1B0004868C0 /* MCOSMTPLoginOperation.h in CopyFiles */, C6A81BEF1707806600882C15 /* MCOSMTPSendOperation.h in CopyFiles */, C63CD68916BE1BC100DB18F1 /* MCDateFormatter.h in CopyFiles */, C6F61FAE170288640073032E /* MCOMessageBuilder.h in CopyFiles */, @@ -1210,6 +1217,7 @@ C6CF62DA175325D5006398B9 /* MCMailProvidersManager.h in CopyFiles */, C6CF62DB175325E2006398B9 /* MCNetService.h in CopyFiles */, C6A81BF91707811500882C15 /* MCOSMTPOperation.h in CopyFiles */, + 8B0095CD1A00DE2A00F84BC0 /* MCOSMTPLoginOperation.h in CopyFiles */, C6A81BF81707811100882C15 /* MCOSMTPSendOperation.h in CopyFiles */, C6BA2B111705F4E6003F0E9E /* MCOConstants.h in CopyFiles */, C6A81BF71707811000882C15 /* MCOSMTPSession.h in CopyFiles */, @@ -1431,6 +1439,10 @@ 84D7378E199C02A8005124E5 /* MCONNTPDisconnectOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCONNTPDisconnectOperation.mm; sourceTree = ""; }; 84D73791199C0511005124E5 /* MCONNTPGroupInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCONNTPGroupInfo.h; sourceTree = ""; }; 84D73792199C0511005124E5 /* MCONNTPGroupInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCONNTPGroupInfo.mm; sourceTree = ""; }; + 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPLoginOperation.cc; sourceTree = ""; }; + 8B0095C81A00DDC500F84BC0 /* MCSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCSMTPLoginOperation.h; sourceTree = ""; }; + 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOSMTPLoginOperation.h; sourceTree = ""; }; + 8B0095CB1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOSMTPLoginOperation.mm; sourceTree = ""; }; 943F1A9817D964F600F0C798 /* MCIMAPConnectOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPConnectOperation.cc; sourceTree = ""; }; 943F1A9917D964F600F0C798 /* MCIMAPConnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPConnectOperation.h; sourceTree = ""; }; 9E774D871767C54E0065EB9B /* MCIMAPFolderStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPFolderStatus.h; sourceTree = ""; }; @@ -2249,6 +2261,8 @@ C64EA7E316A149EF00778456 /* MCAsyncSMTP.h */, C64EA68F169E847800778456 /* MCSMTPAsyncSession.cc */, C64EA690169E847800778456 /* MCSMTPAsyncSession.h */, + 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cc */, + 8B0095C81A00DDC500F84BC0 /* MCSMTPLoginOperation.h */, C64EA79C169F29A700778456 /* MCSMTPSendWithDataOperation.cc */, C64EA79D169F29A700778456 /* MCSMTPSendWithDataOperation.h */, C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */, @@ -2638,6 +2652,8 @@ C6A81BE81706A6B300882C15 /* MCOSMTP.h */, C6A81BBD17068E5E00882C15 /* MCOSMTPSession.h */, C6A81BBE17068E5E00882C15 /* MCOSMTPSession.mm */, + 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */, + 8B0095CB1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm */, C6A81BC117068E9500882C15 /* MCOSMTPSendOperation.h */, C6A81BC217068E9500882C15 /* MCOSMTPSendOperation.mm */, 8416A99B17F284F400B3C7DA /* MCOSMTPNoopOperation.h */, @@ -3088,6 +3104,7 @@ 8416A9A117F2871D00B3C7DA /* MCOIMAPNoopOperation.mm in Sources */, C64EA784169F24E400778456 /* MCSMTPAsyncSession.cc in Sources */, C6F7B19F17A1C15200BE78BB /* MCCertificateUtils.cc in Sources */, + 8B0095C91A00DDC500F84BC0 /* MCSMTPLoginOperation.cc in Sources */, C64EA79E169F29A700778456 /* MCSMTPSendWithDataOperation.cc in Sources */, C64EA7DA16A1386600778456 /* MCSMTPOperation.cc in Sources */, C64EA7EA16A154B300778456 /* MCSMTPCheckAccountOperation.cc in Sources */, @@ -3202,6 +3219,7 @@ C6F61FB51702AB340073032E /* MCOIMAPBaseOperation.mm in Sources */, C608167517759967001F1018 /* MCSMTPDisconnectOperation.cc in Sources */, C6A81BBF17068E5E00882C15 /* MCOSMTPSession.mm in Sources */, + 8B0095CC1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm in Sources */, C6A81BC317068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */, C6A81BC717068EB000882C15 /* MCOSMTPOperation.mm in Sources */, 8416A99D17F284F400B3C7DA /* MCOSMTPNoopOperation.mm in Sources */, @@ -3330,6 +3348,7 @@ 8416A9A217F2871D00B3C7DA /* MCOIMAPNoopOperation.mm in Sources */, C6BA2BBF1705F4E6003F0E9E /* MCSMTPAsyncSession.cc in Sources */, C6F7B1A017A1C15200BE78BB /* MCCertificateUtils.cc in Sources */, + 8B0095CF1A00DE7700F84BC0 /* MCSMTPLoginOperation.cc in Sources */, C6BA2BC01705F4E6003F0E9E /* MCSMTPSendWithDataOperation.cc in Sources */, C6BA2BC11705F4E6003F0E9E /* MCSMTPOperation.cc in Sources */, C6BA2BC21705F4E6003F0E9E /* MCSMTPCheckAccountOperation.cc in Sources */, @@ -3444,6 +3463,7 @@ C6BA2C141705F4E6003F0E9E /* MCOIMAPBaseOperation.mm in Sources */, C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */, C6A81BC017068E5E00882C15 /* MCOSMTPSession.mm in Sources */, + 8B0095CE1A00DE7700F84BC0 /* MCOSMTPLoginOperation.mm in Sources */, C6A81BC417068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */, C6A81BC817068EB000882C15 /* MCOSMTPOperation.mm in Sources */, 8416A99E17F284F400B3C7DA /* MCOSMTPNoopOperation.mm in Sources */, diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc index 1964c944..8acfc9c5 100644 --- a/src/async/smtp/MCSMTPAsyncSession.cc +++ b/src/async/smtp/MCSMTPAsyncSession.cc @@ -1,6 +1,7 @@ #include "MCSMTPAsyncSession.h" #include "MCSMTPSession.h" +#include "MCSMTPLoginOperation.h" #include "MCSMTPSendWithDataOperation.h" #include "MCSMTPCheckAccountOperation.h" #include "MCSMTPDisconnectOperation.h" @@ -206,6 +207,13 @@ void SMTPAsyncSession::tryAutomaticDisconnectAfterDelay(void * context) op->start(); } +SMTPOperation * SMTPAsyncSession::loginOperation() +{ + SMTPLoginOperation * op = new SMTPLoginOperation(); + op->setSession(this); + return (SMTPOperation *) op->autorelease(); +} + SMTPOperation * SMTPAsyncSession::sendMessageOperation(Data * messageData) { SMTPSendWithDataOperation * op = new SMTPSendWithDataOperation(); diff --git a/src/async/smtp/MCSMTPAsyncSession.h b/src/async/smtp/MCSMTPAsyncSession.h index fa0893d2..a48b5c26 100644 --- a/src/async/smtp/MCSMTPAsyncSession.h +++ b/src/async/smtp/MCSMTPAsyncSession.h @@ -59,6 +59,7 @@ namespace mailcore { virtual dispatch_queue_t dispatchQueue(); #endif + virtual SMTPOperation * loginOperation(); virtual SMTPOperation * sendMessageOperation(Data * messageData); virtual SMTPOperation * sendMessageOperation(Address * from, Array * recipients, Data * messageData); diff --git a/src/async/smtp/MCSMTPLoginOperation.cc b/src/async/smtp/MCSMTPLoginOperation.cc new file mode 100644 index 00000000..7740b54f --- /dev/null +++ b/src/async/smtp/MCSMTPLoginOperation.cc @@ -0,0 +1,29 @@ +// +// MCSMTPLoginOperation.cc +// mailcore2 +// +// Created by Robert Widmann on 9/24/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCSMTPLoginOperation.h" + +#include "MCSMTPAsyncSession.h" +#include "MCSMTPSession.h" + +using namespace mailcore; + +SMTPLoginOperation::SMTPLoginOperation() +{ +} + +SMTPLoginOperation::~SMTPLoginOperation() +{ +} + +void SMTPLoginOperation::main() +{ + ErrorCode error; + session()->session()->loginIfNeeded(&error); + setError(error); +} diff --git a/src/async/smtp/MCSMTPLoginOperation.h b/src/async/smtp/MCSMTPLoginOperation.h new file mode 100644 index 00000000..88b82641 --- /dev/null +++ b/src/async/smtp/MCSMTPLoginOperation.h @@ -0,0 +1,34 @@ +// +// MCSMTPLoginOperation.h +// mailcore2 +// +// Created by Robert Widmann on 9/24/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef MAILCORE_MCSMTPLOGINOPERATION_H + +#define MAILCORE_MCSMTPLOGINOPERATION_H + +#include +#include +#include + +#ifdef __cplusplus + +namespace mailcore { + + class SMTPLoginOperation : public SMTPOperation { + public: + SMTPLoginOperation(); + virtual ~SMTPLoginOperation(); + + public: // subclass behavior + virtual void main(); + }; + +} + +#endif + +#endif diff --git a/src/cmake/async.cmake b/src/cmake/async.cmake index 947a69ee..dc4a7243 100644 --- a/src/cmake/async.cmake +++ b/src/cmake/async.cmake @@ -49,6 +49,7 @@ set(async_smtp_files async/smtp/MCSMTPCheckAccountOperation.cc async/smtp/MCSMTPDisconnectOperation.cc async/smtp/MCSMTPOperation.cc + async/smtp/MCSMTPLoginOperation.cc async/smtp/MCSMTPSendWithDataOperation.cc async/smtp/MCSMTPNoopOperation.cc ) diff --git a/src/cmake/objc.cmake b/src/cmake/objc.cmake index cdf09dd6..0de041e7 100644 --- a/src/cmake/objc.cmake +++ b/src/cmake/objc.cmake @@ -70,6 +70,7 @@ set(objc_rfc822_files set(objc_smtp_files objc/smtp/MCOSMTPOperation.mm + objc/smtp/MCOSMTPLoginOperation.mm objc/smtp/MCOSMTPSendOperation.mm objc/smtp/MCOSMTPNoopOperation.mm objc/smtp/MCOSMTPSession.mm diff --git a/src/cmake/public-headers.cmake b/src/cmake/public-headers.cmake index b917dec9..df5331a4 100644 --- a/src/cmake/public-headers.cmake +++ b/src/cmake/public-headers.cmake @@ -183,6 +183,7 @@ objc/pop/MCOPOPFetchMessagesOperation.h objc/pop/MCOPOPMessageInfo.h objc/smtp/MCOSMTP.h objc/smtp/MCOSMTPSession.h +objc/smtp/MCOSMTPLoginOperation.h objc/smtp/MCOSMTPSendOperation.h objc/smtp/MCOSMTPOperation.h objc/nntp/MCONNTP.h diff --git a/src/core/smtp/MCSMTPSession.h b/src/core/smtp/MCSMTPSession.h index 844369f6..4f7c9135 100644 --- a/src/core/smtp/MCSMTPSession.h +++ b/src/core/smtp/MCSMTPSession.h @@ -95,13 +95,13 @@ namespace mailcore { void setup(); void unsetup(); void connectIfNeeded(ErrorCode * pError); - void loginIfNeeded(ErrorCode * pError); bool checkCertificate(); void sendMessage(MessageBuilder * msg, SMTPProgressCallback * callback, ErrorCode * pError); public: // private virtual bool isDisconnected(); + virtual void loginIfNeeded(ErrorCode * pError); }; } diff --git a/src/objc/smtp/MCOSMTP.h b/src/objc/smtp/MCOSMTP.h index 49d01de3..7434a855 100644 --- a/src/objc/smtp/MCOSMTP.h +++ b/src/objc/smtp/MCOSMTP.h @@ -11,6 +11,7 @@ #define MAILCORE_MCOSMTP_H #import +#import #import #import diff --git a/src/objc/smtp/MCOSMTPLoginOperation.h b/src/objc/smtp/MCOSMTPLoginOperation.h new file mode 100644 index 00000000..7eee9986 --- /dev/null +++ b/src/objc/smtp/MCOSMTPLoginOperation.h @@ -0,0 +1,32 @@ +// +// MCOSMTPLoginOperation.h +// mailcore2 +// +// Created by Robert Widmann on 9/24/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef MAILCORE_MCOSMTPLOGINOPERATION_H + +#define MAILCORE_MCOSMTPLOGINOPERATION_H + +#import + +/** This is an asynchronous operation that will perform a noop operation through SMTP. */ +@interface MCOSMTPLoginOperation : MCOSMTPOperation + +/* + Starts the asynchronous operation. + + @param completionBlock Called when the operation is finished. + + - On success `error` will be nil + + - On failure, `error` will be set with `MCOErrorDomain` as domain and an + error code available in MCOConstants.h, + */ +- (void) start:(void (^)(NSError * error))completionBlock; + +@end + +#endif diff --git a/src/objc/smtp/MCOSMTPLoginOperation.mm b/src/objc/smtp/MCOSMTPLoginOperation.mm new file mode 100644 index 00000000..ece721ee --- /dev/null +++ b/src/objc/smtp/MCOSMTPLoginOperation.mm @@ -0,0 +1,66 @@ +// +// MCOSMTPLoginOperation.m +// mailcore2 +// +// Created by Robert Widmann on 9/24/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCOSMTPLoginOperation.h" + +#include "MCSMTPLoginOperation.h" + +#import "MCOUtils.h" +#import "MCOOperation+Private.h" + +typedef void (^CompletionType)(NSError *error); + +@implementation MCOSMTPLoginOperation { + CompletionType _completionBlock; +} + +#define nativeType mailcore::SMTPLoginOperation + ++ (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; + + NSError * error = [NSError mco_errorWithErrorCode:MCO_NATIVE_INSTANCE->error()]; + _completionBlock(error); + [_completionBlock release]; + _completionBlock = NULL; +} + + +@end diff --git a/src/objc/smtp/MCOSMTPSession.h b/src/objc/smtp/MCOSMTPSession.h index 286cd7c3..d462dbfb 100644 --- a/src/objc/smtp/MCOSMTPSession.h +++ b/src/objc/smtp/MCOSMTPSession.h @@ -88,6 +88,16 @@ /** @name Operations */ +/** + Returns an operation that will perform a login. + + MCOPOPOperation * op = [session loginOperation]; + [op start:^(NSError * error) { + ... + }]; + */ +- (MCOSMTPOperation *) loginOperation; + /** Returns an operation that will send the given message through SMTP. It will use the recipient set in the message data (To, Cc and Bcc). diff --git a/src/objc/smtp/MCOSMTPSession.mm b/src/objc/smtp/MCOSMTPSession.mm index e0eb2a7d..6b40c709 100644 --- a/src/objc/smtp/MCOSMTPSession.mm +++ b/src/objc/smtp/MCOSMTPSession.mm @@ -11,6 +11,7 @@ #include "MCAsyncSMTP.h" #import "MCOUtils.h" +#import "MCOSMTPLoginOperation.h" #import "MCOSMTPSendOperation.h" #import "MCOSMTPNoopOperation.h" #import "MCOSMTPOperation.h" @@ -104,6 +105,14 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, #pragma mark - Operations +- (MCOSMTPOperation *) loginOperation +{ + mailcore::SMTPOperation * coreOp = MCO_NATIVE_INSTANCE->loginOperation(); + MCOSMTPLoginOperation * result = [[[MCOSMTPLoginOperation alloc] initWithMCOperation:coreOp] autorelease]; + [result setSession:self]; + return result; +} + - (MCOSMTPSendOperation *) sendOperationWithData:(NSData *)messageData { mailcore::SMTPOperation * coreOp = MCO_NATIVE_INSTANCE->sendMessageOperation([messageData mco_mcData]); -- cgit v1.2.3