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>
36 #import "SOGoAptMailNotification.h"
37 #import "SOGoCalendarComponent.h"
39 static NSString *mailTemplateDefaultLanguage = nil;
40 static BOOL sendEMailNotifications = NO;
42 @implementation SOGoCalendarComponent
47 static BOOL didInit = NO;
53 ud = [NSUserDefaults standardUserDefaults];
54 mailTemplateDefaultLanguage = [[ud stringForKey:@"SOGoDefaultLanguage"]
56 if (!mailTemplateDefaultLanguage)
57 mailTemplateDefaultLanguage = @"French";
59 sendEMailNotifications
60 = [ud boolForKey: @"SOGoAppointmentSendEMailNotifications"];
66 if ((self = [super init]))
81 - (NSString *) davContentType
83 return @"text/calendar";
86 - (iCalCalendar *) calendar
92 iCalString = [self contentAsString];
95 calendar = [iCalCalendar parseSingleFromSource: iCalString];
105 - (NSException *) primarySaveContentString: (NSString *) _iCalString
107 return [super saveContentString: _iCalString];
110 - (NSException *) primaryDelete
112 return [super delete];
115 - (NSException *) deleteWithBaseSequence: (int) a
117 [self subclassResponsibility: _cmd];
122 - (NSException *) delete
124 return [self deleteWithBaseSequence:0];
127 /* EMail Notifications */
128 - (NSString *) homePageURLForPerson: (iCalPerson *) _person
133 NSArray *traversalObjects;
135 /* generate URL from traversal stack */
136 ctx = [[WOApplication application] context];
137 traversalObjects = [ctx objectTraversalStack];
138 if ([traversalObjects count] > 0)
139 baseURL = [[traversalObjects objectAtIndex:0] baseURLInContext:ctx];
142 baseURL = @"http://localhost/";
143 [self warnWithFormat:@"Unable to create baseURL from context!"];
145 uid = [[AgenorUserManager sharedUserManager]
146 getUIDForEmail: [_person rfc822Email]];
149 ? [NSString stringWithFormat:@"%@%@", baseURL, uid]
153 - (BOOL) sendEMailNotifications
155 return sendEMailNotifications;
158 - (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
159 forOldObject: (iCalRepeatableEntityObject *) _oldObject
160 andNewObject: (iCalRepeatableEntityObject *) _newObject
161 toAttendees: (NSArray *) _attendees
164 iCalPerson *organizer;
165 NSString *cn, *sender, *iCalString;
166 NGSendMail *sendmail;
169 iCalPerson *attendee;
171 SOGoAptMailNotification *p;
172 NSString *subject, *text, *header;
173 NGMutableHashMap *headerMap;
175 NGMimeBodyPart *bodyPart;
176 NGMimeMultipartBody *body;
178 if ([_attendees count])
182 organizer = [_newObject organizer];
183 cn = [organizer cnWithoutQuotes];
185 sender = [NSString stringWithFormat:@"%@ <%@>",
187 [organizer rfc822Email]];
189 sender = [organizer rfc822Email];
191 /* generate iCalString once */
192 iCalString = [[_newObject parent] versitString];
194 /* get sendmail object */
195 sendmail = [NGSendMail sharedSendMail];
197 /* get WOApplication instance */
198 app = [WOApplication application];
200 /* generate dynamic message content */
202 count = [_attendees count];
203 for (i = 0; i < count; i++)
205 attendee = [_attendees objectAtIndex:i];
207 /* construct recipient */
210 recipient = [NSString stringWithFormat: @"%@ <%@>",
212 [attendee rfc822Email]];
214 recipient = [attendee rfc822Email];
216 /* create page name */
217 // TODO: select user's default language?
218 pageName = [NSString stringWithFormat: @"SOGoAptMail%@%@",
219 mailTemplateDefaultLanguage,
221 /* construct message content */
222 p = [app pageWithName: pageName inContext: [WOContext context]];
223 [p setNewApt: _newObject];
224 [p setOldApt: _oldObject];
225 [p setHomePageURL: [self homePageURLForPerson: attendee]];
226 [p setViewTZ: [self userTimeZone: cn]];
227 subject = [p getSubject];
230 /* construct message */
231 headerMap = [NGMutableHashMap hashMapWithCapacity: 5];
233 /* NOTE: multipart/alternative seems like the correct choice but
234 * unfortunately Thunderbird doesn't offer the rich content alternative
235 * at all. Mail.app shows the rich content alternative _only_
236 * so we'll stick with multipart/mixed for the time being.
238 [headerMap setObject: @"multipart/mixed" forKey: @"content-type"];
239 [headerMap setObject: sender forKey: @"From"];
240 [headerMap setObject: recipient forKey: @"To"];
241 [headerMap setObject: [NSCalendarDate date] forKey: @"date"];
242 [headerMap setObject: subject forKey: @"Subject"];
243 msg = [NGMimeMessage messageWithHeader: headerMap];
246 body = [[NGMimeMultipartBody alloc] initWithPart: msg];
249 headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
250 [headerMap setObject: @"text/plain; charset=utf-8"
251 forKey: @"content-type"];
252 bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
253 [bodyPart setBody: [text dataUsingEncoding: NSUTF8StringEncoding]];
255 /* attach text part to multipart body */
256 [body addBodyPart: bodyPart];
259 header = [NSString stringWithFormat: @"text/calendar; method=%@;"
261 [(iCalCalendar *) [_newObject parent] method]];
262 headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
263 [headerMap setObject:header forKey: @"content-type"];
264 bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
265 [bodyPart setBody: [iCalString dataUsingEncoding: NSUTF8StringEncoding]];
267 /* attach calendar part to multipart body */
268 [body addBodyPart: bodyPart];
270 /* attach multipart body to message */
274 /* send the damn thing */
275 [sendmail sendMimePart: msg
276 toRecipients: [NSArray arrayWithObject: [attendee rfc822Email]]
277 sender: [organizer rfc822Email]];