]> err.no Git - scalable-opengroupware.org/blobdiff - OGoContentStore/OCSContactFieldExtractor.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1235 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / OGoContentStore / OCSContactFieldExtractor.m
index 863b15f032af41c4ef5c63f6517f1462c143de22..b52b567e88f1f5469f033b7eab285fcc8788a538 100644 (file)
   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;
 }