/
SUUserDefaults.m
88 lines (76 loc) · 2.97 KB
/
SUUserDefaults.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//
// SUUserDefaults.m
// Sparkle
//
// Created by Andy Matuschak on 12/21/07.
// Copyright 2007 Andy Matuschak. All rights reserved.
//
#import "Sparkle.h"
#import "SUUserDefaults.h"
@implementation SUUserDefaults
+ (SUUserDefaults *)standardUserDefaults
{
static SUUserDefaults *standardUserDefaults = nil;
if (standardUserDefaults == nil)
standardUserDefaults = [[SUUserDefaults alloc] init];
return standardUserDefaults;
}
- (void)dealloc
{
[identifier release];
[super dealloc];
}
- (void)setIdentifier:(NSString *)anIdentifier
{
[identifier autorelease];
identifier = [anIdentifier copy];
}
- (void)verifyIdentifier
{
if (identifier == nil)
[NSException raise:@"SUUserDefaultsMissingIdentifier" format:@"You must set the SUUserDefaults identifier before using it."];
}
- (id)objectForKey:(NSString *)defaultName
{
[self verifyIdentifier];
CFPropertyListRef obj = CFPreferencesCopyValue((CFStringRef)defaultName, (CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
#if MAC_OS_X_VERSION_MIN_REQUIRED > 1050
return [NSMakeCollectable(obj) autorelease];
#else
return [(id)obj autorelease];
#endif
}
- (void)setObject:(id)value forKey:(NSString *)defaultName;
{
[self verifyIdentifier];
CFPreferencesSetValue((CFStringRef)defaultName, value, (CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
CFPreferencesSynchronize((CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
// If anything's bound to this through an NSUserDefaultsController, it won't know that anything's changed.
// We can't get an NSUserDefaults object for anything other than the standard one for the app, so this won't work for bundles.
// But it's the best we can do: this will make NSUserDefaultsControllers know about the changes that have been made.
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (BOOL)boolForKey:(NSString *)defaultName
{
BOOL value;
[self verifyIdentifier];
CFPropertyListRef plr = CFPreferencesCopyValue((CFStringRef)defaultName, (CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
if (plr == NULL)
value = NO;
else {
value = (BOOL)CFBooleanGetValue((CFBooleanRef)plr);
CFRelease(plr);
}
return value;
}
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName
{
[self verifyIdentifier];
CFPreferencesSetValue((CFStringRef)defaultName, (CFBooleanRef)[NSNumber numberWithBool:value], (CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
CFPreferencesSynchronize((CFStringRef)identifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
// If anything's bound to this through an NSUserDefaultsController, it won't know that anything's changed.
// We can't get an NSUserDefaults object for anything other than the standard one for the app, so this won't work for bundles.
// But it's the best we can do: this will make NSUserDefaultsControllers know about the changes that have been made.
[[NSUserDefaults standardUserDefaults] synchronize];
}
@end