Monotone-Parent: 69395b75fdbee1ede0021d893697e1ed210ba3a7

Monotone-Revision: 360a0a073b90f6a8e37d542c557726bd5c885e3d

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2011-01-12T00:10:21
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau
2011-01-12 00:10:21 +00:00
parent 32b6ee0c2b
commit ab1580efe5
2 changed files with 72 additions and 40 deletions

View File

@@ -6,6 +6,13 @@
2011-01-11 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* 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.

View File

@@ -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"