113c60ac5f71b446d3ad912b832669f1dd9f9b6e
[zxing.git] / iphone / Classes / AddContactAction.m
1 //
2 //  AddContactAction.m
3 //  ZXing
4 //
5 //  Created by Christian Brunschen on 29/05/2008.
6 /*
7  * Copyright 2008 ZXing authors
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21
22 #import "AddContactAction.h"
23 #import "AddressBook/AddressBook.h"
24
25
26 @implementation AddContactAction
27
28 @synthesize name;
29 @synthesize phoneNumbers;
30 @synthesize note;
31 @synthesize email;
32 @synthesize urlString;
33 @synthesize address;
34
35 + actionWithName:(NSString *)n
36     phoneNumbers:(NSArray *)nums
37            email:(NSString *)em
38              url:(NSString *)us
39          address:(NSString *)ad
40             note:(NSString *)nt {
41   AddContactAction *aca = [[[self alloc] init] autorelease];
42   aca.name = n;
43   aca.phoneNumbers = nums;
44   aca.email = em;
45   aca.urlString = us;
46   aca.address = ad;
47   aca.note = nt;
48   return aca;
49 }
50
51 - (NSString *)title {
52   return NSLocalizedString(@"Add Contact", @"Add Contact");
53 }
54
55 - (void)performActionWithController:(UIViewController *)controller 
56                       shouldConfirm:(bool)confirm {
57   CFErrorRef *error = NULL;
58   NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
59   
60   ABRecordRef person = ABPersonCreate();
61     
62   NSRange commaRange = [name rangeOfString:@","];
63   if (commaRange.location != NSNotFound) {
64     NSString *lastName = [[name substringToIndex:commaRange.location] 
65                           stringByTrimmingCharactersInSet:whitespaceSet];
66     ABRecordSetValue(person, kABPersonLastNameProperty, lastName, error);
67     NSArray *firstNames = [[[name substringFromIndex:commaRange.location + commaRange.length]
68                             stringByTrimmingCharactersInSet:whitespaceSet] 
69                            componentsSeparatedByCharactersInSet:whitespaceSet];
70     ABRecordSetValue(person, kABPersonFirstNameProperty, [firstNames objectAtIndex:0], error);
71     for (int i = 1; i < [firstNames count]; i++) {
72       ABRecordSetValue(person, kABPersonMiddleNameProperty, [firstNames objectAtIndex:1], error);
73     }
74   } else {
75     NSArray *nameParts = [name componentsSeparatedByCharactersInSet:whitespaceSet];
76     int nParts = nameParts.count;
77     if (nParts == 1) {
78       ABRecordSetValue(person, kABPersonFirstNameProperty, name, error);
79     } else if (nParts >= 2) {
80       int lastPart = nParts - 1;
81       ABRecordSetValue(person, kABPersonFirstNameProperty, [nameParts objectAtIndex:0], error);
82       for (int i = 1; i < lastPart; i++) {
83         ABRecordSetValue(person, kABPersonMiddleNameProperty, [nameParts objectAtIndex:i], error);
84       }
85       ABRecordSetValue(person, kABPersonLastNameProperty, [nameParts objectAtIndex:lastPart], error);
86     }
87   }
88   
89   if (self.note) {
90     ABRecordSetValue(person, kABPersonNoteProperty, self.note, error);
91   }
92   
93   if (self.phoneNumbers && self.phoneNumbers.count > 0) {
94     // multi-values: nultiple phone numbers
95     ABMutableMultiValueRef phoneNumberMultiValue = 
96     ABMultiValueCreateMutable(kABStringPropertyType);
97     for (NSString *number in self.phoneNumbers) {
98       ABMultiValueAddValueAndLabel(phoneNumberMultiValue, number, 
99                                    kABPersonPhoneMainLabel, NULL);
100     }
101     ABRecordSetValue(person, kABPersonPhoneProperty,
102                      phoneNumberMultiValue, error);
103   }
104   
105   if (self.email) {
106     // a single email address
107     ABMutableMultiValueRef emailMultiValue = 
108     ABMultiValueCreateMutable(kABStringPropertyType);
109     ABMultiValueAddValueAndLabel(emailMultiValue, self.email, 
110                                  kABHomeLabel, NULL);
111     ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, error);
112   }
113   
114   if (self.urlString) {
115     // a single url as the home page
116     ABMutableMultiValueRef urlMultiValue = 
117     ABMultiValueCreateMutable(kABStringPropertyType);
118     ABMultiValueAddValueAndLabel(urlMultiValue, self.urlString,
119                                  kABPersonHomePageLabel, NULL);
120     ABRecordSetValue(person, kABPersonURLProperty, urlMultiValue, error);
121   }
122   
123   ABUnknownPersonViewController *unknownPersonViewController = 
124   [[ABUnknownPersonViewController alloc] init];
125   unknownPersonViewController.displayedPerson = person;
126   unknownPersonViewController.allowsActions = true;
127   unknownPersonViewController.allowsAddingToAddressBook = true;
128   unknownPersonViewController.unknownPersonViewDelegate = self;
129   CFRelease(person);
130
131   viewController = [controller retain];
132   [[viewController navigationController] pushViewController:unknownPersonViewController animated:YES];
133   [unknownPersonViewController release];
134 }
135
136 - (void)dismissUnknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController {
137   [[viewController navigationController] popToViewController:viewController animated:YES];
138   [viewController release];
139   viewController = nil;
140 }
141
142 // ABUnknownPersonViewControllerDelegate
143
144 - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController
145                  didResolveToPerson:(ABRecordRef)person {
146   if (person) {
147     [self performSelector:@selector(dismissUnknownPersonViewController:) withObject:unknownPersonViewController afterDelay:0.0];
148   }
149 }
150 @end