X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=OGoContentStore%2FOCSContactFieldExtractor.m;h=b52b567e88f1f5469f033b7eab285fcc8788a538;hb=cf399b96ff4042cc9da1547d056f993fa1e7041c;hp=863b15f032af41c4ef5c63f6517f1462c143de22;hpb=7aab1e5fa5349a6cd088d6ad8da7d1d1873e453d;p=scalable-opengroupware.org diff --git a/OGoContentStore/OCSContactFieldExtractor.m b/OGoContentStore/OCSContactFieldExtractor.m index 863b15f0..b52b567e 100644 --- a/OGoContentStore/OCSContactFieldExtractor.m +++ b/OGoContentStore/OCSContactFieldExtractor.m @@ -19,58 +19,84 @@ 02111-1307, USA. */ -#include +#import +#import +#import + +#import +#import @interface OCSContactFieldExtractor : GCSFieldExtractor @end -#include "common.h" - @implementation OCSContactFieldExtractor -- (NSMutableDictionary *)extractQuickFieldsFromContent:(NSString *)_content { - static NSString *fieldNames[] = { - @"givenName", - @"cn", - @"sn", - @"l", - @"mail", - @"o", - @"ou", - @"telephoneNumber", - nil - }; +- (NSMutableDictionary *) extractQuickFieldsFromVCard: (NGVCard *) vCard +{ NSMutableDictionary *fields; - NSDictionary *plist; - unsigned i; - - if ([_content length] == 0) - return nil; - - // TODO: we want to support vcard storage in the future?! - - if ((plist = [_content propertyList]) == nil) { - [self logWithFormat:@"ERROR: could not parse property list content!"]; - return nil; - } - - fields = [NSMutableDictionary dictionaryWithCapacity:16]; - - /* copy field values to quick record */ - for (i = 0; fieldNames[i] != nil; i++) { - NSString *fieldName, *sqlName; - id value; - - fieldName = fieldNames[i]; - sqlName = [fieldName lowercaseString]; /* actually pgsql doesn't care */ - - value = [plist objectForKey:fieldName]; - if ([value isNotNull]) - [fields setObject:value forKey:sqlName]; - else - [fields setObject:[NSNull null] forKey:sqlName]; - } - + NSArray *values; + CardElement *adr; + NSString *value; + unsigned int max; + + fields = [NSMutableDictionary dictionaryWithCapacity: 16]; + + value = [vCard fn]; + if (value) + [fields setObject: value forKey: @"c_cn"]; + values = [vCard n]; + if (values) + { + max = [values count]; + if (max > 0) + { + [fields setObject: [values objectAtIndex: 0] forKey: @"c_sn"]; + if (max > 1) + [fields setObject: [values objectAtIndex: 1] + forKey: @"c_givenName"]; + } + } + value = [vCard preferredTel]; + if (value) + [fields setObject: value forKey: @"c_telephoneNumber"]; + value = [vCard preferredEMail]; + if (value) + [fields setObject: value forKey: @"c_mail"]; + values = [vCard org]; + max = [values count]; + if (max > 0) + { + [fields setObject: [values objectAtIndex: 0] forKey: @"c_o"]; + if (max > 1) + [fields setObject: [values objectAtIndex: 1] forKey: @"c_ou"]; + } + adr = [vCard preferredAdr]; + if (adr) + [fields setObject: [adr value: 3] forKey: @"c_l"]; + value = [[vCard uniqueChildWithTag: @"X-AIM"] value: 0]; + [fields setObject: value forKey: @"c_screenname"]; + + return fields; +} + +- (NSMutableDictionary *) extractQuickFieldsFromContent: (NSString *) content +{ + NSMutableDictionary *fields; + NGVCard *vCard; + + fields = nil; + if ([content length] > 0 + && [[content uppercaseString] hasPrefix: @"BEGIN:VCARD"]) + { + vCard = [NGVCard parseSingleFromSource: content]; + if (vCard) + fields = [self extractQuickFieldsFromVCard: vCard]; + else + [self errorWithFormat: @"Could not parse content as a vCard."]; + } + else + [self errorWithFormat: @"Content is not a vCard"]; + return fields; }