VoiceMac/Classes/VoiceMac/MGMController.m
2010-09-20 19:44:17 -05:00

633 lines
28 KiB
Objective-C

//
// MGMController.m
// VoiceMac
//
// Created by Mr. Gecko on 8/15/10.
// Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMController.h"
#import "MGMAccountSetup.h"
#import "MGMVoiceUser.h"
#import "MGMSIPUser.h"
#import "MGMSMSManager.h"
#import "MGMSMSMessageView.h"
#import "MGMBadge.h"
#import "MGMMultiSMS.h"
#import "MGMInboxWindow.h"
#import "MGMPhoneFeild.h"
#import "MGMNumberOptions.h"
#import <VoiceBase/VoiceBase.h>
#import <MGMUsers/MGMUsers.h>
#import <GeckoReporter/GeckoReporter.h>
#import <Growl/GrowlApplicationBridge.h>
#import <WebKit/WebKit.h>
NSString * const MGMCopyright = @"Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/";
NSString * const MGMVersion = @"MGMVersion";
NSString * const MGMLaunchCount = @"MGMLaunchCount";
NSString * const MGMMakeDefault = @"MGMMakeDefault";
NSString * const MGMContactsControllersChangedNotification = @"MGMContactsControllersChangedNotification";
NSString * const MGMLoading = @"Loading...";
@implementation MGMController
// MegaEduX was here.
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setup) name:MGMGRDoneNotification object:nil];
[MGMReporter sharedReporter];
}
- (void)setup {
[GrowlApplicationBridge setGrowlDelegate:nil];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:MGMMakeDefault]) {
NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
LSSetDefaultHandlerForURLScheme(CFSTR("tel"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("callto"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("telephone"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("phone"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("phonenumber"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("call"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("sms"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("vmsound"), (CFStringRef)bundleID);
LSSetDefaultHandlerForURLScheme(CFSTR("vmtheme"), (CFStringRef)bundleID);
[defaults removeObjectForKey:MGMMakeDefault];
}
if ([defaults objectForKey:MGMVersion]==nil) {
[defaults setObject:[[MGMSystemInfo info] applicationVersion] forKey:MGMVersion];
[defaults removeObjectForKey:@"actionCall"];
[defaults removeObjectForKey:@"googleContact"];
[defaults removeObjectForKey:@"lastPhone"];
[defaults removeObjectForKey:@"MailSoundPath"];
[defaults removeObjectForKey:@"MailSoundVariant"];
[defaults removeObjectForKey:@"NSSplitView Subview Frames SMSSplitView"];
[defaults removeObjectForKey:@"NSWindow Frame SMSWindow"];
[defaults removeObjectForKey:@"NSWindow Frame contactsWindow"];
[defaults removeObjectForKey:@"NSWindow Frame InformationWindow"];
[defaults removeObjectForKey:@"SMSSoundPath"];
[defaults removeObjectForKey:@"SMSSoundVariant"];
[defaults removeObjectForKey:@"SMSThemePath"];
[defaults removeObjectForKey:@"SMSThemeVariant"];
}
[self registerDefaults];
if ([defaults integerForKey:MGMLaunchCount]!=5) {
[defaults setInteger:[defaults integerForKey:MGMLaunchCount]+1 forKey:MGMLaunchCount];
if ([defaults integerForKey:MGMLaunchCount]==5) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Donations"];
[alert setInformativeText:@"Thank you for using VoiceMac. VoiceMac is donation supported software. If you like using it, please consider giving a donation to help with development."];
[alert addButtonWithTitle:@"Yes"];
[alert addButtonWithTitle:@"No"];
int result = [alert runModal];
if (result==1000)
[self donate:self];
}
}
NSFileManager<NSFileManagerProtocol> *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:[MGMUser cachePath]]) {
if ([manager respondsToSelector:@selector(removeFileAtPath:handler:)])
[manager removeFileAtPath:[MGMUser cachePath] handler:nil];
else
[manager removeItemAtPath:[MGMUser cachePath] error:nil];
}
quitting = NO;
currentContactsController = -1;
preferences = [MGMPreferences new];
[preferences addPreferencesPaneClassName:@"MGMAccountsPane"];
[preferences addPreferencesPaneClassName:@"MGMSoundsPane"];
[preferences addPreferencesPaneClassName:@"MGMSMSThemesPane"];
#if MGMSIPENABLED
[preferences addPreferencesPaneClassName:@"MGMSIPPane"];
[[MGMSIP sharedSIP] setDelegate:self];
#endif
taskManager = [[MGMTaskManager managerWithDelegate:self] retain];
whitePages = [MGMWhitePages new];
themeManager = [MGMThemeManager new];
SMSManager = [[MGMSMSManager managerWithController:self] retain];
badge = [MGMBadge new];
badgeValues = [NSMutableDictionary new];
contactsControllers = [NSMutableArray new];
NSArray *lastUsers = [MGMUser lastUsers];
for (int i=0; i<[lastUsers count]; i++) {
MGMUser *user = [MGMUser userWithID:[lastUsers objectAtIndex:i]];
if ([[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleVoice]) {
[contactsControllers addObject:[MGMVoiceUser voiceUser:user controller:self]];
}
#if MGMSIPENABLED
else if ([[user settingForKey:MGMSAccountType] isEqual:MGMSSIP]) {
if (![[MGMSIP sharedSIP] isStarted]) [[MGMSIP sharedSIP] start];
[contactsControllers addObject:[MGMSIPUser SIPUser:user controller:self]];
}
#endif
}
multipleSMS = [NSMutableArray new];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(userStarted:) name:MGMUserStartNotification object:nil];
[notificationCenter addObserver:self selector:@selector(userDone:) name:MGMUserDoneNotification object:nil];
if ([contactsControllers count]==0) {
if ([[MGMUser userNames] count]==0)
[[MGMAccountSetup new] showSetupWindow:self]; // This is not a leak, it'll auto release it self when done.
else
[self preferences:self];
}
[[RLMap mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"map" ofType:@"html"]]]];
NSAppleEventManager *em = [NSAppleEventManager sharedAppleEventManager];
[em setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
[notificationCenter addObserver:self selector:@selector(updateWindowMenu) name:MGMContactsControllersChangedNotification object:nil];
[notificationCenter postNotificationName:MGMContactsControllersChangedNotification object:self];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
if (contactsControllers!=nil)
[contactsControllers release];
if (multipleSMS!=nil)
[multipleSMS release];
if (preferences!=nil)
[preferences release];
if (taskManager!=nil)
[taskManager release];
if (whitePages!=nil)
[whitePages release];
if (themeManager!=nil)
[themeManager release];
if (SMSManager!=nil)
[SMSManager release];
if (badge!=nil)
[badge release];
if (badgeValues!=nil)
[badgeValues release];
[super dealloc];
}
- (void)registerDefaults {
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
[defaults setObject:[NSNumber numberWithInt:1] forKey:MGMLaunchCount];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
- (BOOL)isQuitting {
return quitting;
}
- (NSArray *)contactsControllers {
return contactsControllers;
}
- (MGMPreferences *)preferences {
return preferences;
}
- (MGMThemeManager *)themeManager {
return themeManager;
}
- (MGMSMSManager *)SMSManager {
return SMSManager;
}
- (MGMBadge *)badge {
return badge;
}
- (void)setBadge:(int)theBadge forInstance:(MGMInstance *)theInstance {
if (![theInstance isLoggedIn]) return;
if (theBadge==0)
[badgeValues removeObjectForKey:[theInstance userNumber]];
else
[badgeValues setObject:[NSNumber numberWithInt:theBadge] forKey:[theInstance userNumber]];
NSArray *valueKeys = [badgeValues allKeys];
int value = 0;
for (int i=0; i<[valueKeys count]; i++)
value += [[badgeValues objectForKey:[valueKeys objectAtIndex:i]] intValue];
if (value==0)
[badge setLabel:nil];
else
[badge setLabel:[[NSNumber numberWithInt:value] stringValue]];
}
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
SEL menuSelector = [menuItem action];
if (menuSelector==@selector(showInbox:) || menuSelector==@selector(call:)) {
return (currentContactsController!=-1);
} else if (menuSelector==@selector(sms:)) {
return (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(sms:)]);
} else if (menuSelector==@selector(inboxSpam:)) {
if (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem]!=nil) {
if ([[[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem] objectForKey:MGMISpam] boolValue])
[menuItem setTitle:@"Unreport for Spam"];
else
[menuItem setTitle:@"Report for Spam"];
return YES;
} else
return NO;
} else if (menuSelector==@selector(inboxMarkRead:)) {
if (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem]!=nil) {
if ([[[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem] objectForKey:MGMIRead] boolValue])
[menuItem setTitle:@"Mark Unread"];
else
[menuItem setTitle:@"Mark Read"];
return YES;
} else
return NO;
} else if (menuSelector==@selector(refreshInbox:)) {
return (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] inboxWindow]!=nil && [[NSApplication sharedApplication] keyWindow]==[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] inboxWindow]);
} else if (menuSelector==@selector(inboxDelete:)) {
return (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem]!=nil);
} else if (menuSelector==@selector(inboxUndelete:)) {
return (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] selectedItem]!=nil && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] currentInbox]==3);
} else if (menuSelector==@selector(saveAudio:)) {
return (currentContactsController!=-1 && [[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] && [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] audioURL]!=nil);
}
return YES;
}
- (void)updateWindowMenu {
if (quitting)
return;
int splitterIndex = 0;
for (int i=0; i<[windowMenu numberOfItems]; i++) {
if (splitterIndex!=0) {
if ([[windowMenu itemAtIndex:i] isSeparatorItem])
break;
[windowMenu removeItemAtIndex:i];
i--;
}
if ([[[windowMenu itemAtIndex:i] title] isEqual:@"users"])
splitterIndex = i;
}
for (int i=[contactsControllers count]-1; i>=0; i--) {
NSMenuItem *item = [[NSMenuItem new] autorelease];
[item setTitle:[[contactsControllers objectAtIndex:i] menuTitle]];
if (currentContactsController==i)
[item setState:NSOnState];
if (i<10)
[item setKeyEquivalent:[[NSNumber numberWithInt:i+1] stringValue]];
[item setTag:i];
[item setTarget:self];
[item setAction:@selector(showUserWindow:)];
[windowMenu insertItem:item atIndex:splitterIndex+1];
}
}
- (IBAction)showUserWindow:(id)sender {
MGMContactsController *contactsController = [contactsControllers objectAtIndex:[sender tag]];
[contactsController showContactsWindow];
}
- (void)handleURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent {
NSURL *url = [NSURL URLWithString:[[event paramDescriptorForKeyword:keyDirectObject] stringValue]];
NSString *scheme = [[url scheme] lowercaseString];
NSString *data = [url resourceSpecifier];
/*NSString *queryData = [url query];
NSDictionary *query;
if (queryData) {
NSMutableArray *dataArr = [NSMutableArray arrayWithArray:[data componentsSeparatedByString:@"?"]];
[dataArr removeLastObject];
data = [dataArr componentsJoinedByString:@"?"];
NSMutableDictionary *dataDic = [NSMutableDictionary dictionary];
NSArray *parameters = [queryData componentsSeparatedByString:@"&"];
for (int i=0; i<[parameters count]; i++) {
NSArray *info = [[parameters objectAtIndex:i] componentsSeparatedByString:@"="];
[dataDic setObject:[[[info subarrayWithRange:NSMakeRange(1, [info count]-1)] componentsJoinedByString:@"="] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:[[info objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
query = [NSDictionary dictionaryWithDictionary:dataDic];
}*/
if ([data hasPrefix:@"//"]) {
data = [data substringFromIndex:2];
}
if ([scheme isEqualToString:@"tel"] || [scheme isEqualToString:@"callto"] || [scheme isEqualToString:@"telephone"] || [scheme isEqualToString:@"phone"] || [scheme isEqualToString:@"phonenumber"]) {
if (currentContactsController==-1)
return;
MGMContactsController *contactsController = [contactsControllers objectAtIndex:currentContactsController];
NSString *phoneNumber = [data phoneFormatWithAreaCode:[contactsController areaCode]];
[[MGMNumberOptions alloc] initWithContactsController:contactsController controller:self number:phoneNumber]; // This is not a leak as I release it within it self. I just don't want to keep track of it in here.
} else if ([scheme isEqualToString:@"call"]) {
if (currentContactsController==-1)
return;
MGMContactsController *contactsController = [contactsControllers objectAtIndex:currentContactsController];
NSString *phoneNumber = [data phoneFormatWithAreaCode:[contactsController areaCode]];
[contactsController showContactsWindow];
[[contactsController phoneField] setStringValue:[phoneNumber readableNumber]];
[self call:self];
} else if ([scheme isEqualToString:@"sms"]) {
if (currentContactsController==-1)
return;
MGMContactsController *contactsController = [contactsControllers objectAtIndex:currentContactsController];
if (![contactsController respondsToSelector:@selector(sms:)]) return;
NSString *phoneNumber = [data phoneFormatWithAreaCode:[contactsController areaCode]];
[contactsController showContactsWindow];
[[contactsController phoneField] setStringValue:[phoneNumber readableNumber]];
[self sms:self];
} else if ([scheme isEqualToString:@"vmtheme"]) {
[taskManager addTask:nil withURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@", data]]];
} else if ([scheme isEqualToString:@"vmsound"]) {
[taskManager addTask:nil withURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@", data]]];
}
}
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames {
[taskManager application:sender openFiles:filenames];
for (int i=0; i<[filenames count]; i++) {
if ([[[[filenames objectAtIndex:i] pathExtension] lowercaseString] isEqualToString:MGMVMTExt]) {
NSFileManager<NSFileManagerProtocol> *manager = [NSFileManager defaultManager];
if ([manager respondsToSelector:@selector(movePath:toPath:handler:)])
[manager movePath:[filenames objectAtIndex:i] toPath:[[themeManager themesFolderPath] stringByAppendingPathComponent:[[filenames objectAtIndex:i] lastPathComponent]] handler:nil];
else
[manager moveItemAtPath:[filenames objectAtIndex:i] toPath:[[themeManager themesFolderPath] stringByAppendingPathComponent:[[filenames objectAtIndex:i] lastPathComponent]] error:nil];
} else if ([[[[filenames objectAtIndex:i] pathExtension] lowercaseString] isEqualToString:MGMVMSExt]) {
NSFileManager<NSFileManagerProtocol> *manager = [NSFileManager defaultManager];
if ([manager respondsToSelector:@selector(movePath:toPath:handler:)])
[manager movePath:[filenames objectAtIndex:i] toPath:[[themeManager soundsFolderPath] stringByAppendingPathComponent:[[filenames objectAtIndex:i] lastPathComponent]] handler:nil];
else
[manager moveItemAtPath:[filenames objectAtIndex:i] toPath:[[themeManager soundsFolderPath] stringByAppendingPathComponent:[[filenames objectAtIndex:i] lastPathComponent]] error:nil];
}
}
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag {
if (!flag && currentContactsController!=-1)
[[contactsControllers objectAtIndex:currentContactsController] showContactsWindow];
return YES;
}
- (IBAction)about:(id)sender {
MGMSystemInfo *sysInfo = [MGMSystemInfo info];
[aboutNameField setStringValue:[NSString stringWithFormat:@"%@ %@", [sysInfo applicationName], [sysInfo applicationVersion]]];
[aboutWindow makeKeyAndOrderFront:self];
}
- (IBAction)showTaskManager:(id)sender {
[taskManager showTaskManager:sender];
}
- (IBAction)showInbox:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] showWindow:sender];
}
- (IBAction)refreshInbox:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] loadInbox];
}
- (IBAction)inboxSpam:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] spam:sender];
}
- (IBAction)inboxMarkRead:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] markRead:sender];
}
- (IBAction)inboxDelete:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] delete:sender];
}
- (IBAction)inboxUndelete:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)]) {
NSBeep();
return;
}
[[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] undelete:sender];
}
- (void)userStarted:(NSNotification *)theNotification {
MGMUser *user = [theNotification object];
if ([[user settingForKey:MGMSAccountType] isEqual:MGMSGoogleVoice]) {
[contactsControllers addObject:[MGMVoiceUser voiceUser:user controller:self]];
}
#if MGMSIPENABLED
else if ([[user settingForKey:MGMSAccountType] isEqual:MGMSSIP]) {
if (![[MGMSIP sharedSIP] isStarted]) [[MGMSIP sharedSIP] start];
[contactsControllers addObject:[MGMSIPUser SIPUser:user controller:self]];
}
#endif
[[NSNotificationCenter defaultCenter] postNotificationName:MGMContactsControllersChangedNotification object:self];
}
- (void)contactsControllerBecameCurrent:(MGMContactsController *)theContactsController {
if ([contactsControllers containsObject:theContactsController])
currentContactsController = [contactsControllers indexOfObject:theContactsController];
else
currentContactsController = [contactsControllers count];
[self updateWindowMenu];
}
- (void)userDone:(NSNotification *)theNotification {
for (int i=0; i<[contactsControllers count]; i++) {
if ([[contactsControllers objectAtIndex:i] isKindOfClass:[MGMVoiceUser class]]) {
MGMVoiceUser *voiceUser = [contactsControllers objectAtIndex:i];
if ([[voiceUser user] isEqual:[theNotification object]]) {
for (unsigned int i=0; i<[multipleSMS count]; i++) {
if ([[multipleSMS objectAtIndex:i] instance]==[voiceUser instance]) {
[[[multipleSMS objectAtIndex:i] SMSWindow] close];
i--;
}
}
for (unsigned int i=0; i<[[SMSManager SMSMessages] count]; i++) {
if ([[[SMSManager SMSMessages] objectAtIndex:i] instance]==[voiceUser instance]) {
[SMSManager closeSMSMessage:[[SMSManager SMSMessages] objectAtIndex:i]];
i--;
}
}
[self setBadge:0 forInstance:[voiceUser instance]];
currentContactsController = -1;
[contactsControllers removeObject:voiceUser];
[[NSNotificationCenter defaultCenter] postNotificationName:MGMContactsControllersChangedNotification object:self];
break;
}
}
#if MGMSIPENABLED
else if ([[contactsControllers objectAtIndex:i] isKindOfClass:[MGMSIPUser class]]) {
MGMSIPUser *SIPUser = [contactsControllers objectAtIndex:i];
if ([[SIPUser user] isEqual:[theNotification object]]) {
currentContactsController = -1;
[contactsControllers removeObject:SIPUser];
[[NSNotificationCenter defaultCenter] postNotificationName:MGMContactsControllersChangedNotification object:self];
}
}
#endif
}
}
- (NSString *)currentPhoneNumber {
NSString *phoneNumber = nil;
if ([[NSApplication sharedApplication] mainWindow]==[SMSManager SMSWindow])
phoneNumber = [SMSManager currentPhoneNumber];
if (phoneNumber==nil && currentContactsController!=-1)
phoneNumber = [[contactsControllers objectAtIndex:currentContactsController] currentPhoneNumber];
return phoneNumber;
}
- (IBAction)preferences:(id)sender {
[preferences showPreferences];
}
- (IBAction)sendMultipleSMS:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(instance)]) {
NSBeep();
return;
}
[multipleSMS addObject:[MGMMultiSMS SMSWithInstance:[[contactsControllers objectAtIndex:currentContactsController] instance] controller:self]];
}
- (void)removeMultiSMS:(MGMMultiSMS *)theMultiSMS {
[multipleSMS removeObject:theMultiSMS];
}
- (IBAction)saveAudio:(id)sender {
if (currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(inboxWindow)] || [[[contactsControllers objectAtIndex:currentContactsController] inboxWindow] audioURL]==nil) {
NSBeep();
return;
}
MGMVoiceUser *voiceUser = [contactsControllers objectAtIndex:currentContactsController];
NSURL *audioURL = [[voiceUser inboxWindow] audioURL];
NSDictionary *data = [[voiceUser inboxWindow] selectedItem];
[taskManager saveURL:audioURL withName:[NSString stringWithFormat:@"%@ (%@)", [[voiceUser contacts] nameForNumber:[data objectForKey:MGMIPhoneNumber]], [[data objectForKey:MGMIPhoneNumber] readableNumber]]];
}
- (IBAction)call:(id)sender {
NSString *phoneNumber = [self currentPhoneNumber];
if (phoneNumber==nil || currentContactsController==-1) {
NSBeep();
return;
}
MGMContactsController *contactsController = [contactsControllers objectAtIndex:currentContactsController];
[contactsController showContactsWindow];
[[contactsController phoneField] setStringValue:[phoneNumber readableNumber]];
[contactsController call:sender];
}
- (IBAction)sms:(id)sender {
NSString *phoneNumber = [self currentPhoneNumber];
if (phoneNumber==nil || currentContactsController==-1 || ![[contactsControllers objectAtIndex:currentContactsController] respondsToSelector:@selector(sms:)]) {
NSBeep();
return;
}
MGMVoiceUser *voiceUser = [contactsControllers objectAtIndex:currentContactsController];
[voiceUser showContactsWindow];
[[voiceUser phoneField] setStringValue:[phoneNumber readableNumber]];
[voiceUser sms:sender];
}
- (IBAction)reverseLookup:(id)sender {
NSString *phoneNumber = [self currentPhoneNumber];
if (phoneNumber==nil) {
NSBeep();
return;
}
[whitePages reverseLookup:phoneNumber delegate:self];
[RLName setStringValue:MGMLoading];
[RLAddress setStringValue:MGMLoading];
[RLCityState setStringValue:MGMLoading];
[RLZipCode setStringValue:MGMLoading];
[RLPhoneNumber setStringValue:MGMLoading];
[RLWindow orderFront:self];
}
- (void)reverseLookup:(NSDictionary *)theInfo didFailWithError:(NSError *)theError {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Reverse Lookup Failed"];
[alert setInformativeText:[theError localizedDescription]];
[alert runModal];
}
- (void)reverseLookupDidFindInfo:(NSDictionary *)theInfo forRequest:(NSDictionary *)theRequest {
if ([theInfo objectForKey:MGMWPName]) {
[RLName setStringValue:[theInfo objectForKey:MGMWPName]];
} else {
[RLName setStringValue:@""];
}
if ([theInfo objectForKey:MGMWPAddress]) {
[RLAddress setStringValue:[theInfo objectForKey:MGMWPAddress]];
} else {
[RLAddress setStringValue:@""];
}
if ([theInfo objectForKey:MGMWPLocation]) {
[RLCityState setStringValue:[theInfo objectForKey:MGMWPLocation]];
} else {
[RLCityState setStringValue:@""];
}
if ([theInfo objectForKey:MGMWPZip]) {
[RLZipCode setStringValue:[theInfo objectForKey:MGMWPZip]];
} else {
[RLZipCode setStringValue:@""];
}
if ([theInfo objectForKey:MGMWPPhoneNumber]) {
[RLPhoneNumber setStringValue:[[theInfo objectForKey:MGMWPPhoneNumber] readableNumber]];
} else {
[RLPhoneNumber setStringValue:@""];
}
if ([theInfo objectForKey:MGMWPAddress]) {
[[RLMap windowScriptObject] callWebScriptMethod:@"showAddress" withArguments:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%@, %@", [theInfo objectForKey:MGMWPAddress], [theInfo objectForKey:MGMWPZip]], [NSNumber numberWithInt:15], nil]];
} else if ([theInfo objectForKey:MGMWPZip]) {
[[RLMap windowScriptObject] callWebScriptMethod:@"showAddress" withArguments:[NSArray arrayWithObjects:[theInfo objectForKey:MGMWPZip], [NSNumber numberWithInt:13], nil]];
} else if ([theInfo objectForKey:MGMWPLocation]) {
[[RLMap windowScriptObject] callWebScriptMethod:@"showAddress" withArguments:[NSArray arrayWithObjects:[theInfo objectForKey:MGMWPLocation], [NSNumber numberWithInt:13], nil]];
}
}
- (IBAction)donate:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=7693931"]];
}
- (IBAction)viewTOS:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.google.com/googlevoice/legal-notices.html"]];
}
- (IBAction)rates:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.google.com/support/voice/bin/answer.py?answer=141925"]];
}
- (IBAction)billing:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.google.com/voice/#billing"]];
}
- (void)SIPStopped {
if (quitting)
[[NSApplication sharedApplication] replyToApplicationShouldTerminate:YES];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
NSApplicationTerminateReply response = [taskManager applicationShouldTerminate:sender];
#if MGMSIPENABLED
if (response==NSTerminateNow) {
for (int i=0; i<[contactsControllers count]; i++) {
if ([[contactsControllers objectAtIndex:i] isKindOfClass:[MGMSIPUser class]]) {
MGMSIPUser *SIPUser = [contactsControllers objectAtIndex:i];
if ([[SIPUser calls] count]!=0) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Calls in Progress"];
[alert setInformativeText:@"You appear to have calls in progress, are you sure you want to quit?"];
[alert addButtonWithTitle:@"Yes"];
[alert addButtonWithTitle:@"No"];
int result = [alert runModal];
if (result==1001)
response = NSTerminateCancel;
break;
}
}
}
}
#endif
if (response==NSTerminateNow) {
quitting = YES;
[contactsControllers removeAllObjects];
}
#if MGMSIPENABLED
if (response==NSTerminateNow) {
if ([[MGMSIP sharedSIP] isStarted]) {
[[MGMSIP sharedSIP] stop];
response = NSTerminateLater;
}
}
#endif
return response;
}
@end