+2007-01-31 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * SoObjects/Appointments/SOGoCalendarComponent.m
+ ([SOGoCalendarComponent -sendEMailNotifications]): new method that
+ returns the value of ud "SOGoAppointmentSendEMailNotifications"
+ (iMIP/iTIP).
+ ([SOGoCalendarComponent
+ -sendEMailUsingTemplateNamed:_pageNameforOldObject:_oldObjectandNewObject:_newObjecttoAttendees:_attendees]): method moved from SOGoAppointmentObject/SOGoTaskObject, replacing occurences of "appointment" to "object" in its name.
+
2007-01-30 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/MailerUI/UIxMailListView.m ([UIxMailListView
/* folder management */
-- (id)lookupHomeFolderForUID:(NSString *)_uid inContext:(id)_ctx;
-- (NSArray *)lookupCalendarFoldersForUIDs:(NSArray *)_uids inContext:(id)_ctx;
+- (id) lookupHomeFolderForUID: (NSString *) _uid inContext: (id)_ctx;
+- (NSArray *) lookupCalendarFoldersForUIDs: (NSArray *) _uids
+ inContext: (id) _ctx;
/* "iCal multifolder saves" */
-- (NSException *)saveContentString:(NSString *)_iCal baseSequence:(int)_v;
-- (NSException *)deleteWithBaseSequence:(int)_v;
+- (NSException *) saveContentString: (NSString *)_iCal
+ baseSequence: (int) _v;
+- (NSException *) deleteWithBaseSequence: (int) _v;
-- (NSException *)saveContentString:(NSString *)_iCalString;
+- (NSException *) saveContentString: (NSString *) _iCalString;
-- (NSException *)changeParticipationStatus:(NSString *)_status
- inContext:(id)_ctx;
+- (NSException *) changeParticipationStatus: (NSString *) _status
+ inContext: (id) _ctx;
@end
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalEventChanges.h>
#import <NGCards/iCalPerson.h>
-#import <NGMime/NGMime.h>
-#import <NGMail/NGMail.h>
-#import <NGMail/NGSendMail.h>
#import <SOGo/AgenorUserManager.h>
#import <SOGo/SOGoObject.h>
-#import "SOGoAptMailNotification.h"
#import "iCalEntityObject+Agenor.h"
#import "common.h"
#import "NSArray+Appointments.h"
-@interface SOGoAppointmentObject (PrivateAPI)
-- (NSString *) homePageURLForPerson: (iCalPerson *) _person;
-
-- (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
- forOldAppointment: (iCalEvent *) _newApt
- andNewAppointment: (iCalEvent *) _oldApt
- toAttendees: (NSArray *) _attendees;
-
-- (void) sendInvitationEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees;
-- (void) sendAppointmentUpdateEMailForOldAppointment: (iCalEvent *) _oldApt
- newAppointment: (iCalEvent *) _newApt
- toAttendees: (NSArray *) _attendees;
-- (void) sendAttendeeRemovalEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees;
-- (void) sendAppointmentDeletionEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees;
-@end
-
@implementation SOGoAppointmentObject
-static NSString *mailTemplateDefaultLanguage = nil;
-static BOOL sendEMailNotifications = NO;
-
-+ (void) initialize
-{
- NSUserDefaults *ud;
- static BOOL didInit = NO;
-
- if (!didInit)
- {
- didInit = YES;
-
- ud = [NSUserDefaults standardUserDefaults];
- mailTemplateDefaultLanguage = [[ud stringForKey:@"SOGoDefaultLanguage"]
- retain];
- if (!mailTemplateDefaultLanguage)
- mailTemplateDefaultLanguage = @"French";
-
- sendEMailNotifications
- = [ud boolForKey: @"SOGoAppointmentSendEMailNotifications"];
- }
-}
-
/* accessors */
- (iCalEvent *) event
/* handle old content */
- oldContent = [self iCalString]; /* if nil, this is a new appointment */
+ oldContent = [self contentAsString]; /* if nil, this is a new appointment */
if ([oldContent length] == 0)
{
/* new appointment */
if (delError != nil) return delError;
/* email notifications */
- if (sendEMailNotifications)
+ if ([self sendEMailNotifications])
{
- attendees = [NSMutableArray arrayWithArray:[changes insertedAttendees]];
- [attendees removePerson:organizer];
- [self sendInvitationEMailForAppointment:newApt
- toAttendees:attendees];
+ attendees = [NSMutableArray arrayWithArray: [changes insertedAttendees]];
+ [attendees removePerson: organizer];
+ [self sendEMailUsingTemplateNamed: @"Invitation"
+ forOldObject: nil
+ andNewObject: newApt
+ toAttendees: attendees];
if (updateForcesReconsider) {
attendees = [NSMutableArray arrayWithArray:[newApt attendees]];
[attendees removeObjectsInArray:[changes insertedAttendees]];
[attendees removePerson:organizer];
- [self sendAppointmentUpdateEMailForOldAppointment:oldApt
- newAppointment:newApt
- toAttendees:attendees];
+ [self sendEMailUsingTemplateNamed: @"Update"
+ forOldObject: oldApt
+ andNewObject: newApt
+ toAttendees: attendees];
}
attendees = [NSMutableArray arrayWithArray:[changes deletedAttendees]];
canceledApt = [newApt copy];
[(iCalCalendar *) [canceledApt parent] setMethod: @"cancel"];
- [self sendAttendeeRemovalEMailForAppointment:canceledApt
+ [self sendEMailUsingTemplateNamed: @"Removal"
+ forOldObject: nil
+ andNewObject: canceledApt
toAttendees: attendees];
[canceledApt release];
}
removedUIDs = [self attendeeUIDsFromAppointment:apt];
- if (sendEMailNotifications)
+ if ([self sendEMailNotifications])
{
/* send notification email to attendees excluding organizer */
attendees = [NSMutableArray arrayWithArray:[apt attendees]];
[apt removeAllAttendees];
/* send notification email */
- [self sendAppointmentDeletionEMailForAppointment:apt
- toAttendees:attendees];
+ [self sendEMailUsingTemplateNamed: @"Deletion"
+ forOldObject: nil
+ andNewObject: apt
+ toAttendees: attendees];
}
/* perform */
return @"IPM.Appointment";
}
-/* EMail Notifications */
-
-- (NSString *) homePageURLForPerson: (iCalPerson *) _person
-{
- NSString *baseURL;
- NSString *uid;
- WOContext *ctx;
- NSArray *traversalObjects;
-
- /* generate URL from traversal stack */
- ctx = [[WOApplication application] context];
- traversalObjects = [ctx objectTraversalStack];
- if ([traversalObjects count] > 0)
- baseURL = [[traversalObjects objectAtIndex:0] baseURLInContext:ctx];
- else
- {
- baseURL = @"http://localhost/";
- [self warnWithFormat:@"Unable to create baseURL from context!"];
- }
- uid = [[AgenorUserManager sharedUserManager]
- getUIDForEmail: [_person rfc822Email]];
-
- return ((uid)
- ? [NSString stringWithFormat:@"%@%@", baseURL, uid]
- : nil);
-}
-
- (NSException *) saveContentString: (NSString *) contentString
baseVersion: (unsigned int) baseVersion
{
iCalEvent *event;
NSArray *organizers;
- oldContentString = [self iCalString];
+ oldContentString = [self contentAsString];
if (oldContentString)
newContentString = contentString;
else
baseVersion: baseVersion];
}
-- (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
- forOldAppointment: (iCalEvent *) _oldApt
- andNewAppointment: (iCalEvent *) _newApt
- toAttendees: (NSArray *) _attendees
-{
- NSString *pageName;
- iCalPerson *organizer;
- NSString *cn, *sender, *iCalString;
- NGSendMail *sendmail;
- WOApplication *app;
- unsigned i, count;
- iCalPerson *attendee;
- NSString *recipient;
- SOGoAptMailNotification *p;
- NSString *subject, *text, *header;
- NGMutableHashMap *headerMap;
- NGMimeMessage *msg;
- NGMimeBodyPart *bodyPart;
- NGMimeMultipartBody *body;
-
- if ([_attendees count])
- {
- /* sender */
-
- organizer = [_newApt organizer];
- cn = [organizer cnWithoutQuotes];
- if (cn)
- sender = [NSString stringWithFormat:@"%@ <%@>",
- cn,
- [organizer rfc822Email]];
- else
- sender = [organizer rfc822Email];
-
- /* generate iCalString once */
- iCalString = [[_newApt parent] versitString];
-
- /* get sendmail object */
- sendmail = [NGSendMail sharedSendMail];
-
- /* get WOApplication instance */
- app = [WOApplication application];
-
- /* generate dynamic message content */
-
- count = [_attendees count];
- for (i = 0; i < count; i++)
- {
- attendee = [_attendees objectAtIndex:i];
-
- /* construct recipient */
- cn = [attendee cn];
- if (cn)
- recipient = [NSString stringWithFormat: @"%@ <%@>",
- cn,
- [attendee rfc822Email]];
- else
- recipient = [attendee rfc822Email];
-
- /* create page name */
- // TODO: select user's default language?
- pageName = [NSString stringWithFormat: @"SOGoAptMail%@%@",
- mailTemplateDefaultLanguage,
- _pageName];
- /* construct message content */
- p = [app pageWithName: pageName inContext: [WOContext context]];
- [p setNewApt: _newApt];
- [p setOldApt: _oldApt];
- [p setHomePageURL: [self homePageURLForPerson: attendee]];
- [p setViewTZ: [self userTimeZone: cn]];
- subject = [p getSubject];
- text = [p getBody];
-
- /* construct message */
- headerMap = [NGMutableHashMap hashMapWithCapacity: 5];
-
- /* NOTE: multipart/alternative seems like the correct choice but
- * unfortunately Thunderbird doesn't offer the rich content alternative
- * at all. Mail.app shows the rich content alternative _only_
- * so we'll stick with multipart/mixed for the time being.
- */
- [headerMap setObject: @"multipart/mixed" forKey: @"content-type"];
- [headerMap setObject: sender forKey: @"From"];
- [headerMap setObject: recipient forKey: @"To"];
- [headerMap setObject: [NSCalendarDate date] forKey: @"date"];
- [headerMap setObject: subject forKey: @"Subject"];
- msg = [NGMimeMessage messageWithHeader: headerMap];
-
- /* multipart body */
- body = [[NGMimeMultipartBody alloc] initWithPart: msg];
-
- /* text part */
- headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
- [headerMap setObject: @"text/plain; charset=utf-8"
- forKey: @"content-type"];
- bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
- [bodyPart setBody: [text dataUsingEncoding: NSUTF8StringEncoding]];
-
- /* attach text part to multipart body */
- [body addBodyPart: bodyPart];
-
- /* calendar part */
- header = [NSString stringWithFormat: @"text/calendar; method=%@;"
- @" charset=utf-8",
- [(iCalCalendar *) [_newApt parent] method]];
- headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
- [headerMap setObject:header forKey: @"content-type"];
- bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
- [bodyPart setBody: [iCalString dataUsingEncoding: NSUTF8StringEncoding]];
-
- /* attach calendar part to multipart body */
- [body addBodyPart: bodyPart];
-
- /* attach multipart body to message */
- [msg setBody: body];
- [body release];
-
- /* send the damn thing */
- [sendmail sendMimePart: msg
- toRecipients: [NSArray arrayWithObject: [attendee rfc822Email]]
- sender: [organizer rfc822Email]];
- }
- }
-}
-
-- (void) sendInvitationEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees
-{
- if ([_attendees count])
- [self sendEMailUsingTemplateNamed: @"Invitation"
- forOldAppointment: nil
- andNewAppointment: _apt
- toAttendees: _attendees];
-}
-
-- (void) sendAppointmentUpdateEMailForOldAppointment: (iCalEvent *) _oldApt
- newAppointment: (iCalEvent *) _newApt
- toAttendees: (NSArray *) _attendees
-{
- if ([_attendees count])
- [self sendEMailUsingTemplateNamed: @"Update"
- forOldAppointment: _oldApt
- andNewAppointment: _newApt
- toAttendees: _attendees];
-}
-
-- (void) sendAttendeeRemovalEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees
-{
- if ([_attendees count])
- [self sendEMailUsingTemplateNamed: @"Removal"
- forOldAppointment: nil
- andNewAppointment: _apt
- toAttendees: _attendees];
-}
-
-- (void) sendAppointmentDeletionEMailForAppointment: (iCalEvent *) _apt
- toAttendees: (NSArray *) _attendees
-{
- if ([_attendees count])
- [self sendEMailUsingTemplateNamed: @"Deletion"
- forOldAppointment: nil
- andNewAppointment: _apt
- toAttendees: _attendees];
-}
-
-- (NSString *) davContentType
-{
- return @"text/calendar";
-}
-
- (NSString *) roleOfUser: (NSString *) login
inContext: (WOContext *) context
{
#import <SOGo/SOGoContentObject.h>
+@class NSArray;
@class NSString;
@class iCalCalendar;
+@class iCalRepeatableEntityObject;
@interface SOGoCalendarComponent : SOGoContentObject
{
/* accessors */
-- (NSString *) iCalString;
- (iCalCalendar *) calendar;
- (NSException *) primarySaveContentString: (NSString *) _iCalString;
- (NSException *) delete;
+/* mail notifications */
+- (BOOL) sendEMailNotifications;
+- (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
+ forOldObject: (iCalRepeatableEntityObject *) _oldObject
+ andNewObject: (iCalRepeatableEntityObject *) _newObject
+ toAttendees: (NSArray *) _attendees;
+
@end
#endif /* SOGOCALENDARCOMPONENT_H */
* Boston, MA 02111-1307, USA.
*/
+#import <Foundation/NSString.h>
+
#import <NGCards/iCalCalendar.h>
+#import <NGCards/iCalPerson.h>
+#import <NGCards/iCalRepeatableEntityObject.h>
+#import <NGMime/NGMime.h>
+#import <NGMail/NGMail.h>
+#import <NGMail/NGSendMail.h>
+
+#import <SOGo/AgenorUserManager.h>
+
+#import "common.h"
+#import "SOGoAptMailNotification.h"
#import "SOGoCalendarComponent.h"
+static NSString *mailTemplateDefaultLanguage = nil;
+static BOOL sendEMailNotifications = NO;
+
@implementation SOGoCalendarComponent
++ (void) initialize
+{
+ NSUserDefaults *ud;
+ static BOOL didInit = NO;
+
+ if (!didInit)
+ {
+ didInit = YES;
+
+ ud = [NSUserDefaults standardUserDefaults];
+ mailTemplateDefaultLanguage = [[ud stringForKey:@"SOGoDefaultLanguage"]
+ retain];
+ if (!mailTemplateDefaultLanguage)
+ mailTemplateDefaultLanguage = @"French";
+
+ sendEMailNotifications
+ = [ud boolForKey: @"SOGoAppointmentSendEMailNotifications"];
+ }
+}
+
- (id) init
{
if ((self = [super init]))
[super dealloc];
}
-- (NSString *) iCalString
+- (NSString *) davContentType
{
- // for UI-X appointment viewer
- return [self contentAsString];
+ return @"text/calendar";
}
- (iCalCalendar *) calendar
if (!calendar)
{
- iCalString = [self iCalString];
+ iCalString = [self contentAsString];
if (iCalString)
{
calendar = [iCalCalendar parseSingleFromSource: iCalString];
- (NSException *) primarySaveContentString: (NSString *) _iCalString
{
- return [super saveContentString:_iCalString];
+ return [super saveContentString: _iCalString];
}
- (NSException *) primaryDelete
return [self deleteWithBaseSequence:0];
}
+/* EMail Notifications */
+- (NSString *) homePageURLForPerson: (iCalPerson *) _person
+{
+ NSString *baseURL;
+ NSString *uid;
+ WOContext *ctx;
+ NSArray *traversalObjects;
+
+ /* generate URL from traversal stack */
+ ctx = [[WOApplication application] context];
+ traversalObjects = [ctx objectTraversalStack];
+ if ([traversalObjects count] > 0)
+ baseURL = [[traversalObjects objectAtIndex:0] baseURLInContext:ctx];
+ else
+ {
+ baseURL = @"http://localhost/";
+ [self warnWithFormat:@"Unable to create baseURL from context!"];
+ }
+ uid = [[AgenorUserManager sharedUserManager]
+ getUIDForEmail: [_person rfc822Email]];
+
+ return ((uid)
+ ? [NSString stringWithFormat:@"%@%@", baseURL, uid]
+ : nil);
+}
+
+- (BOOL) sendEMailNotifications
+{
+ return sendEMailNotifications;
+}
+
+- (void) sendEMailUsingTemplateNamed: (NSString *) _pageName
+ forOldObject: (iCalRepeatableEntityObject *) _oldObject
+ andNewObject: (iCalRepeatableEntityObject *) _newObject
+ toAttendees: (NSArray *) _attendees
+{
+ NSString *pageName;
+ iCalPerson *organizer;
+ NSString *cn, *sender, *iCalString;
+ NGSendMail *sendmail;
+ WOApplication *app;
+ unsigned i, count;
+ iCalPerson *attendee;
+ NSString *recipient;
+ SOGoAptMailNotification *p;
+ NSString *subject, *text, *header;
+ NGMutableHashMap *headerMap;
+ NGMimeMessage *msg;
+ NGMimeBodyPart *bodyPart;
+ NGMimeMultipartBody *body;
+
+ if ([_attendees count])
+ {
+ /* sender */
+
+ organizer = [_newObject organizer];
+ cn = [organizer cnWithoutQuotes];
+ if (cn)
+ sender = [NSString stringWithFormat:@"%@ <%@>",
+ cn,
+ [organizer rfc822Email]];
+ else
+ sender = [organizer rfc822Email];
+
+ /* generate iCalString once */
+ iCalString = [[_newObject parent] versitString];
+
+ /* get sendmail object */
+ sendmail = [NGSendMail sharedSendMail];
+
+ /* get WOApplication instance */
+ app = [WOApplication application];
+
+ /* generate dynamic message content */
+
+ count = [_attendees count];
+ for (i = 0; i < count; i++)
+ {
+ attendee = [_attendees objectAtIndex:i];
+
+ /* construct recipient */
+ cn = [attendee cn];
+ if (cn)
+ recipient = [NSString stringWithFormat: @"%@ <%@>",
+ cn,
+ [attendee rfc822Email]];
+ else
+ recipient = [attendee rfc822Email];
+
+ /* create page name */
+ // TODO: select user's default language?
+ pageName = [NSString stringWithFormat: @"SOGoAptMail%@%@",
+ mailTemplateDefaultLanguage,
+ _pageName];
+ /* construct message content */
+ p = [app pageWithName: pageName inContext: [WOContext context]];
+ [p setNewApt: _newObject];
+ [p setOldApt: _oldObject];
+ [p setHomePageURL: [self homePageURLForPerson: attendee]];
+ [p setViewTZ: [self userTimeZone: cn]];
+ subject = [p getSubject];
+ text = [p getBody];
+
+ /* construct message */
+ headerMap = [NGMutableHashMap hashMapWithCapacity: 5];
+
+ /* NOTE: multipart/alternative seems like the correct choice but
+ * unfortunately Thunderbird doesn't offer the rich content alternative
+ * at all. Mail.app shows the rich content alternative _only_
+ * so we'll stick with multipart/mixed for the time being.
+ */
+ [headerMap setObject: @"multipart/mixed" forKey: @"content-type"];
+ [headerMap setObject: sender forKey: @"From"];
+ [headerMap setObject: recipient forKey: @"To"];
+ [headerMap setObject: [NSCalendarDate date] forKey: @"date"];
+ [headerMap setObject: subject forKey: @"Subject"];
+ msg = [NGMimeMessage messageWithHeader: headerMap];
+
+ /* multipart body */
+ body = [[NGMimeMultipartBody alloc] initWithPart: msg];
+
+ /* text part */
+ headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
+ [headerMap setObject: @"text/plain; charset=utf-8"
+ forKey: @"content-type"];
+ bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
+ [bodyPart setBody: [text dataUsingEncoding: NSUTF8StringEncoding]];
+
+ /* attach text part to multipart body */
+ [body addBodyPart: bodyPart];
+
+ /* calendar part */
+ header = [NSString stringWithFormat: @"text/calendar; method=%@;"
+ @" charset=utf-8",
+ [(iCalCalendar *) [_newObject parent] method]];
+ headerMap = [NGMutableHashMap hashMapWithCapacity: 1];
+ [headerMap setObject:header forKey: @"content-type"];
+ bodyPart = [NGMimeBodyPart bodyPartWithHeader: headerMap];
+ [bodyPart setBody: [iCalString dataUsingEncoding: NSUTF8StringEncoding]];
+
+ /* attach calendar part to multipart body */
+ [body addBodyPart: bodyPart];
+
+ /* attach multipart body to message */
+ [msg setBody: body];
+ [body release];
+
+ /* send the damn thing */
+ [sendmail sendMimePart: msg
+ toRecipients: [NSArray arrayWithObject: [attendee rfc822Email]]
+ sender: [organizer rfc822Email]];
+ }
+ }
+}
+
@end
02111-1307, USA.
*/
+#import <SOGo/SOGoGroupFolder.h>
+
#include "SOGoGroupAppointmentFolder.h"
#include "common.h"
#import "NSArray+Appointments.h"
@interface SOGoTaskObject (PrivateAPI)
-- (NSString *)homePageURLForPerson:(iCalPerson *)_person;
-
-- (void)sendEMailUsingTemplateNamed:(NSString *)_pageName
- forOldTask:(iCalToDo *)_newApt
- andNewTask:(iCalToDo *)_oldApt
- toAttendees:(NSArray *)_attendees;
-
-- (void)sendInvitationEMailForTask:(iCalToDo *)_task
- toAttendees:(NSArray *)_attendees;
-- (void)sendTaskUpdateEMailForOldTask:(iCalToDo *)_oldApt
- newTask:(iCalToDo *)_newApt
- toAttendees:(NSArray *)_attendees;
-- (void)sendAttendeeRemovalEMailForTask:(iCalToDo *)_task
- toAttendees:(NSArray *)_attendees;
-- (void)sendTaskDeletionEMailForTask:(iCalToDo *)_task
- toAttendees:(NSArray *)_attendees;
+
+- (NSString *) homePageURLForPerson: (iCalPerson *) _person;
+
@end
@implementation SOGoTaskObject
// /* handle old content */
-// oldContent = [self iCalString]; /* if nil, this is a new task */
+// oldContent = [self contentAsString]; /* if nil, this is a new task */
// if ([oldContent length] == 0)
// {
// /* new task */
// if (delError != nil) return delError;
/* email notifications */
-
+// if ([self sendEMailNotifications])
+// {
// attendees = [NSMutableArray arrayWithArray:[changes insertedAttendees]];
// [attendees removePerson:organizer];
// [self sendInvitationEMailForTask:newApt
// attendees = [NSMutableArray arrayWithArray:[newApt attendees]];
// [attendees removeObjectsInArray:[changes insertedAttendees]];
// [attendees removePerson:organizer];
-// [self sendTaskUpdateEMailForOldTask:oldApt
-// newTask:newApt
-// toAttendees:attendees];
+// [self sendEMailUsingTemplateNamed: @"Update"
+// forOldObject: oldApt
+// andNewObject: newApt
+// toAttendees: attendees];
// }
// attendees = [NSMutableArray arrayWithArray:[changes deletedAttendees]];
// canceledApt = [newApt copy];
// [(iCalCalendar *) [canceledApt parent] setMethod: @"cancel"];
-// [self sendAttendeeRemovalEMailForTask:canceledApt
-// toAttendees:attendees];
+// [self sendEMailUsingTemplateNamed: @"Removal"
+// forOldObject: nil
+// andNewObject: canceledApt
+// toAttendees: attendees];
// [canceledApt release];
// }
+// }
+
return nil;
}
removedUIDs = [self attendeeUIDsFromTask:task];
- /* send notification email to attendees excluding organizer */
- attendees = [NSMutableArray arrayWithArray:[task attendees]];
- [attendees removePerson:[task organizer]];
+ if ([self sendEMailNotifications])
+ {
+ /* send notification email to attendees excluding organizer */
+ attendees = [NSMutableArray arrayWithArray:[task attendees]];
+ [attendees removePerson:[task organizer]];
- /* flag task as being canceled */
- [(iCalCalendar *) [task parent] setMethod: @"cancel"];
- [task increaseSequence];
+ /* flag task as being canceled */
+ [(iCalCalendar *) [task parent] setMethod: @"cancel"];
+ [task increaseSequence];
- /* remove all attendees to signal complete removal */
- [task removeAllAttendees];
+ /* remove all attendees to signal complete removal */
+ [task removeAllAttendees];
- /* send notification email */
- [self sendTaskDeletionEMailForTask:task
- toAttendees:attendees];
+ /* send notification email */
+ [self sendEMailUsingTemplateNamed: @"Deletion"
+ forOldObject: nil
+ andNewObject: task
+ toAttendees: attendees];
+ }
/* perform */
return [NSString stringWithFormat:@"%@%@", baseURL, uid];
}
-- (void)sendEMailUsingTemplateNamed:(NSString *)_pageName
- forOldTask:(iCalToDo *)_oldApt
- andNewTask:(iCalToDo *)_newApt
- toAttendees:(NSArray *)_attendees
-{
- NSString *pageName;
- iCalPerson *organizer;
- NSString *cn, *sender, *iCalString;
- NGSendMail *sendmail;
- WOApplication *app;
- unsigned i, count;
-
- if (![_attendees count]) return; // another job neatly done :-)
-
- /* sender */
-
- organizer = [_newApt organizer];
- cn = [organizer cnWithoutQuotes];
- if (cn) {
- sender = [NSString stringWithFormat:@"%@ <%@>",
- cn,
- [organizer rfc822Email]];
- }
- else {
- sender = [organizer rfc822Email];
- }
-
- /* generate iCalString once */
- iCalString = [[_newApt parent] versitString];
-
- /* get sendmail object */
- sendmail = [NGSendMail sharedSendMail];
-
- /* get WOApplication instance */
- app = [WOApplication application];
-
- /* generate dynamic message content */
-
- count = [_attendees count];
- for (i = 0; i < count; i++) {
- iCalPerson *attendee;
- NSString *recipient;
- SOGoAptMailNotification *p;
- NSString *subject, *text, *header;
- NGMutableHashMap *headerMap;
- NGMimeMessage *msg;
- NGMimeBodyPart *bodyPart;
- NGMimeMultipartBody *body;
-
- attendee = [_attendees objectAtIndex:i];
-
- /* construct recipient */
- cn = [attendee cn];
- if (cn) {
- recipient = [NSString stringWithFormat:@"%@ <%@>",
- cn,
- [attendee rfc822Email]];
- }
- else {
- recipient = [attendee rfc822Email];
- }
-
- /* create page name */
- // TODO: select user's default language?
- pageName = [NSString stringWithFormat:@"SOGoAptMail%@%@",
- mailTemplateDefaultLanguage,
- _pageName];
- /* construct message content */
- p = [app pageWithName:pageName inContext:[WOContext context]];
- [p setNewApt: _newApt];
- [p setOldApt: _oldApt];
- [p setHomePageURL:[self homePageURLForPerson:attendee]];
- [p setViewTZ: [self userTimeZone: cn]];
- subject = [p getSubject];
- text = [p getBody];
-
- /* construct message */
- headerMap = [NGMutableHashMap hashMapWithCapacity:5];
-
- /* NOTE: multipart/alternative seems like the correct choice but
- * unfortunately Thunderbird doesn't offer the rich content alternative
- * at all. Mail.app shows the rich content alternative _only_
- * so we'll stick with multipart/mixed for the time being.
- */
- [headerMap setObject:@"multipart/mixed" forKey:@"content-type"];
- [headerMap setObject:sender forKey:@"From"];
- [headerMap setObject:recipient forKey:@"To"];
- [headerMap setObject:[NSCalendarDate date] forKey:@"date"];
- [headerMap setObject:subject forKey:@"Subject"];
- msg = [NGMimeMessage messageWithHeader:headerMap];
-
- /* multipart body */
- body = [[NGMimeMultipartBody alloc] initWithPart:msg];
-
- /* text part */
- headerMap = [NGMutableHashMap hashMapWithCapacity:1];
- [headerMap setObject:@"text/plain; charset=utf-8" forKey:@"content-type"];
- bodyPart = [NGMimeBodyPart bodyPartWithHeader:headerMap];
- [bodyPart setBody:[text dataUsingEncoding:NSUTF8StringEncoding]];
-
- /* attach text part to multipart body */
- [body addBodyPart:bodyPart];
-
- /* calendar part */
- header = [NSString stringWithFormat:@"text/calendar; method=%@;"
- @" charset=utf-8",
- [(iCalCalendar *) [_newApt parent] method]];
- headerMap = [NGMutableHashMap hashMapWithCapacity:1];
- [headerMap setObject:header forKey:@"content-type"];
- bodyPart = [NGMimeBodyPart bodyPartWithHeader:headerMap];
- [bodyPart setBody:[iCalString dataUsingEncoding:NSUTF8StringEncoding]];
-
- /* attach calendar part to multipart body */
- [body addBodyPart:bodyPart];
-
- /* attach multipart body to message */
- [msg setBody:body];
- [body release];
-
- /* send the damn thing */
- [sendmail sendMimePart:msg
- toRecipients:[NSArray arrayWithObject:[attendee rfc822Email]]
- sender:[organizer rfc822Email]];
- }
-}
-
-- (void)sendInvitationEMailForTask:(iCalToDo *)_task
- toAttendees:(NSArray *)_attendees
-{
- if (![_attendees count]) return; // another job neatly done :-)
-
- [self sendEMailUsingTemplateNamed:@"Invitation"
- forOldTask:nil
- andNewTask:_task
- toAttendees:_attendees];
-}
-
-- (void)sendTaskUpdateEMailForOldTask:(iCalToDo *)_oldApt
- newTask:(iCalToDo *)_newApt
- toAttendees:(NSArray *)_attendees
-{
- if (![_attendees count]) return;
-
- [self sendEMailUsingTemplateNamed:@"Update"
- forOldTask:_oldApt
- andNewTask:_newApt
- toAttendees:_attendees];
-}
-
-- (void) sendAttendeeRemovalEMailForTask:(iCalToDo *)_task
- toAttendees:(NSArray *)_attendees
-{
- if (![_attendees count]) return;
-
- [self sendEMailUsingTemplateNamed:@"Removal"
- forOldTask:nil
- andNewTask:_task
- toAttendees:_attendees];
-}
-
-- (void) sendTaskDeletionEMailForTask: (iCalToDo *) _task
- toAttendees: (NSArray *) _attendees
-{
- if (![_attendees count]) return;
-
- [self sendEMailUsingTemplateNamed:@"Deletion"
- forOldTask:nil
- andNewTask:_task
- toAttendees:_attendees];
-}
-
-- (NSString *) davContentType
-{
- return @"text/calendar";
-}
-
@end /* SOGoTaskObject */
ADDITIONAL_LIB_DIRS += \
-L../SOGo/$(GNUSTEP_OBJ_DIR)/ \
-L../../SOGo/$(GNUSTEP_OBJ_DIR)/ \
- -L../../OGoContentStore/$(GNUSTEP_OBJ_DIR)/
+ -L../../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
+ -L/usr/local/lib
BUNDLE_LIBS += \
-lSOGo \
*/
#import <Foundation/NSArray.h>
+#import <Foundation/NSDictionary.h>
#import <Foundation/NSKeyValueCoding.h>
#import <NGObjWeb/SoUser.h>
#import <NGObjWeb/WORequest.h>