Monotone-Parent: b6bfa451e6c9b0d98e28a07e287a81ab8171dc09

Monotone-Revision: 2c8c5a98bffe88fbe33a7c879bc06a01553833bc

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-08-01T18:54:52
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2007-08-01 18:54:52 +00:00
parent 91df5632b7
commit c8567af7f1
2 changed files with 196 additions and 130 deletions

View File

@ -24,14 +24,19 @@
#import <Foundation/NSObject.h> #import <Foundation/NSObject.h>
#include <NGObjWeb/WOContext.h>
/* /*
UIxMailRenderingContext UIxMailRenderingContext
The rendering context is used to track nesting of mail part viewers. The rendering context is used to track nesting of mail part viewers.
*/ */
@class NSData, NSArray, NSDictionary; @class NSArray;
@class WOContext, WOComponent; @class NSData;
@class NSDictionary;
@class WOComponent;
@interface UIxMailRenderingContext : NSObject @interface UIxMailRenderingContext : NSObject
{ {
@ -47,31 +52,29 @@
WOComponent *htmlViewer; WOComponent *htmlViewer;
} }
- (id)initWithViewer:(WOComponent *)_viewer context:(WOContext *)_ctx; - (id) initWithViewer: (WOComponent *) _viewer
context: (WOContext *) _ctx;
/* state */ /* state */
- (void)reset; - (void) reset;
/* fetching */ /* fetching */
- (NSDictionary *)flatContents; - (NSDictionary *) flatContents;
- (NSData *)flatContentForPartPath:(NSArray *)_partPath; - (NSData *) flatContentForPartPath: (NSArray *) _partPath;
/* viewer components */ /* viewer components */
- (WOComponent *)viewerForBodyInfo:(id)_info; - (WOComponent *) viewerForBodyInfo: (id)_info;
@end @end
#include <NGObjWeb/WOContext.h>
@interface WOContext(UIxMailPart) @interface WOContext(UIxMailPart)
- (void)pushMailRenderingContext:(UIxMailRenderingContext *)_mctx; - (void) pushMailRenderingContext: (UIxMailRenderingContext *) _mctx;
- (UIxMailRenderingContext *)popMailRenderingContext; - (UIxMailRenderingContext *) popMailRenderingContext;
- (UIxMailRenderingContext *)mailRenderingContext; - (UIxMailRenderingContext *) mailRenderingContext;
@end @end

View File

@ -19,176 +19,236 @@
02111-1307, USA. 02111-1307, USA.
*/ */
#include "UIxMailRenderingContext.h" #import <Foundation/NSString.h>
#include <SoObjects/Mailer/SOGoMailObject.h>
#include <Foundation/NSString.h> #import <NGObjWeb/WOComponent.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSNull+misc.h>
#import <SoObjects/Mailer/SOGoMailObject.h>
#import "UIxMailRenderingContext.h"
@implementation UIxMailRenderingContext @implementation UIxMailRenderingContext
static BOOL showNamedTextAttachmentsInline = NO; static BOOL showNamedTextAttachmentsInline = NO;
- (id)initWithViewer:(WOComponent *)_viewer context:(WOContext *)_ctx { - (id) initWithViewer: (WOComponent *) _viewer
if ((self = [super init])) { context: (WOContext *) _ctx
self->viewer = _viewer; {
self->context = _ctx; if ((self = [super init]))
} {
viewer = _viewer;
context = _ctx;
}
return self; return self;
} }
- (id)init {
return [self initWithViewer:nil context:nil]; - (id) init
{
return [self initWithViewer: nil context: nil];
} }
- (void)dealloc { - (void) dealloc
[self->iCalViewer release]; {
[self->htmlViewer release]; [flatContents release];
[self->textViewer release]; [iCalViewer release];
[self->imageViewer release]; [htmlViewer release];
[self->linkViewer release]; [textViewer release];
[self->messageViewer release]; [imageViewer release];
[linkViewer release];
[messageViewer release];
[super dealloc]; [super dealloc];
} }
/* resetting state */ - (void) reset
{
[flatContents release];
[iCalViewer release];
[htmlViewer release];
[textViewer release];
[imageViewer release];
[linkViewer release];
[messageViewer release];
- (void)reset { flatContents = nil;
[self->flatContents release]; self->flatContents = nil; iCalViewer = nil;
[self->textViewer release]; self->textViewer = nil; textViewer = nil;
[self->htmlViewer release]; self->htmlViewer = nil; imageViewer = nil;
[self->imageViewer release]; self->imageViewer = nil; htmlViewer = nil;
[self->linkViewer release]; self->linkViewer = nil; linkViewer = nil;
[self->messageViewer release]; self->messageViewer = nil; messageViewer = nil;
[self->iCalViewer release]; self->iCalViewer = nil;
} }
/* fetching */ /* fetching */
- (NSDictionary *)flatContents { - (NSDictionary *) flatContents
if (self->flatContents != nil) {
return [self->flatContents isNotNull] ? self->flatContents : nil; if (!flatContents)
{
self->flatContents = flatContents = [[viewer clientObject] fetchPlainTextParts];
[[[self->viewer clientObject] fetchPlainTextParts] retain]; [flatContents retain];
[self debugWithFormat:@"CON: %@", self->flatContents]; // [self debugWithFormat:@"CON: %@", flatContents];
return self->flatContents; }
return flatContents;
} }
- (NSData *)flatContentForPartPath:(NSArray *)_partPath { - (NSData *) flatContentForPartPath: (NSArray *) _partPath
{
NSString *pid; NSString *pid;
pid = _partPath ? [_partPath componentsJoinedByString:@"."] : @""; pid = _partPath ? [_partPath componentsJoinedByString:@"."] : @"";
return [[self flatContents] objectForKey:pid]; return [[self flatContents] objectForKey:pid];
} }
/* viewer components */ /* viewer components */
- (WOComponent *)mixedViewer { - (WOComponent *) mixedViewer
{
/* Note: we cannot cache the multipart viewers, because it can be nested */ /* Note: we cannot cache the multipart viewers, because it can be nested */
return [self->viewer pageWithName:@"UIxMailPartMixedViewer"]; return [viewer pageWithName: @"UIxMailPartMixedViewer"];
} }
- (WOComponent *)signedViewer { - (WOComponent *) signedViewer
{
/* Note: we cannot cache the multipart viewers, because it can be nested */ /* Note: we cannot cache the multipart viewers, because it can be nested */
// TODO: temporary workaround (treat it like a plain mixed part) // TODO: temporary workaround (treat it like a plain mixed part)
return [self mixedViewer]; return [self mixedViewer];
} }
- (WOComponent *)alternativeViewer { - (WOComponent *) alternativeViewer
{
/* Note: we cannot cache the multipart viewers, because it can be nested */ /* Note: we cannot cache the multipart viewers, because it can be nested */
return [self->viewer pageWithName:@"UIxMailPartAlternativeViewer"]; return [viewer pageWithName: @"UIxMailPartAlternativeViewer"];
} }
- (WOComponent *)textViewer { - (WOComponent *) textViewer
if (self->textViewer == nil) { {
self->textViewer = if (!textViewer)
[[self->viewer pageWithName:@"UIxMailPartTextViewer"] retain]; {
} textViewer = [viewer pageWithName: @"UIxMailPartTextViewer"];
return self->textViewer; [textViewer retain];
}
return textViewer;
} }
- (WOComponent *)imageViewer { - (WOComponent *) imageViewer
if (self->imageViewer == nil) { {
self->imageViewer = if (!imageViewer)
[[self->viewer pageWithName:@"UIxMailPartImageViewer"] retain]; {
} imageViewer = [viewer pageWithName: @"UIxMailPartImageViewer"];
return self->imageViewer; [imageViewer retain];
}
return imageViewer;
} }
- (WOComponent *)linkViewer { - (WOComponent *) linkViewer
if (self->linkViewer == nil) { {
self->linkViewer = if (!linkViewer)
[[self->viewer pageWithName:@"UIxMailPartLinkViewer"] retain]; {
} linkViewer = [viewer pageWithName: @"UIxMailPartLinkViewer"];
return self->linkViewer; [linkViewer retain];
}
return linkViewer;
} }
- (WOComponent *)htmlViewer { - (WOComponent *) htmlViewer
if (self->htmlViewer == nil) { {
self->htmlViewer = if (!htmlViewer)
[[self->viewer pageWithName:@"UIxMailPartHTMLViewer"] retain]; {
} htmlViewer = [viewer pageWithName: @"UIxMailPartHTMLViewer"];
return self->htmlViewer; [htmlViewer retain];
}
return htmlViewer;
} }
- (WOComponent *)messageViewer { - (WOComponent *) messageViewer
if (self->messageViewer == nil) { {
self->messageViewer = if (!messageViewer)
[[self->viewer pageWithName:@"UIxMailPartMessageViewer"] retain]; {
} messageViewer = [viewer pageWithName: @"UIxMailPartMessageViewer"];
return self->messageViewer; [messageViewer retain];
}
return messageViewer;
} }
- (WOComponent *)iCalViewer { - (WOComponent *) iCalViewer
if (self->iCalViewer == nil) { {
self->iCalViewer = if (!iCalViewer)
[[self->viewer pageWithName:@"UIxMailPartICalViewer"] retain]; {
} iCalViewer = [viewer pageWithName: @"UIxMailPartICalViewer"];
return self->iCalViewer; [iCalViewer retain];
}
return iCalViewer;
} }
/* Kolab viewers */ /* Kolab viewers */
- (WOComponent *)kolabContactViewer { - (WOComponent *) kolabContactViewer
return [self->viewer pageWithName:@"UIxKolabPartContactViewer"]; {
} return [viewer pageWithName: @"UIxKolabPartContactViewer"];
- (WOComponent *)kolabEventViewer {
return [self->viewer pageWithName:@"UIxKolabPartEventViewer"];
}
- (WOComponent *)kolabTodoViewer {
return [self->viewer pageWithName:@"UIxKolabPartTodoViewer"];
} }
- (WOComponent *)kolabNoteViewer { - (WOComponent *) kolabEventViewer
{
return [viewer pageWithName: @"UIxKolabPartEventViewer"];
}
- (WOComponent *) kolabTodoViewer
{
return [viewer pageWithName: @"UIxKolabPartTodoViewer"];
}
- (WOComponent *) kolabNoteViewer
{
return [self textViewer]; // TODO return [self textViewer]; // TODO
} }
- (WOComponent *)kolabJournalViewer {
- (WOComponent *) kolabJournalViewer
{
return [self textViewer]; // TODO return [self textViewer]; // TODO
} }
- (WOComponent *)kolabDistributionListViewer {
- (WOComponent *) kolabDistributionListViewer
{
return [self textViewer]; // TODO return [self textViewer]; // TODO
} }
/* main viewer selection */ /* main viewer selection */
- (WOComponent *)viewerForBodyInfo:(id)_info { - (WOComponent *) viewerForBodyInfo: (id) _info
{
NSString *mt, *st; NSString *mt, *st;
mt = [[_info valueForKey:@"type"] lowercaseString]; mt = [[_info valueForKey:@"type"] lowercaseString];
st = [[_info valueForKey:@"subtype"] lowercaseString]; st = [[_info valueForKey:@"subtype"] lowercaseString];
if ([mt isEqualToString:@"multipart"]) { if ([mt isEqualToString:@"multipart"])
if ([st isEqualToString:@"mixed"]) {
return [self mixedViewer]; if ([st isEqualToString:@"mixed"])
else if ([st isEqualToString:@"signed"]) return [self mixedViewer];
return [self signedViewer]; else if ([st isEqualToString:@"signed"])
else if ([st isEqualToString:@"alternative"] return [self signedViewer];
else if ([st isEqualToString:@"alternative"]
|| [st isEqualToString:@"related"]) || [st isEqualToString:@"related"])
return [self alternativeViewer]; return [self alternativeViewer];
if ([st isEqualToString:@"report"]) if ([st isEqualToString:@"report"])
/* this is used by mail-delivery reports */ /* this is used by mail-delivery reports */
return [self mixedViewer]; return [self mixedViewer];
} }
else if ([mt isEqualToString:@"text"]) { else if ([mt isEqualToString:@"text"])
{
/* /*
Note: in the _info dictionary we do not get the content-disposition Note: in the _info dictionary we do not get the content-disposition
information (inline vs attachment). Our hack is to check for the information (inline vs attachment). Our hack is to check for the
@ -236,37 +296,40 @@ static BOOL showNamedTextAttachmentsInline = NO;
return [self linkViewer]; return [self linkViewer];
} }
if ([mt isEqualToString:@"application"]) { if ([mt isEqualToString:@"application"])
// octet-stream (generate download link?, autodetect type?) {
// octet-stream (generate download link?, autodetect type?)
if ([st hasPrefix:@"x-vnd.kolab."]) { if ([st hasPrefix:@"x-vnd.kolab."])
if ([st isEqualToString:@"x-vnd.kolab.contact"]) {
return [self kolabContactViewer]; if ([st isEqualToString:@"x-vnd.kolab.contact"])
if ([st isEqualToString:@"x-vnd.kolab.event"]) return [self kolabContactViewer];
return [self kolabEventViewer]; if ([st isEqualToString:@"x-vnd.kolab.event"])
if ([st isEqualToString:@"x-vnd.kolab.task"]) return [self kolabEventViewer];
return [self kolabTodoViewer]; if ([st isEqualToString:@"x-vnd.kolab.task"])
if ([st isEqualToString:@"x-vnd.kolab.note"]) return [self kolabTodoViewer];
return [self kolabNoteViewer]; if ([st isEqualToString:@"x-vnd.kolab.note"])
if ([st isEqualToString:@"x-vnd.kolab.journal"]) return [self kolabNoteViewer];
return [self kolabJournalViewer]; if ([st isEqualToString:@"x-vnd.kolab.journal"])
if ([st isEqualToString:@"x-vnd.kolab.contact.distlist"]) return [self kolabJournalViewer];
return [self kolabDistributionListViewer]; if ([st isEqualToString:@"x-vnd.kolab.contact.distlist"])
return [self kolabDistributionListViewer];
[self errorWithFormat:@"found no viewer for Kolab type: %@/%@", mt, st]; [self errorWithFormat:@"found no viewer for Kolab type: %@/%@", mt, st];
return [self linkViewer]; return [self linkViewer];
} }
#if 0 /* the link viewer looks better than plain text ;-) */ #if 0 /* the link viewer looks better than plain text ;-) */
if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer
return [self textViewer]; return [self textViewer];
#endif #endif
} }
// TODO: always fallback to octet viewer?! // TODO: always fallback to octet viewer?!
#if 1 #if 1
[self errorWithFormat:@"found no viewer for MIME type: %@/%@", mt, st]; [self errorWithFormat:@"found no viewer for MIME type: %@/%@", mt, st];
#endif #endif
return [self linkViewer]; return [self linkViewer];
} }