02111-1307, USA.
*/
-#include "UIxMailPartViewer.h"
-
/*
UIxMailPartICalViewer
Show plain/calendar mail parts.
*/
-@class SOGoDateFormatter;
-@class iCalEvent, iCalCalendar;
-
-@interface UIxMailPartICalViewer : UIxMailPartViewer
-{
- iCalCalendar *inCalendar;
- iCalEvent *inEvent;
- id attendee;
- SOGoDateFormatter *dateFormatter;
- id item;
- id storedEventObject;
- iCalEvent *storedEvent;
-}
-
-- (iCalEvent *)authorativeEvent;
-
-@end
+#import <SoObjects/SOGo/SOGoDateFormatter.h>
+#import <SoObjects/SOGo/SOGoUser.h>
+#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
+#import <SoObjects/Appointments/SOGoAppointmentObject.h>
+#import <SoObjects/Mailer/SOGoMailObject.h>
+#import <NGCards/NGCards.h>
+#import <NGImap4/NGImap4EnvelopeAddress.h>
+#import "common.h"
-#include <SOGoUI/SOGoDateFormatter.h>
-#include <SOGo/SOGoAppointment.h>
-#include <SOGo/SOGoUser.h>
-#include <SOGo/SoObjects/Appointments/SOGoAppointmentFolder.h>
-#include <SOGo/SoObjects/Appointments/SOGoAppointmentObject.h>
-#include <SOGo/SoObjects/Mailer/SOGoMailObject.h>
-#include <NGiCal/NGiCal.h>
-#include <NGImap4/NGImap4EnvelopeAddress.h>
-#include "common.h"
+#import "UIxMailPartICalViewer.h"
@implementation UIxMailPartICalViewer
[self->item release]; self->item = nil;
}
+/* raw content handling */
+
+- (NSStringEncoding)fallbackStringEncoding {
+ /*
+ iCalendar invitations sent by Outlook 2002 have the annoying bug that the
+ mail states an UTF-8 content encoding but the actual iCalendar content is
+ encoding in Latin-1 (or Windows Western?).
+
+ As a result the content decoding will fail (TODO: always?). In this case we
+ try to decode with Latin-1.
+
+ Note: we could check for the Outlook x-mailer, but it was considered better
+ to try Latin-1 as a fallback in any case (be tolerant).
+ */
+ return NSISOLatin1StringEncoding;
+}
+
/* accessors */
-- (iCalCalendar *)inCalendar {
- NSString *iCalString;
-
- if (self->inCalendar != nil)
- return [self->inCalendar isNotNull] ? self->inCalendar : nil;
-
- iCalString = [self flatContentAsString];
-
- self->inCalendar =
- [[iCalCalendar parseCalendarFromSource:iCalString] retain];
- if (self->inCalendar == nil) {
- [self warnWithFormat:@"Could not parse a vcalendar string."];
- self->inCalendar = [[NSNull null] retain];
- return nil;
- }
- else
- return self->inCalendar;
+- (iCalCalendar *) inCalendar
+{
+ if (!inCalendar)
+ {
+ inCalendar
+ = [iCalCalendar parseSingleFromSource: [self flatContentAsString]];
+ [inCalendar retain];
+ }
+
+ return inCalendar;
}
+
- (BOOL)couldParseCalendar {
return [[self inCalendar] isNotNull];
}
- (SOGoDateFormatter *)dateFormatter {
if (self->dateFormatter == nil) {
- self->dateFormatter =
- [[SOGoDateFormatter alloc] initWithLocale:[self locale]];
- [self->dateFormatter setFullWeekdayNameAndDetails];
+ dateFormatter = [[context activeUser] dateFormatterInContext: context];
+ [dateFormatter retain];
}
+
return self->dateFormatter;
}
return self->attendee;
}
+- (NSString *) _personForDisplay: (iCalPerson *) person
+{
+ return [NSString stringWithFormat: @"%@ <%@>",
+ [person cnWithoutQuotes],
+ [person rfc822Email]];
+}
+
+- (NSString *) attendeeForDisplay
+{
+ return [self _personForDisplay: attendee];
+}
+
- (void)setItem:(id)_item {
ASSIGN(self->item, _item);
}
return self->item;
}
-- (NSCalendarDate *)startTime {
+- (NSCalendarDate *) startTime
+{
NSCalendarDate *date;
+ NSTimeZone *timeZone;
date = [[self authorativeEvent] startDate];
- [date setTimeZone:[self viewTimeZone]];
+ timeZone = [[context activeUser] timeZone];
+ [date setTimeZone: timeZone];
+
return date;
}
-- (NSCalendarDate *)endTime {
+- (NSCalendarDate *) endTime
+{
NSCalendarDate *date;
+ NSTimeZone *timeZone;
date = [[self authorativeEvent] endDate];
- [date setTimeZone:[self viewTimeZone]];
+ timeZone = [[context activeUser] timeZone];
+ [date setTimeZone: timeZone];
+
return date;
}
- (id)calendarFolder {
/* return scheduling calendar of currently logged-in user */
- return [[[self context] activeUser] schedulingCalendarInContext:
- [self context]];
+ SOGoUser *user;
+ id folder;
+
+ user = [context activeUser];
+ folder = [[user homeFolderInContext: context] lookupName: @"Calendar"
+ inContext: context
+ acquire: NO];
+
+ return folder;
}
- (id)storedEventObject {
}
- (iCalEvent *)storedEvent {
- return [(SOGoAppointmentObject *)[self storedEventObject] event];
+ return (iCalEvent *) [(SOGoAppointmentObject *)[self storedEventObject] component: NO];
}
/* organizer tracking */
- (NSString *)loggedInUserEMail {
- return [[[self context] activeUser] email];
+ return [[[self context] activeUser] primaryEmail];
}
- (iCalEvent *)authorativeEvent {
/* derived fields */
-- (NSString *)organizerDisplayName {
+- (NSString *) organizerDisplayName
+{
iCalPerson *organizer;
- NSString *cn;
-
- if ((organizer = [[self authorativeEvent] organizer]) != nil) {
- cn = [organizer valueForKey:@"cnForDisplay"];
- if ([cn isNotNull] && [cn length] > 0)
- return cn;
-
- cn = [organizer valueForKey:@"rfc822Email"];
- if ([cn isNotNull] && [cn length] > 0)
- return cn;
-
- return @"[error: unable to derive organizer name]";
- }
+ NSString *value;
+
+ organizer = [[self authorativeEvent] organizer];
+ if (organizer)
+ value = [self _personForDisplay: organizer];
+ else
+ value = @"[todo: no organizer set, use 'from']";
- return @"[todo: no organizer set, use 'from']";
+ return value;
}
/* replies */