aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.cc33
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.h9
-rw-r--r--src/async/imap/MCIMAPAsyncSession.cc1
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.cc8
-rw-r--r--src/async/smtp/MCSMTPSendWithDataOperation.cc2
-rw-r--r--src/core/basetypes/MCOperationQueue.cc6
-rw-r--r--src/core/basetypes/MCOperationQueueCallback.h3
-rw-r--r--src/objc/imap/MCOIMAPBaseOperation+Private.h20
-rw-r--r--src/objc/imap/MCOIMAPBaseOperation.mm15
-rw-r--r--src/objc/imap/MCOIMAPOperation.h4
-rw-r--r--src/objc/imap/MCOIMAPSession.mm70
-rw-r--r--src/objc/smtp/MCOSMTPOperation+Private.h20
-rw-r--r--src/objc/smtp/MCOSMTPOperation.mm14
-rw-r--r--src/objc/smtp/MCOSMTPSession.mm9
14 files changed, 177 insertions, 37 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 02320b3a..ed40932c 100644
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -32,6 +32,7 @@
#include "MCIMAPCapabilityOperation.h"
#include "MCOperationQueueCallback.h"
#include "MCIMAPDisconnectOperation.h"
+#include "MCIMAPAsyncSession.h"
using namespace mailcore;
@@ -45,8 +46,13 @@ namespace mailcore {
virtual ~IMAPOperationQueueCallback() {
}
- virtual void queueIdle() {
+ virtual void queueStartRunning() {
+ mConnection->queueStartRunning();
+ }
+
+ virtual void queueStoppedRunning() {
mConnection->tryAutomaticDisconnect();
+ mConnection->queueStoppedRunning();
}
private:
@@ -63,10 +69,12 @@ IMAPAsyncConnection::IMAPAsyncConnection()
mLastFolder = NULL;
mQueueCallback = new IMAPOperationQueueCallback(this);
mQueue->setCallback(mQueueCallback);
+ mOwner = NULL;
}
IMAPAsyncConnection::~IMAPAsyncConnection()
{
+ cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL);
MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mLastFolder);
MC_SAFE_RELEASE(mDefaultNamespace);
@@ -485,6 +493,18 @@ void IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay(void * context)
op->start();
}
+void IMAPAsyncConnection::queueStartRunning()
+{
+ this->retain();
+ mOwner->retain();
+}
+
+void IMAPAsyncConnection::queueStoppedRunning()
+{
+ mOwner->release();
+ this->release();
+}
+
void IMAPAsyncConnection::setLastFolder(String * folder)
{
MC_SAFE_REPLACE_COPY(String, mLastFolder, folder);
@@ -495,3 +515,14 @@ String * IMAPAsyncConnection::lastFolder()
return mLastFolder;
}
+void IMAPAsyncConnection::setOwner(IMAPAsyncSession * owner)
+{
+ mOwner = owner;
+}
+
+IMAPAsyncSession * IMAPAsyncConnection::owner()
+{
+ return mOwner;
+}
+
+
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index 7869644c..d6ef6a91 100644
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -26,6 +26,7 @@ namespace mailcore {
class IMAPIdentityOperation;
class IMAPCapabilityOperation;
class IMAPOperationQueueCallback;
+ class IMAPAsyncSession;
class IMAPAsyncConnection : public Object {
public:
@@ -118,7 +119,8 @@ namespace mailcore {
IMAPNamespace * mDefaultNamespace;
String * mLastFolder;
IMAPOperationQueueCallback * mQueueCallback;
-
+ IMAPAsyncSession * mOwner;
+
virtual void tryAutomaticDisconnectAfterDelay(void * context);
public: // private
@@ -131,6 +133,11 @@ namespace mailcore {
virtual String * lastFolder();
virtual void tryAutomaticDisconnect();
+ virtual void queueStartRunning();
+ virtual void queueStoppedRunning();
+
+ virtual void setOwner(IMAPAsyncSession * owner);
+ virtual IMAPAsyncSession * owner();
};
}
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 3fbd5470..7c085e4a 100644
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -174,6 +174,7 @@ unsigned int IMAPAsyncSession::maximumConnections()
IMAPAsyncConnection * IMAPAsyncSession::session()
{
IMAPAsyncConnection * session = new IMAPAsyncConnection();
+ session->setOwner(this);
session->autorelease();
session->setHostname(mHostname);
diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc
index cf028ced..73bc2a54 100644
--- a/src/async/smtp/MCSMTPAsyncSession.cc
+++ b/src/async/smtp/MCSMTPAsyncSession.cc
@@ -19,8 +19,13 @@ namespace mailcore {
virtual ~SMTPOperationQueueCallback() {
}
- virtual void queueIdle() {
+ virtual void queueStartRunning() {
+ mSession->retain();
+ }
+
+ virtual void queueStoppedRunning() {
mSession->tryAutomaticDisconnect();
+ mSession->release();
}
private:
@@ -38,6 +43,7 @@ SMTPAsyncSession::SMTPAsyncSession()
SMTPAsyncSession::~SMTPAsyncSession()
{
+ cancelDelayedPerformMethod((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL);
MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mQueue);
MC_SAFE_RELEASE(mSession);
diff --git a/src/async/smtp/MCSMTPSendWithDataOperation.cc b/src/async/smtp/MCSMTPSendWithDataOperation.cc
index b64f835b..bb2c5ea9 100644
--- a/src/async/smtp/MCSMTPSendWithDataOperation.cc
+++ b/src/async/smtp/MCSMTPSendWithDataOperation.cc
@@ -38,6 +38,4 @@ void SMTPSendWithDataOperation::main()
ErrorCode error;
session()->session()->sendMessage(mMessageData, this, &error);
setError(error);
-
- //tryAutomaticDisconnect();
}
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc
index f13c9cde..e448c237 100644
--- a/src/core/basetypes/MCOperationQueue.cc
+++ b/src/core/basetypes/MCOperationQueue.cc
@@ -158,7 +158,7 @@ void OperationQueue::stoppedOnMainThread(void * context)
mStarted = false;
if (mCallback) {
- mCallback->queueIdle();
+ mCallback->queueStoppedRunning();
}
release(); // (2)
@@ -171,6 +171,10 @@ void OperationQueue::startThread()
if (mStarted)
return;
+ if (mCallback) {
+ mCallback->queueStartRunning();
+ }
+
retain(); // (3)
mQuitting = false;
mStarted = true;
diff --git a/src/core/basetypes/MCOperationQueueCallback.h b/src/core/basetypes/MCOperationQueueCallback.h
index bf7868ae..367888bb 100644
--- a/src/core/basetypes/MCOperationQueueCallback.h
+++ b/src/core/basetypes/MCOperationQueueCallback.h
@@ -15,7 +15,8 @@ namespace mailcore {
class OperationQueueCallback {
public:
- virtual void queueIdle() {}
+ virtual void queueStartRunning() {}
+ virtual void queueStoppedRunning() {}
};
}
diff --git a/src/objc/imap/MCOIMAPBaseOperation+Private.h b/src/objc/imap/MCOIMAPBaseOperation+Private.h
new file mode 100644
index 00000000..e744355a
--- /dev/null
+++ b/src/objc/imap/MCOIMAPBaseOperation+Private.h
@@ -0,0 +1,20 @@
+//
+// Header.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_MCOIMAPBASEOPERATION_PRIVATE_H_
+#define __MAILCORE_MCOIMAPBASEOPERATION_PRIVATE_H_
+
+@class MCOIMAPSession;
+
+@interface MCOIMAPBaseOperation (Private)
+
+@property (nonatomic, retain) MCOIMAPSession * session;
+
+@end
+
+#endif
diff --git a/src/objc/imap/MCOIMAPBaseOperation.mm b/src/objc/imap/MCOIMAPBaseOperation.mm
index be398ece..ed67e34e 100644
--- a/src/objc/imap/MCOIMAPBaseOperation.mm
+++ b/src/objc/imap/MCOIMAPBaseOperation.mm
@@ -7,10 +7,12 @@
//
#import "MCOIMAPBaseOperation.h"
+#import "MCOIMAPBaseOperation+Private.h"
#import "MCOOperation+Private.h"
#import "MCAsyncIMAP.h"
+#import "MCOIMAPSession.h"
class MCOIMAPBaseOperationIMAPCallback : public mailcore::IMAPOperationCallback {
public:
@@ -33,6 +35,7 @@ private:
@implementation MCOIMAPBaseOperation {
MCOIMAPBaseOperationIMAPCallback * _imapCallback;
+ MCOIMAPSession * _session;
}
- (id) initWithMCOperation:(mailcore::Operation *)op
@@ -47,10 +50,22 @@ private:
- (void) dealloc
{
+ [_session release];
delete _imapCallback;
[super dealloc];
}
+- (void) setSession:(MCOIMAPSession *)session
+{
+ [_session release];
+ _session = [session retain];
+}
+
+- (MCOIMAPSession *) session
+{
+ return _session;
+}
+
- (void) bodyProgress:(unsigned int)current maximum:(unsigned int)maximum
{
}
diff --git a/src/objc/imap/MCOIMAPOperation.h b/src/objc/imap/MCOIMAPOperation.h
index b8ee37e4..6f286596 100644
--- a/src/objc/imap/MCOIMAPOperation.h
+++ b/src/objc/imap/MCOIMAPOperation.h
@@ -12,9 +12,9 @@
/** This class implements a generic IMAP operation */
-#import <MailCore/MCOOperation.h>
+#import <MailCore/MCOIMAPBaseOperation.h>
-@interface MCOIMAPOperation : MCOOperation
+@interface MCOIMAPOperation : MCOIMAPBaseOperation
/**
Starts the asynchronous append operation.
diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm
index a13724ae..a8df8aed 100644
--- a/src/objc/imap/MCOIMAPSession.mm
+++ b/src/objc/imap/MCOIMAPSession.mm
@@ -13,6 +13,7 @@
#import "MCOObjectWrapper.h"
#import "MCOIMAPOperation.h"
#import "MCOIMAPFetchFoldersOperation.h"
+#import "MCOIMAPBaseOperation+Private.h"
#import "MCOUtils.h"
@@ -60,57 +61,74 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
#pragma mark - Operations
+#define MCO_TO_OBJC_OP(op) [self _objcOperationFromNativeOp:op];
+#define OPAQUE_OPERATION(op) [self _objcOpaqueOperationFromNativeOp:op]
+
+- (id) _objcOperationFromNativeOp:(IMAPOperation *)op
+{
+ MCOIMAPBaseOperation * result = MCO_TO_OBJC(op);
+ [result setSession:self];
+ return result;
+}
+
+- (id) _objcOpaqueOperationFromNativeOp:(IMAPOperation *)op
+{
+ MCOIMAPOperation * result = [[[MCOIMAPOperation alloc] initWithMCOperation:op] autorelease];
+ [result setSession:self];
+ return result;
+}
+
- (MCOIMAPFolderInfoOperation *) folderInfoOperation:(NSString *)folder
{
IMAPFolderInfoOperation * coreOp = MCO_NATIVE_INSTANCE->folderInfoOperation([folder mco_mcString]);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFolderStatusOperation *) folderStatusOperation:(NSString *)folder
{
IMAPFolderStatusOperation * coreOp = MCO_NATIVE_INSTANCE->folderStatusOperation([folder mco_mcString]);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchFoldersOperation *) fetchSubscribedFoldersOperation
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->fetchSubscribedFoldersOperation();
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchFoldersOperation *)fetchAllFoldersOperation {
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->fetchAllFoldersOperation();
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPOperation *) renameFolderOperation:(NSString *)folder otherName:(NSString *)otherName
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->renameFolderOperation([folder mco_mcString], [otherName mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPOperation *) deleteFolderOperation:(NSString *)folder
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->deleteFolderOperation([folder mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPOperation *) createFolderOperation:(NSString *)folder
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->createFolderOperation([folder mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPOperation *) subscribeFolderOperation:(NSString *)folder
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->subscribeFolderOperation([folder mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPOperation *) unsubscribeFolderOperation:(NSString *)folder
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->unsubscribeFolderOperation([folder mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPAppendMessageOperation *)appendMessageOperationWithFolder:(NSString *)folder
@@ -120,7 +138,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPAppendMessageOperation * coreOp = MCO_NATIVE_INSTANCE->appendMessageOperation([folder mco_mcString],
[messageData mco_mcData],
(MessageFlag) flags);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPCopyMessagesOperation *)copyMessagesOperationWithFolder:(NSString *)folder
@@ -130,14 +148,14 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPCopyMessagesOperation * coreOp = MCO_NATIVE_INSTANCE->copyMessagesOperation([folder mco_mcString],
MCO_FROM_OBJC(IndexSet, uids),
[destFolder mco_mcString]);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPOperation *) expungeOperation:(NSString *)folder
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->expungeOperation([folder mco_mcString]);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPFetchMessagesOperation *) fetchMessagesByUIDOperationWithFolder:(NSString *)folder
@@ -147,7 +165,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPFetchMessagesOperation * coreOp = MCO_NATIVE_INSTANCE->fetchMessagesByUIDOperation([folder mco_mcString],
(IMAPMessagesRequestKind) requestKind,
MCO_FROM_OBJC(IndexSet, uids));
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchMessagesOperation *) fetchMessagesByNumberOperationWithFolder:(NSString *)folder
@@ -157,7 +175,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPFetchMessagesOperation * coreOp = MCO_NATIVE_INSTANCE->fetchMessagesByNumberOperation([folder mco_mcString],
(IMAPMessagesRequestKind) requestKind,
MCO_FROM_OBJC(IndexSet, numbers));
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchMessagesOperation *) syncMessagesByUIDWithFolder:(NSString *)folder
@@ -169,7 +187,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
(IMAPMessagesRequestKind) requestKind,
MCO_FROM_OBJC(IndexSet, uids),
modSeq);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchContentOperation *) fetchMessageByUIDOperationWithFolder:(NSString *)folder
@@ -177,7 +195,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
urgent:(BOOL)urgent
{
IMAPFetchContentOperation * coreOp = MCO_NATIVE_INSTANCE->fetchMessageByUIDOperation([folder mco_mcString], uid, urgent);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchContentOperation *) fetchMessageByUIDOperationWithFolder:(NSString *)folder
@@ -197,7 +215,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
[partID mco_mcString],
(Encoding) encoding,
urgent);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchContentOperation *) fetchMessageAttachmentByUIDOperationWithFolder:(NSString *)folder
@@ -217,7 +235,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
MCO_FROM_OBJC(IndexSet, uids),
(IMAPStoreFlagsRequestKind) kind,
(MessageFlag) flags);
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPOperation *) storeLabelsOperationWithFolder:(NSString *)folder
@@ -229,7 +247,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
MCO_FROM_OBJC(IndexSet, uids),
(IMAPStoreFlagsRequestKind) kind,
MCO_FROM_OBJC(Array, labels));
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPSearchOperation *) searchOperationWithFolder:(NSString *)folder
@@ -239,7 +257,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPSearchOperation * coreOp = MCO_NATIVE_INSTANCE->searchOperation([folder mco_mcString],
(IMAPSearchKind) kind,
[searchString mco_mcString]);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPSearchOperation *) searchExpressionOperationWithFolder:(NSString *)folder
@@ -247,20 +265,20 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
{
IMAPSearchOperation * coreOp = MCO_NATIVE_INSTANCE->searchOperation([folder mco_mcString],
MCO_FROM_OBJC(IMAPSearchExpression, expression));
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPIdleOperation *) idleOperationWithFolder:(NSString *)folder
lastKnownUID:(uint32_t)lastKnownUID
{
IMAPIdleOperation * coreOp = MCO_NATIVE_INSTANCE->idleOperation([folder mco_mcString], lastKnownUID);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPFetchNamespaceOperation *) fetchNamespaceOperation
{
IMAPFetchNamespaceOperation * coreOp = MCO_NATIVE_INSTANCE->fetchNamespaceOperation();
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPIdentityOperation *) identityOperationWithVendor:(NSString *)vendor
@@ -270,19 +288,19 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
IMAPIdentityOperation * coreOp = MCO_NATIVE_INSTANCE->identityOperation([vendor mco_mcString],
[name mco_mcString],
[version mco_mcString]);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOIMAPOperation *)checkAccountOperation
{
IMAPOperation *coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation();
- return [[[MCOIMAPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOIMAPCapabilityOperation *) capabilityOperation
{
IMAPCapabilityOperation * coreOp = MCO_NATIVE_INSTANCE->capabilityOperation();
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
@end
diff --git a/src/objc/smtp/MCOSMTPOperation+Private.h b/src/objc/smtp/MCOSMTPOperation+Private.h
new file mode 100644
index 00000000..5b9b5ee9
--- /dev/null
+++ b/src/objc/smtp/MCOSMTPOperation+Private.h
@@ -0,0 +1,20 @@
+//
+// MCOSMTPOperation+Private.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_MCOSMTPOPERATION_PRIVATE_H_
+#define __MAILCORE_MCOSMTPOPERATION_PRIVATE_H_
+
+@class MCOSMTPSession;
+
+@interface MCOSMTPOperation (Private)
+
+@property (nonatomic, retain) MCOSMTPSession * session;
+
+@end
+
+#endif
diff --git a/src/objc/smtp/MCOSMTPOperation.mm b/src/objc/smtp/MCOSMTPOperation.mm
index d95c434d..cd52ad13 100644
--- a/src/objc/smtp/MCOSMTPOperation.mm
+++ b/src/objc/smtp/MCOSMTPOperation.mm
@@ -12,17 +12,20 @@
#import "MCOUtils.h"
#import "MCOOperation+Private.h"
+#import "MCOSMTPSession.h"
typedef void (^CompletionType)(NSError *error);
@implementation MCOSMTPOperation {
CompletionType _completionBlock;
+ MCOSMTPSession * _session;
}
#define nativeType mailcore::SMTPOperation
- (void) dealloc
{
+ [_session release];
[_completionBlock release];
[super dealloc];
}
@@ -40,4 +43,15 @@ typedef void (^CompletionType)(NSError *error);
_completionBlock(error);
}
+- (void) setSession:(MCOSMTPSession *)session
+{
+ [_session release];
+ _session = [session retain];
+}
+
+- (MCOSMTPSession *) session
+{
+ return _session;
+}
+
@end
diff --git a/src/objc/smtp/MCOSMTPSession.mm b/src/objc/smtp/MCOSMTPSession.mm
index ad8f212e..de6b54cd 100644
--- a/src/objc/smtp/MCOSMTPSession.mm
+++ b/src/objc/smtp/MCOSMTPSession.mm
@@ -15,6 +15,7 @@
#import "MCOSMTPOperation.h"
#import "MCOOperation+Private.h"
#import "MCOAddress.h"
+#import "MCOSMTPOperation+Private.h"
@implementation MCOSMTPSession {
mailcore::SMTPAsyncSession * _session;
@@ -55,13 +56,17 @@ MCO_OBJC_SYNTHESIZE_BOOL(setUseHeloIPEnabled, useHeloIPEnabled)
- (MCOSMTPSendOperation *) sendOperationWithData:(NSData *)messageData
{
mailcore::SMTPOperation * coreOp = MCO_NATIVE_INSTANCE->sendMessageOperation([messageData mco_mcData]);
- return [[[MCOSMTPSendOperation alloc] initWithMCOperation:coreOp] autorelease];
+ MCOSMTPSendOperation * result = [[[MCOSMTPSendOperation alloc] initWithMCOperation:coreOp] autorelease];
+ [result setSession:self];
+ return result;
}
- (MCOOperation *) checkAccountOperationWithFrom:(MCOAddress *)from
{
mailcore::SMTPOperation *coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation(MCO_FROM_OBJC(mailcore::Address, from));
- return [[[MCOSMTPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ MCOSMTPOperation * result = [[[MCOSMTPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ [result setSession:self];
+ return result;
}
@end