1 /* SOGoCalendarComponent.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 <NGCards/iCalCalendar.h>
26 #import <NGCards/iCalPerson.h>
27 #import <NGCards/iCalRepeatableEntityObject.h>
28 #import <NGMime/NGMime.h>
29 #import <NGMail/NGMail.h>
30 #import <NGMail/NGSendMail.h>
32 #import <SOGo/AgenorUserManager.h>
33 #import <SOGo/SOGoPermissions.h>
37 #import "SOGoAptMailNotification.h"
38 #import "SOGoCalendarComponent.h"
40 static NSString *mailTemplateDefaultLanguage = nil;
41 static BOOL sendEMailNotifications = NO;
43 @implementation SOGoCalendarComponent
48 static BOOL didInit = NO;
54 ud = [NSUserDefaults standardUserDefaults];
55 mailTemplateDefaultLanguage = [[ud stringForKey:@"SOGoDefaultLanguage"]
57 if (!mailTemplateDefaultLanguage)
58 mailTemplateDefaultLanguage = @"French";
60 sendEMailNotifications
61 = [ud boolForKey: @"SOGoAppointmentSendEMailNotifications"];
67 if ((self = [super init]))
82 - (NSString *) davContentType
84 return @"text/calendar";
87 - (NSString *) componentTag
89 [self subclassResponsibility: _cmd];
94 - (iCalCalendar *) calendar
100 iCalString = [self contentAsString];
103 calendar = [iCalCalendar parseSingleFromSource: iCalString];
111 - (iCalRepeatableEntityObject *) component
113 return (iCalRepeatableEntityObject *)
115 firstChildWithTag: [self componentTag]];
120 - (NSException *) primarySaveContentString: (NSString *) _iCalString
122 return [super saveContentString: _iCalString];
125 - (NSException *) primaryDelete
127 return [super delete];
130 - (NSException *) deleteWithBaseSequence: (int) a
132 [self subclassResponsibility: _cmd];
137 - (NSException *) delete
139 return [self deleteWithBaseSequence:0];
142 /* EMail Notifications */
143 - (NSString *) homePageURLForPerson: (iCalPerson *) _person
148 NSArray *traversalObjects;
150 /* generate URL from traversal stack */
151 ctx = [[WOApplication application] context];
152 traversalObjects = [ctx objectTraversalStack];
153 if ([traversalObjects count] > 0)
154 baseURL = [[traversalObjects objectAtIndex:0] baseURLInContext:ctx];
157 baseURL = @"http://localhost/";
158 [self warnWithFormat:@"Unable to create baseURL from context!"];
160 uid = [[AgenorUserManager sharedUserManager]
161 getUIDForEmail: [_person rfc822Email]];
164 ? [NSString stringWithFormat:@"%@%@", baseURL, uid]
168 - (BOOL) sendEMailNotifications
170 return sendEMailNotifications;
173 - (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
174 forOldObject: (iCalRepeatableEntityObject *) _oldObject
175 andNewObject: (iCalRepeatableEntityObject *) _newObject
176 toAttendees: (NSArray *) _attendees
179 iCalPerson *organizer;
180 NSString *cn, *sender, *iCalString;
181 NGSendMail *sendmail;
184 iCalPerson *attendee;
186 SOGoAptMailNotification *p;
187 NSString *subject, *text, *header;
188 NGMutableHashMap *headerMap;
190 NGMimeBodyPart *bodyPart;
191 NGMimeMultipartBody *body;
193 if ([_attendees count])
197 organizer = [_newObject organizer];
198 cn = [organizer cnWithoutQuotes];
200 sender = [NSString stringWithFormat:@"%@ <%@>",
202 [organizer rfc822Email]];
204 sender = [organizer rfc822Email];
206 /* generate iCalString once */
207 iCalString = [[_newObject parent] versitString];
209 /* get sendmail object */
210 sendmail = [NGSendMail sharedSendMail];
212 /* get WOApplication instance */
213 app = [WOApplication application];
215 /* generate dynamic message content */
217 count = [_attendees count];
218 for (i = 0; i < count; i++)
220 attendee = [_attendees objectAtIndex:i];
222 /* construct recipient */
225 recipient = [NSString stringWithFormat: @"%@ <%@>",
227 [attendee rfc822Email]];
229 recipient = [attendee rfc822Email];
231 /* create page name */
232 // TODO: select user's default language?
233 pageName = [NSString stringWithFormat: @"SOGoAptMail%@%@",
234 mailTemplateDefaultLanguage,
236 /* construct message content */
237 p = [app pageWithName: pageName inContext: [WOContext context]];
238 [p setNewApt: _newObject];
239 [p setOldApt: _oldObject];
240 [p setHomePageURL: [self homePageURLForPerson: attendee]];
241 [p setViewTZ: [self userTimeZone: cn]];
242 subject = [p getSubject];
245 /* construct message */
246 headerMap = [NGMutableHashMap hashMapWithCapacity: 5];
248 /* NOTE: multipart/alternative seems like the correct choice but
249 * unfortunately Thunderbird doesn't offer the rich content alternative
250 * at all. Mail.app shows the rich content alternative _only_
251 * so we'll stick with multipart/mixed for the time being.
253 [headerMap setObject: @"multipart/mixed" forKey: @"content-type"];
254 [headerMap setObject: sender forKey: @"From"];
255 [headerMap setObject: recipient forKey: @"To"];
256 [headerMap setObject: [NSCalendarDate date] forKey: @"date"];
257 [headerMap setObject: subject forKey: @"Subject"];
258 msg = [NGMimeMessage messageWithHeader: headerMap];
261 body = [[NGMimeMultipartBody alloc] initWithPart: msg];
264 headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
265 [headerMap setObject: @"text/plain; charset=utf-8"
266 forKey: @"content-type"];
267 bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
268 [bodyPart setBody: [text dataUsingEncoding: NSUTF8StringEncoding]];
270 /* attach text part to multipart body */
271 [body addBodyPart: bodyPart];
274 header = [NSString stringWithFormat: @"text/calendar; method=%@;"
276 [(iCalCalendar *) [_newObject parent] method]];
277 headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
278 [headerMap setObject:header forKey: @"content-type"];
279 bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
280 [bodyPart setBody: [iCalString dataUsingEncoding: NSUTF8StringEncoding]];
282 /* attach calendar part to multipart body */
283 [body addBodyPart: bodyPart];
285 /* attach multipart body to message */
289 /* send the damn thing */
290 [sendmail sendMimePart: msg
291 toRecipients: [NSArray arrayWithObject: [attendee rfc822Email]]
292 sender: [organizer rfc822Email]];
297 - (NSString *) roleOfUser: (NSString *) login
298 inContext: (WOContext *) context
300 AgenorUserManager *um;
301 iCalRepeatableEntityObject *component;
302 NSString *role, *email;
304 um = [AgenorUserManager sharedUserManager];
305 email = [um getEmailForUID: login];
307 component = [self component];
308 if ([component isOrganizer: email])
309 role = SOGoRole_Organizer;
310 else if ([component isParticipant: email])
311 role = SOGoRole_Participant;
312 else if ([[[self container] ownerInContext: nil] isEqualToString: login])