]> err.no Git - scalable-opengroupware.org/blobdiff - UI/MailPartViewers/UIxMailPartICalViewer.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1039 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / MailPartViewers / UIxMailPartICalViewer.m
index fd468cc0ea1739710a6c2dd47edcfd9deee5fd17..f8a0e549a44ed84938e9fcb70b6d61b9b90190d8 100644 (file)
   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;
+#import <SOGoUI/SOGoDateFormatter.h>
+#import <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"
 
-@end
-
-#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];
 }
   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);
 }
   NSCalendarDate *date;
   
   date = [[self authorativeEvent] startDate];
-  [date setTimeZone:[self viewTimeZone]];
+  [date setTimeZone:[[self clientObject] userTimeZone]];
   return date;
 }
 
   NSCalendarDate *date;
   
   date = [[self authorativeEvent] endDate];
-  [date setTimeZone:[self viewTimeZone]];
+  [date setTimeZone:[[self clientObject] userTimeZone]];
   return date;
 }
 
 }
 
 - (iCalEvent *)storedEvent {
-  return [(SOGoAppointmentObject *)[self storedEventObject] event];
+  return (iCalEvent *) [(SOGoAppointmentObject *)[self storedEventObject] component: NO];
 }
 
 /* organizer tracking */
 
 /* 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 */