diff --git a/Classes/ContactDetailsTableViewController.h b/Classes/ContactDetailsTableViewController.h index 311908db9..3deaa2107 100644 --- a/Classes/ContactDetailsTableViewController.h +++ b/Classes/ContactDetailsTableViewController.h @@ -41,7 +41,7 @@ typedef enum _ContactSections { NSIndexPath *editingIndexPath; } -@property (nonatomic, assign) ABRecordRef contact; +@property (nonatomic, assign, setter=setContact:) ABRecordRef contact; @property (nonatomic, strong) IBOutlet id contactDetailsDelegate; @property (nonatomic, strong) IBOutlet UIContactDetailsHeader *headerController; @property (nonatomic, strong) IBOutlet UIContactDetailsFooter *footerController; @@ -50,5 +50,6 @@ typedef enum _ContactSections { - (void)addPhoneField:(NSString*)number; - (void)addSipField:(NSString*)address; - (void)addEmailField:(NSString*)address; +- (void)setContact:(ABRecordRef)contact; @end diff --git a/Classes/ContactDetailsTableViewController.m b/Classes/ContactDetailsTableViewController.m index eeb66c6dd..27b987bc1 100644 --- a/Classes/ContactDetailsTableViewController.m +++ b/Classes/ContactDetailsTableViewController.m @@ -150,14 +150,10 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe } } -+ (NSString*)localizeLabel:(NSString*)str { - return (NSString*) CFBridgingRelease(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef) str)); -} - - (NSDictionary*)getLocalizedLabels { OrderedDictionary *dict = [[OrderedDictionary alloc] initWithCapacity:[labelArray count]]; for(NSString *str in labelArray) { - [dict setObject:[ContactDetailsTableViewController localizeLabel:str] forKey:str]; + [dict setObject:[FastAddressBook localizedLabel:str] forKey:str]; } return dict; } @@ -260,15 +256,15 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe ABMultiValueIdentifier index; CFErrorRef error = NULL; - CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey}; - CFTypeRef values[] = { CFBridgingRetain([value copy]), (__bridge CFTypeRef)([LinphoneManager instance].contactSipField) }; - CFDictionaryRef lDict = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, NULL, NULL); + NSDictionary* lDict = @{(NSString*)kABPersonInstantMessageUsernameKey:value, + (NSString*)kABPersonInstantMessageServiceKey:[LinphoneManager instance].contactSipField}; + if (entry) { index = (int)ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - ABMultiValueReplaceValueAtIndex(lMap, lDict, index); + ABMultiValueReplaceValueAtIndex(lMap, (__bridge CFTypeRef)(lDict), index); } else { CFStringRef label = (__bridge CFStringRef)[labelArray objectAtIndex:0]; - ABMultiValueAddValueAndLabel(lMap, lDict, label, &index); + ABMultiValueAddValueAndLabel(lMap, (__bridge CFTypeRef)lDict, label, &index); } if (!ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, &error)) { @@ -278,7 +274,6 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe if (entry == nil) { entry = [[Entry alloc] initWithData:index]; } - CFRelease(lDict); CFRelease(lMap); /*check if message type is kept or not*/ @@ -286,29 +281,29 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe lMap = ABMultiValueCreateMutableCopy(lcMap); CFRelease(lcMap); index = (int)ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - lDict = ABMultiValueCopyValueAtIndex(lMap,index); - if(!CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) { + lDict = CFBridgingRelease(ABMultiValueCopyValueAtIndex(lMap,index)); + + if([lDict objectForKey:(__bridge NSString*)kABPersonInstantMessageServiceKey] == nil) { /*too bad probably a gtalk number, storing uri*/ - NSString* username = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey); + NSString* username = [lDict objectForKey:(NSString*)kABPersonInstantMessageUsernameKey]; LinphoneAddress* address = linphone_core_interpret_url([LinphoneManager getLc] ,[username UTF8String]); if(address){ char* uri = linphone_address_as_string_uri_only(address); - CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey}; - CFTypeRef values[] = { (__bridge CFTypeRef)([NSString stringWithCString:uri encoding:[NSString defaultCStringEncoding]]), (__bridge CFTypeRef)([LinphoneManager instance].contactSipField) }; - CFDictionaryRef lDict2 = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, NULL, NULL); - ABMultiValueReplaceValueAtIndex(lMap, lDict2, index); - if (!ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, &error)) { + NSDictionary *dict2 = @{(NSString*)kABPersonInstantMessageUsernameKey:[NSString stringWithCString:uri encoding:[NSString defaultCStringEncoding]], + (NSString*)kABPersonInstantMessageServiceKey:[LinphoneManager instance].contactSipField}; + + ABMultiValueReplaceValueAtIndex(lMap, (__bridge CFTypeRef)(dict2), index); + + if (!ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, &error)) { LOGI(@"Can't set contact with value [%@] cause [%@]", value,[(__bridge NSError*)error localizedDescription]); } - CFRelease(lDict2); linphone_address_destroy(address); ms_free(uri); } } CFRelease(lMap); } - CFRelease(lDict); return entry; } @@ -336,7 +331,7 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe lMap = ABMultiValueCreateMutable(kABStringPropertyType); } CFStringRef label = (__bridge CFStringRef)[labelArray objectAtIndex:0]; - if(!ABMultiValueAddValueAndLabel(lMap, CFBridgingRetain([value copy]), label, &identifier)) { + if(!ABMultiValueAddValueAndLabel(lMap, (__bridge CFTypeRef)(value), label, &identifier)) { added = false; } @@ -368,7 +363,7 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe lMap = ABMultiValueCreateMutable(kABStringPropertyType); } CFStringRef label = (__bridge CFStringRef)[labelArray objectAtIndex:0]; - if(!ABMultiValueAddValueAndLabel(lMap, CFBridgingRetain([value copy]), label, &identifier)) { + if(!ABMultiValueAddValueAndLabel(lMap, (__bridge CFTypeRef)(value), label, &identifier)) { added = false; } @@ -405,15 +400,23 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe ABMultiValueRef lMap = ABRecordCopyValue(contact, property); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); CFTypeRef valueRef = ABMultiValueCopyValueAtIndex(lMap, index); - CFTypeRef toRelease = valueRef; + CFTypeRef toRelease = nil; + NSString* value = nil; if (property == kABPersonInstantMessageProperty ) { // when we query the instanteMsg property we get a dictionary instead of a value - valueRef = CFDictionaryGetValue(valueRef, kABPersonInstantMessageUsernameKey); - } - if(![(__bridge NSString*) valueRef length]) { + toRelease = valueRef; + value = (__bridge_transfer NSString*)CFDictionaryGetValue(valueRef, kABPersonInstantMessageUsernameKey); + } else { + value = (__bridge_transfer NSString*)valueRef; + } + + if(value.length == 0) { [self removeEntry:tableview path:[NSIndexPath indexPathForRow:row inSection:section] animated:animated]; } - CFRelease(toRelease); + if( toRelease != nil ){ + CFRelease(toRelease); + } + CFRelease(lMap); } @@ -508,39 +511,37 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe NSString *value = @""; // default label is our app name - NSString *label = [ContactDetailsTableViewController localizeLabel:[labelArray objectAtIndex:0]]; + NSString *label = [FastAddressBook localizedLabel:[labelArray objectAtIndex:0]]; if(contactSections[[indexPath section]] == ContactSections_Number) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonPhoneProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFStringRef labelRef = ABMultiValueCopyLabelAtIndex(lMap, index); + NSString* labelRef = (__bridge_transfer NSString*)(ABMultiValueCopyLabelAtIndex(lMap, index)); if(labelRef != NULL) { - label = [ContactDetailsTableViewController localizeLabel:(NSString*) CFBridgingRelease(labelRef)]; + label = [FastAddressBook localizedLabel:labelRef]; } - NSString* valueRef = CFBridgingRelease(ABMultiValueCopyValueAtIndex(lMap, index)); + NSString* valueRef = (__bridge_transfer NSString*)(ABMultiValueCopyValueAtIndex(lMap, index)); if(valueRef != NULL) { - value = [ContactDetailsTableViewController localizeLabel:valueRef]; + value = [FastAddressBook localizedLabel:valueRef]; } CFRelease(lMap); } else if(contactSections[[indexPath section]] == ContactSections_Sip) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFStringRef labelRef = ABMultiValueCopyLabelAtIndex(lMap, index); + + NSString* labelRef = (__bridge_transfer NSString*)(ABMultiValueCopyLabelAtIndex(lMap, index)); if(labelRef != NULL) { - label = [ContactDetailsTableViewController localizeLabel:(NSString*) CFBridgingRelease(labelRef)]; + label = [FastAddressBook localizedLabel:labelRef]; } CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, index); - CFStringRef valueRef = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey); - if(valueRef != NULL) { + value = (__bridge NSString*)( CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey)); + if(value != NULL) { LinphoneAddress* addr=NULL; - if ([[LinphoneManager instance] lpConfigBoolForKey:@"contact_display_username_only"] - && (addr=linphone_address_new([(NSString *)CFBridgingRelease(valueRef) UTF8String]))) { + if ([[LinphoneManager instance] lpConfigBoolForKey:@"contact_display_username_only"] && (addr=linphone_address_new([value UTF8String]))) { if (linphone_address_get_username(addr)) { value = [NSString stringWithCString:linphone_address_get_username(addr) encoding:[NSString defaultCStringEncoding]]; - } /*else value=@""*/ - } else { - value = (NSString*) CFBridgingRelease(valueRef); + } } if (addr) linphone_address_destroy(addr); } @@ -549,13 +550,13 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe } else if(contactSections[[indexPath section]] == ContactSections_Email) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonEmailProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFStringRef labelRef = ABMultiValueCopyLabelAtIndex(lMap, index); + NSString* labelRef = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(lMap, index); if(labelRef != NULL) { - label = [ContactDetailsTableViewController localizeLabel:(NSString*) CFBridgingRelease(labelRef)]; + label = [FastAddressBook localizedLabel:labelRef]; } - CFStringRef valueRef = ABMultiValueCopyValueAtIndex(lMap, index); + NSString* valueRef = (__bridge_transfer NSString*)(ABMultiValueCopyValueAtIndex(lMap, index)); if(valueRef != NULL) { - value = [ContactDetailsTableViewController localizeLabel:(NSString*) CFBridgingRelease(valueRef)]; + value = [FastAddressBook localizedLabel:valueRef]; } CFRelease(lMap); } @@ -584,25 +585,25 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe if(contactSections[[indexPath section]] == ContactSections_Number) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonPhoneProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFStringRef valueRef = ABMultiValueCopyValueAtIndex(lMap, index); + NSString* valueRef = CFBridgingRelease(ABMultiValueCopyValueAtIndex(lMap, index)); if(valueRef != NULL) { - dest = [ContactDetailsTableViewController localizeLabel:(NSString*) CFBridgingRelease(valueRef)]; + dest = [FastAddressBook localizedLabel:(NSString*)(valueRef)]; } CFRelease(lMap); } else if(contactSections[[indexPath section]] == ContactSections_Sip) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, index); - CFStringRef valueRef = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey); - dest = [FastAddressBook normalizeSipURI:(NSString*) CFBridgingRelease(valueRef)]; + NSString* valueRef = CFBridgingRelease(CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey)); + dest = [FastAddressBook normalizeSipURI:(NSString*) valueRef]; CFRelease(lDict); CFRelease(lMap); } else if(contactSections[[indexPath section]] == ContactSections_Email) { ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonEmailProperty); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFStringRef valueRef = ABMultiValueCopyValueAtIndex(lMap, index); + NSString* valueRef = CFBridgingRelease(ABMultiValueCopyValueAtIndex(lMap, index)); if(valueRef != NULL) { - dest = [FastAddressBook normalizeSipURI:(NSString*) CFBridgingRelease(valueRef)]; + dest = [FastAddressBook normalizeSipURI:(NSString*)(valueRef)]; } CFRelease(lMap); } @@ -631,14 +632,14 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe if( property != kABInvalidPropertyType ){ ABMultiValueRef lMap = ABRecordCopyValue(contact, property); NSInteger index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]); - CFTypeRef labelRef = ABMultiValueCopyLabelAtIndex(lMap, index); + NSString* labelRef = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(lMap, index)); if(labelRef != NULL) { - key = (NSString*) CFBridgingRelease(labelRef); + key = (NSString*)(labelRef); } CFRelease(lMap); } if(key != nil) { - editingIndexPath = [indexPath copy]; + editingIndexPath = indexPath; ContactDetailsLabelViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[ContactDetailsLabelViewController compositeViewDescription] push:TRUE], ContactDetailsLabelViewController); if(controller != nil) { [controller setDataList:[self getLocalizedLabels]]; diff --git a/Classes/ContactDetailsViewController.h b/Classes/ContactDetailsViewController.h index b59c79433..f974b3626 100644 --- a/Classes/ContactDetailsViewController.h +++ b/Classes/ContactDetailsViewController.h @@ -29,7 +29,7 @@ BOOL inhibUpdate; } -@property (nonatomic, assign) ABRecordRef contact; +@property (nonatomic, assign, setter=setContact:) ABRecordRef contact; @property (nonatomic, strong) IBOutlet ContactDetailsTableViewController *tableController; @property (nonatomic, strong) IBOutlet UIToggleButton *editButton; @property (nonatomic, strong) IBOutlet UIButton *backButton; @@ -43,5 +43,5 @@ - (void)newContact:(NSString*)address; - (void)editContact:(ABRecordRef)contact; - (void)editContact:(ABRecordRef)contact address:(NSString*)address; - +- (void)setContact:(ABRecordRef)contact; @end diff --git a/Classes/ContactsTableViewController.m b/Classes/ContactsTableViewController.m index 4ef8e7dc7..f13b1dbdd 100644 --- a/Classes/ContactsTableViewController.m +++ b/Classes/ContactsTableViewController.m @@ -133,7 +133,7 @@ static int ms_strcmpfuz(const char * fuzzy_word, const char * sentence) { NSArray *lContacts = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); for (id lPerson in lContacts) { BOOL add = true; - ABRecordRef person = (ABRecordRef)CFBridgingRetain(lPerson); + ABRecordRef person = (__bridge ABRecordRef)lPerson; // Do not add the contact directly if we set some filter if([ContactSelection getSipFilter] || [ContactSelection emailFilterEnabled]) { @@ -152,19 +152,20 @@ static int ms_strcmpfuz(const char * fuzzy_word, const char * sentence) { if(add) { NSString* lFirstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); - NSString* lLocalizedFirstName = (lFirstName != nil)? CFBridgingRelease(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef)(lFirstName))): nil; + NSString* lLocalizedFirstName = [FastAddressBook localizedLabel:lFirstName]; NSString* lLastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); - NSString* lLocalizedLastName = (lLastName != nil)? CFBridgingRelease(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef)(lLastName))): nil; + NSString* lLocalizedLastName = [FastAddressBook localizedLabel:lLastName]; NSString* lOrganization = CFBridgingRelease(ABRecordCopyValue(person, kABPersonOrganizationProperty)); - NSString* lLocalizedlOrganization = (lOrganization != nil)? CFBridgingRelease(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef)lOrganization)): nil; + NSString* lLocalizedlOrganization = [FastAddressBook localizedLabel:lOrganization]; + NSString *name = nil; - if(lLocalizedFirstName != nil && lLocalizedLastName != nil) { + if(lLocalizedFirstName.length && lLocalizedLastName.length ) { name=[NSString stringWithFormat:@"%@ %@", lLocalizedFirstName, lLocalizedLastName]; - } else if(lLocalizedLastName != nil) { + } else if(lLocalizedLastName.length) { name=[NSString stringWithFormat:@"%@",lLocalizedLastName]; - } else if(lLocalizedFirstName != nil) { + } else if(lLocalizedFirstName.length) { name=[NSString stringWithFormat:@"%@",lLocalizedFirstName]; - } else if(lLocalizedlOrganization != nil) { + } else if(lLocalizedlOrganization.length) { name=[NSString stringWithFormat:@"%@",lLocalizedlOrganization]; } diff --git a/Classes/LinphoneUI/UIContactCell.m b/Classes/LinphoneUI/UIContactCell.m index 1826da270..df4c1d6d9 100644 --- a/Classes/LinphoneUI/UIContactCell.m +++ b/Classes/LinphoneUI/UIContactCell.m @@ -73,35 +73,21 @@ return; } - CFStringRef lFirstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty); - CFStringRef lLocalizedFirstName = (lFirstName != nil)?ABAddressBookCopyLocalizedLabel(lFirstName):nil; - CFStringRef lLastName = ABRecordCopyValue(contact, kABPersonLastNameProperty); - CFStringRef lLocalizedLastName = (lLastName != nil)?ABAddressBookCopyLocalizedLabel(lLastName):nil; - CFStringRef lOrganization = ABRecordCopyValue(contact, kABPersonOrganizationProperty); - CFStringRef lLocalizedOrganization = (lOrganization != nil)?ABAddressBookCopyLocalizedLabel(lOrganization):nil; + NSString* lFirstName = CFBridgingRelease(ABRecordCopyValue(contact, kABPersonFirstNameProperty)); + NSString* lLocalizedFirstName = [FastAddressBook localizedLabel:lFirstName]; - if(lLocalizedFirstName != nil){ - [firstNameLabel setText: (NSString *)CFBridgingRelease(lLocalizedFirstName)]; - } - else - [firstNameLabel setText: @""]; + NSString* lLastName = CFBridgingRelease(ABRecordCopyValue(contact, kABPersonLastNameProperty)); + NSString* lLocalizedLastName = [FastAddressBook localizedLabel:lLastName]; - if(lLocalizedLastName != nil){ - [lastNameLabel setText: (NSString *)CFBridgingRelease(lLocalizedLastName)]; - } - else - [lastNameLabel setText: @""]; + NSString* lOrganization = CFBridgingRelease(ABRecordCopyValue(contact, kABPersonOrganizationProperty)); + NSString* lLocalizedOrganization = [FastAddressBook localizedLabel:lOrganization]; - if(lLocalizedFirstName == nil && lLocalizedLastName == nil) { - [firstNameLabel setText: (NSString *)CFBridgingRelease(lLocalizedOrganization)]; - } + [firstNameLabel setText:(NSString *)(lLocalizedFirstName)]; + [lastNameLabel setText:(NSString *)(lLocalizedLastName)]; - if(lOrganization != nil) - CFRelease(lOrganization); - if(lLastName != nil) - CFRelease(lLastName); - if(lFirstName != nil) - CFRelease(lFirstName); + if(lLocalizedFirstName == nil && lLocalizedLastName == nil) { + [firstNameLabel setText:(NSString *)(lLocalizedOrganization)]; + } } - (void)layoutSubviews { diff --git a/Classes/LinphoneUI/UIContactDetailsHeader.m b/Classes/LinphoneUI/UIContactDetailsHeader.m index 07859fff1..a6f8a5b06 100644 --- a/Classes/LinphoneUI/UIContactDetailsHeader.m +++ b/Classes/LinphoneUI/UIContactDetailsHeader.m @@ -172,12 +172,6 @@ [contactDetailsDelegate onModification:nil]; } -+ (NSString*)localizeLabel:(NSString*)str { - CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel((__bridge CFStringRef) str); - NSString * retStr = (NSString*) CFBridgingRelease(lLocalizedLabel); - return retStr; -} - #pragma mark - UITableViewDataSource Functions - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { diff --git a/Classes/Utils/FastAddressBook.h b/Classes/Utils/FastAddressBook.h index 34723eecc..a33b25545 100644 --- a/Classes/Utils/FastAddressBook.h +++ b/Classes/Utils/FastAddressBook.h @@ -37,4 +37,9 @@ + (NSString*)normalizePhoneNumber:(NSString*)number; + (NSString*)normalizeSipURI:(NSString*)address; + +// TOOLS + ++(NSString*)localizedLabel:(NSString*)label; + @end diff --git a/Classes/Utils/FastAddressBook.m b/Classes/Utils/FastAddressBook.m index c1455cfd9..b3804d4af 100644 --- a/Classes/Utils/FastAddressBook.m +++ b/Classes/Utils/FastAddressBook.m @@ -246,4 +246,14 @@ void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, void CFRelease(addressBook); } +#pragma mark - Tools + ++(NSString *)localizedLabel:(NSString *)label { + if( label != nil ){ + return CFBridgingRelease(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef)(label))); + } + return @""; +} + + @end