28 CPArgumentDomain =
@"CPArgumentDomain";
29 CPApplicationDomain = [[[
CPBundle mainBundle] infoDictionary] objectForKey:
@"CPBundleIdentifier"] ||
@"CPApplicationDomain";
30 CPGlobalDomain =
@"CPGlobalDomain";
31 CPLocaleDomain =
@"CPLocaleDomain";
32 CPRegistrationDomain =
@"CPRegistrationDomain";
34 CPUserDefaultsDidChangeNotification =
@"CPUserDefaultsDidChangeNotification";
36 var StandardUserDefaults;
60 BOOL _searchListNeedsReload;
66 + (id)standardUserDefaults
68 if (!StandardUserDefaults)
71 return StandardUserDefaults;
78 + (void)resetStandardUserDefaults
80 if (StandardUserDefaults)
81 [StandardUserDefaults synchronize];
83 StandardUserDefaults = nil;
96 [
self _setupArgumentsDomain];
101 [
self setPersistentStoreClass:defaultStore forDomain:CPGlobalDomain reloadData:YES];
102 [
self setPersistentStoreClass:defaultStore forDomain:CPApplicationDomain reloadData:YES];
111 - (void)_setupArgumentsDomain
113 var args = [CPApp namedArguments],
114 keys = [args allKeys],
115 count = [keys count],
118 for (; i < count; i++)
121 [
self setObject:[args objectForKey:key] forKey:key inDomain:CPArgumentDomain];
131 if (_searchListNeedsReload)
132 [
self _reloadSearchList];
134 return [_searchList objectForKey:aKey];
140 - (void)setObject:(
id)anObject forKey:(
CPString)aKey
142 [
self setObject:anObject forKey:aKey inDomain:CPApplicationDomain];
152 var domain = [_domains objectForKey:aDomain];
157 return [domain objectForKey:aKey];
164 - (void)setObject:(
id)anObject forKey:(
CPString)aKey inDomain:(
CPString)aDomain
166 if (!aKey || !aDomain)
169 var domain = [_domains objectForKey:aDomain];
173 [_domains setObject:domain forKey:aDomain];
176 [domain setObject:anObject forKey:aKey];
177 _searchListNeedsReload = YES;
178 [
self domainDidChange:aDomain];
185 - (void)removeObjectForKey:(
CPString)aKey
187 [
self removeObjectForKey:aKey inDomain:CPApplicationDomain];
195 if (!aKey || !aDomain)
198 var domain = [_domains objectForKey:aDomain];
202 [domain removeObjectForKey:aKey];
203 _searchListNeedsReload = YES;
204 [
self domainDidChange:aDomain];
217 var keys = [aDictionary
allKeys],
218 count = [keys count],
221 for (; i < count; i++)
224 [
self setObject:[aDictionary
objectForKey:key] forKey:key inDomain:CPRegistrationDomain];
234 - (void)registerDefaultsFromContentsOfFile:(
CPURL)aURL
238 plist = [data plistObject];
240 [
self registerDefaults:plist];
246 - (void)_reloadSearchList
248 _searchListNeedsReload = NO;
250 var dicts = [CPRegistrationDomain, CPGlobalDomain, CPApplicationDomain, CPArgumentDomain],
251 count = [dicts count],
256 for (; i < count; i++)
258 var domain = [_domains objectForKey:dicts[i]];
262 var keys = [domain allKeys],
263 keysCount = [keys count],
266 for (; j < keysCount; j++)
269 [_searchList setObject:[domain objectForKey:key] forKey:key];
279 - (CPArray)volatileDomainNames
281 return [CPArgumentDomain, CPLocaleDomain, CPRegistrationDomain];
287 - (CPArray)persistentDomainNames
289 return [CPGlobalDomain, CPApplicationDomain];
297 return [_stores objectForKey:aDomain];
310 var currentStore = [_stores objectForKey:aDomain];
311 if (currentStore && [currentStore
class] === aStoreClass)
314 var store = [[aStoreClass alloc] init];
315 [store setDomain:aDomain];
316 [_stores setObject:store forKey:aDomain];
319 [
self reloadDataFromStoreForDomain:aDomain];
327 - (void)reloadDataFromStoreForDomain:(
CPString)aDomain
329 var data = [[
self persistentStoreForDomain:aDomain] data],
333 [_domains removeObjectForKey:aDomain];
335 [_domains setObject:domain forKey:aDomain];
337 _searchListNeedsReload = YES;
343 - (void)domainDidChange:(
CPString)aDomain
345 if (aDomain === CPGlobalDomain || aDomain === CPApplicationDomain)
356 var globalDomain = [_domains objectForKey:CPGlobalDomain];
360 [[
self persistentStoreForDomain:CPGlobalDomain] setData:data];
363 var appDomain = [_domains objectForKey:CPApplicationDomain];
367 [[
self persistentStoreForDomain:CPApplicationDomain] setData:data];
371 #pragma mark Getting Default Values
376 - (CPArray)arrayForKey:(
CPString)aKey
378 var value = [
self objectForKey:aKey];
379 if ([value isKindOfClass:CPArray])
390 var value = [
self objectForKey:aKey];
391 if ([value respondsToSelector:
@selector(boolValue)])
392 return [value boolValue];
403 var value = [
self objectForKey:aKey];
404 if ([value isKindOfClass:
CPData])
415 var value = [
self objectForKey:aKey];
427 var value = [
self objectForKey:aKey];
431 if ([value respondsToSelector:
@selector(floatValue)])
432 value = [value floatValue];
434 return parseFloat(value);
442 var value = [
self objectForKey:aKey];
446 if ([value respondsToSelector:
@selector(intValue)])
447 value = [value intValue];
449 return parseInt(value);
455 - (double)doubleForKey:(
CPString)aKey
457 return [
self floatForKey:aKey];
465 var value = [
self objectForKey:aKey];
470 else if ([value respondsToSelector:
@selector(stringValue)])
471 return [value stringValue];
479 - (CPArray)stringArrayForKey:(CPString)aKey
481 var value = [
self objectForKey:aKey];
482 if (![value isKindOfClass:CPArray])
485 for (var i = 0, count = [value count]; i < count; i++)
486 if (![value[i] isKindOfClass:CPString])
495 - (
CPURL)URLForKey:(CPString)aKey
497 var value = [
self objectForKey:aKey];
498 if ([value isKindOfClass:
CPURL])
501 if ([value isKindOfClass:CPString])
502 return [CPURL URLWithString:value];
507 #pragma mark Setting Default Values
513 - (void)setBool:(BOOL)aValue forKey:(CPString)aKey
515 if ([aValue respondsToSelector:
@selector(boolValue)])
516 [
self setObject:[aValue boolValue] forKey:aKey];
523 - (void)setFloat:(
float)aValue forKey:(CPString)aKey
525 if ([aValue respondsToSelector:
@selector(aValue)])
526 aValue = [aValue floatValue];
528 [
self setObject:parseFloat(aValue) forKey:aKey];
534 - (void)setDouble:(
double)aValue forKey:(CPString)aKey
536 [
self setFloat:aValue forKey:aKey];
543 - (void)setInteger:(
int)aValue forKey:(CPString)aKey
545 if ([aValue respondsToSelector:
@selector(intValue)])
546 aValue = [aValue intValue];
548 [
self setObject:parseInt(aValue) forKey:aKey];
555 - (void)setURL:(CPURL)aValue forKey:(CPString)aKey
557 if ([aValue isKindOfClass:CPString])
558 aValue = [CPURL URLWithString:aValue];
560 [
self setObject:aValue forKey:aKey];
572 _CPRaiseInvalidAbstractInvocation(
self, _cmd);
576 - (void)setData:(
CPData)aData
578 _CPRaiseInvalidAbstractInvocation(
self, _cmd);
588 - (void)setDomain:(CPString)aDomain
590 if (_domain === aDomain)
595 _cookie = [[
CPCookie alloc] initWithName:_domain];
600 var result = [_cookie value];
601 if (!result || [result length] < 1)
607 - (void)setData:(
CPData)aData
614 var CPUserDefaultsLocalStoreTestKey =
"9961800812587769-Cappuccino-Storage-Test";
620 + (BOOL)supportsLocalStorage
622 if (!window.localStorage)
629 localStorage.setItem(CPUserDefaultsLocalStoreTestKey,
"1");
630 if (localStorage.getItem(CPUserDefaultsLocalStoreTestKey) !=
"1")
632 localStorage.removeItem(CPUserDefaultsLocalStoreTestKey);
643 if (![[
self class] supportsLocalStorage])
645 [
CPException raise:@"UnsupportedFeature"
reason:@"Browser does not support localStorage for CPUserDefaultsLocalStore"];
649 return self = [
super init];
654 var result = localStorage.getItem(_domain);
655 if (!result || [result length] < 1)
661 - (void)setData:(
CPData)aData
665 localStorage.setItem(_domain, encodeURIComponent([aData rawString]));
669 CPLog.warn(
"Unable to write to local storage: " + e);
675 @implementation CPUserDefaultsStore (CPSynthesizedAccessors)
688 - (void)setDomain:(CPString)aValue