author | alwin <alwin> | 2004-03-08 21:43:14 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-03-08 21:43:14 (UTC) |
commit | 25434cbbcd2d2473c9cd3d486cec7a96a6a6323e (patch) (unidiff) | |
tree | 31cfa6ceaebe0e2e1e0094e4905d05509e778364 /noncore/net/mail/libmailwrapper/generatemail.cpp | |
parent | f3f2b2b3389d62af0f1a3aabac87f6c3cf147379 (diff) | |
download | opie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.zip opie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.tar.gz opie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.tar.bz2 |
some required code restructuring in preparation of new features
Diffstat (limited to 'noncore/net/mail/libmailwrapper/generatemail.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/net/mail/libmailwrapper/generatemail.cpp | 454 |
1 files changed, 454 insertions, 0 deletions
diff --git a/noncore/net/mail/libmailwrapper/generatemail.cpp b/noncore/net/mail/libmailwrapper/generatemail.cpp new file mode 100644 index 0000000..9272d0c --- a/dev/null +++ b/noncore/net/mail/libmailwrapper/generatemail.cpp | |||
@@ -0,0 +1,454 @@ | |||
1 | #include "generatemail.h" | ||
2 | #include "mailwrapper.h" | ||
3 | |||
4 | #include <libetpan/libetpan.h> | ||
5 | |||
6 | #include <qt.h> | ||
7 | |||
8 | const char* Generatemail::USER_AGENT="OpieMail v0.5"; | ||
9 | |||
10 | Generatemail::Generatemail() | ||
11 | { | ||
12 | } | ||
13 | |||
14 | Generatemail::~Generatemail() | ||
15 | { | ||
16 | } | ||
17 | |||
18 | void Generatemail::addRcpts( clist *list, mailimf_address_list *addr_list ) { | ||
19 | clistiter *it, *it2; | ||
20 | |||
21 | for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) { | ||
22 | mailimf_address *addr; | ||
23 | addr = (mailimf_address *) it->data; | ||
24 | |||
25 | if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) { | ||
26 | esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL ); | ||
27 | } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) { | ||
28 | clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list; | ||
29 | for ( it2 = clist_begin( l ); it2; it2 = it2->next ) { | ||
30 | mailimf_mailbox *mbox; | ||
31 | mbox = (mailimf_mailbox *) it2->data; | ||
32 | esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL ); | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | } | ||
37 | |||
38 | char *Generatemail::getFrom( mailimf_field *ffrom) { | ||
39 | char *from = NULL; | ||
40 | if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM) | ||
41 | && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) { | ||
42 | clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list; | ||
43 | clistiter *it; | ||
44 | for ( it = clist_begin( cl ); it; it = it->next ) { | ||
45 | mailimf_mailbox *mb = (mailimf_mailbox *) it->data; | ||
46 | from = strdup( mb->mb_addr_spec ); | ||
47 | } | ||
48 | } | ||
49 | |||
50 | return from; | ||
51 | } | ||
52 | |||
53 | char *Generatemail::getFrom( mailmime *mail ) { | ||
54 | /* no need to delete - its just a pointer to structure content */ | ||
55 | mailimf_field *ffrom = 0; | ||
56 | ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM ); | ||
57 | return getFrom(ffrom); | ||
58 | } | ||
59 | |||
60 | mailimf_field *Generatemail::getField( mailimf_fields *fields, int type ) { | ||
61 | mailimf_field *field; | ||
62 | clistiter *it; | ||
63 | |||
64 | it = clist_begin( fields->fld_list ); | ||
65 | while ( it ) { | ||
66 | field = (mailimf_field *) it->data; | ||
67 | if ( field->fld_type == type ) { | ||
68 | return field; | ||
69 | } | ||
70 | it = it->next; | ||
71 | } | ||
72 | |||
73 | return NULL; | ||
74 | } | ||
75 | |||
76 | mailimf_address_list *Generatemail::parseAddresses(const QString&addr ) { | ||
77 | mailimf_address_list *addresses; | ||
78 | |||
79 | if ( addr.isEmpty() ) | ||
80 | return NULL; | ||
81 | |||
82 | addresses = mailimf_address_list_new_empty(); | ||
83 | |||
84 | bool literal_open = false; | ||
85 | unsigned int startpos = 0; | ||
86 | QStringList list; | ||
87 | QString s; | ||
88 | unsigned int i = 0; | ||
89 | for (; i < addr.length();++i) { | ||
90 | switch (addr[i]) { | ||
91 | case '\"': | ||
92 | literal_open = !literal_open; | ||
93 | break; | ||
94 | case ',': | ||
95 | if (!literal_open) { | ||
96 | s = addr.mid(startpos,i-startpos); | ||
97 | if (!s.isEmpty()) { | ||
98 | list.append(s); | ||
99 | qDebug("Appended %s",s.latin1()); | ||
100 | } | ||
101 | // !!!! this is a MUST BE! | ||
102 | startpos = ++i; | ||
103 | } | ||
104 | break; | ||
105 | default: | ||
106 | break; | ||
107 | } | ||
108 | } | ||
109 | s = addr.mid(startpos,i-startpos); | ||
110 | if (!s.isEmpty()) { | ||
111 | list.append(s); | ||
112 | qDebug("Appended %s",s.latin1()); | ||
113 | } | ||
114 | QStringList::Iterator it; | ||
115 | for ( it = list.begin(); it != list.end(); it++ ) { | ||
116 | int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() ); | ||
117 | if ( err != MAILIMF_NO_ERROR ) { | ||
118 | qDebug( "Error parsing" ); | ||
119 | qDebug( *it ); | ||
120 | } else { | ||
121 | qDebug( "Parse success! %s",(*it).latin1()); | ||
122 | } | ||
123 | } | ||
124 | return addresses; | ||
125 | } | ||
126 | |||
127 | mailmime *Generatemail::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) { | ||
128 | mailmime * filePart = 0; | ||
129 | mailmime_fields * fields = 0; | ||
130 | mailmime_content * content = 0; | ||
131 | mailmime_parameter * param = 0; | ||
132 | char*name = 0; | ||
133 | char*file = 0; | ||
134 | int err; | ||
135 | |||
136 | int pos = filename.findRev( '/' ); | ||
137 | |||
138 | if (filename.length()>0) { | ||
139 | QString tmp = filename.right( filename.length() - ( pos + 1 ) ); | ||
140 | name = strdup( tmp.latin1() ); // just filename | ||
141 | file = strdup( filename.latin1() ); // full name with path | ||
142 | } | ||
143 | |||
144 | int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT; | ||
145 | int mechanism = MAILMIME_MECHANISM_BASE64; | ||
146 | |||
147 | if ( mimetype.startsWith( "text/" ) ) { | ||
148 | param = mailmime_parameter_new( strdup( "charset" ), | ||
149 | strdup( "iso-8859-1" ) ); | ||
150 | mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE; | ||
151 | } | ||
152 | |||
153 | fields = mailmime_fields_new_filename( | ||
154 | disptype, name, | ||
155 | mechanism ); | ||
156 | content = mailmime_content_new_with_str( (char*)mimetype.latin1() ); | ||
157 | if (content!=0 && fields != 0) { | ||
158 | if (param) { | ||
159 | clist_append(content->ct_parameters,param); | ||
160 | param = 0; | ||
161 | } | ||
162 | if (filename.length()>0) { | ||
163 | QFileInfo f(filename); | ||
164 | param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1())); | ||
165 | clist_append(content->ct_parameters,param); | ||
166 | param = 0; | ||
167 | } | ||
168 | filePart = mailmime_new_empty( content, fields ); | ||
169 | } | ||
170 | if (filePart) { | ||
171 | if (filename.length()>0) { | ||
172 | err = mailmime_set_body_file( filePart, file ); | ||
173 | } else { | ||
174 | err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length()); | ||
175 | } | ||
176 | if (err != MAILIMF_NO_ERROR) { | ||
177 | qDebug("Error setting body with file %s",file); | ||
178 | mailmime_free( filePart ); | ||
179 | filePart = 0; | ||
180 | } | ||
181 | } | ||
182 | |||
183 | if (!filePart) { | ||
184 | if ( param != NULL ) { | ||
185 | mailmime_parameter_free( param ); | ||
186 | } | ||
187 | if (content) { | ||
188 | mailmime_content_free( content ); | ||
189 | } | ||
190 | if (fields) { | ||
191 | mailmime_fields_free( fields ); | ||
192 | } else { | ||
193 | if (name) { | ||
194 | free( name ); | ||
195 | } | ||
196 | if (file) { | ||
197 | free( file ); | ||
198 | } | ||
199 | } | ||
200 | } | ||
201 | return filePart; // Success :) | ||
202 | |||
203 | } | ||
204 | |||
205 | void Generatemail::addFileParts( mailmime *message,const QList<Attachment>&files ) { | ||
206 | const Attachment *it; | ||
207 | unsigned int count = files.count(); | ||
208 | qDebug("List contains %i values",count); | ||
209 | for ( unsigned int i = 0; i < count; ++i ) { | ||
210 | qDebug( "Adding file" ); | ||
211 | mailmime *filePart; | ||
212 | int err; | ||
213 | it = ((QList<Attachment>)files).at(i); | ||
214 | |||
215 | filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" ); | ||
216 | if ( filePart == NULL ) { | ||
217 | qDebug( "addFileParts: error adding file:" ); | ||
218 | qDebug( it->getFileName() ); | ||
219 | continue; | ||
220 | } | ||
221 | err = mailmime_smart_add_part( message, filePart ); | ||
222 | if ( err != MAILIMF_NO_ERROR ) { | ||
223 | mailmime_free( filePart ); | ||
224 | qDebug("error smart add"); | ||
225 | } | ||
226 | } | ||
227 | } | ||
228 | |||
229 | mailmime *Generatemail::buildTxtPart(const QString&str ) { | ||
230 | mailmime *txtPart; | ||
231 | mailmime_fields *fields; | ||
232 | mailmime_content *content; | ||
233 | mailmime_parameter *param; | ||
234 | int err; | ||
235 | |||
236 | param = mailmime_parameter_new( strdup( "charset" ), | ||
237 | strdup( "iso-8859-1" ) ); | ||
238 | if ( param == NULL ) | ||
239 | goto err_free; | ||
240 | |||
241 | content = mailmime_content_new_with_str( "text/plain" ); | ||
242 | if ( content == NULL ) | ||
243 | goto err_free_param; | ||
244 | |||
245 | err = clist_append( content->ct_parameters, param ); | ||
246 | if ( err != MAILIMF_NO_ERROR ) | ||
247 | goto err_free_content; | ||
248 | |||
249 | fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT); | ||
250 | if ( fields == NULL ) | ||
251 | goto err_free_content; | ||
252 | |||
253 | txtPart = mailmime_new_empty( content, fields ); | ||
254 | if ( txtPart == NULL ) | ||
255 | goto err_free_fields; | ||
256 | |||
257 | err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() ); | ||
258 | if ( err != MAILIMF_NO_ERROR ) | ||
259 | goto err_free_txtPart; | ||
260 | |||
261 | return txtPart; // Success :) | ||
262 | |||
263 | err_free_txtPart: | ||
264 | mailmime_free( txtPart ); | ||
265 | err_free_fields: | ||
266 | mailmime_fields_free( fields ); | ||
267 | err_free_content: | ||
268 | mailmime_content_free( content ); | ||
269 | err_free_param: | ||
270 | mailmime_parameter_free( param ); | ||
271 | err_free: | ||
272 | qDebug( "buildTxtPart - error" ); | ||
273 | |||
274 | return NULL; // Error :( | ||
275 | } | ||
276 | |||
277 | mailimf_mailbox *Generatemail::newMailbox(const QString&name, const QString&mail ) { | ||
278 | return mailimf_mailbox_new( strdup( name.latin1() ), | ||
279 | strdup( mail.latin1() ) ); | ||
280 | } | ||
281 | |||
282 | mailimf_fields *Generatemail::createImfFields(const Mail&mail ) { | ||
283 | mailimf_fields *fields; | ||
284 | mailimf_field *xmailer; | ||
285 | mailimf_mailbox *sender=0,*fromBox=0; | ||
286 | mailimf_mailbox_list *from=0; | ||
287 | mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0; | ||
288 | clist*in_reply_to = 0; | ||
289 | char *subject = strdup( mail.getSubject().latin1() ); | ||
290 | int err; | ||
291 | |||
292 | sender = newMailbox( mail.getName(), mail.getMail() ); | ||
293 | if ( sender == NULL ) | ||
294 | goto err_free; | ||
295 | |||
296 | fromBox = newMailbox( mail.getName(), mail.getMail() ); | ||
297 | if ( fromBox == NULL ) | ||
298 | goto err_free_sender; | ||
299 | |||
300 | from = mailimf_mailbox_list_new_empty(); | ||
301 | if ( from == NULL ) | ||
302 | goto err_free_fromBox; | ||
303 | |||
304 | err = mailimf_mailbox_list_add( from, fromBox ); | ||
305 | if ( err != MAILIMF_NO_ERROR ) | ||
306 | goto err_free_from; | ||
307 | |||
308 | to = parseAddresses( mail.getTo() ); | ||
309 | if ( to == NULL ) | ||
310 | goto err_free_from; | ||
311 | |||
312 | cc = parseAddresses( mail.getCC() ); | ||
313 | bcc = parseAddresses( mail.getBCC() ); | ||
314 | reply = parseAddresses( mail.getReply() ); | ||
315 | |||
316 | if (mail.Inreply().count()>0) { | ||
317 | in_reply_to = clist_new(); | ||
318 | char*c_reply; | ||
319 | unsigned int nsize = 0; | ||
320 | for (QStringList::ConstIterator it=mail.Inreply().begin(); | ||
321 | it != mail.Inreply().end();++it) { | ||
322 | if ((*it).isEmpty()) | ||
323 | continue; | ||
324 | QString h((*it)); | ||
325 | while (h.length()>0 && h[0]=='<') { | ||
326 | h.remove(0,1); | ||
327 | } | ||
328 | while (h.length()>0 && h[h.length()-1]=='>') { | ||
329 | h.remove(h.length()-1,1); | ||
330 | } | ||
331 | if (h.isEmpty()) continue; | ||
332 | nsize = strlen(h.latin1()); | ||
333 | /* yes! must be malloc! */ | ||
334 | c_reply = (char*)malloc( (nsize+1)*sizeof(char)); | ||
335 | memset(c_reply,0,nsize+1); | ||
336 | memcpy(c_reply,h.latin1(),nsize); | ||
337 | clist_append(in_reply_to,c_reply); | ||
338 | qDebug("In reply to: %s",c_reply); | ||
339 | } | ||
340 | } | ||
341 | |||
342 | fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc, | ||
343 | in_reply_to, NULL, subject ); | ||
344 | if ( fields == NULL ) | ||
345 | goto err_free_reply; | ||
346 | |||
347 | xmailer = mailimf_field_new_custom( strdup( "User-Agent" ), | ||
348 | strdup( USER_AGENT ) ); | ||
349 | if ( xmailer == NULL ) | ||
350 | goto err_free_fields; | ||
351 | |||
352 | err = mailimf_fields_add( fields, xmailer ); | ||
353 | if ( err != MAILIMF_NO_ERROR ) | ||
354 | goto err_free_xmailer; | ||
355 | |||
356 | return fields; // Success :) | ||
357 | |||
358 | err_free_xmailer: | ||
359 | if (xmailer) | ||
360 | mailimf_field_free( xmailer ); | ||
361 | err_free_fields: | ||
362 | if (fields) | ||
363 | mailimf_fields_free( fields ); | ||
364 | err_free_reply: | ||
365 | if (reply) | ||
366 | mailimf_address_list_free( reply ); | ||
367 | if (bcc) | ||
368 | mailimf_address_list_free( bcc ); | ||
369 | if (cc) | ||
370 | mailimf_address_list_free( cc ); | ||
371 | if (to) | ||
372 | mailimf_address_list_free( to ); | ||
373 | err_free_from: | ||
374 | if (from) | ||
375 | mailimf_mailbox_list_free( from ); | ||
376 | err_free_fromBox: | ||
377 | mailimf_mailbox_free( fromBox ); | ||
378 | err_free_sender: | ||
379 | if (sender) | ||
380 | mailimf_mailbox_free( sender ); | ||
381 | err_free: | ||
382 | if (subject) | ||
383 | free( subject ); | ||
384 | qDebug( "createImfFields - error" ); | ||
385 | |||
386 | return NULL; // Error :( | ||
387 | } | ||
388 | |||
389 | mailmime *Generatemail::createMimeMail(const Mail &mail ) { | ||
390 | mailmime *message, *txtPart; | ||
391 | mailimf_fields *fields; | ||
392 | int err; | ||
393 | |||
394 | fields = createImfFields( mail ); | ||
395 | if ( fields == NULL ) | ||
396 | goto err_free; | ||
397 | |||
398 | message = mailmime_new_message_data( NULL ); | ||
399 | if ( message == NULL ) | ||
400 | goto err_free_fields; | ||
401 | |||
402 | mailmime_set_imf_fields( message, fields ); | ||
403 | |||
404 | txtPart = buildTxtPart( mail.getMessage() ); | ||
405 | |||
406 | if ( txtPart == NULL ) | ||
407 | goto err_free_message; | ||
408 | |||
409 | err = mailmime_smart_add_part( message, txtPart ); | ||
410 | if ( err != MAILIMF_NO_ERROR ) | ||
411 | goto err_free_txtPart; | ||
412 | |||
413 | addFileParts( message, mail.getAttachments() ); | ||
414 | |||
415 | return message; // Success :) | ||
416 | |||
417 | err_free_txtPart: | ||
418 | mailmime_free( txtPart ); | ||
419 | err_free_message: | ||
420 | mailmime_free( message ); | ||
421 | err_free_fields: | ||
422 | mailimf_fields_free( fields ); | ||
423 | err_free: | ||
424 | qDebug( "createMimeMail: error" ); | ||
425 | |||
426 | return NULL; // Error :( | ||
427 | } | ||
428 | |||
429 | clist *Generatemail::createRcptList( mailimf_fields *fields ) { | ||
430 | clist *rcptList; | ||
431 | mailimf_field *field; | ||
432 | |||
433 | rcptList = esmtp_address_list_new(); | ||
434 | |||
435 | field = getField( fields, MAILIMF_FIELD_TO ); | ||
436 | if ( field && (field->fld_type == MAILIMF_FIELD_TO) | ||
437 | && field->fld_data.fld_to->to_addr_list ) { | ||
438 | addRcpts( rcptList, field->fld_data.fld_to->to_addr_list ); | ||
439 | } | ||
440 | |||
441 | field = getField( fields, MAILIMF_FIELD_CC ); | ||
442 | if ( field && (field->fld_type == MAILIMF_FIELD_CC) | ||
443 | && field->fld_data.fld_cc->cc_addr_list ) { | ||
444 | addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list ); | ||
445 | } | ||
446 | |||
447 | field = getField( fields, MAILIMF_FIELD_BCC ); | ||
448 | if ( field && (field->fld_type == MAILIMF_FIELD_BCC) | ||
449 | && field->fld_data.fld_bcc->bcc_addr_list ) { | ||
450 | addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list ); | ||
451 | } | ||
452 | |||
453 | return rcptList; | ||
454 | } | ||