ABAddressBook -- Search Exchange AddressBook Source?
Asked Answered
C

0

1

I'm trying to create an app with a custom interface for searching through one's addressbook. Searching the local addressbook seems easy, but I cannot figure out how to search for a person/record in an Exchange addressbook source (i.e. ABSourceType == kABSourceTypeExchangeGAL). I'm using the following code to find the Exchange addressbook source and query it, but I only ever get back an empty array. I understand asking for the entire list of people in an Exchange addressbook cannot possibly return all entries, but I would expect some subset of that list when I query it. Again, instead I get an empty array.

How do you search for contacts in an Exchange addressbook source?

#define CFNIL(x) if(x){CFRelease(x); x=nil;}
    //code

    ABAddressBookRef _addressbook = ABAddressBookCreate();
    CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(_addressbook);
    ABRecordRef exchangeSource;

    for(CFIndex i =0; i<CFArrayGetCount(allSources); i++)
    {
        ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);

        NSNumber *sourceTypeNumber = (NSNumber*)((CFNumberRef)ABRecordCopyValue(source, kABSourceType));
        NSString *sourceTypeName = (NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));

        int sourceType = [sourceTypeNumber intValue];
        if (sourceType == kABSourceTypeExchangeGAL) 
        {
            exchangeSource = source;
        }
        [sourceTypeNumber release];
        [sourceTypeName release];
    }

    if(exchangeSource)
    {
        /*
         This finds matches in the local device addressbook
        NSArray *people = (NSArray *)ABAddressBookCopyPeopleWithName(_addressbook, CFSTR("joe"));
        for(int i=0;i<[people count]; i++)
        {
            ABRecordRef person = (ABRecordRef)[people objectAtIndex:i];
            ABMultiValueRef emails = (ABMultiValueRef)ABRecordCopyValue(person, kABPersonEmailProperty);
            NSLog(@"emails: %@",emails);
            [((NSArray*)emails) release];
        }
        [people release];
         */

        //this array is always empty
        CFArrayRef search = ABAddressBookCopyArrayOfAllPeopleInSource (_addressbook,exchangeSource);
        NSLog(@"%@", search);
        CFNIL(search);
    }
    CFNIL(exchangeSource);
    CFNIL(_addressbook);
Crystacrystal answered 11/7, 2012 at 4:31 Comment(1)
Hey, did you ever find the solution to this? After a lot of searching I got about as far as you did and then get an empty array. It would make sense if there was a way to search it, since the type includes the bit "kABSourceTypeSearchableMask"Shumpert

© 2022 - 2024 — McMap. All rights reserved.