From 3e08125893b29b69a07ac5e7fd552d89d758f4be Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 1 Dec 2010 16:34:41 +0000 Subject: [PATCH] Monotone-Parent: c128393b8fefa2da4bb9673a620d1e0baa64a839 Monotone-Revision: b334cb6723eed85e8c63c638f6db8a79edfb0b11 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-12-01T16:34:41 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 +++++++ OpenChange/MAPIStoreCalendarContext.m | 2 +- OpenChange/MAPIStoreContactsContext.m | 2 +- OpenChange/MAPIStoreContext.h | 2 ++ OpenChange/MAPIStoreContext.m | 34 ++++++++++++++++----------- OpenChange/MAPIStoreFreebusyContext.m | 2 +- OpenChange/MAPIStoreMailContext.m | 4 ++-- OpenChange/MAPIStoreOutboxContext.m | 7 +++--- OpenChange/MAPIStoreTasksContext.m | 2 +- 9 files changed, 40 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 213222452..c8092fa7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-12-01 Wolfgang Sourdeau + + * OpenChange/MAPIStoreContext.m: prevent leaks by adding an + additional mutable array that retains the required parent folders + until deallocation of the context. + (-getCommonTableChildproperty:atURL:withTag:inFolder:withFID:): + log the name of the missing properties for easier diagnostics. + 2010-11-30 Wolfgang Sourdeau * OpenChange/MAPIStoreMailContext.m diff --git a/OpenChange/MAPIStoreCalendarContext.m b/OpenChange/MAPIStoreCalendarContext.m index c7e46b84c..59fda2e3e 100644 --- a/OpenChange/MAPIStoreCalendarContext.m +++ b/OpenChange/MAPIStoreCalendarContext.m @@ -59,8 +59,8 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK moduleFolder = [userFolder lookupName: @"Calendar" inContext: woContext diff --git a/OpenChange/MAPIStoreContactsContext.m b/OpenChange/MAPIStoreContactsContext.m index d3564110d..73825db91 100644 --- a/OpenChange/MAPIStoreContactsContext.m +++ b/OpenChange/MAPIStoreContactsContext.m @@ -61,8 +61,8 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK moduleFolder = [userFolder lookupName: @"Contacts" inContext: woContext diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index bc0173f5f..bef430dfb 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -57,6 +57,8 @@ NSString *uri; + NSMutableArray *parentFoldersBag; + NSMutableDictionary *objectCache; NSMutableDictionary *messages; MAPIStoreAuthenticator *authenticator; diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index fa5c5d9ba..a6270985d 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -208,7 +208,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, messages = [NSMutableDictionary new]; woContext = [WOContext contextWithRequest: nil]; [woContext retain]; - + parentFoldersBag = [NSMutableArray new]; moduleFolder = nil; uri = nil; baseContextSet = NO; @@ -223,6 +223,8 @@ _prepareContextClass (struct mapistore_context *newMemCtx, { [self logWithFormat: @"-dealloc: %@", self]; + [parentFoldersBag release]; + [messageCache release]; [subfolderCache release]; [messages release]; @@ -609,6 +611,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, // uint64_t *llongValue; // uint32_t *longValue; int rc; + const char *propName; rc = MAPI_E_SUCCESS; switch (proptag) @@ -618,24 +621,27 @@ _prepareContextClass (struct mapistore_context *newMemCtx, *data = [[child displayName] asUnicodeInMemCtx: memCtx]; break; default: - // *data = NULL; - rc = MAPI_E_NOT_FOUND; + // rc = MAPI_E_NOT_FOUND; // if ((proptag & 0x001F) == 0x001F) // { - // stringValue = [NSString stringWithFormat: @"Unhandled unicode value: 0x%x", proptag]; - // *data = [stringValue asUnicodeInMemCtx: memCtx]; - // rc = MAPI_E_SUCCESS; - [self errorWithFormat: @"Unknown proptag (returned): %.8x for child '%@'", - proptag, childURL]; + propName = get_proptag_name (proptag); + if (!propName) + propName = ""; + [self errorWithFormat: @"Unhandled value: 0x%x (%s), childURL: %@", + proptag, propName, childURL]; + *data = NULL; + // *data = [stringValue asUnicodeInMemCtx: memCtx]; + // rc = MAPI_E_SUCCESS; + // [self errorWithFormat: @"Unknown proptag (returned): %.8x for child '%@'", + // proptag, childURL]; + // } // } // else // { - // [self errorWithFormat: @"Unknown proptag: %.8x for child '%@'", - // proptag, childURL]; - // *data = NULL; - rc = MAPI_E_NOT_FOUND; - break; - } + // *data = NULL; + rc = MAPI_E_NOT_FOUND; + break; + } return rc; } diff --git a/OpenChange/MAPIStoreFreebusyContext.m b/OpenChange/MAPIStoreFreebusyContext.m index 950246efa..bf25ff487 100644 --- a/OpenChange/MAPIStoreFreebusyContext.m +++ b/OpenChange/MAPIStoreFreebusyContext.m @@ -49,8 +49,8 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK moduleFolder = [userFolder lookupName: @"Calendar" inContext: woContext diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index eb5d32017..01bbeed04 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -69,14 +69,14 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK accountsFolder = [userFolder lookupName: @"Mail" inContext: woContext acquire: NO]; + [parentFoldersBag addObject: accountsFolder]; [woContext setClientObject: accountsFolder]; - [accountsFolder retain]; // LEAK moduleFolder = [accountsFolder lookupName: @"0" inContext: woContext diff --git a/OpenChange/MAPIStoreOutboxContext.m b/OpenChange/MAPIStoreOutboxContext.m index 0f7367a33..ef5cee9d4 100644 --- a/OpenChange/MAPIStoreOutboxContext.m +++ b/OpenChange/MAPIStoreOutboxContext.m @@ -58,19 +58,20 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK accountsFolder = [userFolder lookupName: @"Mail" inContext: woContext acquire: NO]; + [parentFoldersBag addObject: accountsFolder]; [woContext setClientObject: accountsFolder]; - [accountsFolder retain]; // LEAK accountFolder = [accountsFolder lookupName: @"0" inContext: woContext acquire: NO]; - [accountFolder retain]; // LEAK + [parentFoldersBag addObject: accountFolder]; + [woContext setClientObject: accountFolder]; moduleFolder = [accountFolder draftsFolderInContext: nil]; [moduleFolder retain]; diff --git a/OpenChange/MAPIStoreTasksContext.m b/OpenChange/MAPIStoreTasksContext.m index ee52f425f..4691cd5b4 100644 --- a/OpenChange/MAPIStoreTasksContext.m +++ b/OpenChange/MAPIStoreTasksContext.m @@ -57,8 +57,8 @@ userFolder = [SOGoUserFolder objectWithName: [authenticator username] inContainer: MAPIApp]; + [parentFoldersBag addObject: userFolder]; [woContext setClientObject: userFolder]; - [userFolder retain]; // LEAK moduleFolder = [userFolder lookupName: @"Calendar" inContext: woContext