]> 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 7b53fd061840140723565e508d21610ff7d31564..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 <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;
@@ -50,101 +39,64 @@ static NSString *fieldNames[] = {
   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;
 }