mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-03-06 15:46:23 +00:00
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:
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user