448 lines
19 KiB
Objective-C

//
// MGMAccountsPane.m
// VoiceMac
//
// Created by Mr. Gecko on 8/21/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
#import "MGMAccountsPane.h"
#import "MGMAccountSetup.h"
#import "MGMContactsController.h"
#import "MGMVoiceUser.h"
#import "MGMSIPUser.h"
#import <VoiceBase/VoiceBase.h>
NSString * const MGMLogin = @"Login";
NSString * const MGMLogout = @"Logout";
@implementation MGMAccountsPane
- (id)initWithPreferences:(MGMPreferences *)thePreferences {
if ((self = [super initWithPreferences:thePreferences])) {
if (![NSBundle loadNibNamed:@"AccountsPane" owner:self]) {
NSLog(@"Unable to load Nib for Account Preferences");
[self release];
self = nil;
} else {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:usersTable selector:@selector(reloadData) name:MGMUserStartNotification object:nil];
[notificationCenter addObserver:usersTable selector:@selector(reloadData) name:MGMUserDoneNotification object:nil];
[usersTable setTarget:self];
[usersTable setDoubleAction:@selector(loginout:)];
[loginoutButton setEnabled:NO];
[removeButton setEnabled:NO];
[GVContactsMatrix setEnabled:NO];
[GVGoogleContactsPopUp setEnabled:NO];
[GVActionMatrix setEnabled:NO];
[GVUserNameField setEnabled:NO];
[GVPasswordField setEnabled:NO];
[GCUserNameField setEnabled:NO];
[GCPasswordField setEnabled:NO];
[SIPFullNameField setEnabled:NO];
[SIPDomainField setEnabled:NO];
[SIPRegistrarField setEnabled:NO];
[SIPUserNameField setEnabled:NO];
[SIPPasswordField setEnabled:NO];
[SIPAreaCodeField setEnabled:NO];
[SIPProxyHostField setEnabled:NO];
[SIPProxyPortField setEnabled:NO];
[SIPSIPAddressField setEnabled:NO];
[SIPRegistrarTimeoutField setEnabled:NO];
[SIPTransportPopUp setEnabled:NO];
[SIPToneTypePopUp setEnabled:NO];
[SIPContactsMatrix setEnabled:NO];
[SIPGoogleContactsPopUp setEnabled:NO];
[settingsTab selectTabViewItemAtIndex:0];
}
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] removeObserver:usersTable];
[checkInstance release];
[mainView release];
[super dealloc];
}
+ (void)setUpToolbarItem:(NSToolbarItem *)theItem {
[theItem setLabel:[self title]];
[theItem setPaletteLabel:[theItem label]];
[theItem setImage:[NSImage imageNamed:@"Accounts"]];
}
+ (NSString *)title {
return @"Accounts";
}
- (NSView *)preferencesView {
return mainView;
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [[MGMUser userNames] count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
if ([[tableColumn identifier] isEqual:@"username"]) {
#if MGMSIPENABLED
NSArray *users = [MGMUser users];
if ([users count]<=row)
return nil;
MGMUser *user = [MGMUser userWithID:[users objectAtIndex:row]];
if ([[user settingForKey:MGMSAccountType] isEqual:MGMSSIP]) {
if ([user settingForKey:MGMSIPAccountFullName]!=nil && ![[user settingForKey:MGMSIPAccountFullName] isEqual:@""])
return [user settingForKey:MGMSIPAccountFullName];
}
#endif
return [[MGMUser userNames] objectAtIndex:row];
} else if ([[tableColumn identifier] isEqual:@"state"]) {
NSDictionary *users = [MGMUser usersPlist];
if ([[users allKeys] count]<=row)
return nil;
return ([[users objectForKey:[[users allKeys] objectAtIndex:row]] boolValue] ? @"" : @"");
}
return nil;
}
- (IBAction)loginout:(id)sender {
if ([usersTable selectedRow]==-1) return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:[usersTable selectedRow]]];
if ([[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts])
return;
if ([user isStarted]) {
[user done];
[user setSetting:[NSNumber numberWithBool:YES] forKey:MGMContactsWindowOpen];
[loginoutButton setTitle:MGMLogin];
} else {
[user start];
[loginoutButton setTitle:MGMLogout];
}
[usersTable reloadData];
[self tableViewSelectionDidChange:nil];
}
- (IBAction)add:(id)sender {
[[MGMAccountSetup new] attachToWindow:[preferences preferencesWindow]]; // The Account Setup will automatically release it self when user is done.
}
- (IBAction)remove:(id)sender {
if ([usersTable selectedRow]==-1) return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:[usersTable selectedRow]]];
if ([user isStarted]) {
[user done];
if ([user isStarted])
return;
}
[user remove];
[usersTable reloadData];
[self tableViewSelectionDidChange:nil];
}
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
int selected = [usersTable selectedRow];
[loginoutButton setEnabled:NO];
[removeButton setEnabled:NO];
[GVContactsMatrix setEnabled:NO];
[GVGoogleContactsPopUp setEnabled:NO];
[GVActionMatrix setEnabled:NO];
[GVUserNameField setEnabled:NO];
[GVPasswordField setEnabled:NO];
[GCUserNameField setEnabled:NO];
[GCPasswordField setEnabled:NO];
[SIPFullNameField setEnabled:NO];
[SIPDomainField setEnabled:NO];
[SIPRegistrarField setEnabled:NO];
[SIPUserNameField setEnabled:NO];
[SIPPasswordField setEnabled:NO];
[SIPAreaCodeField setEnabled:NO];
[SIPProxyHostField setEnabled:NO];
[SIPProxyPortField setEnabled:NO];
[SIPSIPAddressField setEnabled:NO];
[SIPRegistrarTimeoutField setEnabled:NO];
[SIPTransportPopUp setEnabled:NO];
[SIPToneTypePopUp setEnabled:NO];
[SIPContactsMatrix setEnabled:NO];
[SIPGoogleContactsPopUp setEnabled:NO];
if (selected==-1)
return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:selected]];
if ([user isStarted])
[loginoutButton setTitle:MGMLogout];
else
[loginoutButton setTitle:MGMLogin];
if (![[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts])
[loginoutButton setEnabled:YES];
else
[loginoutButton setEnabled:NO];
[removeButton setEnabled:YES];
if ([[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleVoice]) {
[settingsTab selectTabViewItemAtIndex:0];
NSArray *users = [MGMUser users];
NSMenu *menu = [[NSMenu new] autorelease];
int selectedGC = 0;
int cCount = 0;
for (int i=0; i<[users count]; i++) {
MGMUser *gcUser = [MGMUser userWithID:[users objectAtIndex:i]];
if ([[gcUser settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts]) {
NSMenuItem *item = [[NSMenuItem new] autorelease];
[item setTitle:[gcUser settingForKey:MGMUserName]];
[item setRepresentedObject:[gcUser settingForKey:MGMUserID]];
if ([[user settingForKey:MGMCGoogleContactsUser] isEqual:[gcUser settingForKey:MGMUserID]])
selectedGC = cCount;
[menu addItem:item];
cCount++;
}
}
NSString *contactsSource = [user settingForKey:MGMSContactsSourceKey];
if ([contactsSource isEqual:NSStringFromClass([MGMAddressBook class])]) {
[GVContactsMatrix selectCellAtRow:0 column:0];
[GVGoogleContactsPopUp setEnabled:NO];
} else if ([contactsSource isEqual:NSStringFromClass([MGMGoogleContacts class])]) {
if (cCount!=0) {
[GVContactsMatrix selectCellAtRow:1 column:0];
[GVGoogleContactsPopUp setEnabled:YES];
} else {
[user setSetting:NSStringFromClass([MGMAddressBook class]) forKey:MGMSContactsSourceKey];
[GVContactsMatrix selectCellAtRow:0 column:0];
[GVGoogleContactsPopUp setEnabled:NO];
}
}
[GVContactsMatrix setEnabled:YES];
[GVGoogleContactsPopUp setMenu:menu];
[GVGoogleContactsPopUp selectItemAtIndex:selectedGC];
if ([[GVGoogleContactsPopUp selectedItem] representedObject]!=nil)
[user setSetting:[[GVGoogleContactsPopUp selectedItem] representedObject] forKey:MGMCGoogleContactsUser];
[GVActionMatrix setEnabled:YES];
[GVActionMatrix selectCellAtRow:[[user settingForKey:MGMSContactsActionKey] intValue] column:0];
if (![user isStarted]) {
[GVUserNameField setEnabled:YES];
[GVPasswordField setEnabled:YES];
}
[GVUserNameField setStringValue:[user settingForKey:MGMUserName]];
[GVPasswordField setStringValue:[user password]];
} else if ([[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts]) {
[settingsTab selectTabViewItemAtIndex:1];
if (![user isStarted]) {
[GCUserNameField setEnabled:YES];
[GCPasswordField setEnabled:YES];
}
[GCUserNameField setStringValue:[user settingForKey:MGMUserName]];
[GCPasswordField setStringValue:[user password]];
}
#if MGMSIPENABLED
else if ([[user settingForKey:MGMSAccountType] isEqual:MGMSSIP]) {
[settingsTab selectTabViewItemAtIndex:2];
if (![user isStarted]) {
[SIPFullNameField setEnabled:YES];
[SIPDomainField setEnabled:YES];
[SIPRegistrarField setEnabled:YES];
[SIPUserNameField setEnabled:YES];
[SIPPasswordField setEnabled:YES];
[SIPAreaCodeField setEnabled:YES];
[SIPProxyHostField setEnabled:YES];
[SIPProxyPortField setEnabled:YES];
[SIPSIPAddressField setEnabled:YES];
[SIPRegistrarTimeoutField setEnabled:YES];
[SIPTransportPopUp setEnabled:YES];
[SIPToneTypePopUp setEnabled:YES];
}
if ([user settingForKey:MGMSIPAccountFullName]!=nil)
[SIPFullNameField setStringValue:[user settingForKey:MGMSIPAccountFullName]];
else
[SIPFullNameField setStringValue:@""];
if ([user settingForKey:MGMSIPAccountDomain]!=nil)
[SIPDomainField setStringValue:[user settingForKey:MGMSIPAccountDomain]];
else
[SIPDomainField setStringValue:@""];
if ([user settingForKey:MGMSIPAccountRegistrar]==nil || [[user settingForKey:MGMSIPAccountRegistrar] isEqual:@""]) {
[[SIPDomainField cell] setPlaceholderString:@"Usually *"];
[SIPRegistrarField setStringValue:@""];
} else {
[[SIPDomainField cell] setPlaceholderString:[user settingForKey:MGMSIPAccountRegistrar]];
[SIPRegistrarField setStringValue:[user settingForKey:MGMSIPAccountRegistrar]];
}
if ([user settingForKey:MGMSIPAccountUserName]!=nil)
[SIPUserNameField setStringValue:[user settingForKey:MGMSIPAccountUserName]];
else
[SIPUserNameField setStringValue:@""];
[SIPPasswordField setStringValue:[user password]];
if ([user settingForKey:MGMSIPUserAreaCode]!=nil)
[SIPAreaCodeField setStringValue:[user settingForKey:MGMSIPUserAreaCode]];
else
[SIPAreaCodeField setStringValue:@""];
if ([user settingForKey:MGMSIPAccountProxy]!=nil)
[SIPProxyHostField setStringValue:[user settingForKey:MGMSIPAccountProxy]];
else
[SIPProxyHostField setStringValue:@""];
if ([user settingForKey:MGMSIPAccountProxyPort]!=nil && [[user settingForKey:MGMSIPAccountProxyPort] intValue]!=0)
[SIPProxyPortField setIntValue:[[user settingForKey:MGMSIPAccountProxyPort] intValue]];
else
[SIPProxyPortField setStringValue:@""];
if ([user settingForKey:MGMSIPAccountSIPAddress]!=nil)
[SIPSIPAddressField setStringValue:[user settingForKey:MGMSIPAccountSIPAddress]];
else
[SIPSIPAddressField setStringValue:@""];
[[SIPSIPAddressField cell] setPlaceholderString:[NSString stringWithFormat:@"%@@%@", [user settingForKey:MGMSIPAccountUserName], [user settingForKey:MGMSIPAccountRegistrar]]];
if ([user settingForKey:MGMSIPAccountRegisterTimeout]!=nil && [[user settingForKey:MGMSIPAccountRegisterTimeout] intValue]!=0)
[SIPRegistrarTimeoutField setIntValue:[[user settingForKey:MGMSIPAccountRegisterTimeout] intValue]];
else
[SIPRegistrarTimeoutField setStringValue:@""];
int transport = [[user settingForKey:MGMSIPAccountTransport] intValue];
[SIPTransportPopUp selectItemAtIndex:transport];
int dtmfToneType = [[user settingForKey:MGMSIPAccountDTMFToneType] intValue];
[SIPToneTypePopUp selectItemAtIndex:dtmfToneType];
NSArray *users = [MGMUser users];
NSMenu *menu = [[NSMenu new] autorelease];
int selectedGC = 0;
int cCount = 0;
for (int i=0; i<[users count]; i++) {
MGMUser *gcUser = [MGMUser userWithID:[users objectAtIndex:i]];
if ([[gcUser settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts]) {
NSMenuItem *item = [[NSMenuItem new] autorelease];
[item setTitle:[gcUser settingForKey:MGMUserName]];
[item setRepresentedObject:[gcUser settingForKey:MGMUserID]];
if ([[user settingForKey:MGMCGoogleContactsUser] isEqual:[gcUser settingForKey:MGMUserID]])
selectedGC = cCount;
[menu addItem:item];
cCount++;
}
}
NSString *contactsSource = [user settingForKey:MGMSContactsSourceKey];
if ([contactsSource isEqual:NSStringFromClass([MGMAddressBook class])]) {
[SIPContactsMatrix selectCellAtRow:0 column:0];
[SIPGoogleContactsPopUp setEnabled:NO];
} else if ([contactsSource isEqual:NSStringFromClass([MGMGoogleContacts class])]) {
if ([[menu itemArray] count]!=0) {
[SIPContactsMatrix selectCellAtRow:1 column:0];
[SIPGoogleContactsPopUp setEnabled:YES];
} else {
[user setSetting:NSStringFromClass([MGMAddressBook class]) forKey:MGMSContactsSourceKey];
[SIPContactsMatrix selectCellAtRow:0 column:0];
[SIPGoogleContactsPopUp setEnabled:NO];
}
}
[SIPContactsMatrix setEnabled:YES];
[SIPGoogleContactsPopUp setMenu:menu];
[SIPGoogleContactsPopUp selectItemAtIndex:selectedGC];
if ([[SIPGoogleContactsPopUp selectedItem] representedObject]!=nil)
[user setSetting:[[SIPGoogleContactsPopUp selectedItem] representedObject] forKey:MGMCGoogleContactsUser];
}
#endif
}
- (IBAction)saveGV:(id)sender {
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:[usersTable selectedRow]]];
if ([[GVUserNameField stringValue] isEqual:@""] || [[GVPasswordField stringValue] isEqual:@""]) {
NSBeep();
[GVUserNameField setStringValue:[user settingForKey:MGMUserName]];
[GVPasswordField setStringValue:[user password]];
} else {
[user setSetting:[GVUserNameField stringValue] forKey:MGMUserName];
[user setPassword:[GVPasswordField stringValue]];
}
}
- (IBAction)saveGC:(id)sender {
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:[usersTable selectedRow]]];
if ([[GCUserNameField stringValue] isEqual:@""] || [[GCPasswordField stringValue] isEqual:@""]) {
NSBeep();
[GCUserNameField setStringValue:[user settingForKey:MGMUserName]];
[GCPasswordField setStringValue:[user password]];
} else {
[user setSetting:[GCUserNameField stringValue] forKey:MGMUserName];
[user setPassword:[GCPasswordField stringValue]];
}
}
- (IBAction)saveSIP:(id)sender {
#if MGMSIPENABLED
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:[usersTable selectedRow]]];
[user setSetting:[SIPFullNameField stringValue] forKey:MGMSIPAccountFullName];
if ([[SIPRegistrarField stringValue] isEqual:@""]) {
[[SIPDomainField cell] setPlaceholderString:@"Usually *"];
[user setSetting:@"" forKey:MGMSIPAccountRegistrar];
} else {
[[SIPDomainField cell] setPlaceholderString:[SIPRegistrarField stringValue]];
[user setSetting:[SIPRegistrarField stringValue] forKey:MGMSIPAccountRegistrar];
}
if ([[SIPRegistrarField stringValue] isEqual:@""] && [[SIPDomainField stringValue] isEqual:@""])
NSBeep();
else
[user setSetting:[SIPDomainField stringValue] forKey:MGMSIPAccountDomain];
if ([[SIPUserNameField stringValue] isEqual:@""] || [[SIPPasswordField stringValue] isEqual:@""]) {
NSBeep();
if ([user settingForKey:MGMSIPAccountUserName]!=nil) {
[SIPUserNameField setStringValue:[user settingForKey:MGMSIPAccountUserName]];
} else {
[SIPUserNameField setStringValue:@""];
}
[SIPPasswordField setStringValue:[user password]];
} else {
[user setSetting:[SIPUserNameField stringValue] forKey:MGMSIPAccountUserName];
[user setSetting:[SIPUserNameField stringValue] forKey:MGMUserName];
[user setPassword:[SIPPasswordField stringValue]];
}
[user setSetting:[SIPAreaCodeField stringValue] forKey:MGMSIPUserAreaCode];
[user setSetting:[SIPProxyHostField stringValue] forKey:MGMSIPAccountProxy];
[user setSetting:[NSNumber numberWithInt:[SIPProxyPortField intValue]] forKey:MGMSIPAccountProxyPort];
[user setSetting:[SIPSIPAddressField stringValue] forKey:MGMSIPAccountSIPAddress];
[[SIPSIPAddressField cell] setPlaceholderString:[NSString stringWithFormat:@"%@@%@", [user settingForKey:MGMSIPAccountUserName], [user settingForKey:MGMSIPAccountRegistrar]]];
[user setSetting:[NSNumber numberWithInt:[SIPRegistrarTimeoutField intValue]] forKey:MGMSIPAccountRegisterTimeout];
[user setSetting:[NSNumber numberWithInt:[SIPTransportPopUp indexOfSelectedItem]] forKey:MGMSIPAccountTransport];
[user setSetting:[NSNumber numberWithInt:[SIPToneTypePopUp indexOfSelectedItem]] forKey:MGMSIPAccountDTMFToneType];
#endif
}
- (IBAction)saveContacts:(id)sender {
int selected = [usersTable selectedRow];
if (selected==-1) return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:selected]];
NSPopUpButton *googleContacts = nil;
if (sender==GVContactsMatrix)
googleContacts = GVGoogleContactsPopUp;
else if (sender==SIPContactsMatrix)
googleContacts = SIPGoogleContactsPopUp;
if ([sender selectedRow]==0) {
[user setSetting:NSStringFromClass([MGMAddressBook class]) forKey:MGMSContactsSourceKey];
[googleContacts setEnabled:NO];
} else if ([sender selectedRow]==1) {
NSArray *users = [MGMUser users];
int cCount = 0;
for (int i=0; i<[users count]; i++) {
MGMUser *gcUser = [MGMUser userWithID:[users objectAtIndex:i]];
if ([[gcUser settingForKey:MGMSAccountType] isEqual:MGMSGoogleContacts])
cCount++;
}
if (cCount>0) {
[user setSetting:NSStringFromClass([MGMGoogleContacts class]) forKey:MGMSContactsSourceKey];
[googleContacts setEnabled:YES];
} else {
[user setSetting:NSStringFromClass([MGMAddressBook class]) forKey:MGMSContactsSourceKey];
[sender selectCellAtRow:0 column:0];
[googleContacts setEnabled:NO];
}
}
}
- (IBAction)saveGoogleContactsUser:(id)sender {
int selected = [usersTable selectedRow];
if (selected==-1) return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:selected]];
[user setSetting:[[sender selectedItem] representedObject] forKey:MGMCGoogleContactsUser];
}
- (IBAction)saveAction:(id)sender {
int selected = [usersTable selectedRow];
if (selected==-1) return;
MGMUser *user = [MGMUser userWithID:[[MGMUser users] objectAtIndex:selected]];
[user setSetting:[NSNumber numberWithInt:[GVActionMatrix selectedRow]] forKey:MGMSContactsActionKey];
}
@end