]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1014 d1b88da0-ebda-0310...
authorwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 31 Jan 2007 22:36:08 +0000 (22:36 +0000)
committerwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 31 Jan 2007 22:36:08 +0000 (22:36 +0000)
ChangeLog
SoObjects/Appointments/SOGoAppointmentObject.h
SoObjects/Appointments/SOGoAppointmentObject.m
SoObjects/Appointments/SOGoCalendarComponent.h
SoObjects/Appointments/SOGoCalendarComponent.m
SoObjects/Appointments/SOGoGroupAppointmentFolder.m
SoObjects/Appointments/SOGoTaskObject.m
SoObjects/common.make
UI/Common/UIxAclEditor.m

index e236403f15bc01e8467c8846b4751c0840bcc643..4c84b8a948c7371c14c5faa7e69ec9054a8d36f6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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
index 3c7e4d78e5f56939ad747c3fd5a45a838fd43bd0..ab41219b59c57e98fdc889360878456fa25ab0fb 100644 (file)
 
 /* 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
index 42e4f01e5147f504b951b29050a2390febb20b4a..cd2d90706bc22dd864a60389146ab161247a71ad 100644 (file)
 #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
@@ -290,7 +244,7 @@ static BOOL sendEMailNotifications = NO;
 
   /* 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 */
@@ -395,20 +349,23 @@ static BOOL sendEMailNotifications = NO;
   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]];
@@ -419,7 +376,9 @@ static BOOL sendEMailNotifications = NO;
     
           canceledApt = [newApt copy];
           [(iCalCalendar *) [canceledApt parent] setMethod: @"cancel"];
-          [self sendAttendeeRemovalEMailForAppointment:canceledApt
+          [self sendEMailUsingTemplateNamed: @"Removal"
+                forOldObject: nil
+                andNewObject: canceledApt
                 toAttendees: attendees];
           [canceledApt release];
         }
@@ -459,7 +418,7 @@ static BOOL sendEMailNotifications = NO;
   
   removedUIDs = [self attendeeUIDsFromAppointment:apt];
 
-  if (sendEMailNotifications)
+  if ([self sendEMailNotifications])
     {
       /* send notification email to attendees excluding organizer */
       attendees = [NSMutableArray arrayWithArray:[apt attendees]];
@@ -473,8 +432,10 @@ static BOOL sendEMailNotifications = NO;
       [apt removeAllAttendees];
 
       /* send notification email */
-      [self sendAppointmentDeletionEMailForAppointment:apt
-            toAttendees:attendees];
+      [self sendEMailUsingTemplateNamed: @"Deletion"
+            forOldObject: nil
+            andNewObject: apt
+            toAttendees: attendees];
     }
 
   /* perform */
@@ -545,33 +506,6 @@ static BOOL sendEMailNotifications = NO;
   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
 {
@@ -580,7 +514,7 @@ static BOOL sendEMailNotifications = NO;
   iCalEvent *event;
   NSArray *organizers;
 
-  oldContentString = [self iCalString];
+  oldContentString = [self contentAsString];
   if (oldContentString)
     newContentString = contentString;
   else
@@ -601,176 +535,6 @@ static BOOL sendEMailNotifications = NO;
                 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
 {
index 637c6f67d98e1bdb5db7d470812a2af395137001..101ebbb43133055f78a3be81a5cbf0e40504397e 100644 (file)
 
 #import <SOGo/SOGoContentObject.h>
 
+@class NSArray;
 @class NSString;
 
 @class iCalCalendar;
+@class iCalRepeatableEntityObject;
 
 @interface SOGoCalendarComponent : SOGoContentObject
 {
@@ -36,7 +38,6 @@
 
 /* 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 */
index adb0cc801a67ed750a2004d27f38c27f8c5d040b..ffae08c17d25a3cc3e553b3af687976166855819 100644 (file)
  * 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
@@ -55,7 +89,7 @@
 
   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
index 0295de5039b4dcfe6d415c69a3757692310e4c7d..c154c5b30d7164131a94218c5f4142d271dd5cb0 100644 (file)
@@ -19,6 +19,8 @@
   02111-1307, USA.
 */
 
+#import <SOGo/SOGoGroupFolder.h>
+
 #include "SOGoGroupAppointmentFolder.h"
 #include "common.h"
 
index f3416c3d3a5fd223b859b5c625043ab620386e8a..775dcecf7205c002a2068a3c17c02eef37f06bf7 100644 (file)
 #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
@@ -277,7 +264,7 @@ static NSString                  *mailTemplateDefaultLanguage = nil;
 
 //   /* 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 */
@@ -387,7 +374,8 @@ static NSString                  *mailTemplateDefaultLanguage = nil;
 //   if (delError   != nil) return delError;
 
   /* email notifications */
-
+//   if ([self sendEMailNotifications])
+//     {
 //   attendees = [NSMutableArray arrayWithArray:[changes insertedAttendees]];
 //   [attendees removePerson:organizer];
 //   [self sendInvitationEMailForTask:newApt
@@ -397,9 +385,10 @@ static NSString                  *mailTemplateDefaultLanguage = nil;
 //     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]];
@@ -409,10 +398,14 @@ static NSString                  *mailTemplateDefaultLanguage = nil;
     
 //     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;
 }
 
@@ -447,20 +440,25 @@ static NSString                  *mailTemplateDefaultLanguage = 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 */
   
@@ -553,180 +551,4 @@ static NSString                  *mailTemplateDefaultLanguage = nil;
   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 */
index 3684a1e4612e50857436515d560cbcbc277e9e9c..fbedc51765a3d65b6d8217327960a818f0fb6323 100644 (file)
@@ -19,7 +19,8 @@ ADDITIONAL_INCLUDE_DIRS += \
 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                                  \
index 7b00e62d044c1a16c4b6260a2f7915ca2b7fe481..b6917d56da8a011a4200568e0c20fee6c2a9396f 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #import <Foundation/NSArray.h>
+#import <Foundation/NSDictionary.h>
 #import <Foundation/NSKeyValueCoding.h>
 #import <NGObjWeb/SoUser.h>
 #import <NGObjWeb/WORequest.h>