212 lines
5.6 KiB
Objective-C

//
// UserDefaults.m
// MacGap
//
// Created by Jeff Hanbury on 16/04/2014.
// Copyright (c) 2014 Twitter. All rights reserved.
//
#import "UserDefaults.h"
#import "JSEventHelper.h"
@interface UserDefaults() {
}
-(void) setupNotificationCenter;
@end
@implementation UserDefaults
- (id) initWithWebView:(WebView *) view{
self = [super init];
if (self) {
self.webView = view;
[self setupNotificationCenter];
}
return self;
}
-(void) setupNotificationCenter{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(defaultsChanged:)
name:NSUserDefaultsDidChangeNotification
object:nil];
}
- (void)defaultsChanged:(NSNotification *)notification {
NSDictionary* returnDict = [self myDefaultsDictionary];
[JSEventHelper triggerEvent:@"userDefaultsChanged" withArgs:returnDict forWebView:self.webView];
}
- (NSString*) getMyDefaults {
NSDictionary* myDefaults = [self myDefaultsDictionary];
return [[Utils sharedInstance] convertDictionaryToJSON:myDefaults];
}
- (NSDictionary*) myDefaultsDictionary {
NSString* prefix = [kWebScriptNamespace stringByAppendingString:@"_"];
NSMutableDictionary* returnDict = [[NSMutableDictionary alloc] init];
// Get the user defaults.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Build up a dictionary containing just the items beginning with our
// prefix.
for (NSString* key in [self getUserDefaultsKeys]) {
if ([key hasPrefix:prefix]) {
id val = [defaults valueForKey:key];
[returnDict setObject:val forKey:key];
}
}
return returnDict;
}
- (NSArray*) getUserDefaultsKeys {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
return [[prefs dictionaryRepresentation] allKeys];
}
- (void) removeObjectForKey:(NSString*)key {
NSString* prefixedKey;
prefixedKey = [self addPrefix:key];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:prefixedKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// Check we have a standard prefix for JS-modified keys, for security purposes.
// If not, add it. This stops JavaScript from ever being able to modify keys
// it did not create.
- (NSString*) addPrefix:(NSString*)key {
NSString* prefix;
prefix = [kWebScriptNamespace stringByAppendingString:@"_"];
if (![key hasPrefix:prefix]) {
key = [prefix stringByAppendingString:key];
}
return key;
}
// String
- (void) setString:(NSString*)key withValue:(NSString*)value {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString* prefixedKey;
prefixedKey = [self addPrefix:key];
[prefs setObject:value forKey:prefixedKey];
}
- (NSString*) getString:(NSString *)key {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
return [prefs stringForKey:key];
}
// All the following must convert their type to NSNumber for JavaScript.
// Integer
- (void) setInteger:(NSString*)key withValue:(NSString*)value {
NSString* prefixedKey;
prefixedKey = [self addPrefix:key];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger myInt = [value intValue];
[prefs setInteger:myInt forKey:prefixedKey];
}
- (NSNumber*) getInteger:(NSString *)key {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
return [NSNumber numberWithInteger:[prefs integerForKey:key]];
}
// Boolean
- (void) setBool:(NSString*)key withValue:(NSString*)value {
NSString* prefixedKey;
prefixedKey = [self addPrefix:key];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
BOOL myBool = [value boolValue];
[prefs setBool:myBool forKey:prefixedKey];
}
- (NSNumber*) getBool:(NSString *)key {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
return [NSNumber numberWithBool:[prefs boolForKey:key]];
}
// Float
- (void) setFloat:(NSString*)key withValue:(NSString*)value {
NSString* prefixedKey;
prefixedKey = [self addPrefix:key];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
float myFloat = [value floatValue];
[prefs setFloat:myFloat forKey:prefixedKey];
}
- (NSNumber*) getFloat:(NSString *)key {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
return [NSNumber numberWithFloat:[prefs floatForKey:key]];
}
#pragma mark WebScripting Protocol
+ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector {
return NO;
}
+ (NSString*) webScriptNameForSelector:(SEL)selector {
id result = nil;
if (selector == @selector(getMyDefaults)) {
result = @"getMyDefaults";
}
if (selector == @selector(removeObjectForKey:)) {
result = @"removeObjectForKey";
}
else if (selector == @selector(setString:withValue:)) {
result = @"setString";
} else if (selector == @selector(getString:)) {
result = @"getString";
}
else if (selector == @selector(setInteger:withValue:)) {
result = @"setInteger";
} else if (selector == @selector(getInteger:)) {
result = @"getInteger";
}
else if (selector == @selector(setBool:withValue:)) {
result = @"setBool";
} else if (selector == @selector(getBool:)) {
result = @"getBool";
}
else if (selector == @selector(setFloat:withValue:)) {
result = @"setFloat";
} else if (selector == @selector(getFloat:)) {
result = @"getFloat";
}
return result;
}
+ (BOOL) isKeyExcludedFromWebScript:(const char*)name {
return NO;
}
@end