/* NSObject+CardDAV.m - this file is part of SOGo * * Copyright (C) 2007-2009 Inverse inc. * * Author: Ludovic Marcotte * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #import #import #import #import #import #import #import #import #import #import #import #import "SOGoContactFolder.h" #import "SOGoContactGCSEntry.h" @implementation SOGoFolder (CardDAV) - (void) _appendComponentsMatchingFilters: (NSArray *) filters toResponse: (WOResponse *) response context: (id) localContext { unsigned int count, max; NSDictionary *currentFilter, *contact; NSEnumerator *contacts; NSString *baseURL; baseURL = [self baseURLInContext: localContext]; max = [filters count]; for (count = 0; count < max; count++) { currentFilter = [filters objectAtIndex: count]; contacts = [[(id)self lookupContactsWithFilter: [[currentFilter allValues] lastObject] sortBy: @"c_givenname" ordering: NSOrderedDescending] objectEnumerator]; while ((contact = [contacts nextObject])) [(id)self appendObject: contact withBaseURL: baseURL toREPORTResponse: response]; } } - (BOOL) _isValidFilter: (NSString *) theString { NSString *newString; newString = [theString lowercaseString]; return ([theString isEqualToString: @"sn"] || [theString isEqualToString: @"givenname"] || [theString isEqualToString: @"mail"] || [theString isEqualToString: @"telephonenumber"]); } - (NSDictionary *) _parseContactFilter: (id ) filterElement { NSMutableDictionary *filterData; id parentNode; id ranges; filterData = nil; parentNode = [filterElement parentNode]; if ([[(id)parentNode tagName] isEqualToString: @"filter"] && [self _isValidFilter: [filterElement attribute: @"name"]]) { ranges = [filterElement getElementsByTagName: @"text-match"]; if ([(NSArray *) ranges count] && [(NSArray *) [[ranges objectAtIndex: 0] childNodes] count]) { filterData = [NSMutableDictionary dictionary]; [filterData setObject: [[(NSArray *)[[ranges objectAtIndex: 0] childNodes] lastObject] data] forKey: [filterElement attribute: @"name"]]; } } return filterData; } - (NSArray *) _parseContactFilters: (id ) parentNode { NSEnumerator *children; id node; NSMutableArray *filters; NSDictionary *filter; filters = [NSMutableArray array]; children = [(NSArray *)[parentNode getElementsByTagName: @"prop-filter"] objectEnumerator]; while ((node = [children nextObject])) { filter = [self _parseContactFilter: node]; if (filter) [filters addObject: filter]; } return filters; } - (id) davAddressbookQuery: (id) queryContext { WOResponse *r; NSArray *filters; id document; r = [queryContext response]; [r prepareDAVResponse]; [r appendContentString: @""]; document = [[queryContext request] contentAsDOMDocument]; filters = [self _parseContactFilters: [document documentElement]]; [self _appendComponentsMatchingFilters: filters toResponse: r context: queryContext]; [r appendContentString:@""]; return r; } @end