Monotone-Parent: a32b67b00b6dfccd212526247098ea8c2df940a9

Monotone-Revision: 2c91fd11e3891c010283e64f368ec9476ac3667f

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-03-19T19:24:16
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
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> 2012-03-16 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreGCSFolder.m * OpenChange/MAPIStoreGCSFolder.m

View file

@ -40,8 +40,9 @@
{ {
if ((self = [super init])) if ((self = [super init]))
{ {
propertiesLoaded = NO;
completeFilename = nil; completeFilename = nil;
fileSize = 0;
lastModificationTime = nil;
} }
return self; return self;
@ -84,14 +85,66 @@
return completeFilename; 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 - (NSMutableDictionary *) properties
{ {
NSData *content; NSData *content;
NSString *error; NSString *error;
NSPropertyListFormat format; 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]]; content = [NSData dataWithContentsOfFile: [self completeFilename]];
if (content) if (content)
{ {
@ -104,8 +157,8 @@
[self logWithFormat: @"an error occurred during deserialization" [self logWithFormat: @"an error occurred during deserialization"
@" of message: '%@'", error]; @" of message: '%@'", error];
} }
ASSIGN (lastModificationTime, lastLMTime);
propertiesLoaded = YES; fileSize = lastFileSize;
} }
return [super properties]; return [super properties];
@ -114,6 +167,8 @@
- (void) save - (void) save
{ {
NSData *content; NSData *content;
NSDate *lastLMTime;
NSUInteger lastFileSize;
[container ensureDirectory]; [container ensureDirectory];
@ -126,12 +181,17 @@
if (![content writeToFile: [self completeFilename] atomically: NO]) if (![content writeToFile: [self completeFilename] atomically: NO])
[NSException raise: @"MAPIStoreIOException" [NSException raise: @"MAPIStoreIOException"
format: @"could not save message"]; format: @"could not save message"];
[self _readFileChangesDataWithDate: &lastLMTime
andSize: &lastFileSize];
ASSIGN (lastModificationTime, lastLMTime);
fileSize = lastFileSize;
// [self logWithFormat: @"fs message written to '%@'", [self completeFilename]]; // [self logWithFormat: @"fs message written to '%@'", [self completeFilename]];
} }
- (NSString *) davEntityTag - (NSString *) davEntityTag
{ {
NSCalendarDate *lm; NSDate *lm;
lm = [self lastModificationTime]; lm = [self lastModificationTime];
@ -166,12 +226,12 @@
return [attributes objectForKey: key]; return [attributes objectForKey: key];
} }
- (NSCalendarDate *) creationTime - (NSDate *) creationTime
{ {
return [self _fileAttributeForKey: NSFileCreationDate]; return [self _fileAttributeForKey: NSFileCreationDate];
} }
- (NSCalendarDate *) lastModificationTime - (NSDate *) lastModificationTime
{ {
return [self _fileAttributeForKey: NSFileModificationDate]; return [self _fileAttributeForKey: NSFileModificationDate];
} }