From f6129b13dda6f5f927568600a4e7dbea03939731 Mon Sep 17 00:00:00 2001 From: Nikolay Morev Date: Wed, 6 Apr 2016 09:45:42 +0400 Subject: Expose SMTP response and response code to Objective-C API * Expose SMTP response and response code to Objective-C API --- src/async/smtp/MCSMTPOperation.cpp | 11 +++++++++++ src/async/smtp/MCSMTPOperation.h | 4 ++++ src/core/smtp/MCSMTPSession.cpp | 14 ++++++++++++-- src/core/smtp/MCSMTPSession.h | 4 ++++ src/objc/abstract/MCOConstants.h | 5 +++++ src/objc/smtp/MCOSMTPLoginOperation.mm | 3 ++- src/objc/smtp/MCOSMTPNoopOperation.mm | 3 ++- src/objc/smtp/MCOSMTPOperation+Private.h | 2 ++ src/objc/smtp/MCOSMTPOperation.mm | 21 ++++++++++++++++++++- src/objc/smtp/MCOSMTPSendOperation.mm | 3 ++- 10 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/async/smtp/MCSMTPOperation.cpp b/src/async/smtp/MCSMTPOperation.cpp index 28e1e152..0b3c8ad8 100644 --- a/src/async/smtp/MCSMTPOperation.cpp +++ b/src/async/smtp/MCSMTPOperation.cpp @@ -10,6 +10,7 @@ #include +#include "MCSMTPSession.h" #include "MCSMTPAsyncSession.h" #include "MCSMTPOperationCallback.h" @@ -72,6 +73,16 @@ ErrorCode SMTPOperation::error() return mError; } +String * SMTPOperation::lastSMTPResponse() +{ + return session()->session()->lastSMTPResponse(); +} + +int SMTPOperation::lastSMTPResponseCode() +{ + return session()->session()->lastSMTPResponseCode(); +} + struct progressContext { unsigned int current; unsigned int maximum; diff --git a/src/async/smtp/MCSMTPOperation.h b/src/async/smtp/MCSMTPOperation.h index 5978d3d6..d1c4182b 100644 --- a/src/async/smtp/MCSMTPOperation.h +++ b/src/async/smtp/MCSMTPOperation.h @@ -34,6 +34,10 @@ namespace mailcore { virtual void setError(ErrorCode error); virtual ErrorCode error(); + virtual String * lastSMTPResponse(); + + virtual int lastSMTPResponseCode(); + virtual void start(); private: diff --git a/src/core/smtp/MCSMTPSession.cpp b/src/core/smtp/MCSMTPSession.cpp index dfd55176..166a58cd 100644 --- a/src/core/smtp/MCSMTPSession.cpp +++ b/src/core/smtp/MCSMTPSession.cpp @@ -185,6 +185,16 @@ bool SMTPSession::useHeloIPEnabled() return mUseHeloIPEnabled; } +String * SMTPSession::lastSMTPResponse() +{ + return mLastSMTPResponse; +} + +int SMTPSession::lastSMTPResponseCode() +{ + return mLastSMTPResponseCode; +} + void SMTPSession::body_progress(size_t current, size_t maximum, void * context) { SMTPSession * session; @@ -712,8 +722,10 @@ void SMTPSession::internalSendMessage(Address * from, Array * recipients, Data * response = NULL; if (mSmtp->response != NULL) { response = String::stringWithUTF8Characters(mSmtp->response); + MC_SAFE_REPLACE_COPY(String, mLastSMTPResponse, response); } responseCode = mSmtp->response_code; + mLastSMTPResponseCode = responseCode; if ((r == MAILSMTP_ERROR_STREAM) || (r == MAILSMTP_ERROR_CONNECTION_REFUSED)) { * pError = ErrorConnection; @@ -758,9 +770,7 @@ void SMTPSession::internalSendMessage(Address * from, Array * recipients, Data * } * pError = ErrorSendMessage; - MC_SAFE_REPLACE_COPY(String, mLastSMTPResponse, response); mLastLibetpanError = r; - mLastSMTPResponseCode = responseCode; goto err; } diff --git a/src/core/smtp/MCSMTPSession.h b/src/core/smtp/MCSMTPSession.h index e54673c5..a5250d2e 100644 --- a/src/core/smtp/MCSMTPSession.h +++ b/src/core/smtp/MCSMTPSession.h @@ -49,6 +49,10 @@ namespace mailcore { virtual void setUseHeloIPEnabled(bool enabled); virtual bool useHeloIPEnabled(); + + virtual String * lastSMTPResponse(); + + virtual int lastSMTPResponseCode(); virtual void connect(ErrorCode * pError); virtual void disconnect(); diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h index cc422ed9..05e6f00f 100644 --- a/src/objc/abstract/MCOConstants.h +++ b/src/objc/abstract/MCOConstants.h @@ -423,6 +423,11 @@ typedef NS_ENUM(NSInteger, MCOErrorCode) { MCOErrorCodeCount, }; +/** Error userInfo key for SMTP operations response string */ +#define MCOSMTPResponseKey @"MCOSMTPResponseKey" +/** Error userInfo key for SMTP operations response code */ +#define MCOSMTPResponseCodeKey @"MCOSMTPResponseCodeKey" + /** Here's the list of connection log types.*/ typedef NS_ENUM(NSInteger, MCOConnectionLogType) { /** Received data.*/ diff --git a/src/objc/smtp/MCOSMTPLoginOperation.mm b/src/objc/smtp/MCOSMTPLoginOperation.mm index f84163da..2e947f17 100644 --- a/src/objc/smtp/MCOSMTPLoginOperation.mm +++ b/src/objc/smtp/MCOSMTPLoginOperation.mm @@ -12,6 +12,7 @@ #import "MCOUtils.h" #import "MCOOperation+Private.h" +#import "MCOSMTPOperation+Private.h" typedef void (^CompletionType)(NSError *error); @@ -56,7 +57,7 @@ typedef void (^CompletionType)(NSError *error); if (_completionBlock == NULL) return; - NSError * error = [NSError mco_errorWithErrorCode:MCO_NATIVE_INSTANCE->error()]; + NSError * error = [self _errorFromNativeOperation]; _completionBlock(error); [_completionBlock release]; _completionBlock = NULL; diff --git a/src/objc/smtp/MCOSMTPNoopOperation.mm b/src/objc/smtp/MCOSMTPNoopOperation.mm index aedb45bc..256029c9 100644 --- a/src/objc/smtp/MCOSMTPNoopOperation.mm +++ b/src/objc/smtp/MCOSMTPNoopOperation.mm @@ -12,6 +12,7 @@ #import "MCOUtils.h" #import "MCOOperation+Private.h" +#import "MCOSMTPOperation+Private.h" typedef void (^CompletionType)(NSError *error); @@ -56,7 +57,7 @@ typedef void (^CompletionType)(NSError *error); if (_completionBlock == NULL) return; - NSError * error = [NSError mco_errorWithErrorCode:MCO_NATIVE_INSTANCE->error()]; + NSError * error = [self _errorFromNativeOperation]; _completionBlock(error); [_completionBlock release]; _completionBlock = NULL; diff --git a/src/objc/smtp/MCOSMTPOperation+Private.h b/src/objc/smtp/MCOSMTPOperation+Private.h index a3cb0cb5..03397c79 100644 --- a/src/objc/smtp/MCOSMTPOperation+Private.h +++ b/src/objc/smtp/MCOSMTPOperation+Private.h @@ -16,6 +16,8 @@ @property (nonatomic, retain) MCOSMTPSession * session; +- (NSError *) _errorFromNativeOperation; + @end #endif diff --git a/src/objc/smtp/MCOSMTPOperation.mm b/src/objc/smtp/MCOSMTPOperation.mm index 9d96613f..3ff939c6 100644 --- a/src/objc/smtp/MCOSMTPOperation.mm +++ b/src/objc/smtp/MCOSMTPOperation.mm @@ -39,7 +39,7 @@ typedef void (^CompletionType)(NSError *error); if (_completionBlock == NULL) return; - NSError * error = [NSError mco_errorWithErrorCode:MCO_NATIVE_INSTANCE->error()]; + NSError * error = [self _errorFromNativeOperation]; _completionBlock(error); [_completionBlock release]; _completionBlock = NULL; @@ -56,4 +56,23 @@ typedef void (^CompletionType)(NSError *error); return _session; } +- (NSError *) _errorFromNativeOperation +{ + nativeType * op = MCO_NATIVE_INSTANCE; + NSError * error = [NSError mco_errorWithErrorCode:op->error()]; + if (error != nil) { + if (op->lastSMTPResponse() != NULL || op->lastSMTPResponseCode() != 0) { + NSMutableDictionary * userInfo = [[error userInfo] mutableCopy]; + if (op->lastSMTPResponse() != NULL) { + userInfo[MCOSMTPResponseKey] = MCO_TO_OBJC(op->lastSMTPResponse()); + } + if (op->lastSMTPResponseCode() != 0) { + userInfo[MCOSMTPResponseCodeKey] = @(op->lastSMTPResponseCode()); + } + error = [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo]; + } + } + return error; +} + @end diff --git a/src/objc/smtp/MCOSMTPSendOperation.mm b/src/objc/smtp/MCOSMTPSendOperation.mm index e02550da..ae108814 100644 --- a/src/objc/smtp/MCOSMTPSendOperation.mm +++ b/src/objc/smtp/MCOSMTPSendOperation.mm @@ -12,6 +12,7 @@ #import "MCOUtils.h" #import "MCOOperation+Private.h" +#import "MCOSMTPOperation+Private.h" #define nativeType mailcore::SMTPOperation @@ -99,7 +100,7 @@ private: if (_completionBlock == NULL) return; - NSError * error = [NSError mco_errorWithErrorCode:MCO_NATIVE_INSTANCE->error()]; + NSError * error = [self _errorFromNativeOperation]; _completionBlock(error); [_completionBlock release]; _completionBlock = NULL; -- cgit v1.2.3