1 /* UIxContactFoldersView.m - this file is part of SOGo
3 * Copyright (C) 2006 Inverse groupe conseil
5 * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
7 * This file is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * This file is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
23 #import <Foundation/NSString.h>
25 #import <NGObjWeb/NSException+HTTP.h>
26 #import <NGObjWeb/SoObject.h>
27 #import <NGObjWeb/WOResponse.h>
29 #import <SoObjects/SOGo/SOGoUser.h>
30 #import <SoObjects/SOGo/NSString+Utilities.h>
31 #import <SoObjects/Contacts/SOGoContactFolders.h>
32 #import <SoObjects/Contacts/SOGoContactFolder.h>
33 #import <SoObjects/Contacts/SOGoContactGCSFolder.h>
37 #import "UIxContactFoldersView.h"
39 @implementation UIxContactFoldersView
41 - (id) _selectActionForApplication: (NSString *) actionName
43 SOGoContactFolders *folders;
44 NSString *url, *action;
47 folders = [self clientObject];
48 action = [NSString stringWithFormat: @"../%@/%@",
49 [folders defaultSourceName],
52 request = [[self context] request];
54 url = [[request uri] composeURLWithAction: action
55 parameters: [self queryParameters]
58 return [self redirectToLocation: url];
63 return [self _selectActionForApplication: @"view"];
68 return [self _selectActionForApplication: @"new"];
71 - (id) selectForSchedulerAction
73 return [self _selectActionForApplication: @"scheduler-contacts"];
76 - (id) selectForMailerAction
78 return [self _selectActionForApplication: @"mailer-contacts"];
81 - (id) selectForCalendarsAction
83 return [self _selectActionForApplication: @"calendars-contacts"];
86 - (id) selectForAddressBooksAction
88 return [self _selectActionForApplication: @"addressbooks-contacts"];
91 - (id) selectForAclsAction
93 return [self _selectActionForApplication: @"acls-contacts"];
96 - (NSArray *) _searchResults: (NSString *) contact
98 NSMutableArray *results;
99 SOGoContactFolders *topFolder;
100 NSEnumerator *sogoContactFolders;
101 id <SOGoContactFolder> currentFolder;
103 results = [NSMutableArray new];
104 [results autorelease];
106 topFolder = [self clientObject];
107 sogoContactFolders = [[topFolder contactFolders] objectEnumerator];
108 currentFolder = [sogoContactFolders nextObject];
109 while (currentFolder)
111 [results addObjectsFromArray: [currentFolder
112 lookupContactsWithFilter: contact
114 ordering: NSOrderedAscending]];
115 currentFolder = [sogoContactFolders nextObject];
122 - (NSString *) _emailForResult: (NSDictionary *) result
124 NSMutableString *email;
125 NSString *name, *mail;
127 email = [NSMutableString string];
128 name = [result objectForKey: @"displayName"];
130 name = [result objectForKey: @"cn"];
131 mail = [result objectForKey: @"mail"];
133 [email appendFormat: @"%@ <%@>", name, mail];
135 [email appendString: mail];
140 - (NSDictionary *) _nextResultWithUid: (NSEnumerator *) results
142 NSDictionary *result, *possibleResult;
145 possibleResult = [results nextObject];
146 while (possibleResult && !result)
147 if ([[possibleResult objectForKey: @"c_uid"] length])
148 result = possibleResult;
150 possibleResult = [results nextObject];
155 - (WOResponse *) _responseForResults: (NSArray *) results
157 WOResponse *response;
158 NSString *email, *responseString;
159 NSDictionary *result;
161 response = [context response];
165 result = [self _nextResultWithUid: [results objectEnumerator]];
167 result = [results objectAtIndex: 0];
168 email = [self _emailForResult: result];
169 responseString = [NSString stringWithFormat: @"%@:%@",
170 [result objectForKey: @"c_uid"],
172 [response setStatus: 200];
173 [response setHeader: @"text/plain; charset=iso-8859-1"
174 forKey: @"Content-Type"];
175 [response appendContentString: responseString];
178 [response setStatus: 404];
183 - (id <WOActionResults>) contactSearchAction
186 id <WOActionResults> result;
188 contact = [self queryParameterForKey: @"search"];
189 if ([contact length])
190 result = [self _responseForResults: [self _searchResults: contact]];
192 result = [NSException exceptionWithHTTPStatus: 400
193 reason: @"missing 'search' parameter"];
198 - (id <WOActionResults>) updateAdditionalAddressBooksAction
200 WOResponse *response;
203 ud = [[context activeUser] userDefaults];
204 [ud setObject: [self queryParameterForKey: @"ids"]
205 forKey: @"additionaladdressbooks"];
207 response = [context response];
208 [response setStatus: 200];
209 [response setHeader: @"text/html; charset=\"utf-8\"" forKey: @"content-type"];
214 - (SOGoContactGCSFolder *) contactFolderForUID: (NSString *) uid
216 SOGoFolder *upperContainer;
217 SOGoUserFolder *userFolder;
218 SOGoContactFolders *contactFolders;
219 SOGoContactGCSFolder *contactFolder;
220 SoSecurityManager *securityManager;
222 upperContainer = [[[self clientObject] container] container];
223 userFolder = [SOGoUserFolder objectWithName: uid
224 inContainer: upperContainer];
225 contactFolders = [SOGoContactFolders objectWithName: @"Contacts"
226 inContainer: userFolder];
227 contactFolder = [SOGoContactGCSFolder objectWithName: @"personal"
228 inContainer: contactFolders];
230 setOCSPath: [NSString stringWithFormat: @"/Users/%@/Contacts/personal", uid]];
231 [contactFolder setOwner: uid];
233 securityManager = [SoSecurityManager sharedSecurityManager];
235 return (([securityManager validatePermission: SoPerm_AccessContentsInformation
236 onObject: contactFolder
237 inContext: context] == nil)
238 ? contactFolder : nil);
241 - (id <WOActionResults>) checkRightsAction
243 WOResponse *response;
246 NSMutableString *rights;
248 unsigned int count, max;
251 ud = [[context activeUser] userDefaults];
252 uids = [ud objectForKey: @"additionaladdressbooks"];
254 response = [context response];
255 [response setStatus: 200];
256 [response setHeader: @"text/plain; charset=\"utf-8\""
257 forKey: @"content-type"];
258 rights = [NSMutableString string];
259 if ([uids length] > 0)
261 ids = [uids componentsSeparatedByString: @","];
263 for (count = 0; count < max; count++)
265 result = ([self contactFolderForUID: [ids objectAtIndex: count]] != nil);
267 [rights appendFormat: @"%d", result];
269 [rights appendFormat: @",%d", result];
272 [response appendContentString: rights];