aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoa V. Dinh <dinh.viet.hoa@gmail.com>2013-07-25 23:09:37 -0700
committerGravatar Hoa V. Dinh <dinh.viet.hoa@gmail.com>2013-07-25 23:09:37 -0700
commitc559c8834773c4d6d78cb0cccc968d2a3477f67a (patch)
treeaa5daeec68ac98f5cee85333ee3fa9baa3d6e2cd
parentb27f76a56eebe7e297e9f7c2f00bf3b0eb61d662 (diff)
Fixed memory leak on cancellation in ObjC API
-rw-r--r--src/objc/imap/MCOIMAPAppendMessageOperation.mm16
-rw-r--r--src/objc/imap/MCOIMAPCapabilityOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPCopyMessagesOperation.mm16
-rw-r--r--src/objc/imap/MCOIMAPFetchContentOperation.mm12
-rw-r--r--src/objc/imap/MCOIMAPFetchFoldersOperation.mm16
-rw-r--r--src/objc/imap/MCOIMAPFetchMessagesOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPFetchNamespaceOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPFolderInfoOperation.mm16
-rw-r--r--src/objc/imap/MCOIMAPFolderStatusOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPIdentityOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPIdleOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPMessageRenderingOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPOperation.mm13
-rw-r--r--src/objc/imap/MCOIMAPSearchOperation.mm13
-rw-r--r--src/objc/pop/MCOPOPFetchHeaderOperation.mm12
-rw-r--r--src/objc/pop/MCOPOPFetchMessageOperation.mm13
-rw-r--r--src/objc/pop/MCOPOPFetchMessagesOperation.mm12
-rw-r--r--src/objc/smtp/MCOSMTPSendOperation.mm15
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;