]> err.no Git - sope/blob - sope-mime/NGMime/NGMimeBodyGenerator.m
major change to MIME generation, a lot of cleanups
[sope] / sope-mime / NGMime / NGMimeBodyGenerator.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
6   SOPE 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
9   later version.
10
11   SOPE 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.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with SOPE; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #include "NGMimeBodyGenerator.h"
23 #include "NGMimePartGenerator.h"
24 #include "common.h"
25
26 @implementation NGMimeBodyGenerator
27
28 static BOOL debugOn = NO;
29
30 + (int)version {
31   return 2;
32 }
33 + (void)initialize {
34   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
35   
36   debugOn = [ud boolForKey:@"NGMimeGeneratorDebugEnabled"];
37   if (debugOn)
38     NSLog(@"WARNING[%@]: NGMimeGeneratorDebugEnabled is enabled!", self);
39 }
40
41 /* generate data for body */
42
43 - (NSData *)generateBodyOfPart:(id<NGMimePart>)_part
44   additionalHeaders:(NGMutableHashMap *)_addHeaders
45   delegate:(id)_delegate
46 {
47   NSData *data, *input;
48   
49   input = [_part body];
50   data  = [self encodeData:input
51                 forPart:_part
52                 additionalHeaders:_addHeaders];
53   if (debugOn) {
54     [self debugWithFormat:@"encoded %d bytes to %d bytes (same=%s, class=%@)",
55           [input length], [data length], 
56           input == data ? "yes" : "no", 
57           NSStringFromClass([data class])];
58   }
59   return data;
60 }
61
62 /* properly encode data for transfer (eg to 7bit for email) */
63
64 - (NSData *)encodeData:(NSData *)_data
65   forPart:(id<NGMimePart>)_part
66   additionalHeaders:(NGMutableHashMap *)_addHeaders
67 {
68   return _data;
69 }
70
71 /* manage data storage */
72
73 - (void)setUseMimeData:(BOOL)_b {
74   self->useMimeData = _b;
75 }
76 - (BOOL)useMimeData {
77   return self->useMimeData;
78 }
79
80 /* debugging */
81
82 - (BOOL)isDebuggingEnabled {
83   return debugOn;
84 }
85
86 @end /* NGMimeBodyGenerator */
87
88
89 @implementation NGMimeTextBodyGenerator
90
91 + (int)version {
92   return 2;
93 }
94 + (void)initialize {
95   NSAssert2([super version] == 2,
96             @"invalid superclass (%@) version %i !",
97             NSStringFromClass([self superclass]), [super version]);
98 }
99
100 - (NSData *)generateBodyOfPart:(id<NGMimePart>)_part
101   additionalHeaders:(NGMutableHashMap *)_addHeaders
102   delegate:(id)_delegate
103 {
104   NSStringEncoding encoding;
105   NSData           *data;
106   id               body;
107   
108   encoding = [NSString defaultCStringEncoding];
109   body = [_part body];
110   
111   if ([body isKindOfClass:[NSString class]]) {
112     // TODO: deal with charset in content-type!
113     data = [body dataUsingEncoding:encoding];
114   }
115   else
116     data = body;
117 #if 0  
118   else {
119     NSLog(@"WARNING: textBodyGenerator expect that body is"
120           @" kind of class NSString");
121   }
122 #endif  
123   if (data == nil) {
124     NSLog(@"WARNING(%s): generate empty body", __PRETTY_FUNCTION__);
125     data = [NSData data];
126   }
127   return [self encodeData:data forPart:_part additionalHeaders:_addHeaders];
128 }
129
130 @end /* NGMimeTextBodyGenerator */
131
132
133 @implementation NGMimeRfc822BodyGenerator
134
135 + (int)version {
136   return 2;
137 }
138 + (void)initialize {
139   NSAssert2([super version] == 2,
140             @"invalid superclass (%@) version %i !",
141             NSStringFromClass([self superclass]), [super version]);
142 }
143
144 - (id<NGMimePartGenerator>)generatorForPart:(id<NGMimePart>)_part {
145   id g;
146   
147   g = [[[NGMimePartGenerator alloc] init] autorelease];
148   [g setUseMimeData:self->useMimeData];
149   return g;
150 }
151
152 - (NSData *)generateBodyOfPart:(id<NGMimePart>)_part
153   additionalHeaders:(NGMutableHashMap *)_addHeaders
154   delegate:(id)_delegate
155 {
156   NSData              *data;
157   NGMimePartGenerator *gen;
158   
159   gen = (NGMimePartGenerator *)[self generatorForPart:_part];
160   [gen setDelegate:_delegate];
161   data = [gen generateMimeFromPart:[_part body]];
162   return data;
163 }
164
165 @end /* NGMimeRfc822BodyGenerator */