Monotone-Parent: a32b67b00b6dfccd212526247098ea8c2df940a9

Monotone-Revision: 2c91fd11e3891c010283e64f368ec9476ac3667f

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-03-19T19:24:16
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2012-03-19 19:24:16 +00:00
parent d1966f9b5c
commit 03f86ea11f
2 changed files with 77 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2012-03-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/SOGoMAPIFSMessage.m (-init): init 2 new ivars:
fileSize and lastModificationTime.
(-properties): check the current file size and last modification
time against cached values and reload the props file if anything
changed.
(-creationTime, -lastModificationTime): new return type: NSDate
instead of NSCalendarDate.
2012-03-16 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreGCSFolder.m

View File

@ -40,8 +40,9 @@
{
if ((self = [super init]))
{
propertiesLoaded = NO;
completeFilename = nil;
fileSize = 0;
lastModificationTime = nil;
}
return self;
@ -84,14 +85,66 @@
return completeFilename;
}
- (BOOL) _readFileChangesDataWithDate: (NSDate **) newLMTime
andSize: (NSUInteger *) newFileSize
{
BOOL rc;
NSDictionary *attributes;
attributes = [[NSFileManager defaultManager]
fileAttributesAtPath: [self completeFilename]
traverseLink: NO];
if (attributes)
{
*newLMTime = [attributes fileModificationDate];
*newFileSize = [attributes fileSize];
rc = YES;
}
else
rc = NO;
return rc;
}
- (BOOL) _checkFileChangesDataWithDate: (NSDate **) newLMTime
andSize: (NSUInteger *) newFileSize
{
BOOL hasChanged = NO;
NSDate *lastLMTime;
NSUInteger lastFileSize;
if ([self _readFileChangesDataWithDate: &lastLMTime
andSize: &lastFileSize])
{
if (fileSize != lastFileSize
|| ![lastModificationTime isEqual: lastLMTime])
{
if (lastLMTime)
*newLMTime = lastLMTime;
if (newFileSize)
*newFileSize = lastFileSize;
hasChanged = YES;
}
}
return hasChanged;
}
- (NSMutableDictionary *) properties
{
NSData *content;
NSString *error;
NSPropertyListFormat format;
NSDate *lastLMTime;
NSUInteger lastFileSize;
if (!propertiesLoaded)
if ([self _checkFileChangesDataWithDate: &lastLMTime
andSize: &lastFileSize])
{
[self logWithFormat: @"file '%@' new or modified: rereading properties",
[self completeFilename]];
[properties release];
properties = nil;
content = [NSData dataWithContentsOfFile: [self completeFilename]];
if (content)
{
@ -104,8 +157,8 @@
[self logWithFormat: @"an error occurred during deserialization"
@" of message: '%@'", error];
}
propertiesLoaded = YES;
ASSIGN (lastModificationTime, lastLMTime);
fileSize = lastFileSize;
}
return [super properties];
@ -114,6 +167,8 @@
- (void) save
{
NSData *content;
NSDate *lastLMTime;
NSUInteger lastFileSize;
[container ensureDirectory];
@ -126,12 +181,17 @@
if (![content writeToFile: [self completeFilename] atomically: NO])
[NSException raise: @"MAPIStoreIOException"
format: @"could not save message"];
[self _readFileChangesDataWithDate: &lastLMTime
andSize: &lastFileSize];
ASSIGN (lastModificationTime, lastLMTime);
fileSize = lastFileSize;
// [self logWithFormat: @"fs message written to '%@'", [self completeFilename]];
}
- (NSString *) davEntityTag
{
NSCalendarDate *lm;
NSDate *lm;
lm = [self lastModificationTime];
@ -166,12 +226,12 @@
return [attributes objectForKey: key];
}
- (NSCalendarDate *) creationTime
- (NSDate *) creationTime
{
return [self _fileAttributeForKey: NSFileCreationDate];
}
- (NSCalendarDate *) lastModificationTime
- (NSDate *) lastModificationTime
{
return [self _fileAttributeForKey: NSFileModificationDate];
}