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 <NGCards/NGVCard.h>
-#include "common.h"
-
@implementation OCSContactFieldExtractor
-static NSString *fieldNames[] = {
- /* quickfield, vCard KVC path */
- @"givenName", @"n.given",
- @"cn", @"fn.stringValue",
- @"sn", @"n.family",
- @"l", @"preferredAdr.locality",
- @"mail", @"preferredEMail.stringValue",
- @"o", @"org.orgnam",
- @"ou", @"org.orgunit",
- @"telephoneNumber", @"preferredTel.stringValue",
- nil, nil
-};
-
-- (NSMutableDictionary *) extractQuickFieldsFromVCard: (NGVCard *) _vCard
+- (NSMutableDictionary *) extractQuickFieldsFromVCard: (NGVCard *) vCard
{
NSMutableDictionary *fields;
NSArray *values;
NSString *value;
unsigned int max;
- if (_vCard == nil)
- return nil;
+ fields = [NSMutableDictionary dictionaryWithCapacity: 16];
- fields = [NSMutableDictionary dictionaryWithCapacity:16];
-
- value = [_vCard fn];
+ value = [vCard fn];
if (value)
- [fields setObject: value forKey: @"cn"];
- values = [_vCard n];
+ [fields setObject: value forKey: @"c_cn"];
+ values = [vCard n];
if (values)
{
max = [values count];
if (max > 0)
{
- [fields setObject: [values objectAtIndex: 0] forKey: @"sn"];
+ [fields setObject: [values objectAtIndex: 0] forKey: @"c_sn"];
if (max > 1)
[fields setObject: [values objectAtIndex: 1]
- forKey: @"givenName"];
+ forKey: @"c_givenName"];
}
}
- value = [_vCard preferredTel];
+ value = [vCard preferredTel];
if (value)
- [fields setObject: value forKey: @"telephoneNumber"];
- value = [_vCard preferredEMail];
+ [fields setObject: value forKey: @"c_telephoneNumber"];
+ value = [vCard preferredEMail];
if (value)
- [fields setObject: value forKey: @"mail"];
- values = [_vCard org];
- if (values)
+ [fields setObject: value forKey: @"c_mail"];
+ values = [vCard org];
+ max = [values count];
+ if (max > 0)
{
- max = [values count];
- if (max > 0)
- {
- [fields setObject: [values objectAtIndex: 0] forKey: @"o"];
- if (max > 1)
- [fields setObject: [values objectAtIndex: 1] forKey: @"ou"];
- }
+ [fields setObject: [values objectAtIndex: 0] forKey: @"c_o"];
+ if (max > 1)
+ [fields setObject: [values objectAtIndex: 1] forKey: @"c_ou"];
}
- adr = [_vCard preferredAdr];
+ adr = [vCard preferredAdr];
if (adr)
- [fields setObject: [adr value: 3] forKey: @"l"];
+ [fields setObject: [adr value: 3] forKey: @"c_l"];
+ value = [[vCard uniqueChildWithTag: @"X-AIM"] value: 0];
+ [fields setObject: value forKey: @"c_screenname"];
return fields;
}
-- (NSMutableDictionary *)extractQuickFieldsFromVCardString:(NSString *)_str {
+- (NSMutableDictionary *) extractQuickFieldsFromContent: (NSString *) content
+{
+ NSMutableDictionary *fields;
NGVCard *vCard;
-
- if ((vCard = [NGVCard parseSingleFromSource: _str]) == nil) {
- [self errorWithFormat:@"Could not parse content as a vCard."];
- return nil;
- }
-
- return [self extractQuickFieldsFromVCard: vCard];
-}
-- (NSMutableDictionary *)extractQuickFieldsFromContent:(NSString *)_content {
- NSMutableDictionary *fields;
- NSDictionary *plist;
- unsigned i;
-
- if ([_content length] == 0)
- return nil;
-
- if ([_content hasPrefix:@"BEGIN:VCARD"])
- return [self extractQuickFieldsFromVCardString:_content];
-
- // 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;
- }
-
- if (![plist isKindOfClass:[NSDictionary class]]) {
- [self logWithFormat:@"ERROR: parsed property list is not a dictionary!"];
- return nil;
- }
-
- fields = [NSMutableDictionary dictionaryWithCapacity:16];
-
- /* copy field values to quick record */
- for (i = 0; fieldNames[i] != nil; i += 2) {
- 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];
- }
-
+ 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;
}