aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-06-22 23:04:01 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-06-22 23:04:01 -0700
commitb203675deaaf0049b7093587ce8fb30bb6ab3d9a (patch)
tree7c7a30059958bc5b736752a6f486fad30bc87d2a /src
parent9682845dd6a6985f396a93ff95adc1dcdeae8861 (diff)
POP operations retain the session. Fixed #129
Diffstat (limited to 'src')
-rw-r--r--src/async/pop/MCPOPAsyncSession.cc28
-rw-r--r--src/async/pop/MCPOPAsyncSession.h4
-rw-r--r--src/core/smtp/MCSMTPSession.cc2
-rw-r--r--src/objc/pop/MCOPOPOperation+Private.h20
-rw-r--r--src/objc/pop/MCOPOPOperation.mm13
-rw-r--r--src/objc/pop/MCOPOPSession.mm31
6 files changed, 88 insertions, 10 deletions
diff --git a/src/async/pop/MCPOPAsyncSession.cc b/src/async/pop/MCPOPAsyncSession.cc
index 39f356db..1269a34b 100644
--- a/src/async/pop/MCPOPAsyncSession.cc
+++ b/src/async/pop/MCPOPAsyncSession.cc
@@ -14,17 +14,44 @@
#include "MCPOPDeleteMessagesOperation.h"
#include "MCPOPFetchMessagesOperation.h"
#include "MCPOPCheckAccountOperation.h"
+#include "MCOperationQueueCallback.h"
using namespace mailcore;
+namespace mailcore {
+ class POPOperationQueueCallback : public Object, public OperationQueueCallback {
+ public:
+ POPOperationQueueCallback(POPAsyncSession * session) {
+ mSession = session;
+ }
+
+ virtual ~POPOperationQueueCallback() {
+ }
+
+ virtual void queueStartRunning() {
+ mSession->retain();
+ }
+
+ virtual void queueStoppedRunning() {
+ mSession->release();
+ }
+
+ private:
+ POPAsyncSession * mSession;
+ };
+}
+
POPAsyncSession::POPAsyncSession()
{
mSession = new POPSession();
mQueue = new OperationQueue();
+ mQueueCallback = new POPOperationQueueCallback(this);
+ mQueue->setCallback(mQueueCallback);
}
POPAsyncSession::~POPAsyncSession()
{
+ MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mSession);
MC_SAFE_RELEASE(mQueue);
}
@@ -164,6 +191,5 @@ POPSession * POPAsyncSession::session()
void POPAsyncSession::runOperation(POPOperation * operation)
{
-#warning disconnect after delay
mQueue->addOperation(operation);
}
diff --git a/src/async/pop/MCPOPAsyncSession.h b/src/async/pop/MCPOPAsyncSession.h
index 166675e0..452d4d75 100644
--- a/src/async/pop/MCPOPAsyncSession.h
+++ b/src/async/pop/MCPOPAsyncSession.h
@@ -22,7 +22,8 @@ namespace mailcore {
class POPFetchMessageOperation;
class POPDeleteMessagesOperation;
class POPFetchMessagesOperation;
-
+ class POPOperationQueueCallback;
+
class POPAsyncSession : public Object {
public:
POPAsyncSession();
@@ -68,6 +69,7 @@ namespace mailcore {
private:
POPSession * mSession;
OperationQueue * mQueue;
+ POPOperationQueueCallback * mQueueCallback;
public: // private
virtual void runOperation(POPOperation * operation);
diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc
index 3e49ea5f..ee225b16 100644
--- a/src/core/smtp/MCSMTPSession.cc
+++ b/src/core/smtp/MCSMTPSession.cc
@@ -44,12 +44,10 @@ SMTPSession::SMTPSession()
SMTPSession::~SMTPSession()
{
- MCLog("dealloc");
MC_SAFE_RELEASE(mLastSMTPResponse);
MC_SAFE_RELEASE(mHostname);
MC_SAFE_RELEASE(mUsername);
MC_SAFE_RELEASE(mPassword);
- MCLog("dealloc4");
}
void SMTPSession::setHostname(String * hostname)
diff --git a/src/objc/pop/MCOPOPOperation+Private.h b/src/objc/pop/MCOPOPOperation+Private.h
new file mode 100644
index 00000000..1d888f08
--- /dev/null
+++ b/src/objc/pop/MCOPOPOperation+Private.h
@@ -0,0 +1,20 @@
+//
+// MCOPOPOperation+Private.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_MCOPOPOPERATION_PRIVATE_H_
+#define __MAILCORE_MCOPOPOPERATION_PRIVATE_H_
+
+@class MCOPOPSession;
+
+@interface MCOPOPOperation (Private)
+
+@property (nonatomic, retain) MCOPOPSession * session;
+
+@end
+
+#endif
diff --git a/src/objc/pop/MCOPOPOperation.mm b/src/objc/pop/MCOPOPOperation.mm
index 7bb17bb8..9b58f84d 100644
--- a/src/objc/pop/MCOPOPOperation.mm
+++ b/src/objc/pop/MCOPOPOperation.mm
@@ -12,17 +12,20 @@
#import "MCOUtils.h"
#import "MCOOperation+Private.h"
+#import "MCOPOPSession.h"
typedef void (^CompletionType)(NSError *error);
@implementation MCOPOPOperation {
CompletionType _completionBlock;
+ MCOPOPSession * _session;
}
#define nativeType mailcore::POPOperation
- (void) dealloc
{
+ [_session release];
[_completionBlock release];
[super dealloc];
}
@@ -40,5 +43,15 @@ typedef void (^CompletionType)(NSError *error);
_completionBlock(error);
}
+- (void) setSession:(MCOPOPSession *)session
+{
+ [_session release];
+ _session = [session retain];
+}
+
+- (MCOPOPSession *) session
+{
+ return _session;
+}
@end
diff --git a/src/objc/pop/MCOPOPSession.mm b/src/objc/pop/MCOPOPSession.mm
index 10806937..11f7cad6 100644
--- a/src/objc/pop/MCOPOPSession.mm
+++ b/src/objc/pop/MCOPOPSession.mm
@@ -14,6 +14,7 @@
#import "MCOPOPOperation.h"
#import "MCOOperation+Private.h"
#import "MCOPOPFetchMessagesOperation.h"
+#import "MCOPOPOperation+Private.h"
@implementation MCOPOPSession {
mailcore::POPAsyncSession * _session;
@@ -55,41 +56,59 @@ MCO_OBJC_SYNTHESIZE_BOOL(setCheckCertificateEnabled, isCheckCertificateEnabled)
#pragma mark - Operations
+
+#define MCO_TO_OBJC_OP(op) [self _objcOperationFromNativeOp:op];
+#define OPAQUE_OPERATION(op) [self _objcOpaqueOperationFromNativeOp:op]
+
+- (id) _objcOperationFromNativeOp:(mailcore::POPOperation *)op
+{
+ MCOPOPOperation * result = MCO_TO_OBJC(op);
+ [result setSession:self];
+ return result;
+}
+
+- (id) _objcOpaqueOperationFromNativeOp:(mailcore::POPOperation *)op
+{
+ MCOPOPOperation * result = [[[MCOPOPOperation alloc] initWithMCOperation:op] autorelease];
+ [result setSession:self];
+ return result;
+}
+
- (MCOPOPFetchMessagesOperation *) fetchMessagesOperation
{
mailcore::POPFetchMessagesOperation * coreOp = MCO_NATIVE_INSTANCE->fetchMessagesOperation();
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOPOPFetchHeaderOperation *) fetchHeaderOperationWithIndex:(unsigned int)index
{
mailcore::POPFetchHeaderOperation * coreOp = MCO_NATIVE_INSTANCE->fetchHeaderOperation(index);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
- (MCOPOPFetchMessageOperation *) fetchMessageOperationWithIndex:(unsigned int)index;
{
mailcore::POPFetchMessageOperation * coreOp = MCO_NATIVE_INSTANCE->fetchMessageOperation(index);
- return MCO_TO_OBJC(coreOp);
+ return MCO_TO_OBJC_OP(coreOp);
}
// Will disconnect.
- (MCOPOPOperation *) deleteMessagesOperationWithIndexes:(MCOIndexSet *)indexes
{
mailcore::POPOperation * coreOp = MCO_NATIVE_INSTANCE->deleteMessagesOperation(MCO_FROM_OBJC(mailcore::IndexSet, indexes));
- return [[[MCOPOPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOPOPOperation *) disconnectOperation
{
mailcore::POPOperation * coreOp = MCO_NATIVE_INSTANCE->disconnectOperation();
- return [[[MCOPOPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
- (MCOPOPOperation *) checkAccountOperation
{
mailcore::POPOperation * coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation();
- return [[[MCOPOPOperation alloc] initWithMCOperation:coreOp] autorelease];
+ return OPAQUE_OPERATION(coreOp);
}
@end