02111-1307, USA.
*/
+#import <Foundation/NSArray.h>
+#import <Foundation/NSString.h>
+#import <NGObjWeb/NSException+HTTP.h>
+#import <NGObjWeb/SoObject+SoDAV.h>
+#import <NGObjWeb/WOContext.h>
+#import <NGObjWeb/WORequest.h>
+#import <NGExtensions/NSObject+Logs.h>
+#import <EOControl/EOQualifier.h>
+#import <EOControl/EOSortOrdering.h>
#import <GDLContentStore/GCSFolder.h>
-#import "common.h"
-
+#import <SoObjects/SOGo/NSDictionary+Utilities.h>
#import "SOGoContactGCSEntry.h"
#import "SOGoContactGCSFolder.h"
-#define folderListingFields [NSArray arrayWithObjects: @"c_name", @"cn", \
- @"givenname", @"screenname", \
- @"o", @"mail", @"telephonenumber", \
+#define folderListingFields [NSArray arrayWithObjects: @"c_name", @"c_cn", \
+ @"c_givenname", @"c_sn", @"c_screenname", \
+ @"c_o", @"c_mail", @"c_telephonenumber", \
nil]
@implementation SOGoContactGCSFolder
if (filter && [filter length] > 0)
{
qs = [NSString stringWithFormat:
- @"(sn isCaseInsensitiveLike: '%@%%') OR "
- @"(givenname isCaseInsensitiveLike: '%@%%') OR "
- @"(mail isCaseInsensitiveLike: '%@%%') OR "
- @"(telephonenumber isCaseInsensitiveLike: '%%%@%%')",
+ @"(c_sn isCaseInsensitiveLike: '%@%%') OR "
+ @"(c_givenname isCaseInsensitiveLike: '%@%%') OR "
+ @"(c_mail isCaseInsensitiveLike: '%@%%') OR "
+ @"(c_telephonenumber isCaseInsensitiveLike: '%%%@%%')",
filter, filter, filter, filter];
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
}
return qualifier;
}
+- (NSArray *) _flattenedRecords: (NSArray *) records
+{
+ NSMutableArray *newRecords;
+ NSEnumerator *oldRecords;
+ NSDictionary *oldRecord;
+ NSMutableDictionary *newRecord;
+ NSString *data;
+
+ newRecords = [NSMutableArray arrayWithCapacity: [records count]];
+
+ oldRecords = [records objectEnumerator];
+ oldRecord = [oldRecords nextObject];
+ while (oldRecord)
+ {
+ newRecord = [NSMutableDictionary new];
+ [newRecord autorelease];
+
+ [newRecord setObject: [oldRecord objectForKey: @"c_name"]
+ forKey: @"c_uid"];
+ [newRecord setObject: [oldRecord objectForKey: @"c_name"]
+ forKey: @"c_name"];
+
+ data = [oldRecord objectForKey: @"c_cn"];
+ if (![data length])
+ data = [oldRecord keysWithFormat: @"%{c_givenname} %{c_sn}"];
+ [newRecord setObject: data
+ forKey: @"displayName"];
+
+ data = [oldRecord objectForKey: @"c_mail"];
+ if (!data)
+ data = @"";
+ [newRecord setObject: data forKey: @"mail"];
+
+ data = [oldRecord objectForKey: @"c_screenname"];
+ if (!data)
+ data = @"";
+ [newRecord setObject: data forKey: @"screenName"];
+
+ data = [oldRecord objectForKey: @"c_o"];
+ if (!data)
+ data = @"";
+ [newRecord setObject: data forKey: @"org"];
+
+ data = [oldRecord objectForKey: @"c_telephonenumber"];
+ if (![data length])
+ data = @"";
+ [newRecord setObject: data forKey: @"phone"];
+
+ [newRecords addObject: newRecord];
+ oldRecord = [oldRecords nextObject];
+ }
+
+ return newRecords;
+}
+
- (NSArray *) lookupContactsWithFilter: (NSString *) filter
sortBy: (NSString *) sortKey
ordering: (NSComparisonResult) sortOrdering
{
- NSArray *fields, *records;
+ NSArray *fields, *dbRecords, *records;
EOQualifier *qualifier;
EOSortOrdering *ordering;
fields = folderListingFields;
qualifier = [self _qualifierForFilter: filter];
- records = [[self ocsFolder] fetchFields: fields
- matchingQualifier: qualifier];
- if ([records count] > 1)
+ dbRecords = [[self ocsFolder] fetchFields: fields
+ matchingQualifier: qualifier];
+ if ([dbRecords count] > 0)
{
+ records = [self _flattenedRecords: dbRecords];
ordering
= [EOSortOrdering sortOrderingWithKey: sortKey
selector: ((sortOrdering == NSOrderedDescending)
[NSArray arrayWithObject: ordering]];
}
else
- [self errorWithFormat:@"(%s): fetch failed!", __PRETTY_FUNCTION__];
+ records = nil;
+// else
+// [self errorWithFormat:@"(%s): fetch failed!", __PRETTY_FUNCTION__];
//[self debugWithFormat:@"fetched %i records.", [records count]];
return records;
}
+- (NSArray *) davNamespaces
+{
+ return [NSArray arrayWithObject: @"urn:ietf:params:xml:ns:carddav"];
+}
+
+- (NSArray *) davComplianceClassesInContext: (id)_ctx
+{
+ NSMutableArray *classes;
+ NSArray *primaryClasses;
+
+ classes = [NSMutableArray new];
+ [classes autorelease];
+
+ primaryClasses = [super davComplianceClassesInContext: _ctx];
+ if (primaryClasses)
+ [classes addObjectsFromArray: primaryClasses];
+ [classes addObject: @"access-control"];
+ [classes addObject: @"addressbook-access"];
+
+ return classes;
+}
+
- (NSString *) groupDavResourceType
{
return @"vcard-collection";