aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Nikolay Morev <kolyuchiy@gmail.com>2016-04-06 09:45:42 +0400
committerGravatar HoĆ  V. DINH <dinh.viet.hoa@gmail.com>2016-04-05 22:45:42 -0700
commitf6129b13dda6f5f927568600a4e7dbea03939731 (patch)
tree199fbee36eb258ad0447f30d8aae3756410710ba
parent36d342d911e0cf2cad6a008ecc9b5ce401c9029e (diff)
Expose SMTP response and response code to Objective-C API
* Expose SMTP response and response code to Objective-C API
-rw-r--r--src/async/smtp/MCSMTPOperation.cpp11
-rw-r--r--src/async/smtp/MCSMTPOperation.h4
-rw-r--r--src/core/smtp/MCSMTPSession.cpp14
-rw-r--r--src/core/smtp/MCSMTPSession.h4
-rw-r--r--src/objc/abstract/MCOConstants.h5
-rw-r--r--src/objc/smtp/MCOSMTPLoginOperation.mm3
-rw-r--r--src/objc/smtp/MCOSMTPNoopOperation.mm3
-rw-r--r--src/objc/smtp/MCOSMTPOperation+Private.h2
-rw-r--r--src/objc/smtp/MCOSMTPOperation.mm21
-rw-r--r--src/objc/smtp/MCOSMTPSendOperation.mm3
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 <stdlib.h>
+#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;