29 CPGlobalDomain =
@"CPGlobalDomain";
30 CPLocaleDomain =
@"CPLocaleDomain";
31 CPRegistrationDomain =
@"CPRegistrationDomain";
33 CPUserDefaultsDidChangeNotification =
@"CPUserDefaultsDidChangeNotification";
35 var StandardUserDefaults;
58 BOOL _searchListNeedsReload;
64 + (id)standardUserDefaults
66 if (!StandardUserDefaults)
69 return StandardUserDefaults;
76 + (void)resetStandardUserDefaults
78 if (StandardUserDefaults)
79 [StandardUserDefaults synchronize];
81 StandardUserDefaults = nil;
94 [
self _setupArgumentsDomain];
99 [
self setPersistentStoreClass:defaultStore forDomain:CPGlobalDomain reloadData:YES];
100 [
self setPersistentStoreClass:defaultStore forDomain:CPApplicationDomain reloadData:YES];
109 - (void)_setupArgumentsDomain
111 var args = [CPApp namedArguments],
112 keys = [args allKeys],
113 count = [keys count],
116 for (; i < count; i++)
119 [
self setObject:[args objectForKey:key] forKey:key inDomain:CPArgumentDomain];
129 if (_searchListNeedsReload)
130 [
self _reloadSearchList];
132 return [_searchList objectForKey:aKey];
138 - (void)setObject:(
id)anObject forKey:(
CPString)aKey
140 [
self setObject:anObject forKey:aKey inDomain:CPApplicationDomain];
150 var domain = [_domains objectForKey:aDomain];
155 return [domain objectForKey:aKey];
162 - (void)setObject:(
id)anObject forKey:(
CPString)aKey inDomain:(
CPString)aDomain
164 if (!aKey || !aDomain)
167 var domain = [_domains objectForKey:aDomain];
171 [_domains setObject:domain forKey:aDomain];
174 [domain setObject:anObject forKey:aKey];
175 _searchListNeedsReload = YES;
176 [
self domainDidChange:aDomain];
183 - (void)removeObjectForKey:(
CPString)aKey
185 [
self removeObjectForKey:aKey inDomain:CPApplicationDomain];
193 if (!aKey || !aDomain)
196 var domain = [_domains objectForKey:aDomain];
200 [domain removeObjectForKey:aKey];
201 _searchListNeedsReload = YES;
202 [
self domainDidChange:aDomain];
215 var keys = [aDictionary
allKeys],
216 count = [keys count],
219 for (; i < count; i++)
222 [
self setObject:[aDictionary
objectForKey:key] forKey:key inDomain:CPRegistrationDomain];
232 - (void)registerDefaultsFromContentsOfFile:(
CPURL)aURL
236 plist = [data plistObject];
238 [
self registerDefaults:plist];
244 - (void)_reloadSearchList
246 _searchListNeedsReload = NO;
248 var dicts = [CPRegistrationDomain, CPGlobalDomain, CPApplicationDomain, CPArgumentDomain],
249 count = [dicts count],
254 for (; i < count; i++)
256 var domain = [_domains objectForKey:dicts[i]];
260 var keys = [domain allKeys],
261 keysCount = [keys count],
264 for (; j < keysCount; j++)
267 [_searchList setObject:[domain objectForKey:key] forKey:key];
277 - (CPArray)volatileDomainNames
279 return [CPArgumentDomain, CPLocaleDomain, CPRegistrationDomain];
285 - (CPArray)persistentDomainNames
287 return [CPGlobalDomain, CPApplicationDomain];
295 return [_stores objectForKey:aDomain];
308 var currentStore = [_stores objectForKey:aDomain];
309 if (currentStore && [currentStore
class] === aStoreClass)
312 var store = [[aStoreClass alloc] init];
313 [store setDomain:aDomain];
314 [_stores setObject:store forKey:aDomain];
317 [
self reloadDataFromStoreForDomain:aDomain];
325 - (void)reloadDataFromStoreForDomain:(
CPString)aDomain
327 var data = [[
self persistentStoreForDomain:aDomain] data],
331 [_domains removeObjectForKey:aDomain];
333 [_domains setObject:domain forKey:aDomain];
335 _searchListNeedsReload = YES;
341 - (void)domainDidChange:(
CPString)aDomain
343 if (aDomain === CPGlobalDomain || aDomain === CPApplicationDomain)
354 var globalDomain = [_domains objectForKey:CPGlobalDomain];
358 [[
self persistentStoreForDomain:CPGlobalDomain] setData:data];
361 var appDomain = [_domains objectForKey:CPApplicationDomain];
365 [[
self persistentStoreForDomain:CPApplicationDomain] setData:data];
369 #pragma mark Getting Default Values 374 - (CPArray)arrayForKey:(
CPString)aKey
376 var value = [
self objectForKey:aKey];
377 if ([value isKindOfClass:CPArray])
388 var value = [
self objectForKey:aKey];
389 if ([value respondsToSelector:
@selector(boolValue)])
390 return [value boolValue];
401 var value = [
self objectForKey:aKey];
402 if ([value isKindOfClass:
CPData])
413 var value = [
self objectForKey:aKey];
425 var value = [
self objectForKey:aKey];
429 if ([value respondsToSelector:
@selector(floatValue)])
430 value = [value floatValue];
432 return parseFloat(value);
440 var value = [
self objectForKey:aKey];
444 if ([value respondsToSelector:
@selector(intValue)])
445 value = [value intValue];
447 return parseInt(value);
453 - (double)doubleForKey:(
CPString)aKey
455 return [
self floatForKey:aKey];
463 var value = [
self objectForKey:aKey];
468 else if ([value respondsToSelector:
@selector(stringValue)])
469 return [value stringValue];
477 - (CPArray)stringArrayForKey:(
CPString)aKey
479 var value = [
self objectForKey:aKey];
480 if (![value isKindOfClass:CPArray])
483 for (var i = 0, count = [value count]; i < count; i++)
484 if (![value[i] isKindOfClass:CPString])
495 var value = [
self objectForKey:aKey];
496 if ([value isKindOfClass:
CPURL])
500 return [
CPURL URLWithString:value];
505 #pragma mark Setting Default Values 511 - (void)setBool:(BOOL)aValue forKey:(
CPString)aKey
513 if ([aValue respondsToSelector:
@selector(boolValue)])
514 [
self setObject:[aValue boolValue] forKey:aKey];
521 - (void)setFloat:(
float)aValue forKey:(
CPString)aKey
523 if ([aValue respondsToSelector:
@selector(floatValue)])
524 aValue = [aValue floatValue];
526 [
self setObject:parseFloat(aValue) forKey:aKey];
532 - (void)setDouble:(
double)aValue forKey:(
CPString)aKey
534 [
self setFloat:aValue forKey:aKey];
541 - (void)setInteger:(
int)aValue forKey:(
CPString)aKey
543 if ([aValue respondsToSelector:
@selector(intValue)])
544 aValue = [aValue intValue];
546 [
self setObject:parseInt(aValue) forKey:aKey];
555 if ([aValue isKindOfClass:
CPString])
556 aValue = [
CPURL URLWithString:aValue];
558 [
self setObject:aValue forKey:aKey];
570 _CPRaiseInvalidAbstractInvocation(
self, _cmd);
574 - (void)setData:(
CPData)aData
576 _CPRaiseInvalidAbstractInvocation(
self, _cmd);
588 if (_domain === aDomain)
598 var result = [_cookie value];
599 if (!result || [result length] < 1)
605 - (void)setData:(
CPData)aData
612 var CPUserDefaultsLocalStoreTestKey =
"9961800812587769-Cappuccino-Storage-Test";
618 + (BOOL)supportsLocalStorage
620 if (!window.localStorage)
627 localStorage.setItem(CPUserDefaultsLocalStoreTestKey,
"1");
628 if (localStorage.getItem(CPUserDefaultsLocalStoreTestKey) !=
"1")
630 localStorage.removeItem(CPUserDefaultsLocalStoreTestKey);
641 if (![[
self class] supportsLocalStorage])
643 [
CPException raise:@"UnsupportedFeature"
reason:@"Browser does not support localStorage for CPUserDefaultsLocalStore"];
647 return self = [
super init];
652 var result = localStorage.getItem(_domain);
653 if (!result || [result length] < 1)
659 - (void)setData:(
CPData)aData
663 localStorage.setItem(_domain, encodeURIComponent([aData rawString]));
667 CPLog.warn(
"Unable to write to local storage: " + e);
673 @implementation CPUserDefaultsStore (CPSynthesizedAccessors)
Used to implement exception handling (creating & raising).
void setValue:expires:domain:(CPString value, [expires] CPDate date, [domain] CPString domain)
A representation of a single point in time.
The main run loop for the application.
A Cappuccino wrapper for any data type.
void postNotificationName:object:(CPString aNotificationName, [object] id anObject)
void raise:reason:(CPString aName, [reason] CPString aReason)
Provides loading of a URL request.
Unarchives objects created using CPKeyedArchiver.
CPData sendSynchronousRequest:returningResponse:(CPURLRequest aRequest, [returningResponse]/*{ */CPURLResponse/*} */aURLResponse)
CPNotificationCenter defaultCenter()
A mutable key-value pair collection.
id requestWithURL:(CPURL aURL)
Implements keyed archiving of object graphs (e.g. for storing data).
An immutable string (collection of characters).
id objectForKey:(id aKey)
if(CPFeatureIsCompatible(CPHTMLCanvasFeature))
CPData dataWithRawString:(CPString aString)
global CPApp CPArgumentDomain
id unarchiveObjectWithData:(CPData aData)
Sends messages (CPNotification) between objects.
Contains data obtained during a request made with CPURLConnection.
CPDictionary infoDictionary()
CPData archivedDataWithRootObject:(id anObject)