VoiceMac/Classes/VoiceBase/MGMAddons.m

1462 lines
32 KiB
Mathematica
Raw Normal View History

2010-09-20 19:44:17 -05:00
//
// NSAddons.m
// VoiceBase
//
// Created by Mr. Gecko on 3/4/09.
// 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.
2010-09-20 19:44:17 -05:00
//
#import "MGMAddons.h"
#import "MGMInbox.h"
#import "MGMXML.h"
2010-09-20 19:44:17 -05:00
@implementation NSString (MGMAddons)
+ (NSString *)stringWithSeconds:(int)theSeconds {
int time = theSeconds;
int seconds = time%60;
time = time/60;
int minutes = time%60;
time = time/60;
int hours = time%24;
int days = time/24;
NSString *string;
if (days!=0) {
string = [NSString stringWithFormat:@"%d:%02d:%02d:%02d", days, hours, minutes, seconds];
} else if (hours!=0) {
string = [NSString stringWithFormat:@"%d:%02d:%02d", hours, minutes, seconds];
} else {
string = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
}
return string;
}
- (NSString *)flattenHTML {
NSString *xml = [NSString stringWithFormat:@"<d>%@</d>", self];
MGMXMLElement *xmlElement = [[[MGMXMLElement alloc] initWithXMLString:xml error:nil] autorelease];
2010-09-20 19:44:17 -05:00
return [xmlElement stringValue];
}
- (NSString *)replace:(NSString *)targetString with:(NSString *)replaceString {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSMutableString *temp = [NSMutableString new];
NSRange replaceRange = NSMakeRange(0, [self length]);
NSRange rangeInOriginalString = replaceRange;
int replaced = 0;
while (1) {
NSRange rangeToCopy;
NSRange foundRange = [self rangeOfString:targetString options:0 range:rangeInOriginalString];
if (foundRange.length == 0) break;
rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location);
[temp appendString:[self substringWithRange:rangeToCopy]];
[temp appendString:replaceString];
rangeInOriginalString.length -= NSMaxRange(foundRange) -
rangeInOriginalString.location;
rangeInOriginalString.location = NSMaxRange(foundRange);
replaced++;
if (replaced % 100 == 0) {
[pool drain];
pool = [NSAutoreleasePool new];
}
}
if (rangeInOriginalString.length > 0) [temp appendString:[self substringWithRange:rangeInOriginalString]];
[pool drain];
return [temp autorelease];
}
- (BOOL)containsString:(NSString *)string {
2011-02-25 10:23:30 -06:00
return ([[self lowercaseString] rangeOfString:[string lowercaseString]].location!=NSNotFound);
2010-09-20 19:44:17 -05:00
}
- (NSString *)javascriptEscape {
2010-09-20 19:44:17 -05:00
NSString *escaped = [self replace:@"\\" with:@"\\\\"];
escaped = [escaped replace:@"'" with:@"\\'"];
escaped = [escaped replace:@"\n" with:@"<br />"];
escaped = [escaped replace:@"\r" with:@""];
2010-09-20 19:44:17 -05:00
return escaped;
}
- (NSString *)filePath {
/*NSString *path = [self stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (![path hasPrefix:@"file:///"]) {
path = [NSString stringWithFormat:@"file://%@", path];
}
return [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];*/
return [[NSURL fileURLWithPath:self] absoluteString];
}
- (NSString *)littersToNumbers {
NSMutableString *outString = [NSMutableString string];
for (int i=0; i<[self length]; i++) {
unichar character = [self characterAtIndex:i];
switch (character) {
case 'a'...'c':
case 'A'...'C':
character = '2';
break;
case 'd'...'f':
case 'D'...'F':
character = '3';
break;
case 'g'...'i':
case 'G'...'I':
character = '4';
break;
case 'j'...'l':
case 'J'...'L':
character = '5';
break;
case 'm'...'o':
case 'M'...'O':
character = '6';
break;
case 'p'...'s':
case 'P'...'S':
character = '7';
break;
case 't'...'v':
case 'T'...'V':
character = '8';
break;
case 'w'...'z':
case 'W'...'Z':
character = '9';
break;
case '0'...'9':
break;
default:
character = '\0';
break;
}
if (character!='\0')
CFStringAppendCharacters((CFMutableStringRef)outString, &character, 1);
}
return outString;
}
- (NSString *)removePhoneWhiteSpace {
NSString *number = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
number = [number replace:@" " with:@""];
number = [number replace:@"-" with:@""];
number = [number replace:@")" with:@""];
number = [number replace:@"(" with:@""];
number = [number replace:@"+1" with:@"1"];
number = [number replace:@"+" with:@"011"];
2010-09-20 19:44:17 -05:00
number = [number replace:@"." with:@""];
return number;
}
- (BOOL)isPhone {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return YES;
2010-09-20 19:44:17 -05:00
NSString *number = [self removePhoneWhiteSpace];
if ([number length]<1)
return NO;
return [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[number characterAtIndex:0]];
}
- (BOOL)isPhoneComplete {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return YES;
2010-09-20 19:44:17 -05:00
NSString *number = [self removePhoneWhiteSpace];
if ([number length]<1 || ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[number characterAtIndex:0]])
return NO;
if ([number hasPrefix:@"011"])
return YES;
if ([number length]==11 && [number hasPrefix:@"1"])
return YES;
else if ([number length]==10 || [number length]==7)
return YES;
return NO;
}
- (NSString *)phoneFormatWithAreaCode:(NSString *)theAreaCode {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
2010-09-20 19:44:17 -05:00
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
int length = [number length];
if (length==11 && [number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else if (length<=7)
number = [NSString stringWithFormat:@"+1%@%@", theAreaCode, number];
else if (length<=10)
number = [NSString stringWithFormat:@"+1%@", number];
}
return number;
}
- (NSString *)phoneFormatAreaCode:(NSString *)theAreaCode {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
2010-09-20 19:44:17 -05:00
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
int length = [number length];
if (length==11 && [number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else
number = [NSString stringWithFormat:@"+1%@%@", theAreaCode, number];
}
return number;
}
- (NSString *)phoneFormat {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
2010-09-20 19:44:17 -05:00
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
if ([number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else
number = [NSString stringWithFormat:@"+1%@", number];
}
return number;
}
- (NSString *)readableNumber {
Added support for iPhone to MGMFFmpeg. Updated settings in Theme Tester. Updated settings in VoiceMac for the Theme Manager. Added the ability to hide icons in themes. Added the ability to change the font in themes. Fixed issue in MGMAddressBook where getting group members is not accurate. Made it so SIP addresses and Email addresses would not be recognized as phone numbers. Added support for 2 step verification. Added the ability to reload the user phone numbers. Added the ability to place the next message at any point in the previous message. Added the ability to do css based on the class of the message view with %MESSAGECLASSES%. Added the ability to get the codecs available and change the top codec in MGMSIP. Made it stop ring back before hanging up. Added initWithRootElement: to MGMXMLDocument. Added initWithName: and initWithName:stringValue: to MGMXMLElement. Added initWithKind:, setStringValue:, and fixed issues with reading attributes value. Made MGMVoiceUser support 2 step verification API, reload the user phones when it becomes active, and display a message if there is no phone numbers in Google Voice. Fixed issue where Google Chat will not appear in the User Phones list. Added a 2 Step Verification Dialog. Added Codec selection in MGMSIPPane. Fixed issues with MGMMultiSMS where it wouldn't alert the user if the message was blank and it wouldn't make the text field non editable. Added support for new SMS protocol to MGMSMSMessageView. Added support in the FFmpeg install script to build for iOS. Added ability to compile for the Simulator only in the PJProject build script. Made iOS and Mac OS final path go to 2 different folders. Updated to Revision 3466 of PJProject.
2011-03-21 07:43:56 -05:00
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
2010-09-20 19:44:17 -05:00
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
if ([number length]==10) {
2010-09-20 19:44:17 -05:00
NSString *areaCode = [number substringToIndex:3];
number = [number substringFromIndex:3];
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
number = [NSString stringWithFormat:@"(%@) %@-%@", areaCode, firstNumbers, number];
} else if ([number length]==11 && [number hasPrefix:@"1"]) {
number = [number substringFromIndex:1];
NSString *areaCode = [number substringToIndex:3];
number = [number substringFromIndex:3];
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
if ([areaCode isEqual:@"800"])
number = [NSString stringWithFormat:@"1 (%@) %@-%@", areaCode, firstNumbers, number];
else
number = [NSString stringWithFormat:@"(%@) %@-%@", areaCode, firstNumbers, number];
} else if ([number length]>=7 && [number length]<=10) {
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
number = [NSString stringWithFormat:@"%@-%@", firstNumbers, number];
2010-09-20 19:44:17 -05:00
}
} else {
number = [number substringFromIndex:3];
number = [@"+" stringByAppendingString:number];
2010-09-20 19:44:17 -05:00
}
return number;
}
- (NSString *)areaCode {
NSString *areaCode = [[self removePhoneWhiteSpace] littersToNumbers];
if (![areaCode hasPrefix:@"011"]) {
if ([areaCode length]>7) {
if ([areaCode hasPrefix:@"1"])
areaCode = [areaCode substringFromIndex:1];
areaCode = [areaCode substringToIndex:3];
}
return areaCode;
}
return nil;
}
- (NSString *)areaCodeLocation {
switch ([self intValue]) {
case 200:
return @"Service access code";
break;
case 201:
return @"New Jersey - NorthEast";
break;
case 202:
return @"District Of Columbia";
break;
case 203:
return @"Connecticut";
break;
case 204:
return @"Manitoba";
break;
case 205:
return @"Alabama - Birmingham/Central Alabama";
break;
case 206:
return @"Washington - Seattle";
break;
case 207:
return @"Maine";
break;
case 208:
return @"Idaho";
break;
case 209:
return @"California - Central";
break;
case 210:
return @"Texas - San Antonio";
break;
case 211:
return @"Coin Phone Refunds";
break;
case 212:
return @"New York - Manhattan";
break;
case 213:
return @"California - Los Angeles";
break;
case 214:
return @"Texas - Dallas";
break;
case 215:
return @"Pennsylvania - SouthEast";
break;
case 216:
return @"Ohio - Cleveland";
break;
case 217:
return @"Illinois - South Central";
break;
case 218:
return @"Minnesota - Northern";
break;
case 219:
return @"Indiana - Northern";
break;
case 224:
return @"Illinois overlay deferred";
break;
case 225:
return @"Louisiana";
break;
case 228:
return @"Mississippi";
break;
case 229:
return @"Georgia - (split from 912)";
break;
case 231:
return @"Michigan";
break;
case 234:
return @"Ohio (overlay 330)";
break;
case 240:
return @"Maryland";
break;
case 242:
return @"Bahamas-Carib";
break;
case 246:
return @"Barbados-Carib";
break;
case 248:
return @"Michigan - Oakland Cty";
break;
case 250:
return @"British Columbia";
break;
case 252:
return @"North Carolina";
break;
case 253:
return @"Washington - Tacoma";
break;
case 254:
return @"Texas - Ft. Worth";
break;
case 256:
return @"Alabama - Huntsville/North Alabama";
break;
case 262:
return @"Wisconsin";
break;
case 264:
return @"Anguilla";
break;
case 267:
return @"Pennsylvania (overlay 215)";
break;
case 268:
return @"Antigua/Barbuda-Carib";
break;
case 270:
return @"Kentucky";
break;
case 278:
return @"Michigan overlay suspended";
break;
case 281:
return @"Texas - Houston";
break;
case 284:
return @"British V.I.-Carib";
break;
case 300:
return @"Service Access Code";
break;
case 301:
return @"Maryland - Southern&Western";
break;
case 302:
return @"Delaware";
break;
case 303:
return @"Colorado - Northern&Western";
break;
case 304:
return @"West Virginia";
break;
case 305:
return @"Florida - SouthEast";
break;
case 306:
return @"Saskatchewan";
break;
case 307:
return @"Wyoming";
break;
case 308:
return @"Nebraska - Western";
break;
case 309:
return @"Illinois - West Central";
break;
case 310:
return @"California - Los Angeles";
break;
case 311:
return @"Reserved Special Function";
break;
case 312:
return @"Illinois - Chicago";
break;
case 313:
return @"Michigan - Eastern";
break;
case 314:
return @"Missouri - Eastern";
break;
case 315:
return @"New York - North Central";
break;
case 316:
return @"Kansas - Southern";
break;
case 317:
return @"Indiana - Central";
break;
case 318:
return @"Louisiana - Western";
break;
case 319:
return @"Iowa - Eastern";
break;
case 320:
return @"Minnesota";
break;
case 321:
return @"Florida Space Coast (Melbourne)";
break;
case 323:
return @"California - Los Angeles";
break;
case 325:
return @"Texas - San Angelo";
break;
case 330:
return @"Ohio - Eastern";
break;
case 331:
return @"Illinois overlay deferred";
break;
case 334:
return @"Alabama - Montgomery/Mobile/Lower Alabama";
break;
case 336:
return @"North Carolina";
break;
case 337:
return @"Louisiana";
break;
case 339:
return @"Massachusetts";
break;
case 340:
return @"US Virgin Islands";
break;
case 341:
return @"California";
break;
case 345:
return @"Cayman Islands";
break;
case 347:
return @"New York - NYC-not Mnhtn (split from 718)";
break;
case 351:
return @"Massachusetts";
break;
case 352:
return @"Florida - North";
break;
case 360:
return @"Washington - Western";
break;
case 361:
return @"Texas - (split from 512)";
break;
case 369:
return @"California - (split from 707)";
break;
case 385:
return @"Utah";
break;
case 400:
return @"Service Access Code";
break;
case 401:
return @"Rhode Island";
break;
case 402:
return @"Nebraska - Eastern";
break;
case 403:
return @"Alberta , Southern";
break;
case 404:
return @"Georgia - Metro Atlanta";
break;
case 405:
return @"Oklahoma- Southern&Western";
break;
case 406:
return @"Montana";
break;
case 407:
return @"Florida - Greater Orlando";
break;
case 408:
return @"California - Central Coastal";
break;
case 409:
return @"Texas - SouthEast";
break;
case 410:
return @"Maryland - Eastern";
break;
case 411:
return @"Directory Services";
break;
case 412:
return @"Pennsylvania - Pittsburgh";
break;
case 413:
return @"Massachusetts - Western";
break;
case 414:
return @"Wisconsin - Eastern";
break;
case 415:
return @"California - San Francisco";
break;
case 416:
return @"Ontario - City of Toronto";
break;
case 417:
return @"Missouri - SouthWest";
break;
case 418:
return @"Quebec - NorthEast";
break;
case 419:
return @"Ohio - NorthWest";
break;
case 423:
return @"Tennessee - Eastern";
break;
case 424:
return @"California (overlay 310)";
break;
case 425:
return @"Washington - Seattle east suburbs";
break;
case 435:
return @"Utah";
break;
case 440:
return @"Ohio - Northeast";
break;
case 441:
return @"Bermuda-Carib";
break;
case 442:
return @"California";
break;
case 443:
return @"Maryland";
break;
case 445:
return @"Pennsylvania";
break;
case 450:
return @"Quebec";
break;
case 456:
return @"Inbound International";
break;
case 464:
return @"Illinois overlay deferred";
break;
case 469:
return @"Texas";
break;
case 473:
return @"Grenada-Carib";
break;
case 475:
return @"Connecticut - (overlay 203)";
break;
case 478:
return @"Georgia";
break;
case 480:
return @"Arizona - Phoenix. East Valley";
break;
case 484:
return @"Pennsylvania (overlay 610)";
break;
case 500:
return @"Personal Communication Svcs";
break;
case 501:
return @"Arkansas";
break;
case 502:
return @"Kentucky - Western";
break;
case 503:
return @"Oregon - Portland tri-metro";
break;
case 504:
return @"Louisiana - Eastern";
break;
case 505:
return @"New Mexico";
break;
case 506:
return @"New Brunswick";
break;
case 507:
return @"Minnesota - Southern";
break;
case 508:
return @"Massachusetts - Eastern";
break;
case 509:
return @"Washington - Eastern";
break;
case 510:
return @"California - East Bay Area";
break;
case 512:
return @"Texas - Southern";
break;
case 513:
return @"Ohio - SouthWest";
break;
case 514:
return @"Quebec - Southern";
break;
case 515:
return @"Iowa - Central";
break;
case 516:
return @"New York - Nassau County LI";
break;
case 517:
return @"Michigan - Central";
break;
case 518:
return @"New York - NorthEast";
break;
case 519:
return @"Ontario - SouthWest";
break;
case 520:
return @"Arizona";
break;
case 530:
return @"California - Northern";
break;
case 540:
return @"Virginia";
break;
case 541:
return @"Oregon";
break;
case 555:
return @"Not Available";
break;
case 559:
return @"California - Central";
break;
case 561:
return @"Florida - Greater Palm Beach";
break;
case 562:
return @"California - Los Angeles";
break;
case 564:
return @"Washington - (overlay 360)";
break;
case 567:
return @"Ohio";
break;
case 570:
return @"Pennsylvania - (split 717)";
break;
case 571:
return @"Virginia";
break;
case 573:
return @"Missouri";
break;
case 580:
return @"Oklahoma";
break;
case 586:
return @"Michigan overlay suspended";
break;
case 600:
return @"Canada/Services";
break;
case 601:
return @"Mississippi";
break;
case 602:
return @"Arizona";
break;
case 603:
return @"New Hampshire";
break;
case 604:
return @"British Columbia";
break;
case 605:
return @"South Dakota";
break;
case 606:
return @"Kentucky - Eastern";
break;
case 607:
return @"New York - South Central";
break;
case 608:
return @"Wisconsin - SouthWest";
break;
case 609:
return @"New Jersey - Southern";
break;
case 610:
return @"Pennsylvania";
break;
case 611:
return @"Repair Service";
break;
case 612:
return @"Minnesota - Minneapolis";
break;
case 613:
return @"Ontario - SouthEast";
break;
case 614:
return @"Ohio - Columbus Area";
break;
case 615:
return @"Tennessee - Middle/Western";
break;
case 616:
return @"Michigan - Western";
break;
case 617:
return @"Massachusetts - Eastern";
break;
case 618:
return @"Illinois - Southern";
break;
case 619:
return @"California - San Diego, S.Cal";
break;
case 620:
return @"Kansas";
break;
case 623:
return @"Arizona - Phoenix. West Valley";
break;
case 626:
return @"California - Pas./San Gabr.Vly";
break;
case 627:
return @"California - (split from 707)";
break;
case 628:
return @"California";
break;
case 630:
return @"Illinois - Chicago suburbs";
break;
case 631:
return @"New York - Suffolk County LI";
break;
case 636:
return @"Missouri";
break;
case 641:
return @"Iowa";
break;
case 646:
return @"New York - Manhattan (split from 212)";
break;
case 647:
return @"Ontario";
break;
case 649:
return @"Turks & Caicos";
break;
case 650:
return @"California - West Bay Area";
break;
case 651:
return @"Minnesota - St. Paul ";
break;
case 657:
return @"California";
break;
case 660:
return @"Missouri";
break;
case 661:
return @"California - (split from 805)";
break;
case 662:
return @"Mississippi";
break;
case 664:
return @"Montserrat-Carib";
break;
case 669:
return @"California";
break;
case 670:
return @"CNMI-Mariana Islands";
break;
case 671:
return @"Guam";
break;
case 678:
return @"Georgia";
break;
case 679:
return @"Michigan overlay suspended";
break;
case 682:
return @"Texas";
break;
case 700:
return @"Service Varies by LD Carrier";
break;
case 701:
return @"North Dakota";
break;
case 702:
return @"Nevada - Clark County";
break;
case 703:
return @"Virginia - Northern & Western";
break;
case 704:
return @"North Carolina - Western";
break;
case 705:
return @"Ontario - Northern";
break;
case 706:
return @"Georgia - Northern";
break;
case 707:
return @"California - North Coastal";
break;
case 708:
return @"Illinois - NorthEast";
break;
case 709:
return @"Newfndlnd, Labradr";
break;
case 710:
return @"Gov Emer Telecom Svc";
break;
case 711:
return @"Special Function";
break;
case 712:
return @"Iowa - Western";
break;
case 713:
return @"Texas - Houston Area";
break;
case 714:
return @"California - Orange County";
break;
case 715:
return @"Wisconsin - Northern";
break;
case 716:
return @"New York - Western";
break;
case 717:
return @"Pennsylvania - East Central";
break;
case 718:
return @"New York - NYC except Mnhtn";
break;
case 719:
return @"Colorado - SouthEast";
break;
case 720:
return @"Colorado";
break;
case 724:
return @"Pennsylvania - Western";
break;
case 727:
return @"Florida Greater St Petersburg";
break;
case 731:
return @"Tennessee";
break;
case 732:
return @"New Jersey - Central";
break;
case 734:
return @"Michigan - Ann Arbor/Ypsilanti";
break;
case 737:
return @"Texas";
break;
case 740:
return @"Ohio - SouthEast";
break;
case 747:
return @"California";
break;
case 752:
return @"California";
break;
case 757:
return @"Virginia";
break;
case 758:
return @"St. Lucia-Carib";
break;
case 760:
return @"California - San Diego";
break;
case 763:
return @"Minnesota - Minneapolis Suburbs";
break;
case 764:
return @"California";
break;
case 765:
return @"Indiana - Outside Indianapolis";
break;
case 767:
return @"Dominica";
break;
case 770:
return @"Georgia";
break;
case 773:
return @"Illinois - Chicago";
break;
case 774:
return @"Massachusetts";
break;
case 775:
return @"Nevada";
break;
case 778:
return @"British Columbia";
break;
case 780:
return @"Alberta, Edmonton & North";
break;
case 781:
return @"Massachusetts";
break;
case 784:
return @"St. Vincent/Grenadines";
break;
case 785:
return @"Kansas - Northern";
break;
case 786:
return @"Florida - Overlay the 305 area";
break;
case 787:
return @"Puerto Rico-Carib";
break;
case 800:
return @"Toll-Free Calling";
break;
case 801:
return @"Utah";
break;
case 802:
return @"Vermont";
break;
case 803:
return @"South Carolina";
break;
case 804:
return @"Virginia - SouthEast";
break;
case 805:
return @"California - SouthCentral";
break;
case 806:
return @"Texas - North Panhandle";
break;
case 807:
return @"Ontario - NorthWest";
break;
case 808:
return @"Hawaii";
break;
case 809:
return @"Caribbean Islands";
break;
case 810:
return @"Michigan - Northern";
break;
case 811:
return @"Special Function";
break;
case 812:
return @"Indiana - Southern";
break;
case 813:
return @"Florida - Tampa area";
break;
case 814:
return @"Pennsylvania - West Central";
break;
case 815:
return @"Illinois - Northern";
break;
case 816:
return @"Missouri - NorthWest";
break;
case 817:
return @"Texas - North Central";
break;
case 818:
return @"California - SF Valley, LA area";
break;
case 819:
return @"Quebec - Eastern";
break;
case 822:
return @"Future Toll-Free Svc.";
break;
case 828:
return @"North Carolina";
break;
case 830:
return @"Texas -South, near San Antonio";
break;
case 831:
return @"California, Central Coastal";
break;
case 832:
return @"Texas, Houston area";
break;
case 833:
return @"Future Toll-Free Svc.";
break;
case 835:
return @"Pennsylvania";
break;
case 843:
return @"South Carolina";
break;
case 844:
return @"Future Toll-Free Svc.";
break;
case 845:
return @"New York";
break;
case 847:
return @"Illinois - Chicago suburbs";
break;
case 850:
return @"Florida panhandle";
break;
case 855:
return @"Toll-Free Svc.";
break;
case 856:
return @"New Jersey - Southern";
break;
case 857:
return @"Massachusetts";
break;
case 858:
return @"California - (split from 619)";
break;
case 859:
return @"Kentucky";
break;
case 860:
return @"Connecticut";
break;
case 863:
return @"Florida - South Central";
break;
case 864:
return @"South Carolina";
break;
case 865:
return @"Tennessee";
break;
case 866:
return @"Toll-Free Svc.";
break;
case 867:
return @"Yukon/N.W.Territories";
break;
case 868:
return @"Trinidad and Tobago-Carib";
break;
case 869:
return @"St.Kitts and Nevis-Carib";
break;
case 870:
return @"Arkansas";
break;
case 872:
return @"Illinois overlay deferred";
break;
case 876:
return @"Jamaica";
break;
case 877:
return @"Toll-Free Calling";
break;
case 878:
return @"Pennsylvania";
break;
case 880:
return @"Paid 800 Service";
break;
case 881:
return @"Paid 888 Service";
break;
case 882:
return @"Paid 877 Service";
break;
case 888:
return @"Toll-Free Calling";
break;
case 900:
return @"Value Added Info Svc Code";
break;
case 901:
return @"Tennessee - Western";
break;
case 902:
return @"Prince Edward Island, Nova Scotia ";
break;
case 903:
return @"Texas - NorthEast";
break;
case 904:
return @"Florida - Northeast";
break;
case 905:
return @"Greater Toronto Area, except Toronto";
break;
case 906:
return @"Michigan - Upper North";
break;
case 907:
return @"Alaska";
break;
case 908:
return @"New Jersey - Central";
break;
case 909:
return @"California - Riverside&S.Bern";
break;
case 910:
return @"North Carolina";
break;
case 911:
return @"Emergency Services";
break;
case 912:
return @"Georgia - Southern";
break;
case 913:
return @"Kansas - Northern";
break;
case 914:
return @"New York - Southern";
break;
case 915:
return @"Texas - Western";
break;
case 916:
return @"California - Sacramento";
break;
case 917:
return @"New York City";
break;
case 918:
return @"Oklahoma - NorthEast";
break;
case 919:
return @"North Carolina - Eastern";
break;
case 920:
return @"Wisconsin";
break;
case 925:
return @"California - S.F.Bay area";
break;
case 931:
return @"Tennessee";
break;
case 935:
return @"California - (split from 619)";
break;
case 936:
return @"Texas - (split from 409)";
break;
case 937:
return @"Ohio - Dayton, SW Ohio";
break;
case 939:
return @"Puerto Rico";
break;
case 940:
return @"Texas - Ft. Worth";
break;
case 941:
return @"Florida - Cape Coral area";
break;
case 947:
return @"Michigan overlay suspended";
break;
case 949:
return @"California - Orange County";
break;
case 951:
return @"California";
break;
case 952:
return @"Minnesota - Minneapolis Suburbs";
break;
case 954:
return @"Florida - Greater Ft Lauderdale";
break;
case 956:
return @"Texas - Laredo/Brownsville";
break;
case 959:
return @"Connecticut - (overlay 860)";
break;
case 970:
return @"Colorado";
break;
case 971:
return @"Oregon";
break;
case 972:
return @"Texas - Dallas";
break;
case 973:
return @"New Jersey - Northern";
break;
case 978:
return @"Massachusetts";
break;
case 979:
return @"Texas";
break;
case 980:
return @"North Carolina";
break;
case 985:
return @"Louisiana";
break;
case 989:
return @"Michigan";
break;
}
return @"No Location Found";
}
- (NSString *)addPercentEscapes {
NSString *result = [self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]|"), kCFStringEncodingUTF8);
if (escapedString) {
result = [NSString stringWithString:(NSString *)escapedString];
CFRelease(escapedString);
}
return result;
}
#if !TARGET_OS_IPHONE
2010-09-20 19:44:17 -05:00
- (NSString *)truncateForWidth:(double)theWidth attributes:(NSDictionary *)theAttributes {
NSString *endString = @"…";
NSString *truncatedString = self;
int truncatedStringLength = [self length];
if (truncatedStringLength>2 && [truncatedString sizeWithAttributes:theAttributes].width>theWidth) {
double targetWidth = theWidth - [endString sizeWithAttributes:theAttributes].width;
NSCharacterSet *whiteSpaceCharacters = [NSCharacterSet whitespaceAndNewlineCharacterSet];
while ([truncatedString sizeWithAttributes:theAttributes].width > targetWidth && truncatedStringLength) {
truncatedStringLength--;
while ([whiteSpaceCharacters characterIsMember:[truncatedString characterAtIndex:truncatedStringLength-1]])
truncatedStringLength--;
truncatedString = [truncatedString substringToIndex:truncatedStringLength];
}
truncatedString = [truncatedString stringByAppendingString:endString];
}
return truncatedString;
}
#endif
2010-09-20 19:44:17 -05:00
NSComparisonResult dateSort(NSDictionary *info1, NSDictionary *info2, void *context) {
NSComparisonResult result = [[info1 objectForKey:MGMITime] compare:[info2 objectForKey:MGMITime]];
if (result==NSOrderedAscending) {
result = NSOrderedDescending;
} else if (result==NSOrderedDescending) {
result = NSOrderedAscending;
}
return result;
}
- (BOOL)isIPAddress {
NSArray *components = [self componentsSeparatedByString:@"."];
if ([components count]!=4)
return NO;
NSCharacterSet *characterSet = [NSCharacterSet decimalDigitCharacterSet];
for (int i=0; i<[components count]; i++) {
NSString *component = [components objectAtIndex:i];
if ([component length]>3)
return NO;
for (int c=0; c<[component length]; c++) {
if (![characterSet characterIsMember:[component characterAtIndex:c]])
return NO;
}
if ([component intValue]>255)
return NO;
}
return YES;
}
#if MGMSIPENABLED
+ (NSString *)stringWithPJString:(pj_str_t)pjString {
return [[[NSString alloc] initWithBytes:pjString.ptr length:pjString.slen encoding:NSUTF8StringEncoding] autorelease];
}
- (pj_str_t)PJString {
return pj_str((char *)[self UTF8String]);
}
#endif
@end
@implementation NSData (MGMAddons)
- (NSData *)resizeTo:(
#if TARGET_OS_IPHONE
CGSize
#else
NSSize
#endif
)theSize {
2010-09-20 19:44:17 -05:00
#if TARGET_OS_IPHONE
UIImage *image = [[UIImage alloc] initWithData:self];
2010-09-20 19:44:17 -05:00
#else
NSImage *image = [[NSImage alloc] initWithData:self];
#endif
if (image==nil)
return self;
2010-09-20 19:44:17 -05:00
if (image!=nil) {
#if TARGET_OS_IPHONE
CGSize size = [image size];
#else
2010-09-20 19:44:17 -05:00
NSSize size = [image size];
#endif
2010-09-20 19:44:17 -05:00
float scaleFactor = 0.0;
float scaledWidth = theSize.width;
float scaledHeight = theSize.height;
if (
#if TARGET_OS_IPHONE
!CGSizeEqualToSize(size, theSize)
#else
!NSEqualSizes(size, theSize)
#endif
) {
2010-09-20 19:44:17 -05:00
float widthFactor = theSize.width / size.width;
float heightFactor = theSize.height / size.height;
if (widthFactor < heightFactor)
scaleFactor = widthFactor;
else
scaleFactor = heightFactor;
scaledWidth = size.width * scaleFactor;
scaledHeight = size.height * scaleFactor;
}
NSData *scaledData = self;
#if TARGET_OS_IPHONE
CGSize newSize = CGSizeMake(scaledWidth, scaledHeight);
if (!CGSizeEqualToSize(newSize, CGSizeZero)) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, scaledWidth, scaledHeight)];
UIImage *newImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
[pool drain];
scaledData = UIImagePNGRepresentation(newImage);
[newImage release];
2010-09-20 19:44:17 -05:00
}
#else
NSSize newSize = NSMakeSize(scaledWidth, scaledHeight);
if (!NSEqualSizes(newSize, NSZeroSize)) {
NSImage *newImage = [[NSImage alloc] initWithSize:newSize];
if (newImage==nil || NSEqualSizes([newImage size], NSZeroSize))
return self;
[newImage lockFocus];
NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
[graphicsContext setImageInterpolation:NSImageInterpolationHigh];
[graphicsContext setShouldAntialias:YES];
[image drawInRect:NSMakeRect(0, 0, scaledWidth, scaledHeight) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[newImage unlockFocus];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:[newImage TIFFRepresentation]];
scaledData = [imageRep representationUsingType:NSPNGFileType properties:nil];
[newImage release];
}
#endif
2010-09-20 19:44:17 -05:00
[image release];
return scaledData;
}
return nil;
}
2010-09-20 19:44:17 -05:00
@end