2 Copyright (C) 2004-2005 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #include "UIxMailRenderingContext.h"
23 #include <SoObjects/Mailer/SOGoMailObject.h>
26 @implementation UIxMailRenderingContext
28 static BOOL showNamedTextAttachmentsInline = NO;
30 - (id)initWithViewer:(WOComponent *)_viewer context:(WOContext *)_ctx {
31 if ((self = [super init])) {
32 self->viewer = _viewer;
38 return [self initWithViewer:nil context:nil];
42 [self->iCalViewer release];
43 [self->htmlViewer release];
44 [self->textViewer release];
45 [self->imageViewer release];
46 [self->linkViewer release];
47 [self->messageViewer release];
54 [self->flatContents release]; self->flatContents = nil;
55 [self->textViewer release]; self->textViewer = nil;
56 [self->htmlViewer release]; self->htmlViewer = nil;
57 [self->imageViewer release]; self->imageViewer = nil;
58 [self->linkViewer release]; self->linkViewer = nil;
59 [self->messageViewer release]; self->messageViewer = nil;
60 [self->iCalViewer release]; self->iCalViewer = nil;
65 - (NSDictionary *)flatContents {
66 if (self->flatContents != nil)
67 return [self->flatContents isNotNull] ? self->flatContents : nil;
70 [[[self->viewer clientObject] fetchPlainTextParts] retain];
71 [self debugWithFormat:@"CON: %@", self->flatContents];
72 return self->flatContents;
75 - (NSData *)flatContentForPartPath:(NSArray *)_partPath {
78 pid = _partPath ? [_partPath componentsJoinedByString:@"."] : @"";
79 return [[self flatContents] objectForKey:pid];
82 /* viewer components */
84 - (WOComponent *)mixedViewer {
85 /* Note: we cannot cache the multipart viewers, because it can be nested */
86 return [self->viewer pageWithName:@"UIxMailPartMixedViewer"];
89 - (WOComponent *)signedViewer {
90 /* Note: we cannot cache the multipart viewers, because it can be nested */
91 // TODO: temporary workaround (treat it like a plain mixed part)
92 return [self mixedViewer];
95 - (WOComponent *)alternativeViewer {
96 /* Note: we cannot cache the multipart viewers, because it can be nested */
97 return [self->viewer pageWithName:@"UIxMailPartAlternativeViewer"];
100 - (WOComponent *)textViewer {
101 if (self->textViewer == nil) {
103 [[self->viewer pageWithName:@"UIxMailPartTextViewer"] retain];
105 return self->textViewer;
108 - (WOComponent *)imageViewer {
109 if (self->imageViewer == nil) {
111 [[self->viewer pageWithName:@"UIxMailPartImageViewer"] retain];
113 return self->imageViewer;
116 - (WOComponent *)linkViewer {
117 if (self->linkViewer == nil) {
119 [[self->viewer pageWithName:@"UIxMailPartLinkViewer"] retain];
121 return self->linkViewer;
124 - (WOComponent *)htmlViewer {
125 if (self->htmlViewer == nil) {
127 [[self->viewer pageWithName:@"UIxMailPartHTMLViewer"] retain];
129 return self->htmlViewer;
132 - (WOComponent *)messageViewer {
133 if (self->messageViewer == nil) {
134 self->messageViewer =
135 [[self->viewer pageWithName:@"UIxMailPartMessageViewer"] retain];
137 return self->messageViewer;
140 - (WOComponent *)iCalViewer {
141 if (self->iCalViewer == nil) {
143 [[self->viewer pageWithName:@"UIxMailPartICalViewer"] retain];
145 return self->iCalViewer;
148 - (WOComponent *)viewerForBodyInfo:(id)_info {
151 mt = [[_info valueForKey:@"type"] lowercaseString];
152 st = [[_info valueForKey:@"subtype"] lowercaseString];
154 if ([mt isEqualToString:@"multipart"]) {
155 if ([st isEqualToString:@"mixed"])
156 return [self mixedViewer];
157 if ([st isEqualToString:@"signed"])
158 return [self signedViewer];
159 if ([st isEqualToString:@"alternative"])
160 return [self alternativeViewer];
162 if ([st isEqualToString:@"report"])
163 /* this is used by mail-delivery reports */
164 return [self mixedViewer];
166 else if ([mt isEqualToString:@"text"]) {
168 Note: in the _info dictionary we do not get the content-disposition
169 information (inline vs attachment). Our hack is to check for the
172 if ([st isEqualToString:@"plain"] || [st isEqualToString:@"html"]) {
173 if (!showNamedTextAttachmentsInline) {
176 n = [[_info objectForKey:@"parameterList"] objectForKey:@"name"];
177 if ([n isNotNull] && [n length] > 0)
178 return [self linkViewer];
181 return [st isEqualToString:@"html"]
182 ? [self htmlViewer] : [self textViewer];
185 if ([st isEqualToString:@"calendar"])
186 return [self iCalViewer];
188 else if ([mt isEqualToString:@"image"])
189 return [self imageViewer];
190 else if ([mt isEqualToString:@"message"] && [st isEqualToString:@"rfc822"])
191 return [self messageViewer];
192 else if ([mt isEqualToString:@"message"] &&
193 [st isEqualToString:@"delivery-status"]) {
195 Content-Description: Delivery error report
196 Content-Type: message/delivery-status
198 Reporting-MTA: dns; mail.opengroupware.org
199 Arrival-Date: Mon, 18 Jul 2005 12:08:43 +0200 (CEST)
201 Final-Recipient: rfc822; ioioi@plop.com
204 Diagnostic-Code: X-Postfix; host plop.com[64.39.31.55] said: 550 5.7.1
205 <ioioi@plop.com>... Relaying denied
207 // Note: we cannot use the text viewer because the body is not pre-fetched
208 return [self linkViewer];
210 else if ([mt isEqualToString:@"application"]) {
211 // octet-stream (generate download link?, autodetect type?)
213 #if 0 /* the link viewer looks better than plain text ;-) */
214 if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer
215 return [self textViewer];
219 // TODO: always fallback to octet viewer?!
221 [self errorWithFormat:@"found no viewer for MIME type: %@/%@", mt, st];
223 return [self linkViewer];
228 - (BOOL)isDebuggingEnabled {
232 @end /* UIxMailRenderingContext */
235 @implementation WOContext(UIxMailPart)
237 static NSString *MRK = @"UIxMailRenderingContext";
239 - (void)pushMailRenderingContext:(UIxMailRenderingContext *)_mctx {
240 [self setObject:_mctx forKey:MRK];
242 - (UIxMailRenderingContext *)popMailRenderingContext {
243 UIxMailRenderingContext *mctx;
245 if ((mctx = [self objectForKey:MRK]) == nil)
248 mctx = [[mctx retain] autorelease];
249 [self removeObjectForKey:MRK];
252 - (UIxMailRenderingContext *)mailRenderingContext {
253 return [self objectForKey:MRK];
256 @end /* WOContext(UIxMailPart) */