summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/tests/readmsg.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/tests/readmsg.c') (more/less context) (show whitespace changes)
-rw-r--r--kmicromail/libetpan/tests/readmsg.c355
1 files changed, 355 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tests/readmsg.c b/kmicromail/libetpan/tests/readmsg.c
new file mode 100644
index 0000000..822c93c
--- a/dev/null
+++ b/kmicromail/libetpan/tests/readmsg.c
@@ -0,0 +1,355 @@
1#include <unistd.h>
2#include <string.h>
3#include <stdlib.h>
4
5#include <libetpan/charconv.h>
6#include <libetpan/libetpan.h>
7
8#include "option-parser.h"
9#include "readmsg-common.h"
10
11
12/* render message */
13
14static int etpan_render_mime(FILE * f, mailmessage * msg_info,
15 struct mailmime * mime)
16{
17 int r;
18 clistiter * cur;
19 int col;
20 int text;
21 int show;
22 struct mailmime_single_fields fields;
23 int res;
24
25 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
26 mime->mm_content_type);
27
28 text = etpan_mime_is_text(mime);
29
30 r = show_part_info(f, &fields, mime->mm_content_type);
31 if (r != NO_ERROR) {
32 res = r;
33 goto err;
34 }
35
36 switch(mime->mm_type) {
37 case MAILMIME_SINGLE:
38 show = 0;
39 if (text)
40 show = 1;
41
42 if (show) {
43 char * data;
44 size_t len;
45 char * converted;
46 size_t converted_len;
47 char * source_charset;
48 size_t write_len;
49
50 /* viewable part */
51
52 r = etpan_fetch_message(msg_info, mime,
53 &fields, &data, &len);
54 if (r != NO_ERROR) {
55 res = r;
56 goto err;
57 }
58
59 source_charset = fields.fld_content_charset;
60 if (source_charset == NULL)
61 source_charset = DEST_CHARSET;
62
63 r = charconv_buffer(source_charset, DEST_CHARSET,
64 data, len, &converted, &converted_len);
65 if (r != MAIL_CHARCONV_NO_ERROR) {
66
67 r = fprintf(f, "[ error converting charset from %s to %s ]\n",
68 source_charset, DEST_CHARSET);
69 if (r < 0) {
70 res = ERROR_FILE;
71 goto err;
72 }
73
74 write_len = fwrite(data, 1, len, f);
75 if (write_len != len) {
76 mailmime_decoded_part_free(data);
77 res = r;
78 goto err;
79 }
80 }
81 else {
82 write_len = fwrite(converted, 1, converted_len, f);
83 if (write_len != len) {
84 charconv_buffer_free(converted);
85 mailmime_decoded_part_free(data);
86 res = r;
87 goto err;
88 }
89
90 charconv_buffer_free(converted);
91 }
92
93 write_len = fwrite("\r\n\r\n", 1, 4, f);
94 if (write_len < 4) {
95 mailmime_decoded_part_free(data);
96 res = ERROR_FILE;
97 goto err;
98 }
99
100 mailmime_decoded_part_free(data);
101 }
102 else {
103 /* not viewable part */
104
105 r = fprintf(f, " (not shown)\n\n");
106 if (r < 0) {
107 res = ERROR_FILE;
108 goto err;
109 }
110 }
111
112 break;
113
114 case MAILMIME_MULTIPLE:
115
116 if (strcasecmp(mime->mm_content_type->ct_subtype, "alternative") == 0) {
117 struct mailmime * prefered_body;
118 int prefered_score;
119
120 /* case of multiple/alternative */
121
122 /*
123 we choose the better part,
124 alternative preference :
125
126 text/plain => score 3
127 text/xxx => score 2
128 other => score 1
129 */
130
131 prefered_body = NULL;
132 prefered_score = 0;
133
134 for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ;
135 cur != NULL ; cur = clist_next(cur)) {
136 struct mailmime * submime;
137 int score;
138
139 score = 1;
140 submime = clist_content(cur);
141 if (etpan_mime_is_text(submime))
142 score = 2;
143
144 if (submime->mm_content_type != NULL) {
145 if (strcasecmp(submime->mm_content_type->ct_subtype, "plain") == 0)
146 score = 3;
147 }
148
149 if (score > prefered_score) {
150 prefered_score = score;
151 prefered_body = submime;
152 }
153 }
154
155 if (prefered_body != NULL) {
156 r = etpan_render_mime(f, msg_info, prefered_body);
157 if (r != NO_ERROR) {
158 res = r;
159 goto err;
160 }
161 }
162 }
163 else {
164 for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ;
165 cur != NULL ; cur = clist_next(cur)) {
166
167 r = etpan_render_mime(f, msg_info, clist_content(cur));
168 if (r != NO_ERROR) {
169 res = r;
170 goto err;
171 }
172 }
173 }
174
175 break;
176
177 case MAILMIME_MESSAGE:
178
179 if (mime->mm_data.mm_message.mm_fields != NULL) {
180 struct mailimf_fields * fields;
181
182 if (msg_info != NULL) {
183 fields = fetch_fields(msg_info, mime);
184 if (fields == NULL) {
185 res = ERROR_FETCH;
186 goto err;
187 }
188
189 col = 0;
190 r = fields_write(f, &col, fields);
191 if (r != NO_ERROR) {
192 mailimf_fields_free(fields);
193 res = r;
194 goto err;
195 }
196
197 mailimf_fields_free(fields);
198 }
199 else {
200 col = 0;
201 r = fields_write(f, &col, mime->mm_data.mm_message.mm_fields);
202 if (r != NO_ERROR) {
203 res = r;
204 goto err;
205 }
206 }
207
208 r = fprintf(f, "\r\n");
209 if (r < 0) {
210 res = ERROR_FILE;
211 goto err;
212 }
213 }
214
215 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
216 r = etpan_render_mime(f, msg_info, mime->mm_data.mm_message.mm_msg_mime);
217 if (r != NO_ERROR) {
218 res = r;
219 goto err;
220 }
221 }
222
223 break;
224 }
225
226 return NO_ERROR;
227
228 err:
229 return res;
230}
231
232
233int main(int argc, char ** argv)
234{
235 int r;
236 int driver;
237 char * server;
238 int port;
239 int connection_type;
240 char * user;
241 char * password;
242 int auth_type;
243 char * path;
244 char * cache_directory;
245 char * flags_directory;
246 struct mailstorage * storage;
247 int cached;
248 struct mailfolder * folder;
249
250 /* get options */
251
252 r = parse_options(argc, argv,
253 &driver, &server, &port, &connection_type,
254 &user, &password, &auth_type,
255 &path, &cache_directory, &flags_directory);
256
257 cached = (cache_directory != NULL);
258
259 /* build the storage structure */
260
261 storage = mailstorage_new(NULL);
262 if (storage == NULL) {
263 printf("error initializing storage\n");
264 goto free_opt;
265 }
266
267 r = init_storage(storage, driver, server, port, connection_type,
268 user, password, auth_type, path, cache_directory, flags_directory);
269 if (r != MAIL_NO_ERROR) {
270 printf("error initializing storage\n");
271 goto free_opt;
272 }
273
274 /* get the folder structure */
275
276 folder = mailfolder_new(storage, path, NULL);
277 if (folder == NULL) {
278 printf("error initializing folder\n");
279 goto free_storage;
280 }
281
282 r = mailfolder_connect(folder);
283 if (r != MAIL_NO_ERROR) {
284 printf("error initializing folder\n");
285 goto free_folder;
286 }
287
288 while (optind < argc) {
289 mailmessage * msg;
290 uint32_t msg_num;
291 struct mailmime * mime;
292
293 msg_num = strtoul(argv[optind], NULL, 10);
294
295 r = mailsession_get_message(folder->fld_session, msg_num, &msg);
296 if (r != MAIL_NO_ERROR) {
297 printf("** message %i not found ** - %s\n", msg_num,
298 maildriver_strerror(r));
299 optind ++;
300 continue;
301 }
302
303 r = mailmessage_get_bodystructure(msg, &mime);
304 if (r != MAIL_NO_ERROR) {
305 printf("** message %i not found - %s **\n", msg_num,
306 maildriver_strerror(r));
307 mailmessage_free(msg);
308 optind ++;
309 continue;
310 }
311
312 r = etpan_render_mime(stdout, msg, mime);
313
314 mailmessage_free(msg);
315
316 optind ++;
317 }
318
319 mailfolder_free(folder);
320 mailstorage_free(storage);
321
322 if (server != NULL)
323 free(server);
324 if (user != NULL)
325 free(user);
326 if (password != NULL)
327 free(password);
328 if (path != NULL)
329 free(path);
330 if (cache_directory != NULL)
331 free(cache_directory);
332 if (flags_directory != NULL)
333 free(flags_directory);
334
335 return 0;
336
337 free_folder:
338 mailfolder_free(folder);
339 free_storage:
340 mailstorage_free(storage);
341 free_opt:
342 if (server != NULL)
343 free(server);
344 if (user != NULL)
345 free(user);
346 if (password != NULL)
347 free(password);
348 if (path != NULL)
349 free(path);
350 if (cache_directory != NULL)
351 free(cache_directory);
352 if (flags_directory != NULL)
353 free(flags_directory);
354 return -1;
355}