* Adium is the legal property of its developers, whose names are listed in the copyright file included * with this source distribution. * This program 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; either version 2 of the License, * or (at your option) any later version. * This program 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, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #import <Adium/AIAccountControllerProtocol.h> #import "AIAccountProxySettings.h" #import <AIUtilities/AIMenuAdditions.h> #import <AIUtilities/AIPopUpButtonAdditions.h> #import <Adium/AIAccount.h> @interface AIAccountProxySettings () - (void)configureControlDimming; - (void)updatePasswordField; - (NSMenuItem *)_proxyMenuItemWithTitle:(NSString *)title tag:(NSInteger)tag; @implementation AIAccountProxySettings if (self == [AIAccountProxySettings class]) { [self exposeBinding:@"showProxyDetailsControls"]; * @brief Init our account proxy settings * Loads AccountProxy.nib and sets up menus if ((self = [super init])) { [NSBundle loadNibNamed:@"AccountProxy" owner:self]; [popUpButton_proxy setMenu:[self _proxyMenu]]; return view_accountProxy; [view_accountProxy release]; * Called when proxy usage is turned on or off - (IBAction)toggleProxy:(id)sender [self configureControlDimming]; * @brief Change proxy type * Called when the proxy type is changed - (void)changeProxyType:(id)sender [self configureControlDimming]; * @brief Configure the proxy view for the passed account * @param inAccount The account for which to configure - (void)configureForAccount:(AIAccount *)inAccount if (account != inAccount) { account = [inAccount retain]; [checkBox_useProxy setState:[[account preferenceForKey:KEY_ACCOUNT_PROXY_ENABLED group:GROUP_ACCOUNT_STATUS] boolValue]]; [popUpButton_proxy selectItemWithTag:[[account preferenceForKey:KEY_ACCOUNT_PROXY_TYPE group:GROUP_ACCOUNT_STATUS] integerValue]]; NSString *proxyHost = [account preferenceForKey:KEY_ACCOUNT_PROXY_HOST group:GROUP_ACCOUNT_STATUS]; [textField_proxyHostName setStringValue:(proxyHost ? proxyHost : @"")]; NSString *proxyPort = [account preferenceForKey:KEY_ACCOUNT_PROXY_PORT group:GROUP_ACCOUNT_STATUS]; [textField_proxyPortNumber setStringValue:(proxyPort ? proxyPort : @"")]; NSString *proxyUser = [account preferenceForKey:KEY_ACCOUNT_PROXY_USERNAME group:GROUP_ACCOUNT_STATUS]; [textField_proxyUserName setStringValue:(proxyUser ? proxyUser : @"")]; [self updatePasswordField]; [self configureControlDimming]; * @brief Save current control values - (void)saveConfiguration NSString *proxyHostName = [textField_proxyHostName stringValue]; NSString *proxyUserName = [textField_proxyUserName stringValue]; if (![proxyUserName isEqualToString:[account preferenceForKey:KEY_ACCOUNT_PROXY_USERNAME group:GROUP_ACCOUNT_STATUS]] || ![proxyHostName isEqualToString:[account preferenceForKey:KEY_ACCOUNT_PROXY_HOST group:GROUP_ACCOUNT_STATUS]]) { [adium.accountController setPassword:[textField_proxyPassword stringValue] forProxyServer:proxyHostName [account setPreference:[NSNumber numberWithInteger:[checkBox_useProxy state]] forKey:KEY_ACCOUNT_PROXY_ENABLED group:GROUP_ACCOUNT_STATUS]; [account setPreference:[NSNumber numberWithInteger:[[popUpButton_proxy selectedItem] tag]] forKey:KEY_ACCOUNT_PROXY_TYPE group:GROUP_ACCOUNT_STATUS]; [account setPreference:[textField_proxyHostName stringValue] forKey:KEY_ACCOUNT_PROXY_HOST group:GROUP_ACCOUNT_STATUS]; [account setPreference:[textField_proxyPortNumber stringValue] forKey:KEY_ACCOUNT_PROXY_PORT group:GROUP_ACCOUNT_STATUS]; [account setPreference:[textField_proxyUserName stringValue] forKey:KEY_ACCOUNT_PROXY_USERNAME group:GROUP_ACCOUNT_STATUS]; * @brief Update password field - (void)updatePasswordField NSString *proxyHostName = [textField_proxyHostName stringValue]; NSString *proxyUserName = [textField_proxyUserName stringValue]; if (proxyHostName && proxyUserName) { NSString *proxyPassword = [adium.accountController passwordForProxyServer:proxyHostName [textField_proxyPassword setStringValue:(proxyPassword ? proxyPassword : @"")]; * @brief User changed proxy preference * We set to nil instead of the @"" a stringValue would return because we want to return to the global (default) value * if the user clears the field. - (void)controlTextDidChange:(NSNotification *)aNotification NSTextField *sender = [aNotification object]; if (sender == textField_proxyHostName) { } else if (sender == textField_proxyPortNumber) { [account setPreference:[NSNumber numberWithInteger:[textField_proxyPortNumber integerValue]] forKey:KEY_ACCOUNT_PROXY_PORT group:GROUP_ACCOUNT_STATUS]; } else if (sender == textField_proxyUserName) { NSString *userName = [textField_proxyUserName stringValue]; //If the username changed, save the new username and clear the password field if (![userName isEqualToString:[account preferenceForKey:KEY_ACCOUNT_PROXY_USERNAME group:GROUP_ACCOUNT_STATUS]]) { [account setPreference:userName forKey:KEY_ACCOUNT_PROXY_USERNAME group:GROUP_ACCOUNT_STATUS]; //Update the password field [textField_proxyPassword setStringValue:@""]; [textField_proxyPassword setEnabled:(userName && [userName length])]; - (BOOL)showProxyDetailsControls AdiumProxyType proxyType = (AdiumProxyType)[[popUpButton_proxy selectedItem] tag]; BOOL usingSystemwide = (proxyType == Adium_Proxy_Default_SOCKS5 || proxyType == Adium_Proxy_Default_HTTP || proxyType == Adium_Proxy_Default_SOCKS4); * @brief Configure dimming of proxy controls - (void)configureControlDimming AdiumProxyType proxyType = (AdiumProxyType)[[popUpButton_proxy selectedItem] tag]; BOOL proxyEnabled = [checkBox_useProxy state]; BOOL usingSystemwide = (proxyType == Adium_Proxy_Default_SOCKS5 || proxyType == Adium_Proxy_Default_HTTP || proxyType == Adium_Proxy_Default_SOCKS4); [popUpButton_proxy setEnabled:proxyEnabled]; [textField_proxyHostName setEnabled:(proxyEnabled && !usingSystemwide)]; [textField_proxyPortNumber setEnabled:(proxyEnabled && !usingSystemwide)]; [textField_proxyUserName setEnabled:(proxyEnabled && !usingSystemwide)]; [textField_proxyPassword setEnabled:(proxyEnabled && !usingSystemwide)]; [self willChangeValueForKey:@"showProxyDetailsControls"]; [self didChangeValueForKey:@"showProxyDetailsControls"]; //Proxy type menu ------------------------------------------------------------------------------------------------------ #pragma mark Proxy type menu * @brief Build the proxy type menu * @result An NSMenu of supported proxy settings NSMenu *proxyMenu = [[NSMenu alloc] init]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:AILocalizedString(@"Systemwide SOCKS4 Settings",nil) tag:Adium_Proxy_Default_SOCKS4]]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:AILocalizedString(@"Systemwide SOCKS5 Settings",nil) tag:Adium_Proxy_Default_SOCKS5]]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:AILocalizedString(@"Systemwide HTTP Settings",nil) tag:Adium_Proxy_Default_HTTP]]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:@"SOCKS4" tag:Adium_Proxy_SOCKS4]]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:@"SOCKS5" tag:Adium_Proxy_SOCKS5]]; [proxyMenu addItem:[self _proxyMenuItemWithTitle:@"HTTP" tag:Adium_Proxy_HTTP]]; return [proxyMenu autorelease]; * @brief Create a proxy menu menuItem * Convenience method for _proxyMenu - (NSMenuItem *)_proxyMenuItemWithTitle:(NSString *)title tag:(NSInteger)tag menuItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:title action:@selector(changeProxyType:) return [menuItem autorelease];