02111-1307, USA.
*/
-#include <GDLContentStore/GCSFieldExtractor.h>
+#import <Foundation/NSArray.h>
+#import <Foundation/NSDictionary.h>
+#import <NGExtensions/NSObject+Logs.h>
+
+#import <GDLContentStore/GCSFieldExtractor.h>
+#import <NGCards/NGVCard.h>
@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;
}