summaryrefslogtreecommitdiff
authoralwin <alwin>2004-03-08 21:43:14 (UTC)
committer alwin <alwin>2004-03-08 21:43:14 (UTC)
commit25434cbbcd2d2473c9cd3d486cec7a96a6a6323e (patch) (unidiff)
tree31cfa6ceaebe0e2e1e0094e4905d05509e778364
parentf3f2b2b3389d62af0f1a3aabac87f6c3cf147379 (diff)
downloadopie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.zip
opie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.tar.gz
opie-25434cbbcd2d2473c9cd3d486cec7a96a6a6323e.tar.bz2
some required code restructuring in preparation of new features
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/generatemail.cpp454
-rw-r--r--noncore/net/mail/libmailwrapper/generatemail.h44
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.cpp52
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.h4
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp49
-rw-r--r--noncore/net/mail/libmailwrapper/libmailwrapper.pro16
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.cpp19
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.h25
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.cpp464
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.h32
10 files changed, 625 insertions, 534 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
8const char* Generatemail::USER_AGENT="OpieMail v0.5";
9
10Generatemail::Generatemail()
11{
12}
13
14Generatemail::~Generatemail()
15{
16}
17
18void 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
38char *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
53char *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
60mailimf_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
76mailimf_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
127mailmime *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
205void 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
229mailmime *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
263err_free_txtPart:
264 mailmime_free( txtPart );
265err_free_fields:
266 mailmime_fields_free( fields );
267err_free_content:
268 mailmime_content_free( content );
269err_free_param:
270 mailmime_parameter_free( param );
271err_free:
272 qDebug( "buildTxtPart - error" );
273
274 return NULL; // Error :(
275}
276
277mailimf_mailbox *Generatemail::newMailbox(const QString&name, const QString&mail ) {
278 return mailimf_mailbox_new( strdup( name.latin1() ),
279 strdup( mail.latin1() ) );
280}
281
282mailimf_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
358err_free_xmailer:
359 if (xmailer)
360 mailimf_field_free( xmailer );
361err_free_fields:
362 if (fields)
363 mailimf_fields_free( fields );
364err_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 );
373err_free_from:
374 if (from)
375 mailimf_mailbox_list_free( from );
376err_free_fromBox:
377 mailimf_mailbox_free( fromBox );
378err_free_sender:
379 if (sender)
380 mailimf_mailbox_free( sender );
381err_free:
382 if (subject)
383 free( subject );
384 qDebug( "createImfFields - error" );
385
386 return NULL; // Error :(
387}
388
389mailmime *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
417err_free_txtPart:
418 mailmime_free( txtPart );
419err_free_message:
420 mailmime_free( message );
421err_free_fields:
422 mailimf_fields_free( fields );
423err_free:
424 qDebug( "createMimeMail: error" );
425
426 return NULL; // Error :(
427}
428
429clist *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}
diff --git a/noncore/net/mail/libmailwrapper/generatemail.h b/noncore/net/mail/libmailwrapper/generatemail.h
new file mode 100644
index 0000000..8be5a2b
--- a/dev/null
+++ b/noncore/net/mail/libmailwrapper/generatemail.h
@@ -0,0 +1,44 @@
1#ifndef __GENERATE_MAIL_H
2#define __GENERATE_MAIL_H
3
4#include <qpe/applnk.h>
5
6#include <qobject.h>
7#include <libetpan/clist.h>
8
9class Mail;
10class RecMail;
11class Attachment;
12struct mailimf_fields;
13struct mailimf_field;
14struct mailimf_mailbox;
15struct mailmime;
16struct mailimf_address_list;
17class progressMailSend;
18struct mailsmtp;
19
20class Generatemail : public QObject
21{
22 Q_OBJECT
23public:
24 Generatemail();
25 virtual ~Generatemail();
26
27protected:
28 static void addRcpts( clist *list, mailimf_address_list *addr_list );
29 static char *getFrom( mailmime *mail );
30 static char *getFrom( mailimf_field *ffrom);
31 static mailimf_field *getField( mailimf_fields *fields, int type );
32 mailimf_address_list *parseAddresses(const QString&addr );
33 void addFileParts( mailmime *message,const QList<Attachment>&files );
34 mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content);
35 mailmime *buildTxtPart(const QString&str );
36 mailimf_mailbox *newMailbox(const QString&name,const QString&mail );
37 mailimf_fields *createImfFields(const Mail &mail );
38 mailmime *createMimeMail(const Mail&mail );
39 clist *createRcptList( mailimf_fields *fields );
40
41 static const char* USER_AGENT;
42};
43
44#endif
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.cpp b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
index eb2c031..137a6ef 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
@@ -28,17 +28,17 @@ void Genericwrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
28 } 28 }
29 mailmime_field*field = 0; 29 mailmime_field*field = 0;
30 mailmime_single_fields fields; 30 mailmime_single_fields fields;
31 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 31 memset(&fields, 0, sizeof(struct mailmime_single_fields));
32 if (mime->mm_mime_fields != NULL) { 32 if (mime->mm_mime_fields != NULL) {
33 mailmime_single_fields_init(&fields, mime->mm_mime_fields, 33 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
34 mime->mm_content_type); 34 mime->mm_content_type);
35 } 35 }
36 36
37 mailmime_content*type = fields.fld_content; 37 mailmime_content*type = fields.fld_content;
38 clistcell*current; 38 clistcell*current;
39 if (!type) { 39 if (!type) {
40 target.setType("text"); 40 target.setType("text");
41 target.setSubtype("plain"); 41 target.setSubtype("plain");
42 } else { 42 } else {
43 target.setSubtype(type->ct_subtype); 43 target.setSubtype(type->ct_subtype);
44 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) { 44 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) {
@@ -140,17 +140,17 @@ void Genericwrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mi
140 return; 140 return;
141 } 141 }
142 int r; 142 int r;
143 char*data = 0; 143 char*data = 0;
144 size_t len; 144 size_t len;
145 clistiter * cur = 0; 145 clistiter * cur = 0;
146 QString b; 146 QString b;
147 RecPart part; 147 RecPart part;
148 148
149 switch (mime->mm_type) { 149 switch (mime->mm_type) {
150 case MAILMIME_SINGLE: 150 case MAILMIME_SINGLE:
151 { 151 {
152 QValueList<int>countlist = recList; 152 QValueList<int>countlist = recList;
153 countlist.append(current_count); 153 countlist.append(current_count);
154 r = mailmessage_fetch_section(message,mime,&data,&len); 154 r = mailmessage_fetch_section(message,mime,&data,&len);
155 part.setSize(len); 155 part.setSize(len);
156 part.setPositionlist(countlist); 156 part.setPositionlist(countlist);
@@ -236,32 +236,32 @@ RecBody Genericwrapper::parseMail( mailmessage * msg )
236 QValueList<int>recList; 236 QValueList<int>recList;
237 traverseBody(body,msg,mime,recList); 237 traverseBody(body,msg,mime,recList);
238 return body; 238 return body;
239} 239}
240 240
241QString Genericwrapper::parseDateTime( mailimf_date_time *date ) 241QString Genericwrapper::parseDateTime( mailimf_date_time *date )
242{ 242{
243 char tmp[23]; 243 char tmp[23];
244 244
245 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 245 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
246 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); 246 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
247 247
248 return QString( tmp ); 248 return QString( tmp );
249} 249}
250 250
251QString Genericwrapper::parseAddressList( mailimf_address_list *list ) 251QString Genericwrapper::parseAddressList( mailimf_address_list *list )
252{ 252{
253 QString result( "" ); 253 QString result( "" );
254 254
255 bool first = true; 255 bool first = true;
256 if (list == 0) return result; 256 if (list == 0) return result;
257 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 257 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
258 mailimf_address *addr = (mailimf_address *) current->data; 258 mailimf_address *addr = (mailimf_address *) current->data;
259 259
260 if ( !first ) { 260 if ( !first ) {
261 result.append( "," ); 261 result.append( "," );
262 } else { 262 } else {
263 first = false; 263 first = false;
264 } 264 }
265 265
266 switch ( addr->ad_type ) { 266 switch ( addr->ad_type ) {
267 case MAILIMF_ADDRESS_MAILBOX: 267 case MAILIMF_ADDRESS_MAILBOX:
@@ -270,69 +270,69 @@ QString Genericwrapper::parseAddressList( mailimf_address_list *list )
270 case MAILIMF_ADDRESS_GROUP: 270 case MAILIMF_ADDRESS_GROUP:
271 result.append( parseGroup( addr->ad_data.ad_group ) ); 271 result.append( parseGroup( addr->ad_data.ad_group ) );
272 break; 272 break;
273 default: 273 default:
274 qDebug( "Generic: unkown mailimf address type" ); 274 qDebug( "Generic: unkown mailimf address type" );
275 break; 275 break;
276 } 276 }
277 } 277 }
278 278
279 return result; 279 return result;
280} 280}
281 281
282QString Genericwrapper::parseGroup( mailimf_group *group ) 282QString Genericwrapper::parseGroup( mailimf_group *group )
283{ 283{
284 QString result( "" ); 284 QString result( "" );
285 285
286 result.append( group->grp_display_name ); 286 result.append( group->grp_display_name );
287 result.append( ": " ); 287 result.append( ": " );
288 288
289 if ( group->grp_mb_list != NULL ) { 289 if ( group->grp_mb_list != NULL ) {
290 result.append( parseMailboxList( group->grp_mb_list ) ); 290 result.append( parseMailboxList( group->grp_mb_list ) );
291 } 291 }
292 292
293 result.append( ";" ); 293 result.append( ";" );
294 294
295 return result; 295 return result;
296} 296}
297 297
298QString Genericwrapper::parseMailbox( mailimf_mailbox *box ) 298QString Genericwrapper::parseMailbox( mailimf_mailbox *box )
299{ 299{
300 QString result( "" ); 300 QString result( "" );
301 301
302 if ( box->mb_display_name == NULL ) { 302 if ( box->mb_display_name == NULL ) {
303 result.append( box->mb_addr_spec ); 303 result.append( box->mb_addr_spec );
304 } else { 304 } else {
305 result.append( convert_String(box->mb_display_name).latin1() ); 305 result.append( convert_String(box->mb_display_name).latin1() );
306 result.append( " <" ); 306 result.append( " <" );
307 result.append( box->mb_addr_spec ); 307 result.append( box->mb_addr_spec );
308 result.append( ">" ); 308 result.append( ">" );
309 } 309 }
310 310
311 return result; 311 return result;
312} 312}
313 313
314QString Genericwrapper::parseMailboxList( mailimf_mailbox_list *list ) 314QString Genericwrapper::parseMailboxList( mailimf_mailbox_list *list )
315{ 315{
316 QString result( "" ); 316 QString result( "" );
317 317
318 bool first = true; 318 bool first = true;
319 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { 319 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
320 mailimf_mailbox *box = (mailimf_mailbox *) current->data; 320 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
321 321
322 if ( !first ) { 322 if ( !first ) {
323 result.append( "," ); 323 result.append( "," );
324 } else { 324 } else {
325 first = false; 325 first = false;
326 } 326 }
327 327
328 result.append( parseMailbox( box ) ); 328 result.append( parseMailbox( box ) );
329 } 329 }
330 330
331 return result; 331 return result;
332} 332}
333 333
334encodedString* Genericwrapper::fetchDecodedPart(const RecMail&,const RecPart&part) 334encodedString* Genericwrapper::fetchDecodedPart(const RecMail&,const RecPart&part)
335{ 335{
336 QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier()); 336 QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier());
337 if (it==bodyCache.end()) return new encodedString(); 337 if (it==bodyCache.end()) return new encodedString();
338 encodedString*t = decode_String(it.data(),part.Encoding()); 338 encodedString*t = decode_String(it.data(),part.Encoding());
@@ -362,16 +362,36 @@ void Genericwrapper::cleanMimeCache()
362 encodedString*t = it.data(); 362 encodedString*t = it.data();
363 //it.setValue(0); 363 //it.setValue(0);
364 if (t) delete t; 364 if (t) delete t;
365 } 365 }
366 bodyCache.clear(); 366 bodyCache.clear();
367 qDebug("Genericwrapper: cache cleaned"); 367 qDebug("Genericwrapper: cache cleaned");
368} 368}
369 369
370QStringList Genericwrapper::parseInreplies(mailimf_in_reply_to * in_replies)
371{
372 QStringList res;
373 if (!in_replies || !in_replies->mid_list) return res;
374 clistiter * current = 0;
375 for ( current = clist_begin( in_replies->mid_list ); current != NULL; current = current->next ) {
376 QString h((char*)current->data);
377 while (h.length()>0 && h[0]=='<') {
378 h.remove(0,1);
379 }
380 while (h.length()>0 && h[h.length()-1]=='>') {
381 h.remove(h.length()-1,1);
382 }
383 if (h.length()>0) {
384 res.append(h);
385 }
386 }
387 return res;
388}
389
370void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox,bool mbox_as_to) 390void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox,bool mbox_as_to)
371{ 391{
372 int r; 392 int r;
373 mailmessage_list * env_list = 0; 393 mailmessage_list * env_list = 0;
374 r = mailsession_get_messages_list(session,&env_list); 394 r = mailsession_get_messages_list(session,&env_list);
375 if (r != MAIL_NO_ERROR) { 395 if (r != MAIL_NO_ERROR) {
376 qDebug("Error message list"); 396 qDebug("Error message list");
377 return; 397 return;
@@ -379,17 +399,18 @@ void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const
379 r = mailsession_get_envelopes_list(session, env_list); 399 r = mailsession_get_envelopes_list(session, env_list);
380 if (r != MAIL_NO_ERROR) { 400 if (r != MAIL_NO_ERROR) {
381 qDebug("Error filling message list"); 401 qDebug("Error filling message list");
382 if (env_list) { 402 if (env_list) {
383 mailmessage_list_free(env_list); 403 mailmessage_list_free(env_list);
384 } 404 }
385 return; 405 return;
386 } 406 }
387 mailimf_references * refs; 407 mailimf_references * refs = 0;
408 mailimf_in_reply_to * in_replies = 0;
388 uint32_t i = 0; 409 uint32_t i = 0;
389 for(; i < carray_count(env_list->msg_tab) ; ++i) { 410 for(; i < carray_count(env_list->msg_tab) ; ++i) {
390 mailmessage * msg; 411 mailmessage * msg;
391 QBitArray mFlags(7); 412 QBitArray mFlags(7);
392 msg = (mailmessage*)carray_get(env_list->msg_tab, i); 413 msg = (mailmessage*)carray_get(env_list->msg_tab, i);
393 if (msg->msg_fields == NULL) { 414 if (msg->msg_fields == NULL) {
394 //qDebug("could not fetch envelope of message %i", i); 415 //qDebug("could not fetch envelope of message %i", i);
395 continue; 416 continue;
@@ -421,21 +442,26 @@ void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const
421 mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) ); 442 mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
422 if (single_fields.fld_bcc) 443 if (single_fields.fld_bcc)
423 mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) ); 444 mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
424 if (single_fields.fld_orig_date) 445 if (single_fields.fld_orig_date)
425 mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) ); 446 mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
426 // crashes when accessing pop3 account? 447 // crashes when accessing pop3 account?
427 if (single_fields.fld_message_id->mid_value) { 448 if (single_fields.fld_message_id->mid_value) {
428 mail->setMsgid(QString(single_fields.fld_message_id->mid_value)); 449 mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
429 qDebug("Msqgid == %s",mail->Msgid().latin1()); 450 qDebug("Msgid == %s",mail->Msgid().latin1());
430 } 451 }
452
431 refs = single_fields.fld_references; 453 refs = single_fields.fld_references;
432 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 454 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
433 char * text = (char*)refs->mid_list->first->data; 455 char * text = (char*)refs->mid_list->first->data;
434 mail->setReplyto(QString(text)); 456 mail->setReplyto(QString(text));
435 } 457 }
458 if (single_fields.fld_in_reply_to && single_fields.fld_in_reply_to->mid_list &&
459 clist_count(single_fields.fld_in_reply_to->mid_list)) {
460 mail->setInreply(parseInreplies(single_fields.fld_in_reply_to));
461 }
436 target.append(mail); 462 target.append(mail);
437 } 463 }
438 if (env_list) { 464 if (env_list) {
439 mailmessage_list_free(env_list); 465 mailmessage_list_free(env_list);
440 } 466 }
441} 467}
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.h b/noncore/net/mail/libmailwrapper/genericwrapper.h
index 0870912..b3cd4fe 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.h
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.h
@@ -16,16 +16,17 @@ struct mailmime_mechanism;
16struct mailimf_mailbox_list; 16struct mailimf_mailbox_list;
17struct mailimf_mailbox; 17struct mailimf_mailbox;
18struct mailimf_date_time; 18struct mailimf_date_time;
19struct mailimf_group; 19struct mailimf_group;
20struct mailimf_address_list; 20struct mailimf_address_list;
21struct mailsession; 21struct mailsession;
22struct mailstorage; 22struct mailstorage;
23struct mailfolder; 23struct mailfolder;
24struct mailimf_in_reply_to;
24 25
25/* this class hold just the funs shared between 26/* this class hold just the funs shared between
26 * mbox and pop3 (later mh, too) mail access. 27 * mbox and pop3 (later mh, too) mail access.
27 * it is not desigend to make a instance of it! 28 * it is not desigend to make a instance of it!
28 */ 29 */
29class Genericwrapper : public AbstractMail 30class Genericwrapper : public AbstractMail
30{ 31{
31 Q_OBJECT 32 Q_OBJECT
@@ -43,22 +44,23 @@ public:
43 44
44protected: 45protected:
45 RecBody parseMail( mailmessage * msg ); 46 RecBody parseMail( mailmessage * msg );
46 QString parseMailboxList( mailimf_mailbox_list *list ); 47 QString parseMailboxList( mailimf_mailbox_list *list );
47 QString parseMailbox( mailimf_mailbox *box ); 48 QString parseMailbox( mailimf_mailbox *box );
48 QString parseGroup( mailimf_group *group ); 49 QString parseGroup( mailimf_group *group );
49 QString parseAddressList( mailimf_address_list *list ); 50 QString parseAddressList( mailimf_address_list *list );
50 QString parseDateTime( mailimf_date_time *date ); 51 QString parseDateTime( mailimf_date_time *date );
51 52
52 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rek=0,int current_count=1); 53 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rek=0,int current_count=1);
53 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); 54 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime);
54 static void fillParameters(RecPart&target,clist*parameters); 55 static void fillParameters(RecPart&target,clist*parameters);
55 static QString getencoding(mailmime_mechanism*aEnc); 56 static QString getencoding(mailmime_mechanism*aEnc);
56 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox,bool mbox_as_to=false); 57 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox,bool mbox_as_to=false);
58 QStringList parseInreplies(mailimf_in_reply_to * in_replies);
57 59
58 QString msgTempName; 60 QString msgTempName;
59 unsigned int last_msg_id; 61 unsigned int last_msg_id;
60 QMap<QString,encodedString*> bodyCache; 62 QMap<QString,encodedString*> bodyCache;
61 mailstorage * m_storage; 63 mailstorage * m_storage;
62 mailfolder*m_folder; 64 mailfolder*m_folder;
63}; 65};
64 66
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 3375e69..e29a0a0 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -108,32 +108,32 @@ void IMAPwrapper::login()
108 logout(); 108 logout();
109 } else { 109 } else {
110 mailstream_flush(m_imap->imap_stream); 110 mailstream_flush(m_imap->imap_stream);
111 return; 111 return;
112 } 112 }
113 } 113 }
114 server = account->getServer().latin1(); 114 server = account->getServer().latin1();
115 port = account->getPort().toUInt(); 115 port = account->getPort().toUInt();
116 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 116 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
117 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 117 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
118 login.show(); 118 login.show();
119 if ( QDialog::Accepted == login.exec() ) { 119 if ( QDialog::Accepted == login.exec() ) {
120 // ok 120 // ok
121 user = login.getUser().latin1(); 121 user = login.getUser().latin1();
122 pass = login.getPassword().latin1(); 122 pass = login.getPassword().latin1();
123 } else { 123 } else {
124 // cancel 124 // cancel
125 qDebug( "IMAP: Login canceled" ); 125 qDebug( "IMAP: Login canceled" );
126 return; 126 return;
127 } 127 }
128 } else { 128 } else {
129 user = account->getUser().latin1(); 129 user = account->getUser().latin1();
130 pass = account->getPassword().latin1(); 130 pass = account->getPassword().latin1();
131 } 131 }
132 132
133 m_imap = mailimap_new( 20, &imap_progress ); 133 m_imap = mailimap_new( 20, &imap_progress );
134 134
135 /* connect */ 135 /* connect */
136 bool ssl = false; 136 bool ssl = false;
137 bool try_tls = false; 137 bool try_tls = false;
138 bool force_tls = false; 138 bool force_tls = false;
139 139
@@ -433,23 +433,38 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
433 if (head->env_cc!=NULL) { 433 if (head->env_cc!=NULL) {
434 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 434 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
435 m->setCC(addresslist); 435 m->setCC(addresslist);
436 } 436 }
437 if (head->env_bcc!=NULL) { 437 if (head->env_bcc!=NULL) {
438 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 438 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
439 m->setBcc(addresslist); 439 m->setBcc(addresslist);
440 } 440 }
441 /* reply to address, eg. email. */
441 if (head->env_reply_to!=NULL) { 442 if (head->env_reply_to!=NULL) {
442 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 443 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
443 if (addresslist.count()) { 444 if (addresslist.count()) {
444 m->setReplyto(addresslist.first()); 445 m->setReplyto(addresslist.first());
445 } 446 }
446 } 447 }
447 m->setMsgid(QString(head->env_message_id)); 448 if (head->env_in_reply_to!=NULL) {
449 QString h(head->env_in_reply_to);
450 while (h.length()>0 && h[0]=='<') {
451 h.remove(0,1);
452 }
453 while (h.length()>0 && h[h.length()-1]=='>') {
454 h.remove(h.length()-1,1);
455 }
456 if (h.length()>0) {
457 m->setInreply(QStringList(h));
458 }
459 }
460 if (head->env_message_id) {
461 m->setMsgid(QString(head->env_message_id));
462 }
448 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 463 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
449#if 0 464#if 0
450 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 465 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
451 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 466 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
452 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec); 467 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec);
453 qDebug(da.toString()); 468 qDebug(da.toString());
454#endif 469#endif
455 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 470 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
diff --git a/noncore/net/mail/libmailwrapper/libmailwrapper.pro b/noncore/net/mail/libmailwrapper/libmailwrapper.pro
index 8ea04a4..cb1e573 100644
--- a/noncore/net/mail/libmailwrapper/libmailwrapper.pro
+++ b/noncore/net/mail/libmailwrapper/libmailwrapper.pro
@@ -1,50 +1,52 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qt warn_on debug 2CONFIG += qt warn_on debug
3 3
4HEADERS = mailwrapper.h \ 4HEADERS = mailwrapper.h \
5 imapwrapper.h \ 5 imapwrapper.h \
6 mailtypes.h \ 6 mailtypes.h \
7 pop3wrapper.h \ 7 pop3wrapper.h \
8 abstractmail.h \ 8 abstractmail.h \
9 smtpwrapper.h \ 9 smtpwrapper.h \
10 genericwrapper.h \ 10 genericwrapper.h \
11 mboxwrapper.h \ 11 mboxwrapper.h \
12 settings.h \ 12 settings.h \
13 logindialog.h \ 13 logindialog.h \
14 sendmailprogress.h \ 14 sendmailprogress.h \
15 statusmail.h \ 15 statusmail.h \
16 mhwrapper.h \ 16 mhwrapper.h \
17 nntpwrapper.h 17 nntpwrapper.h \
18 18 generatemail.h
19
19SOURCES = imapwrapper.cpp \ 20SOURCES = imapwrapper.cpp \
20 mailwrapper.cpp \ 21 mailwrapper.cpp \
21 mailtypes.cpp \ 22 mailtypes.cpp \
22 pop3wrapper.cpp \ 23 pop3wrapper.cpp \
23 abstractmail.cpp \ 24 abstractmail.cpp \
24 smtpwrapper.cpp \ 25 smtpwrapper.cpp \
25 genericwrapper.cpp \ 26 genericwrapper.cpp \
26 mboxwrapper.cpp \ 27 mboxwrapper.cpp \
27 settings.cpp \ 28 settings.cpp \
28 logindialog.cpp \ 29 logindialog.cpp \
29 sendmailprogress.cpp \ 30 sendmailprogress.cpp \
30 statusmail.cpp \ 31 statusmail.cpp \
31 mhwrapper.cpp \ 32 mhwrapper.cpp \
32 nntpwrapper.cpp 33 nntpwrapper.cpp \
34 generatemail.cpp
33 35
34 INTERFACES = logindialogui.ui \ 36INTERFACES = logindialogui.ui \
35 sendmailprogressui.ui 37 sendmailprogressui.ui
36 38
37 39
38INCLUDEPATH += $(OPIEDIR)/include 40INCLUDEPATH += $(OPIEDIR)/include
39 41
40CONFTEST = $$system( echo $CONFIG_TARGET_MACOSX ) 42CONFTEST = $$system( echo $CONFIG_TARGET_MACOSX )
41contains( CONFTEST, y ){ 43contains( CONFTEST, y ){
42 LIBS += -lqpe -letpan -lssl -lcrypto -liconv 44 LIBS += -lqpe -letpan -lssl -lcrypto -liconv
43}else{ 45}else{
44 LIBS += -lqpe -letpan -lssl -lcrypto 46 LIBS += -lqpe -letpan -lssl -lcrypto
45} 47}
46 48
47DESTDIR = $(OPIEDIR)/lib$(PROJMAK) 49DESTDIR = $(OPIEDIR)/lib$(PROJMAK)
48TARGET = mailwrapper 50TARGET = mailwrapper
49 51
50include ( $(OPIEDIR)/include.pro ) 52include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.cpp b/noncore/net/mail/libmailwrapper/mailtypes.cpp
index 96e0fd5..e4646d9 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.cpp
+++ b/noncore/net/mail/libmailwrapper/mailtypes.cpp
@@ -30,24 +30,26 @@ void RecMail::copy_old(const RecMail&old)
30 msg_number = old.msg_number; 30 msg_number = old.msg_number;
31 from = old.from; 31 from = old.from;
32 msg_flags = old.msg_flags; 32 msg_flags = old.msg_flags;
33 to = old.to; 33 to = old.to;
34 cc = old.cc; 34 cc = old.cc;
35 bcc = old.bcc; 35 bcc = old.bcc;
36 wrapper = old.wrapper; 36 wrapper = old.wrapper;
37 in_reply_to = old.in_reply_to; 37 in_reply_to = old.in_reply_to;
38 references = old.references;
38} 39}
39 40
40void RecMail::init() 41void RecMail::init()
41{ 42{
42 to.clear(); 43 to.clear();
43 cc.clear(); 44 cc.clear();
44 bcc.clear(); 45 bcc.clear();
45 in_reply_to.clear(); 46 in_reply_to.clear();
47 references.clear();
46 wrapper = 0; 48 wrapper = 0;
47} 49}
48 50
49void RecMail::setWrapper(AbstractMail*awrapper) 51void RecMail::setWrapper(AbstractMail*awrapper)
50{ 52{
51 wrapper = awrapper; 53 wrapper = awrapper;
52} 54}
53 55
@@ -91,43 +93,52 @@ void RecMail::setInreply(const QStringList&list)
91 in_reply_to = list; 93 in_reply_to = list;
92} 94}
93 95
94const QStringList& RecMail::Inreply()const 96const QStringList& RecMail::Inreply()const
95{ 97{
96 return in_reply_to; 98 return in_reply_to;
97} 99}
98 100
101void RecMail::setReferences(const QStringList&list)
102{
103 references = list;
104}
105
106const QStringList& RecMail::References()const
107{
108 return references;
109}
99 110
100RecPart::RecPart() 111RecPart::RecPart()
101 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_description(""),m_lines(0),m_size(0) 112 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_description(""),m_lines(0),m_size(0)
102{ 113{
103 m_Parameters.clear(); 114 m_Parameters.clear();
104 m_poslist.clear(); 115 m_poslist.clear();
105} 116}
106 117
107RecPart::~RecPart() 118RecPart::~RecPart()
108{ 119{
109} 120}
110 121
111void RecPart::setSize(unsigned int size) 122void RecPart::setSize(unsigned int size)
112{ 123{
113 m_size = size; 124 m_size = size;
114} 125}
115 126
116const unsigned int RecPart::Size()const 127const unsigned int RecPart::Size()const
117{ 128{
118 return m_size; 129 return m_size;
119} 130}
120 131
121void RecPart::setLines(unsigned int lines) 132void RecPart::setLines(unsigned int lines)
122{ 133{
123 m_lines = lines; 134 m_lines = lines;
124} 135}
125 136
126const unsigned int RecPart::Lines()const 137const unsigned int RecPart::Lines()const
127{ 138{
128 return m_lines; 139 return m_lines;
129} 140}
130 141
131const QString& RecPart::Type()const 142const QString& RecPart::Type()const
132{ 143{
133 return m_type; 144 return m_type;
@@ -172,17 +183,17 @@ const QString& RecPart::Description()const
172{ 183{
173 return m_description; 184 return m_description;
174} 185}
175 186
176void RecPart::setDescription(const QString&desc) 187void RecPart::setDescription(const QString&desc)
177{ 188{
178 m_description = desc; 189 m_description = desc;
179} 190}
180 191
181void RecPart::setParameters(const part_plist_t&list) 192void RecPart::setParameters(const part_plist_t&list)
182{ 193{
183 m_Parameters = list; 194 m_Parameters = list;
184} 195}
185 196
186const part_plist_t& RecPart::Parameters()const 197const part_plist_t& RecPart::Parameters()const
187{ 198{
188 return m_Parameters; 199 return m_Parameters;
@@ -332,17 +343,17 @@ const int encodedString::Length()const
332 return size; 343 return size;
333} 344}
334 345
335void encodedString::setContent(const char*nContent,int nSize) 346void encodedString::setContent(const char*nContent,int nSize)
336{ 347{
337 if (nSize>0 && nContent) { 348 if (nSize>0 && nContent) {
338 content = (char*)malloc(nSize*sizeof(char)); 349 content = (char*)malloc(nSize*sizeof(char));
339 memcpy(content,nContent,nSize); 350 memcpy(content,nContent,nSize);
340 size = nSize; 351 size = nSize;
341 } 352 }
342} 353}
343 354
344void encodedString::setContent(char*nContent,int nSize) 355void encodedString::setContent(char*nContent,int nSize)
345{ 356{
346 content = nContent; 357 content = nContent;
347 size = nSize; 358 size = nSize;
348} 359}
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.h b/noncore/net/mail/libmailwrapper/mailtypes.h
index 1420f79..17c6db9 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.h
+++ b/noncore/net/mail/libmailwrapper/mailtypes.h
@@ -15,18 +15,18 @@
15#include <qmap.h> 15#include <qmap.h>
16#include <qvaluelist.h> 16#include <qvaluelist.h>
17 17
18class AbstractMail; 18class AbstractMail;
19/* a class to describe mails in a mailbox */ 19/* a class to describe mails in a mailbox */
20/* Attention! 20/* Attention!
21 From programmers point of view it would make sense to 21 From programmers point of view it would make sense to
22 store the mail body into this class, too. 22 store the mail body into this class, too.
23 But: not from the point of view of the device. 23 But: not from the point of view of the device.
24 Mailbodies can be real large. So we request them when 24 Mailbodies can be real large. So we request them when
25 needed from the mail-wrapper class direct from the server itself 25 needed from the mail-wrapper class direct from the server itself
26 (imap) or from a file-based cache (pop3?) 26 (imap) or from a file-based cache (pop3?)
27 So there is no interface "const QString&body()" but you should 27 So there is no interface "const QString&body()" but you should
28 make a request to the mailwrapper with this class as parameter to 28 make a request to the mailwrapper with this class as parameter to
29 get the body. Same words for the attachments. 29 get the body. Same words for the attachments.
30*/ 30*/
31class RecMail 31class RecMail
32{ 32{
@@ -56,27 +56,30 @@ public:
56 void setTo(const QStringList&list); 56 void setTo(const QStringList&list);
57 const QStringList&To()const; 57 const QStringList&To()const;
58 void setCC(const QStringList&list); 58 void setCC(const QStringList&list);
59 const QStringList&CC()const; 59 const QStringList&CC()const;
60 void setBcc(const QStringList&list); 60 void setBcc(const QStringList&list);
61 const QStringList&Bcc()const; 61 const QStringList&Bcc()const;
62 void setInreply(const QStringList&list); 62 void setInreply(const QStringList&list);
63 const QStringList&Inreply()const; 63 const QStringList&Inreply()const;
64 void setReferences(const QStringList&list);
65 const QStringList&References()const;
66
64 const QBitArray&getFlags()const{return msg_flags;} 67 const QBitArray&getFlags()const{return msg_flags;}
65 void setFlags(const QBitArray&flags){msg_flags = flags;} 68 void setFlags(const QBitArray&flags){msg_flags = flags;}
66 69
67 void setWrapper(AbstractMail*wrapper); 70 void setWrapper(AbstractMail*wrapper);
68 AbstractMail* Wrapper(); 71 AbstractMail* Wrapper();
69 72
70protected: 73protected:
71 QString subject,date,from,mbox,msg_id,replyto; 74 QString subject,date,from,mbox,msg_id,replyto;
72 int msg_number,msg_size; 75 int msg_number,msg_size;
73 QBitArray msg_flags; 76 QBitArray msg_flags;
74 QStringList to,cc,bcc,in_reply_to; 77 QStringList to,cc,bcc,in_reply_to,references;
75 AbstractMail*wrapper; 78 AbstractMail*wrapper;
76 void init(); 79 void init();
77 void copy_old(const RecMail&old); 80 void copy_old(const RecMail&old);
78}; 81};
79 82
80typedef QMap<QString,QString> part_plist_t; 83typedef QMap<QString,QString> part_plist_t;
81 84
82class RecPart 85class RecPart
@@ -86,33 +89,33 @@ protected:
86 unsigned int m_lines,m_size; 89 unsigned int m_lines,m_size;
87 part_plist_t m_Parameters; 90 part_plist_t m_Parameters;
88 /* describes the position in the mail */ 91 /* describes the position in the mail */
89 QValueList<int> m_poslist; 92 QValueList<int> m_poslist;
90 93
91public: 94public:
92 RecPart(); 95 RecPart();
93 virtual ~RecPart(); 96 virtual ~RecPart();
94 97
95 const QString&Type()const; 98 const QString&Type()const;
96 void setType(const QString&type); 99 void setType(const QString&type);
97 const QString&Subtype()const; 100 const QString&Subtype()const;
98 void setSubtype(const QString&subtype); 101 void setSubtype(const QString&subtype);
99 const QString&Identifier()const; 102 const QString&Identifier()const;
100 void setIdentifier(const QString&identifier); 103 void setIdentifier(const QString&identifier);
101 const QString&Encoding()const; 104 const QString&Encoding()const;
102 void setEncoding(const QString&encoding); 105 void setEncoding(const QString&encoding);
103 const QString&Description()const; 106 const QString&Description()const;
104 void setDescription(const QString&desc); 107 void setDescription(const QString&desc);
105 void setLines(unsigned int lines); 108 void setLines(unsigned int lines);
106 const unsigned int Lines()const; 109 const unsigned int Lines()const;
107 void setSize(unsigned int size); 110 void setSize(unsigned int size);
108 const unsigned int Size()const; 111 const unsigned int Size()const;
109 112
110 113
111 void setParameters(const part_plist_t&list); 114 void setParameters(const part_plist_t&list);
112 const part_plist_t&Parameters()const; 115 const part_plist_t&Parameters()const;
113 void addParameter(const QString&key,const QString&value); 116 void addParameter(const QString&key,const QString&value);
114 const QString searchParamter(const QString&key)const; 117 const QString searchParamter(const QString&key)const;
115 void setPositionlist(const QValueList<int>&poslist); 118 void setPositionlist(const QValueList<int>&poslist);
116 const QValueList<int>& Positionlist()const; 119 const QValueList<int>& Positionlist()const;
117}; 120};
118 121
@@ -126,64 +129,64 @@ protected:
126public: 129public:
127 RecBody(); 130 RecBody();
128 virtual ~RecBody(); 131 virtual ~RecBody();
129 void setBodytext(const QString&); 132 void setBodytext(const QString&);
130 const QString& Bodytext()const; 133 const QString& Bodytext()const;
131 134
132 void setDescription(const RecPart&des); 135 void setDescription(const RecPart&des);
133 const RecPart& Description()const; 136 const RecPart& Description()const;
134 137
135 void setParts(const QValueList<RecPart>&parts); 138 void setParts(const QValueList<RecPart>&parts);
136 const QValueList<RecPart>& Parts()const; 139 const QValueList<RecPart>& Parts()const;
137 void addPart(const RecPart&part); 140 void addPart(const RecPart&part);
138}; 141};
139 142
140class encodedString 143class encodedString
141{ 144{
142public: 145public:
143 encodedString(); 146 encodedString();
144 /* 147 /*
145 creates an new content string. 148 creates an new content string.
146 it makes a deep copy of it! 149 it makes a deep copy of it!
147 */ 150 */
148 encodedString(const char*nContent,unsigned int length); 151 encodedString(const char*nContent,unsigned int length);
149 /* 152 /*
150 Take over the nContent. Means: it will just copy the pointer, not the content. 153 Take over the nContent. Means: it will just copy the pointer, not the content.
151 so make sure: No one else frees the string, the string has allocated with 154 so make sure: No one else frees the string, the string has allocated with
152 malloc for compatibility with c-based libs 155 malloc for compatibility with c-based libs
153 */ 156 */
154 encodedString(char*nContent,unsigned int nSize); 157 encodedString(char*nContent,unsigned int nSize);
155 /* copy construkor - makes ALWAYS a deep copy!!!! */ 158 /* copy construkor - makes ALWAYS a deep copy!!!! */
156 encodedString(const encodedString&old); 159 encodedString(const encodedString&old);
157 /* assign operator - makes ALWAYS a deep copy!!!! */ 160 /* assign operator - makes ALWAYS a deep copy!!!! */
158 encodedString& operator=(const encodedString&old); 161 encodedString& operator=(const encodedString&old);
159 /* destructor - cleans the content */ 162 /* destructor - cleans the content */
160 virtual ~encodedString(); 163 virtual ~encodedString();
161 164
162 /* returns a pointer to the content - do not delete yoursel! */ 165 /* returns a pointer to the content - do not delete yoursel! */
163 const char*Content()const; 166 const char*Content()const;
164 /* returns the lengths of the content 'cause it must not be a null-terminated string! */ 167 /* returns the lengths of the content 'cause it must not be a null-terminated string! */
165 const int Length()const; 168 const int Length()const;
166 169
167 /* 170 /*
168 makes a deep copy of nContent! 171 makes a deep copy of nContent!
169 */ 172 */
170 void setContent(const char*nContent,int nSize); 173 void setContent(const char*nContent,int nSize);
171 /* 174 /*
172 Take over the nContent. Means: it will just copy the pointer, not the content. 175 Take over the nContent. Means: it will just copy the pointer, not the content.
173 so make sure: No one else frees the string, the string has allocated with 176 so make sure: No one else frees the string, the string has allocated with
174 malloc for compatibility with c-based libs 177 malloc for compatibility with c-based libs
175 */ 178 */
176 void setContent(char*nContent,int nSize); 179 void setContent(char*nContent,int nSize);
177 180
178protected: 181protected:
179 char * content; 182 char * content;
180 unsigned int size; 183 unsigned int size;
181 184
182 void init(); 185 void init();
183 void copy_old(const encodedString&old); 186 void copy_old(const encodedString&old);
184 void clean(); 187 void clean();
185}; 188};
186 189
187struct folderStat 190struct folderStat
188{ 191{
189 unsigned int message_count; 192 unsigned int message_count;
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
index 63acfd5..a4e0beb 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
@@ -1,34 +1,27 @@
1#include <stdlib.h>
2#include <sys/stat.h>
3#include <sys/types.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <string.h>
7#include <qt.h>
8
9#include <qpe/config.h>
10#include <qpe/qcopenvelope_qws.h>
11
12#include <libetpan/libetpan.h>
13
14#include "smtpwrapper.h" 1#include "smtpwrapper.h"
15#include "mailwrapper.h" 2#include "mailwrapper.h"
16#include "abstractmail.h" 3#include "abstractmail.h"
17#include "logindialog.h" 4#include "logindialog.h"
18#include "mailtypes.h" 5#include "mailtypes.h"
19#include "sendmailprogress.h" 6#include "sendmailprogress.h"
20 7
21const char* SMTPwrapper::USER_AGENT="OpieMail v0.4"; 8#include <qt.h>
9
10#include <qpe/config.h>
11#include <qpe/qcopenvelope_qws.h>
12
13#include <libetpan/libetpan.h>
14
22 15
23progressMailSend*SMTPwrapper::sendProgress = 0; 16progressMailSend*SMTPwrapper::sendProgress = 0;
24 17
25SMTPwrapper::SMTPwrapper(SMTPaccount * aSmtp ) 18SMTPwrapper::SMTPwrapper(SMTPaccount * aSmtp )
26 : QObject() 19 : Generatemail()
27{ 20{
28 m_SmtpAccount = aSmtp; 21 m_SmtpAccount = aSmtp;
29 Config cfg( "mail" ); 22 Config cfg( "mail" );
30 cfg.setGroup( "Status" ); 23 cfg.setGroup( "Status" );
31 m_queuedMail = cfg.readNumEntry( "outgoing", 0 ); 24 m_queuedMail = cfg.readNumEntry( "outgoing", 0 );
32 emit queuedMails( m_queuedMail ); 25 emit queuedMails( m_queuedMail );
33 connect( this, SIGNAL( queuedMails(int) ), this, SLOT( emitQCop(int) ) ); 26 connect( this, SIGNAL( queuedMails(int) ), this, SLOT( emitQCop(int) ) );
34 m_smtp = 0; 27 m_smtp = 0;
@@ -82,453 +75,16 @@ QString SMTPwrapper::mailsmtpError( int errnum ) {
82 return tr( "Memory error" ); 75 return tr( "Memory error" );
83 case MAILSMTP_ERROR_CONNECTION_REFUSED: 76 case MAILSMTP_ERROR_CONNECTION_REFUSED:
84 return tr( "Connection refused" ); 77 return tr( "Connection refused" );
85 default: 78 default:
86 return tr( "Unknown error code" ); 79 return tr( "Unknown error code" );
87 } 80 }
88} 81}
89 82
90mailimf_mailbox *SMTPwrapper::newMailbox(const QString&name, const QString&mail ) {
91 return mailimf_mailbox_new( strdup( name.latin1() ),
92 strdup( mail.latin1() ) );
93}
94
95mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) {
96 mailimf_address_list *addresses;
97
98 if ( addr.isEmpty() )
99 return NULL;
100
101 addresses = mailimf_address_list_new_empty();
102
103 bool literal_open = false;
104 unsigned int startpos = 0;
105 QStringList list;
106 QString s;
107 unsigned int i = 0;
108 for (; i < addr.length();++i) {
109 switch (addr[i]) {
110 case '\"':
111 literal_open = !literal_open;
112 break;
113 case ',':
114 if (!literal_open) {
115 s = addr.mid(startpos,i-startpos);
116 if (!s.isEmpty()) {
117 list.append(s);
118 qDebug("Appended %s",s.latin1());
119 }
120 // !!!! this is a MUST BE!
121 startpos = ++i;
122 }
123 break;
124 default:
125 break;
126 }
127 }
128 s = addr.mid(startpos,i-startpos);
129 if (!s.isEmpty()) {
130 list.append(s);
131 qDebug("Appended %s",s.latin1());
132 }
133 QStringList::Iterator it;
134 for ( it = list.begin(); it != list.end(); it++ ) {
135 int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() );
136 if ( err != MAILIMF_NO_ERROR ) {
137 qDebug( "Error parsing" );
138 qDebug( *it );
139 } else {
140 qDebug( "Parse success! %s",(*it).latin1());
141 }
142 }
143 return addresses;
144}
145
146mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail ) {
147 mailimf_fields *fields;
148 mailimf_field *xmailer;
149 mailimf_mailbox *sender=0,*fromBox=0;
150 mailimf_mailbox_list *from=0;
151 mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0;
152 clist*in_reply_to = 0;
153 char *subject = strdup( mail.getSubject().latin1() );
154 int err;
155
156 sender = newMailbox( mail.getName(), mail.getMail() );
157 if ( sender == NULL )
158 goto err_free;
159
160 fromBox = newMailbox( mail.getName(), mail.getMail() );
161 if ( fromBox == NULL )
162 goto err_free_sender;
163
164 from = mailimf_mailbox_list_new_empty();
165 if ( from == NULL )
166 goto err_free_fromBox;
167
168 err = mailimf_mailbox_list_add( from, fromBox );
169 if ( err != MAILIMF_NO_ERROR )
170 goto err_free_from;
171
172 to = parseAddresses( mail.getTo() );
173 if ( to == NULL )
174 goto err_free_from;
175
176 cc = parseAddresses( mail.getCC() );
177 bcc = parseAddresses( mail.getBCC() );
178 reply = parseAddresses( mail.getReply() );
179
180 if (mail.Inreply().count()>0) {
181 in_reply_to = clist_new();
182 char*c_reply;
183 unsigned int nsize = 0;
184 for (QStringList::ConstIterator it=mail.Inreply().begin();
185 it != mail.Inreply().end();++it) {
186 /* yes! must be malloc! */
187 if ((*it).isEmpty())
188 continue;
189 QString h((*it));
190 while (h.length()>0 && h[0]=='<') {
191 h.remove(0,1);
192 }
193 while (h.length()>0 && h[h.length()-1]=='>') {
194 h.remove(h.length()-1,1);
195 }
196 if (h.isEmpty()) continue;
197 nsize = strlen(h.latin1());
198 c_reply = (char*)malloc( (nsize+1)*sizeof(char));
199 memset(c_reply,0,nsize+1);
200 memcpy(c_reply,h.latin1(),nsize);
201 clist_append(in_reply_to,c_reply);
202 qDebug("In reply to: %s",c_reply);
203 }
204 }
205
206 fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc,
207 in_reply_to, NULL, subject );
208 if ( fields == NULL )
209 goto err_free_reply;
210
211 xmailer = mailimf_field_new_custom( strdup( "User-Agent" ),
212 strdup( USER_AGENT ) );
213 if ( xmailer == NULL )
214 goto err_free_fields;
215
216 err = mailimf_fields_add( fields, xmailer );
217 if ( err != MAILIMF_NO_ERROR )
218 goto err_free_xmailer;
219
220 return fields; // Success :)
221
222err_free_xmailer:
223 if (xmailer)
224 mailimf_field_free( xmailer );
225err_free_fields:
226 if (fields)
227 mailimf_fields_free( fields );
228err_free_reply:
229 if (reply)
230 mailimf_address_list_free( reply );
231 if (bcc)
232 mailimf_address_list_free( bcc );
233 if (cc)
234 mailimf_address_list_free( cc );
235 if (to)
236 mailimf_address_list_free( to );
237err_free_from:
238 if (from)
239 mailimf_mailbox_list_free( from );
240err_free_fromBox:
241 mailimf_mailbox_free( fromBox );
242err_free_sender:
243 if (sender)
244 mailimf_mailbox_free( sender );
245err_free:
246 if (subject)
247 free( subject );
248 qDebug( "createImfFields - error" );
249
250 return NULL; // Error :(
251}
252
253mailmime *SMTPwrapper::buildTxtPart(const QString&str ) {
254 mailmime *txtPart;
255 mailmime_fields *fields;
256 mailmime_content *content;
257 mailmime_parameter *param;
258 int err;
259
260 param = mailmime_parameter_new( strdup( "charset" ),
261 strdup( "iso-8859-1" ) );
262 if ( param == NULL )
263 goto err_free;
264
265 content = mailmime_content_new_with_str( "text/plain" );
266 if ( content == NULL )
267 goto err_free_param;
268
269 err = clist_append( content->ct_parameters, param );
270 if ( err != MAILIMF_NO_ERROR )
271 goto err_free_content;
272
273 fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
274 if ( fields == NULL )
275 goto err_free_content;
276
277 txtPart = mailmime_new_empty( content, fields );
278 if ( txtPart == NULL )
279 goto err_free_fields;
280
281 err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() );
282 if ( err != MAILIMF_NO_ERROR )
283 goto err_free_txtPart;
284
285 return txtPart; // Success :)
286
287err_free_txtPart:
288 mailmime_free( txtPart );
289err_free_fields:
290 mailmime_fields_free( fields );
291err_free_content:
292 mailmime_content_free( content );
293err_free_param:
294 mailmime_parameter_free( param );
295err_free:
296 qDebug( "buildTxtPart - error" );
297
298 return NULL; // Error :(
299}
300
301mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) {
302 mailmime * filePart = 0;
303 mailmime_fields * fields = 0;
304 mailmime_content * content = 0;
305 mailmime_parameter * param = 0;
306 char*name = 0;
307 char*file = 0;
308 int err;
309
310 int pos = filename.findRev( '/' );
311
312 if (filename.length()>0) {
313 QString tmp = filename.right( filename.length() - ( pos + 1 ) );
314 name = strdup( tmp.latin1() ); // just filename
315 file = strdup( filename.latin1() ); // full name with path
316 }
317
318 int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT;
319 int mechanism = MAILMIME_MECHANISM_BASE64;
320
321 if ( mimetype.startsWith( "text/" ) ) {
322 param = mailmime_parameter_new( strdup( "charset" ),
323 strdup( "iso-8859-1" ) );
324 mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
325 }
326
327 fields = mailmime_fields_new_filename(
328 disptype, name,
329 mechanism );
330 content = mailmime_content_new_with_str( (char*)mimetype.latin1() );
331 if (content!=0 && fields != 0) {
332 if (param) {
333 clist_append(content->ct_parameters,param);
334 param = 0;
335 }
336 if (filename.length()>0) {
337 QFileInfo f(filename);
338 param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1()));
339 clist_append(content->ct_parameters,param);
340 param = 0;
341 }
342 filePart = mailmime_new_empty( content, fields );
343 }
344 if (filePart) {
345 if (filename.length()>0) {
346 err = mailmime_set_body_file( filePart, file );
347 } else {
348 err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length());
349 }
350 if (err != MAILIMF_NO_ERROR) {
351 qDebug("Error setting body with file %s",file);
352 mailmime_free( filePart );
353 filePart = 0;
354 }
355 }
356
357 if (!filePart) {
358 if ( param != NULL ) {
359 mailmime_parameter_free( param );
360 }
361 if (content) {
362 mailmime_content_free( content );
363 }
364 if (fields) {
365 mailmime_fields_free( fields );
366 } else {
367 if (name) {
368 free( name );
369 }
370 if (file) {
371 free( file );
372 }
373 }
374 }
375 return filePart; // Success :)
376
377}
378
379void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files ) {
380 const Attachment *it;
381 unsigned int count = files.count();
382 qDebug("List contains %i values",count);
383 for ( unsigned int i = 0; i < count; ++i ) {
384 qDebug( "Adding file" );
385 mailmime *filePart;
386 int err;
387 it = ((QList<Attachment>)files).at(i);
388
389 filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" );
390 if ( filePart == NULL ) {
391 qDebug( "addFileParts: error adding file:" );
392 qDebug( it->getFileName() );
393 continue;
394 }
395 err = mailmime_smart_add_part( message, filePart );
396 if ( err != MAILIMF_NO_ERROR ) {
397 mailmime_free( filePart );
398 qDebug("error smart add");
399 }
400 }
401}
402
403mailmime *SMTPwrapper::createMimeMail(const Mail &mail ) {
404 mailmime *message, *txtPart;
405 mailimf_fields *fields;
406 int err;
407
408 fields = createImfFields( mail );
409 if ( fields == NULL )
410 goto err_free;
411
412 message = mailmime_new_message_data( NULL );
413 if ( message == NULL )
414 goto err_free_fields;
415
416 mailmime_set_imf_fields( message, fields );
417
418 txtPart = buildTxtPart( mail.getMessage() );
419
420 if ( txtPart == NULL )
421 goto err_free_message;
422
423 err = mailmime_smart_add_part( message, txtPart );
424 if ( err != MAILIMF_NO_ERROR )
425 goto err_free_txtPart;
426
427 addFileParts( message, mail.getAttachments() );
428
429 return message; // Success :)
430
431err_free_txtPart:
432 mailmime_free( txtPart );
433err_free_message:
434 mailmime_free( message );
435err_free_fields:
436 mailimf_fields_free( fields );
437err_free:
438 qDebug( "createMimeMail: error" );
439
440 return NULL; // Error :(
441}
442
443mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) {
444 mailimf_field *field;
445 clistiter *it;
446
447 it = clist_begin( fields->fld_list );
448 while ( it ) {
449 field = (mailimf_field *) it->data;
450 if ( field->fld_type == type ) {
451 return field;
452 }
453 it = it->next;
454 }
455
456 return NULL;
457}
458
459void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) {
460 clistiter *it, *it2;
461
462 for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) {
463 mailimf_address *addr;
464 addr = (mailimf_address *) it->data;
465
466 if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) {
467 esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL );
468 } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) {
469 clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list;
470 for ( it2 = clist_begin( l ); it2; it2 = it2->next ) {
471 mailimf_mailbox *mbox;
472 mbox = (mailimf_mailbox *) it2->data;
473 esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL );
474 }
475 }
476 }
477}
478
479clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) {
480 clist *rcptList;
481 mailimf_field *field;
482
483 rcptList = esmtp_address_list_new();
484
485 field = getField( fields, MAILIMF_FIELD_TO );
486 if ( field && (field->fld_type == MAILIMF_FIELD_TO)
487 && field->fld_data.fld_to->to_addr_list ) {
488 addRcpts( rcptList, field->fld_data.fld_to->to_addr_list );
489 }
490
491 field = getField( fields, MAILIMF_FIELD_CC );
492 if ( field && (field->fld_type == MAILIMF_FIELD_CC)
493 && field->fld_data.fld_cc->cc_addr_list ) {
494 addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list );
495 }
496
497 field = getField( fields, MAILIMF_FIELD_BCC );
498 if ( field && (field->fld_type == MAILIMF_FIELD_BCC)
499 && field->fld_data.fld_bcc->bcc_addr_list ) {
500 addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list );
501 }
502
503 return rcptList;
504}
505
506char *SMTPwrapper::getFrom( mailimf_field *ffrom) {
507 char *from = NULL;
508 if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM)
509 && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) {
510 clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list;
511 clistiter *it;
512 for ( it = clist_begin( cl ); it; it = it->next ) {
513 mailimf_mailbox *mb = (mailimf_mailbox *) it->data;
514 from = strdup( mb->mb_addr_spec );
515 }
516 }
517
518 return from;
519}
520
521char *SMTPwrapper::getFrom( mailmime *mail ) {
522 /* no need to delete - its just a pointer to structure content */
523 mailimf_field *ffrom = 0;
524 ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM );
525 return getFrom(ffrom);
526}
527 83
528void SMTPwrapper::progress( size_t current, size_t maximum ) { 84void SMTPwrapper::progress( size_t current, size_t maximum ) {
529 if (SMTPwrapper::sendProgress) { 85 if (SMTPwrapper::sendProgress) {
530 SMTPwrapper::sendProgress->setSingleMail(current, maximum ); 86 SMTPwrapper::sendProgress->setSingleMail(current, maximum );
531 qApp->processEvents(); 87 qApp->processEvents();
532 } 88 }
533} 89}
534 90
@@ -624,17 +180,17 @@ void SMTPwrapper::connect_server()
624 const char *server, *user, *pass; 180 const char *server, *user, *pass;
625 bool ssl; 181 bool ssl;
626 uint16_t port; 182 uint16_t port;
627 ssl = false; 183 ssl = false;
628 bool try_tls = true; 184 bool try_tls = true;
629 bool force_tls=false; 185 bool force_tls=false;
630 server = user = pass = 0; 186 server = user = pass = 0;
631 QString failuretext = ""; 187 QString failuretext = "";
632 188
633 if (m_smtp || !m_SmtpAccount) { 189 if (m_smtp || !m_SmtpAccount) {
634 return; 190 return;
635 } 191 }
636 server = m_SmtpAccount->getServer().latin1(); 192 server = m_SmtpAccount->getServer().latin1();
637 if ( m_SmtpAccount->ConnectionType() == 2 ) { 193 if ( m_SmtpAccount->ConnectionType() == 2 ) {
638 ssl = true; 194 ssl = true;
639 try_tls = false; 195 try_tls = false;
640 } else if (m_SmtpAccount->ConnectionType() == 1) { 196 } else if (m_SmtpAccount->ConnectionType() == 1) {
@@ -687,17 +243,17 @@ void SMTPwrapper::connect_server()
687 result = 0; 243 result = 0;
688 failuretext = tr("Error init SMTP tls: %1").arg(mailsmtpError(err)); 244 failuretext = tr("Error init SMTP tls: %1").arg(mailsmtpError(err));
689 } 245 }
690 246
691 if (result==1 && m_SmtpAccount->getLogin() ) { 247 if (result==1 && m_SmtpAccount->getLogin() ) {
692 qDebug("smtp with auth"); 248 qDebug("smtp with auth");
693 if ( m_SmtpAccount->getUser().isEmpty() || m_SmtpAccount->getPassword().isEmpty() ) { 249 if ( m_SmtpAccount->getUser().isEmpty() || m_SmtpAccount->getPassword().isEmpty() ) {
694 // get'em 250 // get'em
695 LoginDialog login( m_SmtpAccount->getUser(), 251 LoginDialog login( m_SmtpAccount->getUser(),
696 m_SmtpAccount->getPassword(), NULL, 0, true ); 252 m_SmtpAccount->getPassword(), NULL, 0, true );
697 login.show(); 253 login.show();
698 if ( QDialog::Accepted == login.exec() ) { 254 if ( QDialog::Accepted == login.exec() ) {
699 // ok 255 // ok
700 user = login.getUser().latin1(); 256 user = login.getUser().latin1();
701 pass = login.getPassword().latin1(); 257 pass = login.getPassword().latin1();
702 } else { 258 } else {
703 result = 0; 259 result = 0;
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.h b/noncore/net/mail/libmailwrapper/smtpwrapper.h
index 7f6aac1..1796df7 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.h
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.h
@@ -4,31 +4,22 @@
4 4
5#include <qpe/applnk.h> 5#include <qpe/applnk.h>
6 6
7#include <qbitarray.h> 7#include <qbitarray.h>
8#include <qdatetime.h> 8#include <qdatetime.h>
9#include <libetpan/clist.h> 9#include <libetpan/clist.h>
10 10
11#include "settings.h" 11#include "settings.h"
12#include "generatemail.h"
12 13
13class Mail;
14class AbstractMail;
15class RecMail;
16class Attachment;
17struct mailimf_fields;
18struct mailimf_field;
19struct mailimf_mailbox;
20struct mailmime;
21struct mailimf_address_list;
22class progressMailSend;
23struct mailsmtp;
24class SMTPaccount; 14class SMTPaccount;
15class AbstractMail;
25 16
26class SMTPwrapper : public QObject 17class SMTPwrapper : public Generatemail
27{ 18{
28 Q_OBJECT 19 Q_OBJECT
29 20
30public: 21public:
31 SMTPwrapper(SMTPaccount * aSmtp); 22 SMTPwrapper(SMTPaccount * aSmtp);
32 virtual ~SMTPwrapper(); 23 virtual ~SMTPwrapper();
33 void sendMail(const Mail& mail,bool later=false ); 24 void sendMail(const Mail& mail,bool later=false );
34 bool flushOutbox(); 25 bool flushOutbox();
@@ -40,44 +31,31 @@ signals:
40 31
41protected: 32protected:
42 mailsmtp *m_smtp; 33 mailsmtp *m_smtp;
43 SMTPaccount * m_SmtpAccount; 34 SMTPaccount * m_SmtpAccount;
44 35
45 void connect_server(); 36 void connect_server();
46 void disc_server(); 37 void disc_server();
47 int start_smtp_tls(); 38 int start_smtp_tls();
48 39
49 mailimf_mailbox *newMailbox(const QString&name,const QString&mail ); 40
50 mailimf_fields *createImfFields(const Mail &mail );
51 mailmime *createMimeMail(const Mail&mail );
52
53 mailimf_address_list *parseAddresses(const QString&addr );
54 void addFileParts( mailmime *message,const QList<Attachment>&files );
55 mailmime *buildTxtPart(const QString&str );
56 mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content);
57 void smtpSend( mailmime *mail,bool later); 41 void smtpSend( mailmime *mail,bool later);
58 clist *createRcptList( mailimf_fields *fields );
59 42
60 static void storeMail(const char*mail, size_t length, const QString&box); 43 static void storeMail(const char*mail, size_t length, const QString&box);
61 static QString mailsmtpError( int err ); 44 static QString mailsmtpError( int err );
62 static void progress( size_t current, size_t maximum ); 45 static void progress( size_t current, size_t maximum );
63 static void addRcpts( clist *list, mailimf_address_list *addr_list );
64 static char *getFrom( mailmime *mail );
65 static char *getFrom( mailimf_field *ffrom);
66 static mailimf_field *getField( mailimf_fields *fields, int type );
67 46
68 int smtpSend(char*from,clist*rcpts,const char*data,size_t size); 47 int smtpSend(char*from,clist*rcpts,const char*data,size_t size);
69 48
70 void storeMail(mailmime*mail, const QString&box); 49 void storeMail(mailmime*mail, const QString&box);
71 50
72 int sendQueuedMail(AbstractMail*wrap,RecMail*which); 51 int sendQueuedMail(AbstractMail*wrap,RecMail*which);
73 void storeFailedMail(const char*data,unsigned int size, const char*failuremessage); 52 void storeFailedMail(const char*data,unsigned int size, const char*failuremessage);
74 53
75 int m_queuedMail; 54 int m_queuedMail;
76 static const char* USER_AGENT;
77 55
78protected slots: 56protected slots:
79 void emitQCop( int queued ); 57 void emitQCop( int queued );
80 58
81}; 59};
82 60
83#endif 61#endif