Developer Area

root/apps/iphone/superbook/trunk/Classes/NaptrViewController.m @ 416

Revision 416, 23.7 kB (checked in by henri, 5 years ago)

Don't show errors if there aren't any naptrs.

Line 
1//
2//  NaptrViewController.m
3//  LocateThem
4//
5//  Created by Henri Asseily on 8/25/08.
6/*
7 Copyright (c) 2008-2009, Telnic Ltd. All rights reserved.
8 
9 Redistribution and use in source and binary forms, with or without modification,
10 are permitted provided that the following conditions are met:
11 
12 Redistributions of source code must retain the above copyright notice, this list of conditions
13 and the following disclaimer. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the documentation and/or other
15 materials provided with the distribution.
16 Neither the name of the Telnic Ltd. nor the names of its contributors may be used to endorse or
17 promote products derived from this software without specific prior written permission.
18 THIS DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
19 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27//
28
29#import "NaptrViewController.h"
30
31static UIFont *headerFont;
32static UIFont *txtFont;
33
34@interface NaptrViewController (PrivateMethods)
35
36- (void)decrementLoadingCount;
37- (void)showError:(NSError *)error;
38@end
39
40@implementation NaptrViewController
41
42@synthesize theTable;
43@synthesize cleanTelName;
44@synthesize headerText;
45@synthesize naptrArray;
46@synthesize txtArray;
47@synthesize locArray;
48@synthesize country;
49@synthesize timeZone;
50@synthesize prefsReverseGeo;
51@synthesize loadingAIView;
52@synthesize loadingAIButton;
53@synthesize storeContactButton;
54@synthesize abId;
55
56#define kHeaderTextFontSize 14.0
57#define kTextFontSize 14.0
58
59#pragma mark ------- canonical init methods
60
61
62- (void)setupWithPersonId:(NSNumber *)personId {
63        NSString *telName = [[FriendsData sharedInstance] getTelForABRecordId:personId withABRecordRef:nil];
64        [self setupWithTel:telName];
65        self.abId = personId;
66}
67
68- (void) setupWithTel:(NSString *)telName {
69       
70        headerFont = [UIFont boldSystemFontOfSize:kHeaderTextFontSize];
71        txtFont = [UIFont boldSystemFontOfSize:kTextFontSize];
72
73        self.title = telName;
74        self.abId = [NSNumber numberWithInt:NSUIntegerMax];
75        self.cleanTelName = [NSMutableString stringWithString:self.title];
76        [self.cleanTelName replaceOccurrencesOfString:@"-"
77                                                                  withString:@" "
78                                                                         options:NSLiteralSearch
79                                                                           range:NSMakeRange(0, [self.cleanTelName length])];
80
81        self.headerText = nil;
82        self.country = nil;
83        self.timeZone = nil;
84        geoLocDidFinish = NO;
85        if (self.naptrArray) {
86                self.naptrArray = nil;
87                self.txtArray = nil;
88                self.locArray = nil;
89        }
90        self.naptrArray = [NSMutableArray arrayWithCapacity:10];
91        self.txtArray = [NSMutableArray arrayWithCapacity:10];
92        self.locArray = [NSMutableArray arrayWithCapacity:1];
93
94        self.loadingAIView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
95        self.loadingAIView.hidesWhenStopped = YES;
96        self.loadingAIButton = [[UIBarButtonItem alloc] initWithCustomView:self.loadingAIView];
97       
98        self.storeContactButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave
99                                                                                                                                                        target:self
100                                                                                                                                                        action:@selector(saveContact:)];
101       
102        // set the uinavbar of the root viewcontroller of the navcontroller
103        self.navigationItem.rightBarButtonItem = self.loadingAIButton;
104       
105        [self.theTable reloadData];
106        loadingCount = 3;
107        [self performSelectorInBackground:@selector(getNaptrInBackgroundForTel:) withObject:self.title];
108        [self performSelectorInBackground:@selector(getTxtInBackgroundForTel:) withObject:self.title];
109        [self performSelectorInBackground:@selector(getLocInBackgroundForTel:) withObject:self.title];
110}
111
112#pragma mark ------- Basic methods
113
114- (void)viewDidLoad {
115        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
116        self.prefsReverseGeo = [defaults integerForKey:@"reverseGeoPreference"];
117}
118
119- (void)viewWillAppear:(BOOL)animated {
120        [super viewWillAppear:animated];
121        // set the uinavbar of the non-root viewcontrollers of the navcontroller
122        self.navigationItem.title = self.title;
123        if (!self.navigationItem.rightBarButtonItem)
124                self.navigationItem.rightBarButtonItem = self.loadingAIButton;
125}
126
127- (void)viewDidAppear:(BOOL)animated {
128        [super viewDidAppear:animated];
129        self.navigationController.navigationBarHidden = NO;
130}
131
132- (void)didReceiveMemoryWarning {
133        [super didReceiveMemoryWarning];
134}
135
136- (void)dealloc {
137        [super dealloc];
138}
139
140#pragma mark ------ set up loading stuff
141
142- (NSUInteger)loadingCount {
143        return loadingCount;
144}
145
146- (void)decrementLoadingCount {
147        // Must call this on main thread, because it has UI needs and is called from background threads
148        if (![NSThread isMainThread]) {
149                [self performSelectorOnMainThread:_cmd
150                                                           withObject:nil
151                                                        waitUntilDone:YES];
152                return;
153        }
154        loadingCount--;
155        if (loadingCount == 0) {
156                [self.loadingAIView stopAnimating];
157                self.navigationItem.rightBarButtonItem = self.storeContactButton;
158        } else {
159                [self.loadingAIView startAnimating];
160                self.navigationItem.rightBarButtonItem = self.loadingAIButton;
161        }
162}
163
164#pragma mark ------ tableView datasource methods
165
166- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
167        return SECTION_LOC+1;
168}
169
170- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
171        switch (section) {
172                case SECTION_HEADER:
173                        return @"Header";
174                        break;
175                case SECTION_NAPTR:
176                        return @"Contact Info";
177                        break;
178                case SECTION_TXT:
179                        return @"Keywords";
180                        break;
181                case SECTION_LOC:
182                        return @"Location";
183                        break;
184                default:
185                        return @"Other Records";
186                        break;
187        }
188}
189
190- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
191        switch (section) {
192                case SECTION_HEADER:
193                        if (!headerText) {
194                                return 0;
195                        }
196                        return 1;
197                        break;
198                case SECTION_NAPTR:
199                        return [naptrArray count];
200                        break;
201                case SECTION_TXT:
202                        return [txtArray count];
203                        break;
204                case SECTION_LOC:
205                        return [locArray count];
206                        break;
207                default:
208                        return 0;
209                        break;
210        }
211}
212
213- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
214       
215        switch (indexPath.section) {
216                case SECTION_HEADER:
217                {
218                        static NSString *MyIdentifier = @"headerCell";
219                       
220                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
221                        if (cell == nil) {
222                                cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
223                        }
224                        //Working with a resizable cell
225                        //If there is already a subview, remove it.
226                        if ([[cell.contentView subviews] count] > 0) {
227                                UIView *labelToClear = [[cell.contentView subviews] objectAtIndex:0];
228                                [labelToClear removeFromSuperview];
229                        }
230                        UILabel *cellLabel;
231                        cellLabel = [headerText sizeCellLabelWithFont:headerFont paddingWidth:10.0f Height:10.0f];
232                        [cell.contentView addSubview:cellLabel];
233                        return cell;
234                }
235                        break;
236                       
237                case SECTION_NAPTR:
238                {
239                        static NSString *MyIdentifier = @"naptrCells";
240                       
241                        RecordNaptr *theRec = [self.naptrArray objectAtIndex:indexPath.row];
242                       
243                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
244                        if (cell == nil) {
245                                NSArray *naptrCellNib = [[NSBundle mainBundle] loadNibNamed:@"NaptrTableViewCell" owner:self options:nil];
246                                cell = (UITableViewCell *)[naptrCellNib objectAtIndex:0];
247                        }
248                       
249                        [(UILabel *)[cell viewWithTag:NAPTRCELL_SERVICETYPE_TAG] setText:theRec.serviceDescription];
250                       
251                        // Check if it's a nonterminal naptr. If so, add the accessory indicator
252                        // and remove the trailing part of the string if it is a subdomain of the current domain
253                        if (theRec.isTerminal) {
254                                [(UILabel *)[cell viewWithTag:NAPTRCELL_LABEL_TAG] setText:theRec.labelDescription];
255                                [(UILabel *)[cell viewWithTag:NAPTRCELL_VALUE_TAG] setText:theRec.uriContent];
256                        } else {
257                                [(UILabel *)[cell viewWithTag:NAPTRCELL_LABEL_TAG] setText:@""];
258                                [(UILabel *)[cell viewWithTag:NAPTRCELL_VALUE_TAG] setText:theRec.labelDescription];
259                                // If NTN points within domain, shorten text to only display the subdomain of this domain
260                                if ([[theRec.labelDescription lowercaseString] hasSuffix:[self.cleanTelName lowercaseString]]) {
261                                        NSInteger suffixIndex = [theRec.labelDescription length] - [self.cleanTelName length] - 1;
262                                        if (suffixIndex > 0) {
263                                                [(UILabel *)[cell viewWithTag:NAPTRCELL_VALUE_TAG] setText:[theRec.labelDescription substringToIndex:suffixIndex]];
264                                        }
265                                }
266                                [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
267                        }
268                       
269                        return cell;
270                }
271                        break;
272                       
273                case SECTION_TXT:
274                {
275                        static NSString *MyIdentifier = @"txtCells";
276                       
277                        RecordTxt *theRec = [self.txtArray objectAtIndex:indexPath.row];
278                       
279                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
280                        if (cell == nil) {
281                                NSArray *txtCellNib = [[NSBundle mainBundle] loadNibNamed:@"TxtTableViewCell" owner:self options:nil];
282                                cell = (UITableViewCell *)[txtCellNib objectAtIndex:0];
283                        }
284                        [(UILabel *)[cell viewWithTag:1] setText:theRec.primaryDescription];
285                        if (theRec.primaryValue != NULL) {
286                                [(UILabel *)[cell viewWithTag:3] setText:theRec.primaryValue];
287                        } else {
288                                [(UILabel *)[cell viewWithTag:3] setText:@""];
289                        }
290                       
291                        // Set the text description and resize the label accordingly
292                        // We're not doing it like the header because we're using a nib for the cell
293                        // (but we override the font size here)
294                        UILabel *textDescriptionLabel = (UILabel *)[cell viewWithTag:2];
295                        textDescriptionLabel.text = theRec.textValue;
296                        CGFloat width = textDescriptionLabel.frame.size.width;
297                        CGFloat height = [textDescriptionLabel.text cellHeightForFont:txtFont paddingWidth:10.0f Height:6.0f];
298                        CGRect newframe = CGRectMake(textDescriptionLabel.frame.origin.x, textDescriptionLabel.frame.origin.y, width, height);
299                        textDescriptionLabel.frame = newframe;
300
301                        return cell;
302                }
303                        break;
304                       
305                case SECTION_LOC:
306                {
307                        static NSString *MyIdentifier = @"locCell";
308                       
309                        RecordLoc *theRec = [self.locArray objectAtIndex:indexPath.row];
310                       
311                        // Get the cell
312                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
313                        if (cell == nil) {
314                                NSArray *locCellNib = [[NSBundle mainBundle] loadNibNamed:@"LocTableViewCell" owner:self options:nil];
315                                cell = (UITableViewCell *)[locCellNib objectAtIndex:0];
316                        }                       
317                       
318                        // Display cell info
319                       
320                        if (timeZone) {
321                                NSCalendar *cal = [NSCalendar currentCalendar];
322                                [cal setTimeZone:timeZone];
323                                NSDate *now = [NSDate date];
324                                // Set the color of the background of the cell, based on whether the person should be awake or not
325                                // Possibility: Make the hours a preference
326//                              unsigned unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit;
327//                              NSDateComponents *comps = [cal components:unitFlags fromDate:now];
328//                              if (([comps hour] < 8) || ([comps hour] > 22)) {
329//                                      cell.contentView.backgroundColor = [UIColor colorWithRed:0 green:0.15 blue:0.3 alpha:1];
330//                                      cell.accessoryView.backgroundColor = [UIColor colorWithRed:0 green:0.15 blue:0.3 alpha:1];
331//                              } else {
332//                                      cell.contentView.backgroundColor = [UIColor colorWithRed:0.3 green:0.9 blue:0.9 alpha:1];
333//                                      cell.accessoryView.backgroundColor = [UIColor colorWithRed:0.3 green:0.9 blue:0.9 alpha:1];
334//                              }
335                                // Now display the time properly
336                                NSDateFormatter *dF = [[NSDateFormatter alloc] init];
337                                [dF setTimeZone:timeZone];
338                                [dF setTimeStyle:NSDateFormatterShortStyle];
339                                [dF setDateStyle:NSDateFormatterNoStyle];
340                                [(UILabel *)[cell viewWithTag:LOCCELL_LOCALTIME_TAG] setText:[dF stringFromDate:now]];
341                                [dF release];
342                        } else {
343                                // no timezone
344                                [(UILabel *)[cell viewWithTag:LOCCELL_LOCALTIME_TAG] setText:@""];
345                        }
346                        if (prefsReverseGeo) {
347                                if (country) {
348                                        [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:country];
349                                        [(UIActivityIndicatorView *)[cell viewWithTag:LOCCELL_ACTIVITYINDICATOR_TAG] stopAnimating];
350                                } else {
351                                        if (geoLocDidFinish) {
352                                                [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:@"Unknown Country"];
353                                                [(UIActivityIndicatorView *)[cell viewWithTag:LOCCELL_ACTIVITYINDICATOR_TAG] stopAnimating];
354                                        } else {
355                                                [(UIActivityIndicatorView *)[cell viewWithTag:LOCCELL_ACTIVITYINDICATOR_TAG] startAnimating];
356                                        }
357                                }
358                        } else {        // not prefsReverseGeo
359                                [(UILabel *)[cell viewWithTag:LOCCELL_COUNTRY_TAG] setText:@"(country lookup disabled)"];
360                                [(UIActivityIndicatorView *)[cell viewWithTag:LOCCELL_ACTIVITYINDICATOR_TAG] stopAnimating];
361                        }
362                       
363                        [(UILabel *)[cell viewWithTag:LOCCELL_LATLONG_TAG] setText:[NSString stringWithFormat:@"%.4f, %.4f",
364                                                                                                                                                theRec.coordinate.latitude, theRec.coordinate.longitude]];
365                        return cell;
366                }
367                        break;
368                       
369                default:
370                {
371                        UITableViewCell *cell = nil;
372                        return cell;
373                }
374                        break;
375        }
376}
377
378#pragma mark ---------- Table view Delegate methods ----------
379
380// Row selection actions:
381//  - terminal naptr: fire off the url, and let the OS handle it
382//  - non-terminal naptr: query that domain
383//  - loc: display the mapview
384- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
385        NSUInteger row = indexPath.row;
386        if (row != NSNotFound) {
387                [tableView deselectRowAtIndexPath:indexPath animated:NO];
388                switch (indexPath.section) {
389                        case SECTION_NAPTR:
390                        {
391                                RecordNaptr *naptr = [self.naptrArray objectAtIndex:row];
392                                if (naptr.isTerminal) {
393                                        [self actOnUri:naptr.uriContent];
394                                } else {
395                                        // Non-Terminal NAPTR
396                                        NaptrViewController *newDetailsViewController = [[[NaptrViewController alloc] initWithNibName:@"TelView"
397                                                                                                                                                                                                                  bundle:[NSBundle mainBundle]]
398                                                                                                                                         autorelease];
399                                        [newDetailsViewController setupWithTel:naptr.uriContent];
400                                        [tableView deselectRowAtIndexPath:indexPath animated:NO];
401                                        [self.navigationController pushViewController:newDetailsViewController animated:YES];
402                                }
403                        }
404                                break;
405                        case SECTION_LOC:
406                        {
407                                RecordLoc *loc = [locArray objectAtIndex:row];
408                                FriendsMapViewController *fMVC = [FriendsMapViewController sharedInstance];
409                                fMVC.initialLoc = loc;
410                                if ([abId integerValue] == NSUIntegerMax) {     // not one of our address book .tel domains
411                                        [fMVC setMarkerWithABRecordId:self.abId title:nil telname:self.title location:loc];
412                                } else {
413                                        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
414                                        if (![defaults boolForKey:@"startupLocatePreference"]) {
415                                                // need to draw the marker, as we didn't locate the user earlier
416                                                NSString *personName = [[FriendsData sharedInstance] getNameForABRecordId:self.abId];
417                                                [fMVC setMarkerWithABRecordId:abId title:personName telname:self.title location:loc];
418                                        }
419                                }
420                                [tableView deselectRowAtIndexPath:indexPath animated:NO];
421                                [self.navigationController pushViewController:fMVC animated:YES];
422                        }
423                                break;
424                        default:
425                                break;
426                }
427        }
428}
429
430- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
431        switch (indexPath.section) {
432                case SECTION_HEADER:
433                {
434                        return [headerText cellHeightForFont:headerFont paddingWidth:10.0f Height:10.0f];
435                }
436                case SECTION_TXT:
437                {
438                        RecordTxt *theRec = [self.txtArray objectAtIndex:indexPath.row];
439                        return [theRec.textValue cellHeightForFont:txtFont paddingWidth:10.0f Height:18.0f];
440                }
441                default:
442                        return (CGFloat)44.0;
443        }
444}
445
446/*
447- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
448       
449        if (editingStyle == UITableViewCellEditingStyleDelete) {
450        }
451        if (editingStyle == UITableViewCellEditingStyleInsert) {
452        }
453}
454*/
455/*
456- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
457        return YES;
458}
459*/
460/*
461- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
462}
463*/
464/*
465- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
466        return YES;
467}
468*/
469
470#pragma mark ------ Custom Data Methods
471
472- (void)getNaptrForTel:(NSString *)telName {
473        NSError *error = nil;
474        [[NetworkUtility sharedInstance] networkwillActivate:YES];
475        DnsResolver *res = [[DnsResolver alloc] init];
476        NSUInteger naptrCount = [res getNAPTRForTel:telName inArray:self.naptrArray withError:&error];
477        [res release];
478        if (naptrCount == 0) {
479#ifdef DEBUG
480                NSLog(@"Warning: Error or No NAPTR records in domain %@", telName);
481#endif
482        }
483        [[NetworkUtility sharedInstance] networkwillActivate:NO];
484        [self decrementLoadingCount];
485        [self.theTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
486        if (error) {
487                // Show all errors unless the answer is invalid, which generally means there aren't any NAPTRs
488                if ([error code] != RESOLVER_STATUS_INVALID_ANSWER) {
489                        [self showError:error];
490                }
491        }
492}
493
494- (void)getTxtForTel:(NSString *)telName {
495        NSError *error = nil;
496        [[NetworkUtility sharedInstance] networkwillActivate:YES];
497        DnsResolver *res = [[DnsResolver alloc] init];
498        self.headerText = [res getTXTForTel:telName inArray:self.txtArray withError:&error];
499        [res release];
500        [[NetworkUtility sharedInstance] networkwillActivate:NO];
501        [self decrementLoadingCount];
502        [self.theTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
503}
504
505- (void)getLocForTel:(NSString *)telName {
506        NSError *error = nil;
507        [[NetworkUtility sharedInstance] networkwillActivate:YES];
508        DnsResolver *res = [[DnsResolver alloc] init];
509        NSUInteger locCount = [res getLOCForTel:telName inArray:self.locArray withError:&error];
510        [res release];
511        [[NetworkUtility sharedInstance] networkwillActivate:NO];
512        [self decrementLoadingCount];   // Don't wait for reverse geo to say we're done, that's a bonus
513        if (locCount > 1) {
514                //NSLog(@"Warning: %d LOC records in domain %@", locCount, telName);
515        }
516        [self.theTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
517        if (locCount > 0) {
518                if (prefsReverseGeo) {
519                        // and now look up the timezone and other goodies that take a while because they use the web
520                        [[NetworkUtility sharedInstance] networkwillActivate:YES];
521                        [self getCountryAndTimeZoneForLoc:(RecordLoc *)[self.locArray objectAtIndex:0]];
522                        [[NetworkUtility sharedInstance] networkwillActivate:NO];
523                        [self.theTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
524                }
525        }
526}
527
528- (void) getNaptrInBackgroundForTel:(NSString *)telName {
529        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
530        [self getNaptrForTel:telName];
531        [pool release];
532}
533
534- (void) getTxtInBackgroundForTel:(NSString *)telName {
535        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
536        [self getTxtForTel:telName];
537        [pool release];
538}
539
540- (void) getLocInBackgroundForTel:(NSString *)telName {
541        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
542        [self getLocForTel:telName];
543        [pool release];
544}
545
546- (void)getCountryAndTimeZoneForLoc:(CLLocation *)aLoc {
547        // Get country and timezone
548        // Don't get current time because the url may be cached. Use the timezone to regenerate the current time
549        NSString *uS = [NSString stringWithFormat:@"http://ws.geonames.org/timezone?lat=%f&lng=%f",
550                                        aLoc.coordinate.latitude, aLoc.coordinate.longitude];
551        NSURL *url = [NSURL URLWithString:uS];
552        NSURLRequest *urlReq = [NSURLRequest requestWithURL:url
553                                                                                        cachePolicy:NSURLRequestReturnCacheDataElseLoad
554                                                                                timeoutInterval:60.0];
555        NSHTTPURLResponse *response = [[[NSHTTPURLResponse alloc]
556                                                                        initWithURL:url
557                                                                        MIMEType:@"text/xml"
558                                                                        expectedContentLength:1024
559                                                                        textEncodingName:nil] autorelease];
560        NSError *error;
561        NSData *tzData = [NSURLConnection sendSynchronousRequest:urlReq
562                                                                                   returningResponse:&response
563                                                                                                           error:&error];
564        if (tzData) {
565                // Got data
566                NSString *sData = [[NSString alloc] initWithData:tzData encoding:NSUTF8StringEncoding];
567                // Now get country
568                NSRange rC1 = [sData rangeOfString:@"<countryName>"];
569                if (rC1.location != NSNotFound) {
570                        NSRange rC2 = [sData rangeOfString:@"</countryName>"];
571                        if (rC2.location != NSNotFound) {
572                                NSRange rC = NSMakeRange(rC1.location+rC1.length, rC2.location - (rC1.location+rC1.length));
573                                self.country = [sData substringWithRange:rC];
574                        }
575                }
576                // And get timezone
577                NSRange rTZ1 = [sData rangeOfString:@"<timezoneId>"];
578                if (rTZ1.location != NSNotFound) {
579                        NSRange rTZ2 = [sData rangeOfString:@"</timezoneId>"];
580                        if (rTZ2.location != NSNotFound) {
581                                NSRange rTZ = NSMakeRange(rTZ1.location+rTZ1.length, rTZ2.location - (rTZ1.location+rTZ1.length));
582                                self.timeZone = [NSTimeZone timeZoneWithName:[sData substringWithRange:rTZ]];
583                        }
584                }
585                [sData release];
586        }
587        geoLocDidFinish = YES;
588}
589
590#pragma mark ------ Methods to handle URI actions
591
592- (void)actOnUri:(NSString *)uri {
593        if (!uri)
594                return;
595        if ([uri hasPrefix:@"tel:"]) {
596                // if a telephone number, ask if we want to send SMS.
597                // Plus, this acts as a user acceptance to call or not
598                UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:uri
599                                                                                                                                 delegate:self
600                                                                                                                cancelButtonTitle:nil
601                                                                                                   destructiveButtonTitle:nil
602                                                                                                                otherButtonTitles:nil];
603                callButtonIndex = [actionSheet addButtonWithTitle:LocStr(@"Call this number")];
604                smsButtonIndex = [actionSheet addButtonWithTitle:LocStr(@"Send an SMS Message")];
605                actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:LocStr(@"Cancel")];
606                [actionSheet showInView:self.view];
607                [actionSheet release];
608        } else if ([uri hasPrefix:@"http:"] || [uri hasPrefix:@"https:"]) {
609                WebUrlViewController *wVC = [[[WebUrlViewController alloc] initWithNibName:@"WebUrlView" bundle:nil] autorelease];
610                wVC.title = LocStr(@"Web View");
611                [self.navigationController pushViewController:wVC animated:YES];
612                [wVC showPage:uri];
613        } else {
614                // directly act on anything not a number or url
615                NSURL *naptrUrl = [NSURL URLWithString:uri];
616                [[UIApplication sharedApplication] openURL:naptrUrl];
617        }
618}
619
620- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
621        if (buttonIndex == actionSheet.cancelButtonIndex) {
622                // Clicked cancel
623                return;
624        }
625        NSURL *naptrUrl;
626        NSString *uri = [actionSheet title];
627    if (buttonIndex == callButtonIndex) {
628                naptrUrl = [NSURL URLWithString:[uri stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
629                [[UIApplication sharedApplication] openURL:naptrUrl];
630        } else if (buttonIndex == smsButtonIndex) {
631                NSRange telPrefixRange = [uri rangeOfString:@"tel:"];
632                naptrUrl = [NSURL URLWithString:[uri stringByReplacingCharactersInRange:telPrefixRange withString:@"sms:"]];
633                [[UIApplication sharedApplication] openURL:naptrUrl];
634    }
635        return;
636}
637
638#pragma mark ------ Methods to save a contact
639
640- (IBAction)saveContact:(id)sender {
641        if (abD)
642                [abD release];
643        abD = [[DotTelABDelegate alloc] initWithViewController:self telName:self.title];
644        abD.naptrArray = self.naptrArray;
645        abD.txtArray = self.txtArray;
646        NSError *err;
647        if ([abId integerValue] == NSUIntegerMax) {     // not one of our address book .tel domains
648                err = [abD saveRecord];
649        } else {
650                err = [abD saveRecordWithRecordId:[abId integerValue]];
651        }
652        if (err) {
653                NSLog([err localizedDescription]);
654        }
655}
656
657#pragma mark ------ Error Methods
658
659- (void)showError:(NSError *)error {
660        if (![NSThread isMainThread]) {
661                [self performSelectorOnMainThread:_cmd
662                                                           withObject:error
663                                                        waitUntilDone:NO];
664                return;
665        }       
666        UIAlertView *errAlert = [[UIAlertView alloc] initWithTitle:@"Error"
667                                                                                                           message:[error localizedDescription]
668                                                                                                          delegate:nil cancelButtonTitle:@"OK"
669                                                                                         otherButtonTitles:nil];
670        [errAlert show];
671        [errAlert release];
672}       
673@end
674
Note: See TracBrowser for help on using the browser.
Telnic
Search This Site
Partners
Neustar
ICANN
Main site | WHOIS | Sell .tel | FAQ | Archived Site | About Telnic | Contact Us