summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/imapwrapper.cpp214
-rw-r--r--noncore/net/mail/imapwrapper.h15
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp214
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h15
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.cpp39
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.h16
-rw-r--r--noncore/net/mail/mailtypes.cpp39
-rw-r--r--noncore/net/mail/mailtypes.h16
8 files changed, 456 insertions, 112 deletions
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index e6e9fc9..27f1410 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -23,11 +23,15 @@ void IMAPwrapper::imap_progress( size_t current, size_t maximum )
23 23
24void IMAPwrapper::login() 24void IMAPwrapper::login()
25{ 25{
26 logout();
27 const char *server, *user, *pass; 26 const char *server, *user, *pass;
28 uint16_t port; 27 uint16_t port;
29 int err = MAILIMAP_NO_ERROR; 28 int err = MAILIMAP_NO_ERROR;
30 29
30 /* we are connected this moment */
31 /* TODO: setup a timer holding the line or if connection closed - delete the value */
32 if (m_imap) {
33 return;
34 }
31 server = account->getServer().latin1(); 35 server = account->getServer().latin1();
32 port = account->getPort().toUInt(); 36 port = account->getPort().toUInt();
33 user = account->getUser().latin1(); 37 user = account->getUser().latin1();
@@ -35,8 +39,7 @@ void IMAPwrapper::login()
35 39
36 m_imap = mailimap_new( 20, &imap_progress ); 40 m_imap = mailimap_new( 20, &imap_progress );
37 /* connect */ 41 /* connect */
38 // err = mailimap_socket_connect( m_imap, (char*)server, port ); 42 if (account->getSSL()) {
39 if (account->getSSL()) {
40 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 43 err = mailimap_ssl_connect( m_imap, (char*)server, port );
41 } else { 44 } else {
42 err = mailimap_socket_connect( m_imap, (char*)server, port ); 45 err = mailimap_socket_connect( m_imap, (char*)server, port );
@@ -77,7 +80,7 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
77 int err = MAILIMAP_NO_ERROR; 80 int err = MAILIMAP_NO_ERROR;
78 clist *result; 81 clist *result;
79 clistcell *current; 82 clistcell *current;
80 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate; 83// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
81 mailimap_fetch_type *fetchType; 84 mailimap_fetch_type *fetchType;
82 mailimap_set *set; 85 mailimap_set *set;
83 86
@@ -90,7 +93,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
90 err = mailimap_examine( m_imap, (char*)mb); 93 err = mailimap_examine( m_imap, (char*)mb);
91 if ( err != MAILIMAP_NO_ERROR ) { 94 if ( err != MAILIMAP_NO_ERROR ) {
92 qDebug("error selecting mailbox: %s",m_imap->imap_response); 95 qDebug("error selecting mailbox: %s",m_imap->imap_response);
93 logout();
94 return; 96 return;
95 } 97 }
96 98
@@ -98,35 +100,29 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
98 100
99 if (last == 0) { 101 if (last == 0) {
100 qDebug("mailbox has no mails"); 102 qDebug("mailbox has no mails");
101 logout();
102 return; 103 return;
103 } 104 }
104 105
105 result = clist_new(); 106 result = clist_new();
106 /* the range has to start at 1!!! not with 0!!!! */ 107 /* the range has to start at 1!!! not with 0!!!! */
107 set = mailimap_set_new_interval( 1, last ); 108 set = mailimap_set_new_interval( 1, last );
108 fetchAtt = mailimap_fetch_att_new_envelope();
109 fetchAttFlags = mailimap_fetch_att_new_flags();
110 fetchAttDate = mailimap_fetch_att_new_internaldate();
111
112 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
113 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 109 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
114 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); 110 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
115 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); 111 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
116 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); 112 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
113 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
117 114
118 err = mailimap_fetch( m_imap, set, fetchType, &result ); 115 err = mailimap_fetch( m_imap, set, fetchType, &result );
119 mailimap_set_free( set ); 116 mailimap_set_free( set );
120 /* cleans up the fetch_att's too! */
121 mailimap_fetch_type_free( fetchType ); 117 mailimap_fetch_type_free( fetchType );
122 118
123 QString date,subject,from; 119 QString date,subject,from;
124 120
125 if ( err == MAILIMAP_NO_ERROR ) { 121 if ( err == MAILIMAP_NO_ERROR ) {
126 current = clist_begin(result); 122
127 mailimap_msg_att * msg_att; 123 mailimap_msg_att * msg_att;
128 int i = 0; 124 int i = 0;
129 while ( current != 0 ) { 125 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
130 ++i; 126 ++i;
131 msg_att = (mailimap_msg_att*)current->data; 127 msg_att = (mailimap_msg_att*)current->data;
132 RecMail*m = parse_list_result(msg_att); 128 RecMail*m = parse_list_result(msg_att);
@@ -135,13 +131,11 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
135 m->setMbox(mailbox); 131 m->setMbox(mailbox);
136 target.append(m); 132 target.append(m);
137 } 133 }
138 current = current->next;
139 } 134 }
140 } else { 135 } else {
141 qDebug("Error fetching headers: %s",m_imap->imap_response); 136 qDebug("Error fetching headers: %s",m_imap->imap_response);
142 } 137 }
143 logout(); 138 mailimap_fetch_list_free(result);
144 clist_free(result);
145} 139}
146 140
147QList<IMAPFolder>* IMAPwrapper::listFolders() 141QList<IMAPFolder>* IMAPwrapper::listFolders()
@@ -219,17 +213,17 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
219 clistcell *current,*c,*cf; 213 clistcell *current,*c,*cf;
220 mailimap_msg_att_dynamic*flist; 214 mailimap_msg_att_dynamic*flist;
221 mailimap_flag_fetch*cflag; 215 mailimap_flag_fetch*cflag;
216 int size;
222 QBitArray mFlags(7); 217 QBitArray mFlags(7);
223 QStringList addresslist; 218 QStringList addresslist;
224 219
225 if (!m_att) { 220 if (!m_att) {
226 return m; 221 return m;
227 } 222 }
228 223 m = new RecMail();
229 c = clist_begin(m_att->att_list); 224 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
230 while ( c ) {
231 current = c; 225 current = c;
232 c = c->next; 226 size = 0;
233 item = (mailimap_msg_att_item*)current->data; 227 item = (mailimap_msg_att_item*)current->data;
234 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 228 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
235 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 229 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
@@ -237,7 +231,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
237 continue; 231 continue;
238 } 232 }
239 cf = flist->att_list->first; 233 cf = flist->att_list->first;
240 while (cf) { 234 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
241 cflag = (mailimap_flag_fetch*)cf->data; 235 cflag = (mailimap_flag_fetch*)cf->data;
242 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 236 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
243 switch (cflag->fl_flag->fl_type) { 237 switch (cflag->fl_flag->fl_type) {
@@ -266,15 +260,11 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
266 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 260 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
267 mFlags.setBit(FLAG_RECENT); 261 mFlags.setBit(FLAG_RECENT);
268 } 262 }
269 cf = cf->next;
270 } 263 }
271 continue; 264 continue;
272 } 265 }
273 if ( item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { 266 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
274 qDebug( "header: \n%s", item->att_data.att_static->att_data.att_rfc822_header );
275 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
276 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 267 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
277 m = new RecMail();
278 m->setDate(head->env_date); 268 m->setDate(head->env_date);
279 m->setSubject(head->env_subject); 269 m->setSubject(head->env_subject);
280 if (head->env_from!=NULL) { 270 if (head->env_from!=NULL) {
@@ -307,8 +297,8 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
307 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 297 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
308 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); 298 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);
309 qDebug(da.toString()); 299 qDebug(da.toString());
310 } else { 300 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
311 qDebug("Another type"); 301 size = item->att_data.att_static->att_data.att_rfc822_size;
312 } 302 }
313 } 303 }
314 /* msg is already deleted */ 304 /* msg is already deleted */
@@ -318,6 +308,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
318 } 308 }
319 if (m) { 309 if (m) {
320 m->setFlags(mFlags); 310 m->setFlags(mFlags);
311 m->setMsgsize(size);
321 } 312 }
322 return m; 313 return m;
323} 314}
@@ -344,13 +335,13 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
344 err = mailimap_examine( m_imap, (char*)mb); 335 err = mailimap_examine( m_imap, (char*)mb);
345 if ( err != MAILIMAP_NO_ERROR ) { 336 if ( err != MAILIMAP_NO_ERROR ) {
346 qDebug("error selecting mailbox: %s",m_imap->imap_response); 337 qDebug("error selecting mailbox: %s",m_imap->imap_response);
347 logout();
348 return body; 338 return body;
349 } 339 }
340
350 result = clist_new(); 341 result = clist_new();
351 /* the range has to start at 1!!! not with 0!!!! */ 342 /* the range has to start at 1!!! not with 0!!!! */
352 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 343 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
353 fetchAtt = mailimap_fetch_att_new_body(); 344 fetchAtt = mailimap_fetch_att_new_bodystructure();
354 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 345 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
355 err = mailimap_fetch( m_imap, set, fetchType, &result ); 346 err = mailimap_fetch( m_imap, set, fetchType, &result );
356 mailimap_set_free( set ); 347 mailimap_set_free( set );
@@ -363,26 +354,39 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
363 body_desc = item->att_data.att_static->att_data.att_body; 354 body_desc = item->att_data.att_static->att_data.att_body;
364 if (body_desc->bd_type==MAILIMAP_BODY_1PART) { 355 if (body_desc->bd_type==MAILIMAP_BODY_1PART) {
365 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body); 356 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body);
366 } else { 357 } else if (body_desc->bd_type==MAILIMAP_BODY_MPART) {
358 qDebug("Mulitpart mail");
359 searchBodyText(mail,body_desc->bd_data.bd_body_mpart,body,0);
367 } 360 }
368
369 } else { 361 } else {
370 qDebug("error fetching body: %s",m_imap->imap_response); 362 qDebug("error fetching body: %s",m_imap->imap_response);
371 } 363 }
372 364 mailimap_fetch_list_free(result);
373 clist_free(result);
374 logout();
375 return body; 365 return body;
376} 366}
377 367
368/* this routine is just called when the mail has only ONE part.
369 for filling the parts of a multi-part-message there are other
370 routines 'cause we can not simply fetch the whole body. */
378void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body) 371void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body)
379{ 372{
380 if (!mailDescription) { 373 if (!mailDescription) {
381 return; 374 return;
382 } 375 }
376 QString sub;
383 switch (mailDescription->bd_type) { 377 switch (mailDescription->bd_type) {
378 case MAILIMAP_BODY_TYPE_1PART_MSG:
379 target_body.setType("text");
380 sub = mailDescription->bd_data.bd_type_text->bd_media_text;
381 target_body.setSubtype(sub.lower());
382 fillPlainBody(mail,target_body);
383 break;
384 case MAILIMAP_BODY_TYPE_1PART_TEXT: 384 case MAILIMAP_BODY_TYPE_1PART_TEXT:
385 fillPlainBody(mail,target_body,mailDescription->bd_data.bd_type_text); 385 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
386 target_body.setType("text");
387 sub = mailDescription->bd_data.bd_type_text->bd_media_text;
388 target_body.setSubtype(sub.lower());
389 fillPlainBody(mail,target_body);
386 break; 390 break;
387 default: 391 default:
388 break; 392 break;
@@ -390,7 +394,7 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mai
390 return; 394 return;
391} 395}
392 396
393void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap_body_type_text * bd) 397void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body)
394{ 398{
395 const char *mb; 399 const char *mb;
396 QString body=""; 400 QString body="";
@@ -426,10 +430,13 @@ void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap
426 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 430 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
427 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 431 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
428 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 432 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
429 int length = msg_att_item->att_data.att_static->att_data.att_body_section->sec_length;
430 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 433 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
431 body = QString(text); 434 if (text) {
432 free(text); 435 body = QString(text);
436 free(text);
437 } else {
438 body = "";
439 }
433 } 440 }
434 } 441 }
435 } 442 }
@@ -437,7 +444,6 @@ void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap
437 } else { 444 } else {
438 qDebug("error fetching text: %s",m_imap->imap_response); 445 qDebug("error fetching text: %s",m_imap->imap_response);
439 } 446 }
440 //clist_free(result);
441 mailimap_fetch_list_free(result); 447 mailimap_fetch_list_free(result);
442 target_body.setBodytext(body); 448 target_body.setBodytext(body);
443 return; 449 return;
@@ -453,13 +459,11 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
453 if (!list) { 459 if (!list) {
454 return l; 460 return l;
455 } 461 }
456 current = clist_begin(list);
457 unsigned int count = 0; 462 unsigned int count = 0;
458 while (current!= NULL) { 463 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
459 from = ""; 464 from = "";
460 named_from = false; 465 named_from = false;
461 current_address=(mailimap_address*)current->data; 466 current_address=(mailimap_address*)current->data;
462 current = current->next;
463 if (current_address->ad_personal_name){ 467 if (current_address->ad_personal_name){
464 from+=QString(current_address->ad_personal_name); 468 from+=QString(current_address->ad_personal_name);
465 from+=" "; 469 from+=" ";
@@ -485,3 +489,117 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
485 } 489 }
486 return l; 490 return l;
487} 491}
492
493void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion)
494{
495 /* current_recursion is for avoiding ugly mails which has a to deep body-structure */
496 if (!mailDescription||current_recursion==2) {
497 return;
498 }
499 qDebug("Mediatype: %s",mailDescription->bd_media_subtype);
500 clistcell*current;
501 mailimap_body*current_body;
502 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
503 current_body = (mailimap_body*)current->data;
504 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
505 searchBodyText(mail,current_body->bd_data.bd_body_mpart,target_body,current_recursion+1);
506 } else if (current_body->bd_type==MAILIMAP_BODY_1PART){
507 RecPart currentPart;
508 fillSinglePart(currentPart,current_body->bd_data.bd_body_1part);
509 target_body.addPart(currentPart);
510 }
511 }
512 if (current_recursion==0) {
513
514 }
515}
516
517void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
518{
519 if (!Description) {
520 return;
521 }
522 switch (Description->bd_type) {
523 case MAILIMAP_BODY_TYPE_1PART_TEXT:
524 target_part.setType("text");
525 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
526 break;
527 case MAILIMAP_BODY_TYPE_1PART_BASIC:
528 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
529 break;
530 default:
531 break;
532 }
533}
534
535void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
536{
537 if (!which) {
538 return;
539 }
540 QString sub;
541 sub = which->bd_media_text;
542 target_part.setSubtype(sub.lower());
543 target_part.setLines(which->bd_lines);
544 fillBodyFields(target_part,which->bd_fields);
545}
546
547void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
548{
549 if (!which) {
550 return;
551 }
552 QString type,sub;
553 switch (which->bd_media_basic->med_type) {
554 case MAILIMAP_MEDIA_BASIC_APPLICATION:
555 type = "application";
556 break;
557 case MAILIMAP_MEDIA_BASIC_AUDIO:
558 type = "audio";
559 break;
560 case MAILIMAP_MEDIA_BASIC_IMAGE:
561 type = "image";
562 break;
563 case MAILIMAP_MEDIA_BASIC_MESSAGE:
564 type = "message";
565 break;
566 case MAILIMAP_MEDIA_BASIC_VIDEO:
567 type = "video";
568 break;
569 case MAILIMAP_MEDIA_BASIC_OTHER:
570 default:
571 if (which->bd_media_basic->med_basic_type) {
572 type = which->bd_media_basic->med_basic_type;
573 } else {
574 type = "";
575 }
576 break;
577 }
578 if (which->bd_media_basic->med_subtype) {
579 sub = which->bd_media_basic->med_subtype;
580 } else {
581 sub = "";
582 }
583 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
584 target_part.setType(type.lower());
585 target_part.setSubtype(sub.lower());
586 fillBodyFields(target_part,which->bd_fields);
587}
588
589void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
590{
591 if (!which) return;
592 if (which->bd_id) {
593 qDebug("Part ID = %s",which->bd_id);
594 target_part.setIdentifier(which->bd_id);
595 } else {
596 qDebug("ID empty");
597 target_part.setIdentifier("");
598 }
599
600 clistcell*cur;
601 mailimap_single_body_fld_param*param;
602 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
603 param = (mailimap_single_body_fld_param*)cur->data;
604 }
605}
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 90f3004..f809edb 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -7,9 +7,13 @@
7struct mailimap; 7struct mailimap;
8struct mailimap_body_type_1part; 8struct mailimap_body_type_1part;
9struct mailimap_body_type_text; 9struct mailimap_body_type_text;
10struct mailimap_body_type_basic;
11struct mailimap_body_type_mpart;
12struct mailimap_body_fields;
10struct mailimap_msg_att; 13struct mailimap_msg_att;
11class RecMail; 14class RecMail;
12class RecBody; 15class RecBody;
16class RecPart;
13 17
14class IMAPwrapper : public QObject 18class IMAPwrapper : public QObject
15{ 19{
@@ -27,8 +31,17 @@ protected:
27 RecMail*parse_list_result(mailimap_msg_att*); 31 RecMail*parse_list_result(mailimap_msg_att*);
28 void login(); 32 void login();
29 void logout(); 33 void logout();
34
30 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body); 35 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
31 void fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap_body_type_text * text_body); 36 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion);
37
38 void fillPlainBody(const RecMail&mail,RecBody&target_body);
39 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
40 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
41 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
42
43 /* just helpers */
44 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
32 static QStringList address_list_to_stringlist(clist*list); 45 static QStringList address_list_to_stringlist(clist*list);
33 46
34private: 47private:
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index e6e9fc9..27f1410 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -23,11 +23,15 @@ void IMAPwrapper::imap_progress( size_t current, size_t maximum )
23 23
24void IMAPwrapper::login() 24void IMAPwrapper::login()
25{ 25{
26 logout();
27 const char *server, *user, *pass; 26 const char *server, *user, *pass;
28 uint16_t port; 27 uint16_t port;
29 int err = MAILIMAP_NO_ERROR; 28 int err = MAILIMAP_NO_ERROR;
30 29
30 /* we are connected this moment */
31 /* TODO: setup a timer holding the line or if connection closed - delete the value */
32 if (m_imap) {
33 return;
34 }
31 server = account->getServer().latin1(); 35 server = account->getServer().latin1();
32 port = account->getPort().toUInt(); 36 port = account->getPort().toUInt();
33 user = account->getUser().latin1(); 37 user = account->getUser().latin1();
@@ -35,8 +39,7 @@ void IMAPwrapper::login()
35 39
36 m_imap = mailimap_new( 20, &imap_progress ); 40 m_imap = mailimap_new( 20, &imap_progress );
37 /* connect */ 41 /* connect */
38 // err = mailimap_socket_connect( m_imap, (char*)server, port ); 42 if (account->getSSL()) {
39 if (account->getSSL()) {
40 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 43 err = mailimap_ssl_connect( m_imap, (char*)server, port );
41 } else { 44 } else {
42 err = mailimap_socket_connect( m_imap, (char*)server, port ); 45 err = mailimap_socket_connect( m_imap, (char*)server, port );
@@ -77,7 +80,7 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
77 int err = MAILIMAP_NO_ERROR; 80 int err = MAILIMAP_NO_ERROR;
78 clist *result; 81 clist *result;
79 clistcell *current; 82 clistcell *current;
80 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate; 83// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
81 mailimap_fetch_type *fetchType; 84 mailimap_fetch_type *fetchType;
82 mailimap_set *set; 85 mailimap_set *set;
83 86
@@ -90,7 +93,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
90 err = mailimap_examine( m_imap, (char*)mb); 93 err = mailimap_examine( m_imap, (char*)mb);
91 if ( err != MAILIMAP_NO_ERROR ) { 94 if ( err != MAILIMAP_NO_ERROR ) {
92 qDebug("error selecting mailbox: %s",m_imap->imap_response); 95 qDebug("error selecting mailbox: %s",m_imap->imap_response);
93 logout();
94 return; 96 return;
95 } 97 }
96 98
@@ -98,35 +100,29 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
98 100
99 if (last == 0) { 101 if (last == 0) {
100 qDebug("mailbox has no mails"); 102 qDebug("mailbox has no mails");
101 logout();
102 return; 103 return;
103 } 104 }
104 105
105 result = clist_new(); 106 result = clist_new();
106 /* the range has to start at 1!!! not with 0!!!! */ 107 /* the range has to start at 1!!! not with 0!!!! */
107 set = mailimap_set_new_interval( 1, last ); 108 set = mailimap_set_new_interval( 1, last );
108 fetchAtt = mailimap_fetch_att_new_envelope();
109 fetchAttFlags = mailimap_fetch_att_new_flags();
110 fetchAttDate = mailimap_fetch_att_new_internaldate();
111
112 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
113 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 109 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
114 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); 110 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
115 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); 111 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
116 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); 112 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
113 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
117 114
118 err = mailimap_fetch( m_imap, set, fetchType, &result ); 115 err = mailimap_fetch( m_imap, set, fetchType, &result );
119 mailimap_set_free( set ); 116 mailimap_set_free( set );
120 /* cleans up the fetch_att's too! */
121 mailimap_fetch_type_free( fetchType ); 117 mailimap_fetch_type_free( fetchType );
122 118
123 QString date,subject,from; 119 QString date,subject,from;
124 120
125 if ( err == MAILIMAP_NO_ERROR ) { 121 if ( err == MAILIMAP_NO_ERROR ) {
126 current = clist_begin(result); 122
127 mailimap_msg_att * msg_att; 123 mailimap_msg_att * msg_att;
128 int i = 0; 124 int i = 0;
129 while ( current != 0 ) { 125 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
130 ++i; 126 ++i;
131 msg_att = (mailimap_msg_att*)current->data; 127 msg_att = (mailimap_msg_att*)current->data;
132 RecMail*m = parse_list_result(msg_att); 128 RecMail*m = parse_list_result(msg_att);
@@ -135,13 +131,11 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
135 m->setMbox(mailbox); 131 m->setMbox(mailbox);
136 target.append(m); 132 target.append(m);
137 } 133 }
138 current = current->next;
139 } 134 }
140 } else { 135 } else {
141 qDebug("Error fetching headers: %s",m_imap->imap_response); 136 qDebug("Error fetching headers: %s",m_imap->imap_response);
142 } 137 }
143 logout(); 138 mailimap_fetch_list_free(result);
144 clist_free(result);
145} 139}
146 140
147QList<IMAPFolder>* IMAPwrapper::listFolders() 141QList<IMAPFolder>* IMAPwrapper::listFolders()
@@ -219,17 +213,17 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
219 clistcell *current,*c,*cf; 213 clistcell *current,*c,*cf;
220 mailimap_msg_att_dynamic*flist; 214 mailimap_msg_att_dynamic*flist;
221 mailimap_flag_fetch*cflag; 215 mailimap_flag_fetch*cflag;
216 int size;
222 QBitArray mFlags(7); 217 QBitArray mFlags(7);
223 QStringList addresslist; 218 QStringList addresslist;
224 219
225 if (!m_att) { 220 if (!m_att) {
226 return m; 221 return m;
227 } 222 }
228 223 m = new RecMail();
229 c = clist_begin(m_att->att_list); 224 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
230 while ( c ) {
231 current = c; 225 current = c;
232 c = c->next; 226 size = 0;
233 item = (mailimap_msg_att_item*)current->data; 227 item = (mailimap_msg_att_item*)current->data;
234 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 228 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
235 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 229 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
@@ -237,7 +231,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
237 continue; 231 continue;
238 } 232 }
239 cf = flist->att_list->first; 233 cf = flist->att_list->first;
240 while (cf) { 234 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
241 cflag = (mailimap_flag_fetch*)cf->data; 235 cflag = (mailimap_flag_fetch*)cf->data;
242 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 236 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
243 switch (cflag->fl_flag->fl_type) { 237 switch (cflag->fl_flag->fl_type) {
@@ -266,15 +260,11 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
266 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 260 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
267 mFlags.setBit(FLAG_RECENT); 261 mFlags.setBit(FLAG_RECENT);
268 } 262 }
269 cf = cf->next;
270 } 263 }
271 continue; 264 continue;
272 } 265 }
273 if ( item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { 266 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
274 qDebug( "header: \n%s", item->att_data.att_static->att_data.att_rfc822_header );
275 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
276 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 267 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
277 m = new RecMail();
278 m->setDate(head->env_date); 268 m->setDate(head->env_date);
279 m->setSubject(head->env_subject); 269 m->setSubject(head->env_subject);
280 if (head->env_from!=NULL) { 270 if (head->env_from!=NULL) {
@@ -307,8 +297,8 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
307 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 297 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
308 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); 298 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);
309 qDebug(da.toString()); 299 qDebug(da.toString());
310 } else { 300 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
311 qDebug("Another type"); 301 size = item->att_data.att_static->att_data.att_rfc822_size;
312 } 302 }
313 } 303 }
314 /* msg is already deleted */ 304 /* msg is already deleted */
@@ -318,6 +308,7 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
318 } 308 }
319 if (m) { 309 if (m) {
320 m->setFlags(mFlags); 310 m->setFlags(mFlags);
311 m->setMsgsize(size);
321 } 312 }
322 return m; 313 return m;
323} 314}
@@ -344,13 +335,13 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
344 err = mailimap_examine( m_imap, (char*)mb); 335 err = mailimap_examine( m_imap, (char*)mb);
345 if ( err != MAILIMAP_NO_ERROR ) { 336 if ( err != MAILIMAP_NO_ERROR ) {
346 qDebug("error selecting mailbox: %s",m_imap->imap_response); 337 qDebug("error selecting mailbox: %s",m_imap->imap_response);
347 logout();
348 return body; 338 return body;
349 } 339 }
340
350 result = clist_new(); 341 result = clist_new();
351 /* the range has to start at 1!!! not with 0!!!! */ 342 /* the range has to start at 1!!! not with 0!!!! */
352 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 343 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
353 fetchAtt = mailimap_fetch_att_new_body(); 344 fetchAtt = mailimap_fetch_att_new_bodystructure();
354 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 345 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
355 err = mailimap_fetch( m_imap, set, fetchType, &result ); 346 err = mailimap_fetch( m_imap, set, fetchType, &result );
356 mailimap_set_free( set ); 347 mailimap_set_free( set );
@@ -363,26 +354,39 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
363 body_desc = item->att_data.att_static->att_data.att_body; 354 body_desc = item->att_data.att_static->att_data.att_body;
364 if (body_desc->bd_type==MAILIMAP_BODY_1PART) { 355 if (body_desc->bd_type==MAILIMAP_BODY_1PART) {
365 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body); 356 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body);
366 } else { 357 } else if (body_desc->bd_type==MAILIMAP_BODY_MPART) {
358 qDebug("Mulitpart mail");
359 searchBodyText(mail,body_desc->bd_data.bd_body_mpart,body,0);
367 } 360 }
368
369 } else { 361 } else {
370 qDebug("error fetching body: %s",m_imap->imap_response); 362 qDebug("error fetching body: %s",m_imap->imap_response);
371 } 363 }
372 364 mailimap_fetch_list_free(result);
373 clist_free(result);
374 logout();
375 return body; 365 return body;
376} 366}
377 367
368/* this routine is just called when the mail has only ONE part.
369 for filling the parts of a multi-part-message there are other
370 routines 'cause we can not simply fetch the whole body. */
378void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body) 371void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body)
379{ 372{
380 if (!mailDescription) { 373 if (!mailDescription) {
381 return; 374 return;
382 } 375 }
376 QString sub;
383 switch (mailDescription->bd_type) { 377 switch (mailDescription->bd_type) {
378 case MAILIMAP_BODY_TYPE_1PART_MSG:
379 target_body.setType("text");
380 sub = mailDescription->bd_data.bd_type_text->bd_media_text;
381 target_body.setSubtype(sub.lower());
382 fillPlainBody(mail,target_body);
383 break;
384 case MAILIMAP_BODY_TYPE_1PART_TEXT: 384 case MAILIMAP_BODY_TYPE_1PART_TEXT:
385 fillPlainBody(mail,target_body,mailDescription->bd_data.bd_type_text); 385 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
386 target_body.setType("text");
387 sub = mailDescription->bd_data.bd_type_text->bd_media_text;
388 target_body.setSubtype(sub.lower());
389 fillPlainBody(mail,target_body);
386 break; 390 break;
387 default: 391 default:
388 break; 392 break;
@@ -390,7 +394,7 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mai
390 return; 394 return;
391} 395}
392 396
393void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap_body_type_text * bd) 397void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body)
394{ 398{
395 const char *mb; 399 const char *mb;
396 QString body=""; 400 QString body="";
@@ -426,10 +430,13 @@ void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap
426 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 430 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
427 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 431 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
428 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 432 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
429 int length = msg_att_item->att_data.att_static->att_data.att_body_section->sec_length;
430 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 433 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
431 body = QString(text); 434 if (text) {
432 free(text); 435 body = QString(text);
436 free(text);
437 } else {
438 body = "";
439 }
433 } 440 }
434 } 441 }
435 } 442 }
@@ -437,7 +444,6 @@ void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap
437 } else { 444 } else {
438 qDebug("error fetching text: %s",m_imap->imap_response); 445 qDebug("error fetching text: %s",m_imap->imap_response);
439 } 446 }
440 //clist_free(result);
441 mailimap_fetch_list_free(result); 447 mailimap_fetch_list_free(result);
442 target_body.setBodytext(body); 448 target_body.setBodytext(body);
443 return; 449 return;
@@ -453,13 +459,11 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
453 if (!list) { 459 if (!list) {
454 return l; 460 return l;
455 } 461 }
456 current = clist_begin(list);
457 unsigned int count = 0; 462 unsigned int count = 0;
458 while (current!= NULL) { 463 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
459 from = ""; 464 from = "";
460 named_from = false; 465 named_from = false;
461 current_address=(mailimap_address*)current->data; 466 current_address=(mailimap_address*)current->data;
462 current = current->next;
463 if (current_address->ad_personal_name){ 467 if (current_address->ad_personal_name){
464 from+=QString(current_address->ad_personal_name); 468 from+=QString(current_address->ad_personal_name);
465 from+=" "; 469 from+=" ";
@@ -485,3 +489,117 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
485 } 489 }
486 return l; 490 return l;
487} 491}
492
493void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion)
494{
495 /* current_recursion is for avoiding ugly mails which has a to deep body-structure */
496 if (!mailDescription||current_recursion==2) {
497 return;
498 }
499 qDebug("Mediatype: %s",mailDescription->bd_media_subtype);
500 clistcell*current;
501 mailimap_body*current_body;
502 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
503 current_body = (mailimap_body*)current->data;
504 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
505 searchBodyText(mail,current_body->bd_data.bd_body_mpart,target_body,current_recursion+1);
506 } else if (current_body->bd_type==MAILIMAP_BODY_1PART){
507 RecPart currentPart;
508 fillSinglePart(currentPart,current_body->bd_data.bd_body_1part);
509 target_body.addPart(currentPart);
510 }
511 }
512 if (current_recursion==0) {
513
514 }
515}
516
517void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
518{
519 if (!Description) {
520 return;
521 }
522 switch (Description->bd_type) {
523 case MAILIMAP_BODY_TYPE_1PART_TEXT:
524 target_part.setType("text");
525 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
526 break;
527 case MAILIMAP_BODY_TYPE_1PART_BASIC:
528 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
529 break;
530 default:
531 break;
532 }
533}
534
535void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
536{
537 if (!which) {
538 return;
539 }
540 QString sub;
541 sub = which->bd_media_text;
542 target_part.setSubtype(sub.lower());
543 target_part.setLines(which->bd_lines);
544 fillBodyFields(target_part,which->bd_fields);
545}
546
547void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
548{
549 if (!which) {
550 return;
551 }
552 QString type,sub;
553 switch (which->bd_media_basic->med_type) {
554 case MAILIMAP_MEDIA_BASIC_APPLICATION:
555 type = "application";
556 break;
557 case MAILIMAP_MEDIA_BASIC_AUDIO:
558 type = "audio";
559 break;
560 case MAILIMAP_MEDIA_BASIC_IMAGE:
561 type = "image";
562 break;
563 case MAILIMAP_MEDIA_BASIC_MESSAGE:
564 type = "message";
565 break;
566 case MAILIMAP_MEDIA_BASIC_VIDEO:
567 type = "video";
568 break;
569 case MAILIMAP_MEDIA_BASIC_OTHER:
570 default:
571 if (which->bd_media_basic->med_basic_type) {
572 type = which->bd_media_basic->med_basic_type;
573 } else {
574 type = "";
575 }
576 break;
577 }
578 if (which->bd_media_basic->med_subtype) {
579 sub = which->bd_media_basic->med_subtype;
580 } else {
581 sub = "";
582 }
583 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
584 target_part.setType(type.lower());
585 target_part.setSubtype(sub.lower());
586 fillBodyFields(target_part,which->bd_fields);
587}
588
589void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
590{
591 if (!which) return;
592 if (which->bd_id) {
593 qDebug("Part ID = %s",which->bd_id);
594 target_part.setIdentifier(which->bd_id);
595 } else {
596 qDebug("ID empty");
597 target_part.setIdentifier("");
598 }
599
600 clistcell*cur;
601 mailimap_single_body_fld_param*param;
602 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
603 param = (mailimap_single_body_fld_param*)cur->data;
604 }
605}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 90f3004..f809edb 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -7,9 +7,13 @@
7struct mailimap; 7struct mailimap;
8struct mailimap_body_type_1part; 8struct mailimap_body_type_1part;
9struct mailimap_body_type_text; 9struct mailimap_body_type_text;
10struct mailimap_body_type_basic;
11struct mailimap_body_type_mpart;
12struct mailimap_body_fields;
10struct mailimap_msg_att; 13struct mailimap_msg_att;
11class RecMail; 14class RecMail;
12class RecBody; 15class RecBody;
16class RecPart;
13 17
14class IMAPwrapper : public QObject 18class IMAPwrapper : public QObject
15{ 19{
@@ -27,8 +31,17 @@ protected:
27 RecMail*parse_list_result(mailimap_msg_att*); 31 RecMail*parse_list_result(mailimap_msg_att*);
28 void login(); 32 void login();
29 void logout(); 33 void logout();
34
30 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body); 35 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
31 void fillPlainBody(const RecMail&mail,RecBody&target_body, mailimap_body_type_text * text_body); 36 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion);
37
38 void fillPlainBody(const RecMail&mail,RecBody&target_body);
39 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
40 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
41 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
42
43 /* just helpers */
44 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
32 static QStringList address_list_to_stringlist(clist*list); 45 static QStringList address_list_to_stringlist(clist*list);
33 46
34private: 47private:
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.cpp b/noncore/net/mail/libmailwrapper/mailtypes.cpp
index f9e5794..0e3174d 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.cpp
+++ b/noncore/net/mail/libmailwrapper/mailtypes.cpp
@@ -2,7 +2,7 @@
2 2
3 3
4RecMail::RecMail() 4RecMail::RecMail()
5 :subject(""),date(""),from(""),mbox(""),msg_id(""),msg_number(0),msg_flags(7) 5 :subject(""),date(""),from(""),mbox(""),msg_id(""),msg_number(0),msg_size(0),msg_flags(7)
6{ 6{
7 init(); 7 init();
8} 8}
@@ -21,6 +21,7 @@ void RecMail::copy_old(const RecMail&old)
21 date = old.date; 21 date = old.date;
22 mbox = old.mbox; 22 mbox = old.mbox;
23 msg_id = old.msg_id; 23 msg_id = old.msg_id;
24 msg_size = old.msg_size;
24 msg_number = old.msg_number; 25 msg_number = old.msg_number;
25 from = old.from; 26 from = old.from;
26 msg_flags = old.msg_flags; 27 msg_flags = old.msg_flags;
@@ -67,12 +68,12 @@ const QStringList& RecMail::Bcc()const
67} 68}
68 69
69RecPart::RecPart() 70RecPart::RecPart()
70 : m_type(""),m_subtype(""),m_identifier(""),m_encoding("") 71 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_lines(0)
71{ 72{
72} 73}
73 74
74RecPart::RecPart(const QString&identifier,const QString&type,const QString&subtype,const QString&encoding) 75RecPart::RecPart(const QString&identifier,const QString&type,const QString&subtype,const QString&encoding,unsigned int lines)
75 : m_type(type),m_subtype(subtype),m_identifier(identifier),m_encoding(encoding) 76 : m_type(type),m_subtype(subtype),m_identifier(identifier),m_encoding(encoding),m_lines(lines)
76{ 77{
77} 78}
78 79
@@ -80,6 +81,16 @@ RecPart::~RecPart()
80{ 81{
81} 82}
82 83
84void RecPart::setLines(unsigned int lines)
85{
86 m_lines = lines;
87}
88
89const unsigned int RecPart::Lines()const
90{
91 return m_lines;
92}
93
83const QString& RecPart::Type()const 94const QString& RecPart::Type()const
84{ 95{
85 return m_type; 96 return m_type;
@@ -156,3 +167,23 @@ void RecBody::addPart(const RecPart& part)
156 RecPart*p = new RecPart(part); 167 RecPart*p = new RecPart(part);
157 m_PartsList.append(p); 168 m_PartsList.append(p);
158} 169}
170
171void RecBody::setType(const QString&type)
172{
173 m_type = type;
174}
175
176const QString& RecBody::Type()const
177{
178 return m_type;
179}
180
181void RecBody::setSubtype(const QString&type)
182{
183 m_subtype = type;
184}
185
186const QString& RecBody::Subtype()const
187{
188 return m_subtype;
189}
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.h b/noncore/net/mail/libmailwrapper/mailtypes.h
index 6d6b080..900f10a 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.h
+++ b/noncore/net/mail/libmailwrapper/mailtypes.h
@@ -46,6 +46,8 @@ public:
46 const QString&Msgid()const{return msg_id;} 46 const QString&Msgid()const{return msg_id;}
47 void setReplyto(const QString&reply){replyto=reply;} 47 void setReplyto(const QString&reply){replyto=reply;}
48 const QString&Replyto()const{return replyto;} 48 const QString&Replyto()const{return replyto;}
49 void setMsgsize(int size){msg_size = size;}
50 const int Msgsize()const{return msg_size;}
49 51
50 52
51 void setTo(const QStringList&list); 53 void setTo(const QStringList&list);
@@ -59,7 +61,7 @@ public:
59 61
60protected: 62protected:
61 QString subject,date,from,mbox,msg_id,replyto; 63 QString subject,date,from,mbox,msg_id,replyto;
62 int msg_number; 64 int msg_number,msg_size;
63 QBitArray msg_flags; 65 QBitArray msg_flags;
64 QStringList to,cc,bcc; 66 QStringList to,cc,bcc;
65 void init(); 67 void init();
@@ -70,9 +72,10 @@ class RecPart
70{ 72{
71protected: 73protected:
72 QString m_type,m_subtype,m_identifier,m_encoding; 74 QString m_type,m_subtype,m_identifier,m_encoding;
75 unsigned int m_lines;
73public: 76public:
74 RecPart(); 77 RecPart();
75 RecPart(const QString&identifier,const QString&type="",const QString&subtype="",const QString&encoding="BASE64"); 78 RecPart(const QString&identifier,const QString&type="",const QString&subtype="",const QString&encoding="BASE64",unsigned int lines=0);
76 virtual ~RecPart(); 79 virtual ~RecPart();
77 80
78 const QString&Type()const; 81 const QString&Type()const;
@@ -83,12 +86,14 @@ public:
83 void setIdentifier(const QString&identifier); 86 void setIdentifier(const QString&identifier);
84 const QString&Encoding()const; 87 const QString&Encoding()const;
85 void setEncoding(const QString&encoding); 88 void setEncoding(const QString&encoding);
89 void setLines(unsigned int lines);
90 const unsigned int Lines()const;
86}; 91};
87 92
88class RecBody 93class RecBody
89{ 94{
90protected: 95protected:
91 QString m_BodyText; 96 QString m_BodyText,m_type,m_subtype;
92 QList<RecPart> m_PartsList; 97 QList<RecPart> m_PartsList;
93 98
94public: 99public:
@@ -96,6 +101,11 @@ public:
96 virtual ~RecBody(); 101 virtual ~RecBody();
97 void setBodytext(const QString&); 102 void setBodytext(const QString&);
98 const QString& Bodytext()const; 103 const QString& Bodytext()const;
104 void setType(const QString&);
105 const QString&Type()const;
106 void setSubtype(const QString&);
107 const QString&Subtype()const;
108
99 109
100 void setParts(const QList<RecPart>&parts); 110 void setParts(const QList<RecPart>&parts);
101 const QList<RecPart>& Parts()const; 111 const QList<RecPart>& Parts()const;
diff --git a/noncore/net/mail/mailtypes.cpp b/noncore/net/mail/mailtypes.cpp
index f9e5794..0e3174d 100644
--- a/noncore/net/mail/mailtypes.cpp
+++ b/noncore/net/mail/mailtypes.cpp
@@ -2,7 +2,7 @@
2 2
3 3
4RecMail::RecMail() 4RecMail::RecMail()
5 :subject(""),date(""),from(""),mbox(""),msg_id(""),msg_number(0),msg_flags(7) 5 :subject(""),date(""),from(""),mbox(""),msg_id(""),msg_number(0),msg_size(0),msg_flags(7)
6{ 6{
7 init(); 7 init();
8} 8}
@@ -21,6 +21,7 @@ void RecMail::copy_old(const RecMail&old)
21 date = old.date; 21 date = old.date;
22 mbox = old.mbox; 22 mbox = old.mbox;
23 msg_id = old.msg_id; 23 msg_id = old.msg_id;
24 msg_size = old.msg_size;
24 msg_number = old.msg_number; 25 msg_number = old.msg_number;
25 from = old.from; 26 from = old.from;
26 msg_flags = old.msg_flags; 27 msg_flags = old.msg_flags;
@@ -67,12 +68,12 @@ const QStringList& RecMail::Bcc()const
67} 68}
68 69
69RecPart::RecPart() 70RecPart::RecPart()
70 : m_type(""),m_subtype(""),m_identifier(""),m_encoding("") 71 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_lines(0)
71{ 72{
72} 73}
73 74
74RecPart::RecPart(const QString&identifier,const QString&type,const QString&subtype,const QString&encoding) 75RecPart::RecPart(const QString&identifier,const QString&type,const QString&subtype,const QString&encoding,unsigned int lines)
75 : m_type(type),m_subtype(subtype),m_identifier(identifier),m_encoding(encoding) 76 : m_type(type),m_subtype(subtype),m_identifier(identifier),m_encoding(encoding),m_lines(lines)
76{ 77{
77} 78}
78 79
@@ -80,6 +81,16 @@ RecPart::~RecPart()
80{ 81{
81} 82}
82 83
84void RecPart::setLines(unsigned int lines)
85{
86 m_lines = lines;
87}
88
89const unsigned int RecPart::Lines()const
90{
91 return m_lines;
92}
93
83const QString& RecPart::Type()const 94const QString& RecPart::Type()const
84{ 95{
85 return m_type; 96 return m_type;
@@ -156,3 +167,23 @@ void RecBody::addPart(const RecPart& part)
156 RecPart*p = new RecPart(part); 167 RecPart*p = new RecPart(part);
157 m_PartsList.append(p); 168 m_PartsList.append(p);
158} 169}
170
171void RecBody::setType(const QString&type)
172{
173 m_type = type;
174}
175
176const QString& RecBody::Type()const
177{
178 return m_type;
179}
180
181void RecBody::setSubtype(const QString&type)
182{
183 m_subtype = type;
184}
185
186const QString& RecBody::Subtype()const
187{
188 return m_subtype;
189}
diff --git a/noncore/net/mail/mailtypes.h b/noncore/net/mail/mailtypes.h
index 6d6b080..900f10a 100644
--- a/noncore/net/mail/mailtypes.h
+++ b/noncore/net/mail/mailtypes.h
@@ -46,6 +46,8 @@ public:
46 const QString&Msgid()const{return msg_id;} 46 const QString&Msgid()const{return msg_id;}
47 void setReplyto(const QString&reply){replyto=reply;} 47 void setReplyto(const QString&reply){replyto=reply;}
48 const QString&Replyto()const{return replyto;} 48 const QString&Replyto()const{return replyto;}
49 void setMsgsize(int size){msg_size = size;}
50 const int Msgsize()const{return msg_size;}
49 51
50 52
51 void setTo(const QStringList&list); 53 void setTo(const QStringList&list);
@@ -59,7 +61,7 @@ public:
59 61
60protected: 62protected:
61 QString subject,date,from,mbox,msg_id,replyto; 63 QString subject,date,from,mbox,msg_id,replyto;
62 int msg_number; 64 int msg_number,msg_size;
63 QBitArray msg_flags; 65 QBitArray msg_flags;
64 QStringList to,cc,bcc; 66 QStringList to,cc,bcc;
65 void init(); 67 void init();
@@ -70,9 +72,10 @@ class RecPart
70{ 72{
71protected: 73protected:
72 QString m_type,m_subtype,m_identifier,m_encoding; 74 QString m_type,m_subtype,m_identifier,m_encoding;
75 unsigned int m_lines;
73public: 76public:
74 RecPart(); 77 RecPart();
75 RecPart(const QString&identifier,const QString&type="",const QString&subtype="",const QString&encoding="BASE64"); 78 RecPart(const QString&identifier,const QString&type="",const QString&subtype="",const QString&encoding="BASE64",unsigned int lines=0);
76 virtual ~RecPart(); 79 virtual ~RecPart();
77 80
78 const QString&Type()const; 81 const QString&Type()const;
@@ -83,12 +86,14 @@ public:
83 void setIdentifier(const QString&identifier); 86 void setIdentifier(const QString&identifier);
84 const QString&Encoding()const; 87 const QString&Encoding()const;
85 void setEncoding(const QString&encoding); 88 void setEncoding(const QString&encoding);
89 void setLines(unsigned int lines);
90 const unsigned int Lines()const;
86}; 91};
87 92
88class RecBody 93class RecBody
89{ 94{
90protected: 95protected:
91 QString m_BodyText; 96 QString m_BodyText,m_type,m_subtype;
92 QList<RecPart> m_PartsList; 97 QList<RecPart> m_PartsList;
93 98
94public: 99public:
@@ -96,6 +101,11 @@ public:
96 virtual ~RecBody(); 101 virtual ~RecBody();
97 void setBodytext(const QString&); 102 void setBodytext(const QString&);
98 const QString& Bodytext()const; 103 const QString& Bodytext()const;
104 void setType(const QString&);
105 const QString&Type()const;
106 void setSubtype(const QString&);
107 const QString&Subtype()const;
108
99 109
100 void setParts(const QList<RecPart>&parts); 110 void setParts(const QList<RecPart>&parts);
101 const QList<RecPart>& Parts()const; 111 const QList<RecPart>& Parts()const;