mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 16:50:58 +00:00
Don't update unless needed
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@4275 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
f5590809e2
commit
d78c8a8c86
3 changed files with 91 additions and 43 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Thu May 20 20:30:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
|
* Source/NSUserDefaults.m: Don't load defaults unless we need to.
|
||||||
|
* Source/include/NSUserDefaults.h: Keep modification timestamp.
|
||||||
|
|
||||||
Thu May 20 10:50:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
Thu May 20 10:50:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
* Source/GSeq.h: Add support for comparison and search.
|
* Source/GSeq.h: Add support for comparison and search.
|
||||||
|
|
|
@ -119,6 +119,7 @@ extern NSString* const NSDateTimeOrdering;
|
||||||
NSMutableString *defaultsDatabase;
|
NSMutableString *defaultsDatabase;
|
||||||
NSMutableString *defaultsDatabaseLockName;
|
NSMutableString *defaultsDatabaseLockName;
|
||||||
NSDistributedLock *defaultsDatabaseLock;
|
NSDistributedLock *defaultsDatabaseLock;
|
||||||
|
NSDate *lastSync;
|
||||||
NSTimer *tickingTimer; // for synchronization
|
NSTimer *tickingTimer; // for synchronization
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
|
|
||||||
setSharedDefaults = NO;
|
setSharedDefaults = NO;
|
||||||
sharedDefaults = nil;
|
sharedDefaults = nil;
|
||||||
[defs release];
|
RELEASE(defs);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSUserDefaults *)standardUserDefaults
|
+ (NSUserDefaults *)standardUserDefaults
|
||||||
|
@ -232,7 +232,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
if (env_list)
|
if (env_list)
|
||||||
{
|
{
|
||||||
env = [NSString stringWithCString: env_list];
|
env = [NSString stringWithCString: env_list];
|
||||||
currLang = [[env componentsSeparatedByString: @";"] retain];
|
currLang = RETAIN([env componentsSeparatedByString: @";"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currLang)
|
if (currLang)
|
||||||
|
@ -282,7 +282,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
// Either userName is empty or it's wrong
|
// Either userName is empty or it's wrong
|
||||||
if (!userHome)
|
if (!userHome)
|
||||||
{
|
{
|
||||||
[self release];
|
RELEASE(self);
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
filename = [NSString stringWithFormat: @"%@/%@",
|
filename = [NSString stringWithFormat: @"%@/%@",
|
||||||
|
@ -300,37 +300,40 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
if (!defaultsDatabase)
|
if (!defaultsDatabase)
|
||||||
{
|
{
|
||||||
if (path != nil && [path isEqual: @""] == NO)
|
if (path != nil && [path isEqual: @""] == NO)
|
||||||
defaultsDatabase = [path copy];
|
defaultsDatabase = (NSMutableString*)[path mutableCopy];
|
||||||
else
|
else
|
||||||
defaultsDatabase =
|
{
|
||||||
[[NSMutableString stringWithFormat: @"%@/%@",
|
defaultsDatabase =
|
||||||
|
(NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
|
||||||
NSHomeDirectoryForUser(NSUserName()),
|
NSHomeDirectoryForUser(NSUserName()),
|
||||||
GNU_UserDefaultsDatabase] retain];
|
GNU_UserDefaultsDatabase];
|
||||||
|
RETAIN(defaultsDatabase);
|
||||||
|
}
|
||||||
|
|
||||||
if ([[defaultsDatabase lastPathComponent] isEqual:
|
if ([[defaultsDatabase lastPathComponent] isEqual:
|
||||||
[GNU_UserDefaultsDatabase lastPathComponent]] == YES)
|
[GNU_UserDefaultsDatabase lastPathComponent]] == YES)
|
||||||
defaultsDatabaseLockName =
|
defaultsDatabaseLockName =
|
||||||
[[NSMutableString stringWithFormat: @"%@/%@",
|
(NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
|
||||||
[defaultsDatabase stringByDeletingLastPathComponent],
|
[defaultsDatabase stringByDeletingLastPathComponent],
|
||||||
[GNU_UserDefaultsDatabaseLock lastPathComponent]]
|
[GNU_UserDefaultsDatabaseLock lastPathComponent]];
|
||||||
retain];
|
|
||||||
else
|
else
|
||||||
defaultsDatabaseLockName =
|
defaultsDatabaseLockName =
|
||||||
[[NSMutableString stringWithFormat: @"%@/%@",
|
(NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
|
||||||
NSHomeDirectoryForUser(NSUserName()),
|
NSHomeDirectoryForUser(NSUserName()),
|
||||||
GNU_UserDefaultsDatabaseLock] retain];
|
GNU_UserDefaultsDatabaseLock];
|
||||||
|
RETAIN(defaultsDatabaseLockName);
|
||||||
defaultsDatabaseLock =
|
defaultsDatabaseLock =
|
||||||
[[NSDistributedLock lockWithPath: defaultsDatabaseLockName] retain];
|
RETAIN([NSDistributedLock lockWithPath: defaultsDatabaseLockName]);
|
||||||
}
|
}
|
||||||
if (processName == nil)
|
if (processName == nil)
|
||||||
processName = [[[[NSProcessInfo processInfo] processName]
|
processName = RETAIN([[[NSProcessInfo processInfo] processName]
|
||||||
lastPathComponent] retain];
|
lastPathComponent]);
|
||||||
|
|
||||||
// Create an empty search list
|
// Create an empty search list
|
||||||
searchList = [[NSMutableArray arrayWithCapacity: 10] retain];
|
searchList = [[NSMutableArray alloc] initWithCapacity: 10];
|
||||||
|
|
||||||
// Initialize persDomains from the archived user defaults (persistent)
|
// Initialize persDomains from the archived user defaults (persistent)
|
||||||
persDomains = [[NSMutableDictionary dictionaryWithCapacity: 10] retain];
|
persDomains = [[NSMutableDictionary alloc] initWithCapacity: 10];
|
||||||
if ([self synchronize] == NO)
|
if ([self synchronize] == NO)
|
||||||
{
|
{
|
||||||
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
|
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
|
||||||
|
@ -347,7 +350,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
}
|
}
|
||||||
if (done == NO)
|
if (done == NO)
|
||||||
{
|
{
|
||||||
[self release];
|
RELEASE(self);
|
||||||
return self = nil;
|
return self = nil;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +372,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create volatile defaults and add the Argument and the Registration domains
|
// Create volatile defaults and add the Argument and the Registration domains
|
||||||
tempDomains = [[NSMutableDictionary dictionaryWithCapacity: 10] retain];
|
tempDomains = [[NSMutableDictionary alloc] initWithCapacity: 10];
|
||||||
[tempDomains setObject: [self __createArgumentDictionary]
|
[tempDomains setObject: [self __createArgumentDictionary]
|
||||||
forKey: NSArgumentDomain];
|
forKey: NSArgumentDomain];
|
||||||
[tempDomains setObject:
|
[tempDomains setObject:
|
||||||
|
@ -383,11 +386,12 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
{
|
{
|
||||||
if (tickingTimer)
|
if (tickingTimer)
|
||||||
[tickingTimer invalidate];
|
[tickingTimer invalidate];
|
||||||
[searchList release];
|
RELEASE(lastSync);
|
||||||
[persDomains release];
|
RELEASE(searchList);
|
||||||
[tempDomains release];
|
RELEASE(persDomains);
|
||||||
[changedDomains release];
|
RELEASE(tempDomains);
|
||||||
[dictionaryRep release];
|
RELEASE(changedDomains);
|
||||||
|
RELEASE(dictionaryRep);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,7 +593,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
- (void)setSearchList: (NSArray*)newList
|
- (void)setSearchList: (NSArray*)newList
|
||||||
{
|
{
|
||||||
DESTROY(dictionaryRep);
|
DESTROY(dictionaryRep);
|
||||||
[searchList release];
|
RELEASE(searchList);
|
||||||
searchList = [newList mutableCopy];
|
searchList = [newList mutableCopy];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,18 +639,50 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
|
|
||||||
- (BOOL) synchronize
|
- (BOOL) synchronize
|
||||||
{
|
{
|
||||||
NSMutableDictionary *newDict = nil;
|
NSFileManager *mgr = [NSFileManager defaultManager];
|
||||||
|
NSMutableDictionary *newDict = nil;
|
||||||
|
NSDictionary *attr;
|
||||||
|
NSDate *mod;
|
||||||
|
|
||||||
if (tickingTimer == nil)
|
if (tickingTimer == nil)
|
||||||
{
|
{
|
||||||
tickingTimer = [NSTimer scheduledTimerWithTimeInterval: 30
|
tickingTimer = [NSTimer scheduledTimerWithTimeInterval: 30
|
||||||
target: self
|
target: self
|
||||||
selector: @selector(__timerTicked: )
|
selector: @selector(__timerTicked:)
|
||||||
userInfo: nil
|
userInfo: nil
|
||||||
repeats: NO];
|
repeats: NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get file lock - break any lock that is more than five minute old.
|
/*
|
||||||
|
* If we haven't changed anything, we only need to synchronise if
|
||||||
|
* the on-disk database has been changed by someone else.
|
||||||
|
*/
|
||||||
|
if (changedDomains == NO)
|
||||||
|
{
|
||||||
|
BOOL wantRead = NO;
|
||||||
|
|
||||||
|
if (lastSync == nil)
|
||||||
|
wantRead = YES;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
attr = [mgr fileAttributesAtPath: defaultsDatabase
|
||||||
|
traverseLink: YES];
|
||||||
|
if (attr == nil)
|
||||||
|
wantRead = YES;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mod = [attr objectForKey: NSFileModificationDate];
|
||||||
|
if ([lastSync earlierDate: mod] != lastSync)
|
||||||
|
wantRead = YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wantRead == NO)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get file lock - break any lock that is more than five minute old.
|
||||||
|
*/
|
||||||
if ([defaultsDatabaseLock tryLock] == NO)
|
if ([defaultsDatabaseLock tryLock] == NO)
|
||||||
{
|
{
|
||||||
if ([[defaultsDatabaseLock lockDate] timeIntervalSinceNow] < -300.0)
|
if ([[defaultsDatabaseLock lockDate] timeIntervalSinceNow] < -300.0)
|
||||||
|
@ -666,21 +702,19 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
DESTROY(dictionaryRep);
|
DESTROY(dictionaryRep);
|
||||||
|
|
||||||
// Read the persistent data from the stored database
|
// Read the persistent data from the stored database
|
||||||
if ([[NSFileManager defaultManager] fileExistsAtPath: defaultsDatabase])
|
if ([mgr fileExistsAtPath: defaultsDatabase])
|
||||||
{
|
{
|
||||||
newDict = [[NSMutableDictionary allocWithZone: [self zone]]
|
newDict = [[NSMutableDictionary allocWithZone: [self zone]]
|
||||||
initWithContentsOfFile: defaultsDatabase];
|
initWithContentsOfFile: defaultsDatabase];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NSDictionary *attr;
|
|
||||||
|
|
||||||
attr = [NSDictionary dictionaryWithObjectsAndKeys:
|
attr = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||||
NSUserName(), NSFileOwnerAccountName, nil];
|
NSUserName(), NSFileOwnerAccountName, nil];
|
||||||
NSLog(@"Creating defaults database file %@", defaultsDatabase);
|
NSLog(@"Creating defaults database file %@", defaultsDatabase);
|
||||||
[[NSFileManager defaultManager] createFileAtPath: defaultsDatabase
|
[mgr createFileAtPath: defaultsDatabase
|
||||||
contents: nil
|
contents: nil
|
||||||
attributes: attr];
|
attributes: attr];
|
||||||
[[NSDictionary dictionary] writeToFile: defaultsDatabase atomically: YES];
|
[[NSDictionary dictionary] writeToFile: defaultsDatabase atomically: YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -707,7 +741,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
[newDict removeObjectForKey: obj];
|
[newDict removeObjectForKey: obj];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[persDomains release];
|
RELEASE(persDomains);
|
||||||
persDomains = newDict;
|
persDomains = newDict;
|
||||||
// Save the changes
|
// Save the changes
|
||||||
if (![persDomains writeToFile: defaultsDatabase atomically: YES])
|
if (![persDomains writeToFile: defaultsDatabase atomically: YES])
|
||||||
|
@ -715,14 +749,22 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
[defaultsDatabaseLock unlock];
|
[defaultsDatabaseLock unlock];
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
attr = [mgr fileAttributesAtPath: defaultsDatabase
|
||||||
|
traverseLink: YES];
|
||||||
|
mod = [attr objectForKey: NSFileModificationDate];
|
||||||
|
ASSIGN(lastSync, mod);
|
||||||
[defaultsDatabaseLock unlock]; // release file lock
|
[defaultsDatabaseLock unlock]; // release file lock
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
attr = [mgr fileAttributesAtPath: defaultsDatabase
|
||||||
|
traverseLink: YES];
|
||||||
|
mod = [attr objectForKey: NSFileModificationDate];
|
||||||
|
ASSIGN(lastSync, mod);
|
||||||
[defaultsDatabaseLock unlock]; // release file lock
|
[defaultsDatabaseLock unlock]; // release file lock
|
||||||
if ([persDomains isEqual: newDict] == NO)
|
if ([persDomains isEqual: newDict] == NO)
|
||||||
{
|
{
|
||||||
[persDomains release];
|
RELEASE(persDomains);
|
||||||
persDomains = newDict;
|
persDomains = newDict;
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
postNotificationName: NSUserDefaultsDidChangeNotification
|
postNotificationName: NSUserDefaultsDidChangeNotification
|
||||||
|
@ -730,7 +772,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[newDict release];
|
RELEASE(newDict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -796,7 +838,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
[dictRep addEntriesFromDictionary: dict];
|
[dictRep addEntriesFromDictionary: dict];
|
||||||
}
|
}
|
||||||
dictionaryRep = [dictRep copy];
|
dictionaryRep = [dictRep copy];
|
||||||
[dictRep release];
|
RELEASE(dictRep);
|
||||||
}
|
}
|
||||||
return dictionaryRep;
|
return dictionaryRep;
|
||||||
}
|
}
|
||||||
|
@ -900,7 +942,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
|
||||||
DESTROY(dictionaryRep);
|
DESTROY(dictionaryRep);
|
||||||
if (!changedDomains)
|
if (!changedDomains)
|
||||||
{
|
{
|
||||||
changedDomains = [[NSMutableArray arrayWithCapacity: 5] retain];
|
changedDomains = [[NSMutableArray alloc] initWithCapacity: 5];
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
postNotificationName: NSUserDefaultsDidChangeNotification object: nil];
|
postNotificationName: NSUserDefaultsDidChangeNotification object: nil];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue