diff options
author | Hoa V. Dinh <dinh.viet.hoa@gmail.com> | 2013-07-25 23:09:37 -0700 |
---|---|---|
committer | Hoa V. Dinh <dinh.viet.hoa@gmail.com> | 2013-07-25 23:09:37 -0700 |
commit | c559c8834773c4d6d78cb0cccc968d2a3477f67a (patch) | |
tree | aa5daeec68ac98f5cee85333ee3fa9baa3d6e2cd | |
parent | b27f76a56eebe7e297e9f7c2f00bf3b0eb61d662 (diff) |
Fixed memory leak on cancellation in ObjC API
18 files changed, 204 insertions, 41 deletions
diff --git a/src/objc/imap/MCOIMAPAppendMessageOperation.mm b/src/objc/imap/MCOIMAPAppendMessageOperation.mm index c281b925..72fb0343 100644 --- a/src/objc/imap/MCOIMAPAppendMessageOperation.mm +++ b/src/objc/imap/MCOIMAPAppendMessageOperation.mm @@ -42,19 +42,29 @@ typedef void (^CompletionType)(NSError *error, uint32_t createdUID); [super dealloc]; } -- (void)start:(void (^)(NSError *error, uint32_t createdUID))completionBlock { +- (void) start:(void (^)(NSError *error, uint32_t createdUID))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; nativeType *op = MCO_NATIVE_INSTANCE; if (op->error() == mailcore::ErrorNone) { _completionBlock(nil, op->createdUID()); - } else { + } + else { _completionBlock([NSError mco_errorWithErrorCode:op->error()], 0); } [_completionBlock release]; diff --git a/src/objc/imap/MCOIMAPCapabilityOperation.mm b/src/objc/imap/MCOIMAPCapabilityOperation.mm index 42952378..75f28610 100644 --- a/src/objc/imap/MCOIMAPCapabilityOperation.mm +++ b/src/objc/imap/MCOIMAPCapabilityOperation.mm @@ -38,12 +38,21 @@ typedef void (^CompletionType)(NSError *error, MCOIndexSet * capabilities); [super dealloc]; } -- (void)start:(void (^)(NSError *error, MCOIndexSet * capabilities))completionBlock { +- (void) start:(void (^)(NSError *error, MCOIndexSet * capabilities))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPCopyMessagesOperation.mm b/src/objc/imap/MCOIMAPCopyMessagesOperation.mm index d14bcc84..eeee2e4a 100644 --- a/src/objc/imap/MCOIMAPCopyMessagesOperation.mm +++ b/src/objc/imap/MCOIMAPCopyMessagesOperation.mm @@ -39,19 +39,29 @@ typedef void (^CompletionType)(NSError *error, MCOIndexSet * destUids); [super dealloc]; } -- (void)start:(void (^)(NSError *error, MCOIndexSet * destUids))completionBlock { +- (void) start:(void (^)(NSError *error, MCOIndexSet * destUids))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; nativeType *op = MCO_NATIVE_INSTANCE; if (op->error() == mailcore::ErrorNone) { _completionBlock(nil, MCO_TO_OBJC(op->destUids())); - } else { + } + else { _completionBlock([NSError mco_errorWithErrorCode:op->error()], 0); } [_completionBlock release]; diff --git a/src/objc/imap/MCOIMAPFetchContentOperation.mm b/src/objc/imap/MCOIMAPFetchContentOperation.mm index d5d4757d..14867548 100644 --- a/src/objc/imap/MCOIMAPFetchContentOperation.mm +++ b/src/objc/imap/MCOIMAPFetchContentOperation.mm @@ -42,12 +42,20 @@ typedef void (^CompletionType)(NSError *error, NSData * data); [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSData * data))completionBlock { +- (void) start:(void (^)(NSError *error, NSData * data))completionBlock { _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPFetchFoldersOperation.mm b/src/objc/imap/MCOIMAPFetchFoldersOperation.mm index 02b7d880..facccca3 100644 --- a/src/objc/imap/MCOIMAPFetchFoldersOperation.mm +++ b/src/objc/imap/MCOIMAPFetchFoldersOperation.mm @@ -43,19 +43,29 @@ typedef void (^CompletionType)(NSError *error, NSArray *folder); [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSArray * /* MCOIMAPFolder */ folders))completionBlock { +- (void) start:(void (^)(NSError *error, NSArray * /* MCOIMAPFolder */ folders))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void)operationCompleted +{ if (_completionBlock == NULL) return; nativeType *op = MCO_NATIVE_INSTANCE; if (op->error() == ErrorNone) { _completionBlock(nil, MCO_TO_OBJC(op->folders())); - } else { + } + else { _completionBlock([NSError mco_errorWithErrorCode:op->error()], nil); } [_completionBlock release]; diff --git a/src/objc/imap/MCOIMAPFetchMessagesOperation.mm b/src/objc/imap/MCOIMAPFetchMessagesOperation.mm index 5ae4cfe7..b310c022 100644 --- a/src/objc/imap/MCOIMAPFetchMessagesOperation.mm +++ b/src/objc/imap/MCOIMAPFetchMessagesOperation.mm @@ -38,12 +38,21 @@ typedef void (^CompletionType)(NSError *error, NSArray * messages, MCOIndexSet * [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSArray * messages, MCOIndexSet * vanishedMessages))completionBlock { +- (void) start:(void (^)(NSError *error, NSArray * messages, MCOIndexSet * vanishedMessages))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPFetchNamespaceOperation.mm b/src/objc/imap/MCOIMAPFetchNamespaceOperation.mm index 861298bf..33ff132c 100644 --- a/src/objc/imap/MCOIMAPFetchNamespaceOperation.mm +++ b/src/objc/imap/MCOIMAPFetchNamespaceOperation.mm @@ -38,12 +38,21 @@ typedef void (^CompletionType)(NSError *error, NSDictionary * namespaces); [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSDictionary * namespaces))completionBlock { +- (void) start:(void (^)(NSError *error, NSDictionary * namespaces))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPFolderInfoOperation.mm b/src/objc/imap/MCOIMAPFolderInfoOperation.mm index 61766073..dffff6fa 100644 --- a/src/objc/imap/MCOIMAPFolderInfoOperation.mm +++ b/src/objc/imap/MCOIMAPFolderInfoOperation.mm @@ -39,12 +39,21 @@ typedef void (^CompletionType)(NSError *error, MCOIMAPFolderInfo *info); [super dealloc]; } -- (void)start:(void (^)(NSError * error, MCOIMAPFolderInfo * info))completionBlock { +- (void)start:(void (^)(NSError * error, MCOIMAPFolderInfo * info))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; @@ -58,7 +67,8 @@ typedef void (^CompletionType)(NSError *error, MCOIMAPFolderInfo *info); [info setFirstUnseenUid:MCO_NATIVE_INSTANCE->firstUnseenUid()]; _completionBlock(nil, info); - } else { + } + else { _completionBlock([NSError mco_errorWithErrorCode:op->error()], nil); } [_completionBlock release]; diff --git a/src/objc/imap/MCOIMAPFolderStatusOperation.mm b/src/objc/imap/MCOIMAPFolderStatusOperation.mm index 2420e0b9..caf1ceb9 100644 --- a/src/objc/imap/MCOIMAPFolderStatusOperation.mm +++ b/src/objc/imap/MCOIMAPFolderStatusOperation.mm @@ -39,12 +39,21 @@ typedef void (^CompletionType)(NSError *error, MCOIMAPFolderStatus *status); [super dealloc]; } -- (void)start:(void (^)(NSError * error, MCOIMAPFolderStatus * status))completionBlock { +- (void) start:(void (^)(NSError * error, MCOIMAPFolderStatus * status))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPIdentityOperation.mm b/src/objc/imap/MCOIMAPIdentityOperation.mm index f02fbba5..b5d65f9a 100644 --- a/src/objc/imap/MCOIMAPIdentityOperation.mm +++ b/src/objc/imap/MCOIMAPIdentityOperation.mm @@ -38,12 +38,21 @@ typedef void (^CompletionType)(NSError *error, NSDictionary * serverIdentity); [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSDictionary * serverIdentity))completionBlock { +- (void) start:(void (^)(NSError *error, NSDictionary * serverIdentity))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPIdleOperation.mm b/src/objc/imap/MCOIMAPIdleOperation.mm index d43bf818..eddf1fcf 100644 --- a/src/objc/imap/MCOIMAPIdleOperation.mm +++ b/src/objc/imap/MCOIMAPIdleOperation.mm @@ -38,12 +38,21 @@ typedef void (^CompletionType)(NSError *error); [super dealloc]; } -- (void)start:(void (^)(NSError *error))completionBlock { +- (void) start:(void (^)(NSError *error))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPMessageRenderingOperation.mm b/src/objc/imap/MCOIMAPMessageRenderingOperation.mm index 983b6cac..4fb49bdb 100644 --- a/src/objc/imap/MCOIMAPMessageRenderingOperation.mm +++ b/src/objc/imap/MCOIMAPMessageRenderingOperation.mm @@ -39,12 +39,21 @@ typedef void (^CompletionType)(NSString * htmlString, NSError * error); [super dealloc]; } -- (void)start:(void (^)(NSString * htmlString, NSError * error))completionBlock { +- (void) start:(void (^)(NSString * htmlString, NSError * error))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPOperation.mm b/src/objc/imap/MCOIMAPOperation.mm index 0b6d48e0..fafec6f2 100644 --- a/src/objc/imap/MCOIMAPOperation.mm +++ b/src/objc/imap/MCOIMAPOperation.mm @@ -27,12 +27,21 @@ typedef void (^CompletionType)(NSError *error); [super dealloc]; } -- (void)start:(void (^)(NSError *error))completionBlock { +- (void)start:(void (^)(NSError *error))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/imap/MCOIMAPSearchOperation.mm b/src/objc/imap/MCOIMAPSearchOperation.mm index 730c73a0..4117a7a7 100644 --- a/src/objc/imap/MCOIMAPSearchOperation.mm +++ b/src/objc/imap/MCOIMAPSearchOperation.mm @@ -39,12 +39,21 @@ typedef void (^CompletionType)(NSError *error, MCOIndexSet * searchResult); [super dealloc]; } -- (void)start:(void (^)(NSError *error, MCOIndexSet * searchResult))completionBlock { +- (void) start:(void (^)(NSError *error, MCOIndexSet * searchResult))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/pop/MCOPOPFetchHeaderOperation.mm b/src/objc/pop/MCOPOPFetchHeaderOperation.mm index ab467a76..c0201ef5 100644 --- a/src/objc/pop/MCOPOPFetchHeaderOperation.mm +++ b/src/objc/pop/MCOPOPFetchHeaderOperation.mm @@ -38,13 +38,21 @@ typedef void (^CompletionType)(NSError *error, MCOMessageHeader * header); [super dealloc]; } -- (void)start:(void (^)(NSError *error, MCOMessageHeader * header))completionBlock +- (void) start:(void (^)(NSError *error, MCOMessageHeader * header))completionBlock { _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/pop/MCOPOPFetchMessageOperation.mm b/src/objc/pop/MCOPOPFetchMessageOperation.mm index 02bad3ad..3f5f0000 100644 --- a/src/objc/pop/MCOPOPFetchMessageOperation.mm +++ b/src/objc/pop/MCOPOPFetchMessageOperation.mm @@ -75,12 +75,21 @@ private: [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSData * messageData))completionBlock { +- (void) start:(void (^)(NSError *error, NSData * messageData))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/pop/MCOPOPFetchMessagesOperation.mm b/src/objc/pop/MCOPOPFetchMessagesOperation.mm index 2fe9b31f..889baf74 100644 --- a/src/objc/pop/MCOPOPFetchMessagesOperation.mm +++ b/src/objc/pop/MCOPOPFetchMessagesOperation.mm @@ -38,13 +38,21 @@ typedef void (^CompletionType)(NSError *error, NSArray * messages); [super dealloc]; } -- (void)start:(void (^)(NSError *error, NSArray * messages))completionBlock +- (void) start:(void (^)(NSError *error, NSArray * messages))completionBlock { _completionBlock = [completionBlock copy]; [self start]; } -- (void)operationCompleted { +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ if (_completionBlock == NULL) return; diff --git a/src/objc/smtp/MCOSMTPSendOperation.mm b/src/objc/smtp/MCOSMTPSendOperation.mm index 8a7d5b04..8394e2cc 100644 --- a/src/objc/smtp/MCOSMTPSendOperation.mm +++ b/src/objc/smtp/MCOSMTPSendOperation.mm @@ -57,7 +57,7 @@ private: return [[[self alloc] initWithMCOperation:op] autorelease]; } -- (id)initWithMCOperation:(mailcore::Operation *)op +- (id) initWithMCOperation:(mailcore::Operation *)op { self = [super initWithMCOperation:op]; @@ -75,14 +75,23 @@ private: [super dealloc]; } -- (void)start:(void (^)(NSError *error))completionBlock { +- (void) start:(void (^)(NSError *error))completionBlock +{ _completionBlock = [completionBlock copy]; [self start]; } +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + // This method needs to be duplicated from MCOSMTPOperation since _completionBlock // references the instance of this subclass and not the one from MCOSMTPOperation. -- (void)operationCompleted { +- (void)operationCompleted +{ if (_completionBlock == NULL) return; |