From ab1580efe5ad2cd41fea548e2af3a5c03387b948 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 12 Jan 2011 00:10:21 +0000 Subject: [PATCH] Monotone-Parent: 69395b75fdbee1ede0021d893697e1ed210ba3a7 Monotone-Revision: 360a0a073b90f6a8e37d542c557726bd5c885e3d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-01-12T00:10:21 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++ OpenChange/MAPIStoreContext.m | 105 +++++++++++++++++++++------------- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index b755053c0..1b506f3e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,13 @@ 2011-01-11 Wolfgang Sourdeau + * OpenChange/MAPIStoreContext.m + (-createMessagePropertiesWithMID:inFID:isAssociated:): added a + retain count handling. + (-releaseRecordWithFMID:ofTableType:): same as above. + (-_saveOrSubmitChangesInMessageWithMID:andFlags:save:): cleanup + table caches even for modifications. + * OpenChange/MAPIStoreMessageTable.m (-getChildProperty:forKey:withTag:): fixed PR_ACCESS and PR_ACCESS_LEVEL to avoid displaying the "read-only" status. diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 29ff9e372..e4dd38f7c 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -823,8 +823,8 @@ _prepareContextClass (struct mapistore_context *newMemCtx, { NSString *childURL, *childKey, *folderURL; MAPIStoreTable *table; - int rc; BOOL isAssociated; + int rc; childURL = [mapping urlFromID: mid]; if (childURL) @@ -862,20 +862,39 @@ _prepareContextClass (struct mapistore_context *newMemCtx, inFID: (uint64_t) fid isAssociated: (BOOL) isAssociated { - NSMutableDictionary *newMessage; + NSMutableDictionary *messageProperties; NSNumber *midNbr; + NSUInteger retainCount; - [self logWithFormat: @"METHOD '%s' -- mid: 0x%.16x, fid: 0x%.16x", - __FUNCTION__, mid, fid]; - newMessage = [NSMutableDictionary new]; - [newMessage setObject: [NSNumber numberWithUnsignedLongLong: fid] - forKey: @"fid"]; - midNbr = [NSNumber numberWithUnsignedLongLong: mid]; - [newMessage setObject: midNbr forKey: @"mid"]; - [newMessage setObject: [NSNumber numberWithBool: isAssociated] - forKey: @"associated"]; - [messages setObject: newMessage forKey: midNbr]; - [newMessage release]; + messageProperties = [messages objectForKey: + [NSNumber numberWithUnsignedLongLong: mid]]; + if (messageProperties) + { + [self logWithFormat: + @"METHOD '%s' -- mid: 0x%.16x, fid: 0x%.16x; retainCount++", + __FUNCTION__, mid, fid]; + retainCount = [[messageProperties objectForKey: @"mapiRetainCount"] + unsignedIntValue]; + [messageProperties + setObject: [NSNumber numberWithUnsignedInt: retainCount + 1] + forKey: @"mapiRetainCount"]; + } + else + { + [self logWithFormat: @"METHOD '%s' -- mid: 0x%.16x, fid: 0x%.16x", + __FUNCTION__, mid, fid]; + messageProperties = [NSMutableDictionary new]; + [messageProperties setObject: [NSNumber numberWithUnsignedLongLong: fid] + forKey: @"fid"]; + midNbr = [NSNumber numberWithUnsignedLongLong: mid]; + [messageProperties setObject: midNbr forKey: @"mid"]; + [messageProperties setObject: [NSNumber numberWithBool: isAssociated] + forKey: @"associated"]; + [messageProperties setObject: [NSNumber numberWithInt: 1] + forKey: @"mapiRetainCount"]; + [messages setObject: messageProperties forKey: midNbr]; + [messageProperties release]; + } return MAPISTORE_SUCCESS; } @@ -940,42 +959,36 @@ _prepareContextClass (struct mapistore_context *newMemCtx, NSMutableDictionary *messageProperties; NSString *messageURL; uint64_t fid; - BOOL viewMessage; + BOOL associated; - viewMessage = NO; messageProperties = [messages objectForKey: [NSNumber numberWithUnsignedLongLong: mid]]; if (messageProperties) { messageURL = [mapping urlFromID: mid]; - if ([[messageProperties objectForKey: @"associated"] boolValue]) + associated = [[messageProperties objectForKey: @"associated"] boolValue]; + if (messageURL) { - if (messageURL) + if (associated) message = [self lookupFAIObject: messageURL]; else - { - fid = [[messageProperties objectForKey: @"fid"] - unsignedLongLongValue]; - message = [self _createMessageOfClass: [messageProperties objectForKey: MAPIPropertyKey (PR_MESSAGE_CLASS_UNICODE)] - associated: YES - withMID: mid inFID: fid]; - } + message = [self lookupObject: messageURL]; } else { - if (messageURL) - message = [self lookupObject: messageURL]; - else - { - fid = [[messageProperties objectForKey: @"fid"] - unsignedLongLongValue]; - message = [self _createMessageOfClass: [messageProperties objectForKey: MAPIPropertyKey (PR_MESSAGE_CLASS_UNICODE)] - associated: NO - withMID: mid inFID: fid]; - } + fid = [[messageProperties objectForKey: @"fid"] + unsignedLongLongValue]; + message = [self _createMessageOfClass: [messageProperties objectForKey: MAPIPropertyKey (PR_MESSAGE_CLASS_UNICODE)] + associated: associated + withMID: mid inFID: fid]; } if (message) { + if (associated) + [faiTable cleanupCaches]; + else + [messageTable cleanupCaches]; + [message setMAPIProperties: messageProperties]; if (isSave) [message MAPISave]; @@ -1416,20 +1429,32 @@ _prepareContextClass (struct mapistore_context *newMemCtx, - (int) releaseRecordWithFMID: (uint64_t) fmid ofTableType: (uint8_t) tableType { - int rc; NSNumber *midNbr; + NSMutableDictionary *messageProperties; + NSUInteger retainCount; + int rc; switch (tableType) { case MAPISTORE_MESSAGE_TABLE: rc = MAPISTORE_SUCCESS; midNbr = [NSNumber numberWithUnsignedLongLong: fmid]; - if ([messages objectForKey: midNbr]) + messageProperties = [messages objectForKey: midNbr]; + if (messageProperties) { - [self logWithFormat: @"message with mid %.16x successfully removed" - @" from message cache", - fmid]; - [messages removeObjectForKey: midNbr]; + retainCount = [[messageProperties objectForKey: @"mapiRetainCount"] + unsignedIntValue]; + if (retainCount == 1) + { + [self logWithFormat: @"message with mid %.16x successfully removed" + @" from message cache", + fmid]; + [messages removeObjectForKey: midNbr]; + } + else + [messageProperties + setObject: [NSNumber numberWithUnsignedInt: retainCount - 1] + forKey: @"mapiRetainCount"]; } else [self warnWithFormat: @"message with mid %.16x not found"