/* * Copyright 2022 Anthony Cohn-Richardby * * This file is part of NetSurf, http://www.netsurf-browser.org/ * * NetSurf is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * NetSurf is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #import #import #import "utils/nsoption.h" #import "SearchProvider.h" #import "Preferences.h" #define KEY_STARTUP_URL @"startup_url" #define KEY_SEARCH_FROM_URL_BAR @"search_from_url_bar" #define KEY_SEARCH_PROVIDER @"search_provider" #define KEY_REMOVE_DOWNLOADS_COMPLETE @"remove_downloads_complete" #define KEY_CONFIRM_OVERWRITE @"confirm_overwrite" #define KEY_DOWNLOAD_LOCATION @"download_location" #define KEY_SWITCH_TAB_IMMEDIATELY @"switch_tab_immediately" #define KEY_BLANK_NEW_TABS @"blank_new_tabs" #define KEY_ALWAYS_SHOW_TABS @"always_show_tabs" #define KEY_TAB_LOCATION @"tab_location" #define KEY_DEVELOPER_VIEW_LOCATION @"developer_view_location" #define KEY_SHOW_URL_SUGGESTIONS @"show_url_suggestions" #define KEY_URL_BAR_BUTTON_TYPE @"url_bar_button_type" #define KEY_SHOW_HISTORY_TOOLTIP @"show_history_tooltip" #define KEY_BROWSING_HISTORY_DAYS @"browsing_history_days" @interface Preferences (Private) -(void)notifyPreferenceUpdated: (PreferenceType)type; -(void)saveNetsurfPrefsFile; @end @implementation Preferences -(id)init { if ((self = [super init])) { defaults = [[NSUserDefaults standardUserDefaults] retain]; } return self; } -(void)dealloc { [defaults release]; [super dealloc]; } -(NSString*)startupUrl { NSString *saved = [defaults stringForKey: KEY_STARTUP_URL]; if (saved != nil) { return saved; } else { return @"https://www.startpage.com"; } } -(void)setStartupUrl: (NSString*)aUrl { [defaults setObject: aUrl forKey: KEY_STARTUP_URL]; } -(BOOL)searchFromUrlBar { if ([defaults objectForKey: KEY_SEARCH_FROM_URL_BAR] != nil) { return [defaults boolForKey: KEY_SEARCH_FROM_URL_BAR]; } else { return NO; } } -(void)setSearchFromUrlBar: (BOOL)value { [defaults setBool: value forKey: KEY_SEARCH_FROM_URL_BAR]; } -(SearchProvider*)searchProvider { NSDictionary *dict = [defaults dictionaryForKey: KEY_SEARCH_PROVIDER]; SearchProvider *ret; if (dict != nil) { ret = [[SearchProvider alloc] initWithDictionary: dict]; [ret autorelease]; } else { ret = [SearchProvider defaultSearchProvider]; } return ret; } -(void)setSearchProvider: (SearchProvider*)aProvider { [defaults setObject: [aProvider dictionaryRepresentation] forKey: KEY_SEARCH_PROVIDER]; } -(BOOL)removeDownloadsOnComplete { if ([defaults objectForKey: KEY_REMOVE_DOWNLOADS_COMPLETE] != nil) { return [defaults boolForKey: KEY_REMOVE_DOWNLOADS_COMPLETE]; } else { return NO; } } -(void)setRemoveDownloadsOnComplete: (BOOL)value { [defaults setBool: value forKey: KEY_REMOVE_DOWNLOADS_COMPLETE]; } -(BOOL)confirmBeforeOverwriting { if ([defaults objectForKey: KEY_CONFIRM_OVERWRITE] != nil) { return [defaults boolForKey: KEY_CONFIRM_OVERWRITE]; } else { return YES; } } -(void)setConfirmBeforeOverwriting: (BOOL)value { [defaults setBool: value forKey: KEY_CONFIRM_OVERWRITE]; } -(NSString*)downloadLocationPath { NSString *downloadPath = [defaults stringForKey: KEY_DOWNLOAD_LOCATION]; if (downloadPath != nil) { return downloadPath; } else { return [@"~/Downloads" stringByExpandingTildeInPath]; } } -(void)setDownloadLocationPath: (NSString*)aPath { [defaults setObject: aPath forKey: KEY_DOWNLOAD_LOCATION]; } -(BOOL)alwaysShowTabs { if ([defaults objectForKey: KEY_ALWAYS_SHOW_TABS] != nil) { return [defaults boolForKey: KEY_ALWAYS_SHOW_TABS]; } else { return NO; } } -(void)setAlwaysShowTabs: (BOOL)value { [defaults setBool: value forKey: KEY_ALWAYS_SHOW_TABS]; [self notifyPreferenceUpdated: PreferenceTypeAlwaysShowTabs]; } -(BOOL)switchTabImmediately { if ([defaults objectForKey: KEY_SWITCH_TAB_IMMEDIATELY] != nil) { return [defaults boolForKey: KEY_SWITCH_TAB_IMMEDIATELY]; } else { return NO; } } -(void)setSwitchTabImmediately: (BOOL)value { [defaults setBool: value forKey: KEY_SWITCH_TAB_IMMEDIATELY]; } -(BOOL)blankNewTabs { if ([defaults objectForKey: KEY_BLANK_NEW_TABS] != nil) { return [defaults boolForKey: KEY_BLANK_NEW_TABS]; } else { return NO; } } -(void)setBlankNewTabs: (BOOL)value { [defaults setBool: value forKey: KEY_BLANK_NEW_TABS]; } -(TabLocation)tabLocation { if ([defaults objectForKey: KEY_TAB_LOCATION] != nil) { return (TabLocation)[defaults integerForKey: KEY_TAB_LOCATION]; } else { return TabLocationTop; } } -(void)setTabLocation: (TabLocation)value { [defaults setInteger: (NSInteger)value forKey: KEY_TAB_LOCATION]; [self notifyPreferenceUpdated: PreferenceTypeTabLocation]; } -(ViewLocation)developerViewLocation { if ([defaults objectForKey: KEY_DEVELOPER_VIEW_LOCATION] != nil) { return (ViewLocation)[defaults integerForKey: KEY_DEVELOPER_VIEW_LOCATION]; } else { return ViewLocationWindow; } } -(void)setDeveloperViewLocation: (ViewLocation)value { [defaults setInteger: (NSInteger)value forKey: KEY_DEVELOPER_VIEW_LOCATION]; } -(BOOL)showUrlSuggestions { if ([defaults objectForKey: KEY_SHOW_URL_SUGGESTIONS] != nil) { return [defaults boolForKey: KEY_SHOW_URL_SUGGESTIONS]; } else { return false; } } -(void)setShowUrlSuggestions: (BOOL)value { [defaults setBool: value forKey: KEY_SHOW_URL_SUGGESTIONS]; [self notifyPreferenceUpdated: PreferenceTypeShowUrlSuggestions]; } -(UrlBarButtonType)urlBarButtonType { if ([defaults objectForKey: KEY_URL_BAR_BUTTON_TYPE] != nil) { return (UrlBarButtonType)[defaults integerForKey: KEY_URL_BAR_BUTTON_TYPE]; } else { return UrlBarButtonTypeText; } } -(void)setUrlBarButtonType: (UrlBarButtonType)buttonType { [defaults setInteger: (NSInteger)buttonType forKey: KEY_URL_BAR_BUTTON_TYPE]; [self notifyPreferenceUpdated: PreferenceTypeUrlBarButtonType]; } -(LoadImages)loadImages { bool loadForeground = nsoption_bool(foreground_images); bool loadBackground = nsoption_bool(background_images); if (loadForeground && loadBackground) { return LoadImagesAll; } else if (loadForeground) { return LoadImagesForeground; } else if (loadBackground) { return LoadImagesBackground; } else { NSLog(@"none"); return LoadImagesNone; } } -(void)setLoadImages: (LoadImages)loadImages { switch (loadImages) { case LoadImagesAll: nsoption_set_bool(foreground_images, true); nsoption_set_bool(background_images, true); break; case LoadImagesForeground: nsoption_set_bool(foreground_images, true); nsoption_set_bool(background_images, false); break; case LoadImagesBackground: nsoption_set_bool(foreground_images, false); nsoption_set_bool(background_images, true); break; default: nsoption_set_bool(foreground_images, false); nsoption_set_bool(background_images, false); break; } [self saveNetsurfPrefsFile]; } -(BOOL)disablePopups { // return (BOOL)nsoption_bool(disable_popups); return NO; } -(void)setDisablePopups: (BOOL)value { // nsoption_set_bool(disable_popups, (bool)value); [self saveNetsurfPrefsFile]; } -(BOOL)hideAds { return (BOOL)nsoption_bool(block_advertisements); } -(void)setHideAds: (BOOL)value { nsoption_set_bool(block_advertisements, (bool)value); [self saveNetsurfPrefsFile]; } -(BOOL)enableJavascript { return (BOOL)nsoption_bool(enable_javascript); } -(void)setEnableJavascript: (BOOL)value { nsoption_set_bool(enable_javascript, (bool)value); [self saveNetsurfPrefsFile]; } -(BOOL)enableAnimation { return (BOOL)nsoption_bool(animate_images); } -(void)setEnableAnimation: (BOOL)value { nsoption_set_bool(animate_images, (bool)value); [self saveNetsurfPrefsFile]; } -(FontType)defaultFont { return (FontType)nsoption_int(font_default); } -(void)setDefaultFont: (FontType)value { nsoption_set_int(font_default, (NSInteger)value); [self saveNetsurfPrefsFile]; } -(NSString*)preferredLanguage { char *lang = nsoption_charp(accept_language); if (lang == NULL) { return @"en"; } else { return [NSString stringWithCString: lang]; } } -(void)setPreferredLanguage: (NSString*)value { NSLog(@"Set to %@", value); nsoption_set_charp(accept_language, strdup([value cString])); [self saveNetsurfPrefsFile]; } -(NSUInteger)fontSize { return (NSUInteger)nsoption_int(font_size); } -(void)setFontSize: (NSUInteger)value { nsoption_set_int(font_size, (int)value); [self saveNetsurfPrefsFile]; } -(BOOL)enableReferralSubmission { return (BOOL)nsoption_bool(send_referer); } -(void)setEnableReferralSubmission: (BOOL)value { nsoption_set_bool(send_referer, (bool)value); [self saveNetsurfPrefsFile]; } -(BOOL)sendDoNotTrackRequest { return (BOOL)nsoption_bool(do_not_track); } -(void)setSendDoNotTrackRequest: (BOOL)value { nsoption_set_bool(do_not_track, (bool)value); [self saveNetsurfPrefsFile]; } -(BOOL)showHistoryTooltip { if ([defaults objectForKey: KEY_SHOW_HISTORY_TOOLTIP] != nil) { return [defaults boolForKey: KEY_SHOW_HISTORY_TOOLTIP]; } else { return NO; } } -(void)setShowHistoryTooltip: (BOOL)value { [defaults setBool: value forKey: KEY_SHOW_HISTORY_TOOLTIP]; } -(NSUInteger)browsingHistoryDays { return [defaults integerForKey: KEY_BROWSING_HISTORY_DAYS]; } -(void)setBrowsingHistoryDays: (NSUInteger)value { [defaults setInteger: value forKey: KEY_BROWSING_HISTORY_DAYS]; } -(NSUInteger)diskCacheSize { NSUInteger bytes = (NSUInteger)nsoption_int(disc_cache_size); return bytes / 0x100000; } -(void)setDiskCacheSize: (NSUInteger)value { nsoption_set_int(disc_cache_size, (int)(value * 0x100000)); [self saveNetsurfPrefsFile]; } -(NSUInteger)memCacheSize { NSUInteger bytes = (NSUInteger)nsoption_int(memory_cache_size); return bytes / 0x100000; } -(void)setMemCacheSize: (NSUInteger)value { nsoption_set_int(memory_cache_size, (int)(value * 0x100000)); [self saveNetsurfPrefsFile]; } -(NSUInteger)cacheExpiryDays { return (NSUInteger)nsoption_int(disc_cache_age); } -(void)setCacheExpiryDays: (NSUInteger)value { nsoption_set_int(disc_cache_age, (int)value); [self saveNetsurfPrefsFile]; } -(ProxyType)proxyType { if (!nsoption_bool(http_proxy)) return ProxyTypeDirect; int proxyType = nsoption_int(http_proxy_auth); BOOL authenticated = (nsoption_charp(http_proxy_auth_user) != NULL) && (nsoption_charp(http_proxy_auth_pass) != NULL); BOOL hostProvided = nsoption_charp(http_proxy_host) != NULL; if (!hostProvided) return ProxyTypeSystem; // If the required fields of a selected proxy type arne't set; Default to none. switch (proxyType) { case OPTION_HTTP_PROXY_AUTH_NONE: return ProxyTypeNoAuth; case OPTION_HTTP_PROXY_AUTH_BASIC: if (authenticated) return ProxyTypeBasicAuth; else return ProxyTypeDirect; case OPTION_HTTP_PROXY_AUTH_NTLM: if (authenticated) return ProxyTypeAuth; else return ProxyTypeDirect; default: return ProxyTypeDirect; } } -(void)setProxyType: (ProxyType)value { switch (value) { case ProxyTypeDirect: nsoption_set_bool(http_proxy, false); break; case ProxyTypeNoAuth: nsoption_set_bool(http_proxy, true); nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_NONE); break; case ProxyTypeBasicAuth: nsoption_set_bool(http_proxy, true); nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_BASIC); break; case ProxyTypeAuth: nsoption_set_bool(http_proxy, true); nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_NTLM); break; case ProxyTypeSystem: nsoption_set_bool(http_proxy, true); nsoption_set_charp(http_proxy_host, NULL); nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_NONE); break; } [self saveNetsurfPrefsFile]; } -(NSString*)proxyHost { char *value = nsoption_charp(http_proxy_host); if (value == NULL) return nil; return [NSString stringWithCString: value]; } -(void)setProxyHost: (NSString*)value { nsoption_set_charp(http_proxy_host, strdup([value cString])); [self saveNetsurfPrefsFile]; } -(NSUInteger)proxyPort { return (NSUInteger)nsoption_int(http_proxy_port); } -(void)setProxyPort: (NSUInteger)value { nsoption_set_int(http_proxy_port, (int)value); [self saveNetsurfPrefsFile]; } -(NSString*)proxyUsername { char *value = nsoption_charp(http_proxy_auth_user); if (value == NULL) return nil; return [NSString stringWithCString: value]; } -(void)setProxyUsername: (NSString*)value { nsoption_set_charp(http_proxy_auth_user, strdup([value cString])); [self saveNetsurfPrefsFile]; } -(NSString*)proxyPassword { char *value = nsoption_charp(http_proxy_auth_pass); if (value == NULL) return nil; return [NSString stringWithCString: value]; } -(void)setProxyPassword: (NSString*)value { nsoption_set_charp(http_proxy_auth_pass, strdup([value cString])); [self saveNetsurfPrefsFile]; } -(NSString*)proxyOmit { char *value = nsoption_charp(http_proxy_noproxy); if (value == NULL) return nil; return [NSString stringWithCString: value]; } -(void)setProxyOmit: (NSString*)value { nsoption_set_charp(http_proxy_noproxy, strdup([value cString])); [self saveNetsurfPrefsFile]; } -(NSUInteger)maximumFetchers { return (NSUInteger)nsoption_int(max_fetchers); } -(void)setMaximumFetchers: (NSUInteger)value { nsoption_set_int(max_fetchers, (int)value); [self saveNetsurfPrefsFile]; } -(NSUInteger)fetchesPerHost { return (NSUInteger)nsoption_int(max_fetchers_per_host); } -(void)setFetchesPerHost: (NSUInteger)value { nsoption_set_int(max_fetchers_per_host, (int)value); [self saveNetsurfPrefsFile]; } -(NSUInteger)cachedConnections { return (NSUInteger)nsoption_int(max_cached_fetch_handles); } -(void)setCachedConnections: (NSUInteger)value { nsoption_set_int(max_cached_fetch_handles, (int)value); [self saveNetsurfPrefsFile]; } +(Preferences*)defaultPreferences { static Preferences *prefs; if (prefs == nil) { prefs = [[Preferences alloc] init]; } return prefs; } -(void)notifyPreferenceUpdated: (PreferenceType)type { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger: type], @"type", nil ]; [[NSNotificationCenter defaultCenter] postNotificationName: PreferencesUpdatedNotificationName object: dict]; } -(void)saveNetsurfPrefsFile { [[NSFileManager defaultManager] createDirectoryAtPath: NS_PREFS_DIR attributes: nil]; if (nsoption_write([NS_PREFS_FILE cString], NULL, NULL) != NSERROR_OK) { NSLog(@"Failed to write prefs to file %@", NS_PREFS_FILE); } } @end