]> err.no Git - sope/blob - sope-mime/NGMime/NGMimeBodyGenerator.m
updated framework version
[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   data     = nil;
111   
112   if ([body isKindOfClass:[NSString class]]) {
113     // TODO: deal with charset in content-type!
114     data = [body dataUsingEncoding:encoding];
115   }
116   else if ([body respondsToSelector:@selector(bytes)])
117     data = body;
118   else if ([body respondsToSelector:@selector(dataUsingEncoding:)])
119     data = [body dataUsingEncoding:encoding];
120   else if (body != nil) {
121     [self logWithFormat:@"ERROR: unexpected part body: %@", body];
122     return nil;
123   }
124   
125   if (data == nil) {
126     [self logWithFormat:@"WARNING(%s): generate empty body",
127             __PRETTY_FUNCTION__];
128     data = [NSData data];
129   }
130   return [self encodeData:data forPart:_part additionalHeaders:_addHeaders];
131 }
132
133 @end /* NGMimeTextBodyGenerator */
134
135
136 @implementation NGMimeRfc822BodyGenerator
137
138 + (int)version {
139   return 2;
140 }
141 + (void)initialize {
142   NSAssert2([super version] == 2,
143             @"invalid superclass (%@) version %i !",
144             NSStringFromClass([self superclass]), [super version]);
145 }
146
147 - (id<NGMimePartGenerator>)generatorForPart:(id<NGMimePart>)_part {
148   id g;
149   
150   g = [[[NGMimePartGenerator alloc] init] autorelease];
151   [g setUseMimeData:self->useMimeData];
152   return g;
153 }
154
155 - (NSData *)generateBodyOfPart:(id<NGMimePart>)_part
156   additionalHeaders:(NGMutableHashMap *)_addHeaders
157   delegate:(id)_delegate
158 {
159   NSData              *data;
160   NGMimePartGenerator *gen;
161   
162   gen = (NGMimePartGenerator *)[self generatorForPart:_part];
163   [gen setDelegate:_delegate];
164   data = [gen generateMimeFromPart:[_part body]];
165   return data;
166 }
167
168 @end /* NGMimeRfc822BodyGenerator */