diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2013-06-22 23:04:01 -0700 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2013-06-22 23:04:01 -0700 |
commit | b203675deaaf0049b7093587ce8fb30bb6ab3d9a (patch) | |
tree | 7c7a30059958bc5b736752a6f486fad30bc87d2a /src | |
parent | 9682845dd6a6985f396a93ff95adc1dcdeae8861 (diff) |
POP operations retain the session. Fixed #129
Diffstat (limited to 'src')
-rw-r--r-- | src/async/pop/MCPOPAsyncSession.cc | 28 | ||||
-rw-r--r-- | src/async/pop/MCPOPAsyncSession.h | 4 | ||||
-rw-r--r-- | src/core/smtp/MCSMTPSession.cc | 2 | ||||
-rw-r--r-- | src/objc/pop/MCOPOPOperation+Private.h | 20 | ||||
-rw-r--r-- | src/objc/pop/MCOPOPOperation.mm | 13 | ||||
-rw-r--r-- | src/objc/pop/MCOPOPSession.mm | 31 |
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 |