summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/imapwrapper.cpp148
-rw-r--r--noncore/net/mail/imapwrapper.h5
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp148
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h5
4 files changed, 128 insertions, 178 deletions
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index 406c57c..f7e93aa 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -31,75 +31,82 @@ void IMAPwrapper::login()
31 31
32 /* we are connected this moment */ 32 /* we are connected this moment */
33 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 33 /* TODO: setup a timer holding the line or if connection closed - delete the value */
34 if (m_imap) { 34 if (m_imap) {
35 err = mailimap_noop(m_imap); 35 err = mailimap_noop(m_imap);
36 if (err!=MAILIMAP_NO_ERROR) { 36 if (err!=MAILIMAP_NO_ERROR) {
37 logout(); 37 logout();
38 } else { 38 } else {
39 mailstream_flush(m_imap->imap_stream); 39 mailstream_flush(m_imap->imap_stream);
40 return; 40 return;
41 } 41 }
42 } 42 }
43 server = account->getServer().latin1(); 43 server = account->getServer().latin1();
44 port = account->getPort().toUInt(); 44 port = account->getPort().toUInt();
45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
47 login.show(); 47 login.show();
48 if ( QDialog::Accepted == login.exec() ) { 48 if ( QDialog::Accepted == login.exec() ) {
49 // ok 49 // ok
50 user = strdup( login.getUser().latin1() ); 50 user = strdup( login.getUser().latin1() );
51 pass = strdup( login.getPassword().latin1() ); 51 pass = strdup( login.getPassword().latin1() );
52 } else { 52 } else {
53 // cancel 53 // cancel
54 qDebug( "IMAP: Login canceled" ); 54 qDebug( "IMAP: Login canceled" );
55 return; 55 return;
56 } 56 }
57 } else { 57 } else {
58 user = account->getUser().latin1(); 58 user = account->getUser().latin1();
59 pass = account->getPassword().latin1(); 59 pass = account->getPassword().latin1();
60 } 60 }
61 61
62 m_imap = mailimap_new( 20, &imap_progress ); 62 m_imap = mailimap_new( 20, &imap_progress );
63
63 /* connect */ 64 /* connect */
64 if (account->getSSL()) { 65 if (account->getSSL()) {
65 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 66 err = mailimap_ssl_connect( m_imap, (char*)server, port );
66 } else { 67 } else {
67 err = mailimap_socket_connect( m_imap, (char*)server, port ); 68 err = mailimap_socket_connect( m_imap, (char*)server, port );
68 } 69 }
69 70
70 if ( err != MAILIMAP_NO_ERROR && 71 if ( err != MAILIMAP_NO_ERROR &&
71 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 72 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
72 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
73 Global::statusMessage(tr("error connecting imap server: %1").arg(m_imap->imap_response)); 74 QString failure = "";
75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
76 failure="Connection refused";
77 } else {
78 failure="Unknown failure";
79 }
80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure));
74 mailimap_free( m_imap ); 81 mailimap_free( m_imap );
75 m_imap = 0; 82 m_imap = 0;
76 return; 83 return;
77 } 84 }
78 85
79 /* login */ 86 /* login */
80 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); 87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
81 if ( err != MAILIMAP_NO_ERROR ) { 88 if ( err != MAILIMAP_NO_ERROR ) {
82 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); 89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response));
83 err = mailimap_close( m_imap ); 90 err = mailimap_close( m_imap );
84 mailimap_free( m_imap ); 91 mailimap_free( m_imap );
85 m_imap = 0; 92 m_imap = 0;
86 } 93 }
87} 94}
88 95
89void IMAPwrapper::logout() 96void IMAPwrapper::logout()
90{ 97{
91 int err = MAILIMAP_NO_ERROR; 98 int err = MAILIMAP_NO_ERROR;
92 if (!m_imap) return; 99 if (!m_imap) return;
93 err = mailimap_logout( m_imap ); 100 err = mailimap_logout( m_imap );
94 err = mailimap_close( m_imap ); 101 err = mailimap_close( m_imap );
95 mailimap_free( m_imap ); 102 mailimap_free( m_imap );
96 m_imap = 0; 103 m_imap = 0;
97} 104}
98 105
99void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) 106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
100{ 107{
101 const char *mb = 0; 108 const char *mb = 0;
102 int err = MAILIMAP_NO_ERROR; 109 int err = MAILIMAP_NO_ERROR;
103 clist *result = 0; 110 clist *result = 0;
104 clistcell *current; 111 clistcell *current;
105// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; 112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
@@ -371,134 +378,91 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
371 clist *result = 0; 378 clist *result = 0;
372 clistcell *current; 379 clistcell *current;
373 mailimap_fetch_att *fetchAtt = 0; 380 mailimap_fetch_att *fetchAtt = 0;
374 mailimap_fetch_type *fetchType = 0; 381 mailimap_fetch_type *fetchType = 0;
375 mailimap_set *set = 0; 382 mailimap_set *set = 0;
376 mailimap_body*body_desc = 0; 383 mailimap_body*body_desc = 0;
377 384
378 mb = mail.getMbox().latin1(); 385 mb = mail.getMbox().latin1();
379 386
380 login(); 387 login();
381 if (!m_imap) { 388 if (!m_imap) {
382 return body; 389 return body;
383 } 390 }
384 391
385 err = mailimap_select( m_imap, (char*)mb); 392 err = mailimap_select( m_imap, (char*)mb);
386 if ( err != MAILIMAP_NO_ERROR ) { 393 if ( err != MAILIMAP_NO_ERROR ) {
387 qDebug("error selecting mailbox: %s",m_imap->imap_response); 394 qDebug("error selecting mailbox: %s",m_imap->imap_response);
388 return body; 395 return body;
389 } 396 }
390 397
391 /* the range has to start at 1!!! not with 0!!!! */ 398 /* the range has to start at 1!!! not with 0!!!! */
392 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
393 fetchAtt = mailimap_fetch_att_new_bodystructure(); 400 fetchAtt = mailimap_fetch_att_new_bodystructure();
394 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
395 err = mailimap_fetch( m_imap, set, fetchType, &result ); 402 err = mailimap_fetch( m_imap, set, fetchType, &result );
396 mailimap_set_free( set ); 403 mailimap_set_free( set );
397 mailimap_fetch_type_free( fetchType ); 404 mailimap_fetch_type_free( fetchType );
398 405
399 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
400 mailimap_msg_att * msg_att; 407 mailimap_msg_att * msg_att;
401 msg_att = (mailimap_msg_att*)current->data; 408 msg_att = (mailimap_msg_att*)current->data;
402 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
410 QValueList<int> path;
403 body_desc = item->att_data.att_static->att_data.att_body; 411 body_desc = item->att_data.att_static->att_data.att_body;
404 if (body_desc->bd_type==MAILIMAP_BODY_1PART) { 412 traverseBody(mail,body_desc,body,0,path);
405 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body);
406 } else if (body_desc->bd_type==MAILIMAP_BODY_MPART) {
407 qDebug("Mulitpart mail");
408 searchBodyText(mail,body_desc->bd_data.bd_body_mpart,body);
409 }
410 } else { 413 } else {
411 qDebug("error fetching body: %s",m_imap->imap_response); 414 qDebug("error fetching body: %s",m_imap->imap_response);
412 } 415 }
413 if (result) mailimap_fetch_list_free(result); 416 if (result) mailimap_fetch_list_free(result);
414 return body; 417 return body;
415} 418}
416 419
417/* this routine is just called when the mail has only ONE part.
418 for filling the parts of a multi-part-message there are other
419 routines 'cause we can not simply fetch the whole body. */
420void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body)
421{
422 if (!mailDescription) {
423 return;
424 }
425 QString sub,body_text;
426 RecPart singlePart;
427 QValueList<int> path;
428 fillSinglePart(singlePart,mailDescription);
429 switch (mailDescription->bd_type) {
430 case MAILIMAP_BODY_TYPE_1PART_MSG:
431 path.append(1);
432 body_text = fetchTextPart(mail,path,true,singlePart.Encoding());
433 target_body.setBodytext(body_text);
434 target_body.setDescription(singlePart);
435 break;
436 case MAILIMAP_BODY_TYPE_1PART_TEXT:
437 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
438 path.append(1);
439 body_text = fetchTextPart(mail,path,true,singlePart.Encoding());
440 target_body.setBodytext(body_text);
441 target_body.setDescription(singlePart);
442 break;
443 case MAILIMAP_BODY_TYPE_1PART_BASIC:
444 qDebug("Single attachment");
445 target_body.setBodytext("");
446 target_body.addPart(singlePart);
447 break;
448 default:
449 break;
450 }
451
452 return;
453}
454
455QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 420QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
456{ 421{
457 QStringList l; 422 QStringList l;
458 QString from; 423 QString from;
459 bool named_from; 424 bool named_from;
460 clistcell *current = NULL; 425 clistcell *current = NULL;
461 mailimap_address * current_address=NULL; 426 mailimap_address * current_address=NULL;
462 if (!list) { 427 if (!list) {
463 return l; 428 return l;
464 } 429 }
465 unsigned int count = 0; 430 unsigned int count = 0;
466 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
467 from = ""; 432 from = "";
468 named_from = false; 433 named_from = false;
469 current_address=(mailimap_address*)current->data; 434 current_address=(mailimap_address*)current->data;
470 if (current_address->ad_personal_name){ 435 if (current_address->ad_personal_name){
471 from+=convert_String((const char*)current_address->ad_personal_name); 436 from+=convert_String((const char*)current_address->ad_personal_name);
472 //from+=QString(current_address->ad_personal_name);
473 from+=" "; 437 from+=" ";
474 named_from = true; 438 named_from = true;
475 } 439 }
476 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
477 from+="<"; 441 from+="<";
478 } 442 }
479 if (current_address->ad_mailbox_name) { 443 if (current_address->ad_mailbox_name) {
480 from+=QString(current_address->ad_mailbox_name); 444 from+=QString(current_address->ad_mailbox_name);
481 from+="@"; 445 from+="@";
482 } 446 }
483 if (current_address->ad_host_name) { 447 if (current_address->ad_host_name) {
484 from+=QString(current_address->ad_host_name); 448 from+=QString(current_address->ad_host_name);
485 } 449 }
486 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
487 from+=">"; 451 from+=">";
488 } 452 }
489 l.append(QString(from)); 453 l.append(QString(from));
490 if (++count > 99) { 454 if (++count > 99) {
491 break; 455 break;
492 } 456 }
493 } 457 }
494 return l; 458 return l;
495} 459}
496 460
497encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call) 461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
498{ 462{
499 encodedString*res=new encodedString; 463 encodedString*res=new encodedString;
500 const char*mb; 464 const char*mb;
501 int err; 465 int err;
502 mailimap_fetch_type *fetchType; 466 mailimap_fetch_type *fetchType;
503 mailimap_set *set; 467 mailimap_set *set;
504 clistcell*current,*cur; 468 clistcell*current,*cur;
@@ -528,151 +492,163 @@ encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>
528 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); 492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section);
529 493
530 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
531 495
532 clist*result = 0; 496 clist*result = 0;
533 497
534 err = mailimap_fetch( m_imap, set, fetchType, &result ); 498 err = mailimap_fetch( m_imap, set, fetchType, &result );
535 mailimap_set_free( set ); 499 mailimap_set_free( set );
536 mailimap_fetch_type_free( fetchType ); 500 mailimap_fetch_type_free( fetchType );
537 501
538 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
539 mailimap_msg_att * msg_att; 503 mailimap_msg_att * msg_att;
540 msg_att = (mailimap_msg_att*)current->data; 504 msg_att = (mailimap_msg_att*)current->data;
541 mailimap_msg_att_item*msg_att_item; 505 mailimap_msg_att_item*msg_att_item;
542 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
543 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
544 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
545 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
546 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
547 /* detach - we take over the content */ 511 /* detach - we take over the content */
548 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
549 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
550 } 514 }
551 } 515 }
552 } 516 }
553 } else { 517 } else {
554 qDebug("error fetching text: %s",m_imap->imap_response); 518 qDebug("error fetching text: %s",m_imap->imap_response);
555 } 519 }
556 if (result) mailimap_fetch_list_free(result); 520 if (result) mailimap_fetch_list_free(result);
557 return res; 521 return res;
558} 522}
559 523
560void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion,QValueList<int>recList) 524/* current_recursion is for recursive calls.
525 current_count means the position inside the internal loop! */
526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,
527 int current_recursion,QValueList<int>recList,int current_count)
561{ 528{
562 /* current_recursion is for avoiding ugly mails which has a to deep body-structure */ 529 if (!body || current_recursion>=10) {
563 if (!mailDescription||current_recursion==10) {
564 return; 530 return;
565 } 531 }
566 clistcell*current; 532 ++current_count;
567 mailimap_body*current_body; 533 switch (body->bd_type) {
568 unsigned int count = 0; 534 case MAILIMAP_BODY_1PART:
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 535 {
570 /* the point in the message */ 536 QValueList<int>countlist = recList;
571 ++count; 537 countlist.append(current_count);
572 current_body = (mailimap_body*)current->data; 538 RecPart currentPart;
573 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 539 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
574 QValueList<int>countlist = recList; 540 QString id("");
575 countlist.append(count); 541 currentPart.setPositionlist(countlist);
576 searchBodyText(mail,current_body->bd_data.bd_body_mpart,target_body,current_recursion+1,countlist); 542 for (unsigned int j = 0; j < countlist.count();++j) {
577 } else if (current_body->bd_type==MAILIMAP_BODY_1PART){ 543 id+=(j>0?" ":"");
578 RecPart currentPart; 544 id+=QString("%1").arg(countlist[j]);
579 fillSinglePart(currentPart,current_body->bd_data.bd_body_1part); 545 }
580 QValueList<int>countlist = recList; 546 qDebug("ID = %s",id.latin1());
581 countlist.append(count); 547 currentPart.setIdentifier(id);
582 /* important: Check for is NULL 'cause a body can be empty! */ 548 fillSinglePart(currentPart,part1);
583 if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) { 549 /* important: Check for is NULL 'cause a body can be empty!
584 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding()); 550 And we put it only into the mail if it is the FIRST part */
585 target_body.setDescription(currentPart); 551 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) {
586 target_body.setBodytext(body_text); 552 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding());
587 } else { 553 target_body.setDescription(currentPart);
588 QString id(""); 554 target_body.setBodytext(body_text);
589 for (unsigned int j = 0; j < countlist.count();++j) { 555 } else {
590 id+=(j>0?" ":""); 556 target_body.addPart(currentPart);
591 id+=QString("%1").arg(countlist[j]); 557 }
592 } 558 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
593 qDebug("ID= %s",id.latin1()); 559 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
594 currentPart.setIdentifier(id); 560 }
595 currentPart.setPositionlist(countlist); 561 }
596 target_body.addPart(currentPart); 562 break;
597 } 563 case MAILIMAP_BODY_MPART:
564 {
565 clistcell*current=0;
566 mailimap_body*current_body=0;
567 unsigned int ccount = current_count-1;
568 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
570 current_body = (mailimap_body*)current->data;
571 traverseBody(mail,current_body,target_body,current_recursion+1,recList,ccount);
572 ++ccount;
598 } 573 }
599 } 574 }
575 break;
576 default:
577 break;
578 }
600} 579}
601 580
602void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 581void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
603{ 582{
604 if (!Description) { 583 if (!Description) {
605 return; 584 return;
606 } 585 }
607 switch (Description->bd_type) { 586 switch (Description->bd_type) {
608 case MAILIMAP_BODY_TYPE_1PART_TEXT: 587 case MAILIMAP_BODY_TYPE_1PART_TEXT:
609 target_part.setType("text"); 588 target_part.setType("text");
610 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 589 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
611 break; 590 break;
612 case MAILIMAP_BODY_TYPE_1PART_BASIC: 591 case MAILIMAP_BODY_TYPE_1PART_BASIC:
613 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 592 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
614 break; 593 break;
615 case MAILIMAP_BODY_TYPE_1PART_MSG: 594 case MAILIMAP_BODY_TYPE_1PART_MSG:
595 target_part.setType("message");
616 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 596 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
617 break; 597 break;
618 default: 598 default:
619 break; 599 break;
620 } 600 }
621} 601}
622 602
623void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 603void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
624{ 604{
625 if (!which) { 605 if (!which) {
626 return; 606 return;
627 } 607 }
628 QString sub; 608 QString sub;
629 sub = which->bd_media_text; 609 sub = which->bd_media_text;
630 target_part.setSubtype(sub.lower()); 610 target_part.setSubtype(sub.lower());
631 target_part.setLines(which->bd_lines); 611 target_part.setLines(which->bd_lines);
632 fillBodyFields(target_part,which->bd_fields); 612 fillBodyFields(target_part,which->bd_fields);
633} 613}
634 614
635void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 615void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
636{ 616{
637 if (!which) { 617 if (!which) {
638 return; 618 return;
639 } 619 }
640// QString sub; 620 target_part.setSubtype("rfc822");
641// sub = which->bd_media_text;
642// target_part.setSubtype(sub.lower());
643 qDebug("Message part"); 621 qDebug("Message part");
644 /* we set this type to text/plain */ 622 /* we set this type to text/plain */
645 target_part.setType("text");
646 target_part.setSubtype("plain");
647 target_part.setLines(which->bd_lines); 623 target_part.setLines(which->bd_lines);
648 fillBodyFields(target_part,which->bd_fields); 624 fillBodyFields(target_part,which->bd_fields);
649} 625}
650 626
651void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 627void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
652{ 628{
653 if (!which) { 629 if (!which) {
654 return; 630 return;
655 } 631 }
656 QString type,sub; 632 QString type,sub;
657 switch (which->bd_media_basic->med_type) { 633 switch (which->bd_media_basic->med_type) {
658 case MAILIMAP_MEDIA_BASIC_APPLICATION: 634 case MAILIMAP_MEDIA_BASIC_APPLICATION:
659 type = "application"; 635 type = "application";
660 break; 636 break;
661 case MAILIMAP_MEDIA_BASIC_AUDIO: 637 case MAILIMAP_MEDIA_BASIC_AUDIO:
662 type = "audio"; 638 type = "audio";
663 break; 639 break;
664 case MAILIMAP_MEDIA_BASIC_IMAGE: 640 case MAILIMAP_MEDIA_BASIC_IMAGE:
665 type = "image"; 641 type = "image";
666 break; 642 break;
667 case MAILIMAP_MEDIA_BASIC_MESSAGE: 643 case MAILIMAP_MEDIA_BASIC_MESSAGE:
668 type = "message"; 644 type = "message";
669 break; 645 break;
670 case MAILIMAP_MEDIA_BASIC_VIDEO: 646 case MAILIMAP_MEDIA_BASIC_VIDEO:
671 type = "video"; 647 type = "video";
672 break; 648 break;
673 case MAILIMAP_MEDIA_BASIC_OTHER: 649 case MAILIMAP_MEDIA_BASIC_OTHER:
674 default: 650 default:
675 if (which->bd_media_basic->med_basic_type) { 651 if (which->bd_media_basic->med_basic_type) {
676 type = which->bd_media_basic->med_basic_type; 652 type = which->bd_media_basic->med_basic_type;
677 } else { 653 } else {
678 type = ""; 654 type = "";
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 9b20288..e5846f8 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -1,67 +1,66 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include <qlist.h> 4#include <qlist.h>
5#include "mailwrapper.h" 5#include "mailwrapper.h"
6#include "abstractmail.h" 6#include "abstractmail.h"
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9struct mailimap; 9struct mailimap;
10struct mailimap_body;
10struct mailimap_body_type_1part; 11struct mailimap_body_type_1part;
11struct mailimap_body_type_text; 12struct mailimap_body_type_text;
12struct mailimap_body_type_basic; 13struct mailimap_body_type_basic;
13struct mailimap_body_type_msg; 14struct mailimap_body_type_msg;
14struct mailimap_body_type_mpart; 15struct mailimap_body_type_mpart;
15struct mailimap_body_fields; 16struct mailimap_body_fields;
16struct mailimap_msg_att; 17struct mailimap_msg_att;
17class encodedString; 18class encodedString;
18 19
19class IMAPwrapper : public AbstractMail 20class IMAPwrapper : public AbstractMail
20{ 21{
21 Q_OBJECT 22 Q_OBJECT
22public: 23public:
23 IMAPwrapper( IMAPaccount *a ); 24 IMAPwrapper( IMAPaccount *a );
24 virtual ~IMAPwrapper(); 25 virtual ~IMAPwrapper();
25 virtual QList<Folder>* listFolders(); 26 virtual QList<Folder>* listFolders();
26 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
27 28
28 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
29 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
30 virtual int deleteAllMail(const Folder*folder); 31 virtual int deleteAllMail(const Folder*folder);
31 32
32 virtual RecBody fetchBody(const RecMail&mail); 33 virtual RecBody fetchBody(const RecMail&mail);
33 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
36 37
37 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); 38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false);
38 virtual int deleteMbox(const Folder*folder); 39 virtual int deleteMbox(const Folder*folder);
39 40
40 static void imap_progress( size_t current, size_t maximum ); 41 static void imap_progress( size_t current, size_t maximum );
41 42
42protected: 43protected:
43 RecMail*parse_list_result(mailimap_msg_att*); 44 RecMail*parse_list_result(mailimap_msg_att*);
44 void login(); 45 void login();
45 void logout(); 46 void logout();
46 47
47 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc=""); 48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
48 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call); 49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call);
49 50
50 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
51 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
52
53 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
54 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
55 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
56 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
55 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=0);
57 56
58 /* just helpers */ 57 /* just helpers */
59 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 58 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
60 static QStringList address_list_to_stringlist(clist*list); 59 static QStringList address_list_to_stringlist(clist*list);
61 60
62 61
63 IMAPaccount *account; 62 IMAPaccount *account;
64 mailimap *m_imap; 63 mailimap *m_imap;
65}; 64};
66 65
67#endif 66#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 406c57c..f7e93aa 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -31,75 +31,82 @@ void IMAPwrapper::login()
31 31
32 /* we are connected this moment */ 32 /* we are connected this moment */
33 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 33 /* TODO: setup a timer holding the line or if connection closed - delete the value */
34 if (m_imap) { 34 if (m_imap) {
35 err = mailimap_noop(m_imap); 35 err = mailimap_noop(m_imap);
36 if (err!=MAILIMAP_NO_ERROR) { 36 if (err!=MAILIMAP_NO_ERROR) {
37 logout(); 37 logout();
38 } else { 38 } else {
39 mailstream_flush(m_imap->imap_stream); 39 mailstream_flush(m_imap->imap_stream);
40 return; 40 return;
41 } 41 }
42 } 42 }
43 server = account->getServer().latin1(); 43 server = account->getServer().latin1();
44 port = account->getPort().toUInt(); 44 port = account->getPort().toUInt();
45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
47 login.show(); 47 login.show();
48 if ( QDialog::Accepted == login.exec() ) { 48 if ( QDialog::Accepted == login.exec() ) {
49 // ok 49 // ok
50 user = strdup( login.getUser().latin1() ); 50 user = strdup( login.getUser().latin1() );
51 pass = strdup( login.getPassword().latin1() ); 51 pass = strdup( login.getPassword().latin1() );
52 } else { 52 } else {
53 // cancel 53 // cancel
54 qDebug( "IMAP: Login canceled" ); 54 qDebug( "IMAP: Login canceled" );
55 return; 55 return;
56 } 56 }
57 } else { 57 } else {
58 user = account->getUser().latin1(); 58 user = account->getUser().latin1();
59 pass = account->getPassword().latin1(); 59 pass = account->getPassword().latin1();
60 } 60 }
61 61
62 m_imap = mailimap_new( 20, &imap_progress ); 62 m_imap = mailimap_new( 20, &imap_progress );
63
63 /* connect */ 64 /* connect */
64 if (account->getSSL()) { 65 if (account->getSSL()) {
65 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 66 err = mailimap_ssl_connect( m_imap, (char*)server, port );
66 } else { 67 } else {
67 err = mailimap_socket_connect( m_imap, (char*)server, port ); 68 err = mailimap_socket_connect( m_imap, (char*)server, port );
68 } 69 }
69 70
70 if ( err != MAILIMAP_NO_ERROR && 71 if ( err != MAILIMAP_NO_ERROR &&
71 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 72 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
72 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
73 Global::statusMessage(tr("error connecting imap server: %1").arg(m_imap->imap_response)); 74 QString failure = "";
75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
76 failure="Connection refused";
77 } else {
78 failure="Unknown failure";
79 }
80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure));
74 mailimap_free( m_imap ); 81 mailimap_free( m_imap );
75 m_imap = 0; 82 m_imap = 0;
76 return; 83 return;
77 } 84 }
78 85
79 /* login */ 86 /* login */
80 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); 87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
81 if ( err != MAILIMAP_NO_ERROR ) { 88 if ( err != MAILIMAP_NO_ERROR ) {
82 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); 89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response));
83 err = mailimap_close( m_imap ); 90 err = mailimap_close( m_imap );
84 mailimap_free( m_imap ); 91 mailimap_free( m_imap );
85 m_imap = 0; 92 m_imap = 0;
86 } 93 }
87} 94}
88 95
89void IMAPwrapper::logout() 96void IMAPwrapper::logout()
90{ 97{
91 int err = MAILIMAP_NO_ERROR; 98 int err = MAILIMAP_NO_ERROR;
92 if (!m_imap) return; 99 if (!m_imap) return;
93 err = mailimap_logout( m_imap ); 100 err = mailimap_logout( m_imap );
94 err = mailimap_close( m_imap ); 101 err = mailimap_close( m_imap );
95 mailimap_free( m_imap ); 102 mailimap_free( m_imap );
96 m_imap = 0; 103 m_imap = 0;
97} 104}
98 105
99void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) 106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
100{ 107{
101 const char *mb = 0; 108 const char *mb = 0;
102 int err = MAILIMAP_NO_ERROR; 109 int err = MAILIMAP_NO_ERROR;
103 clist *result = 0; 110 clist *result = 0;
104 clistcell *current; 111 clistcell *current;
105// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; 112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
@@ -371,134 +378,91 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
371 clist *result = 0; 378 clist *result = 0;
372 clistcell *current; 379 clistcell *current;
373 mailimap_fetch_att *fetchAtt = 0; 380 mailimap_fetch_att *fetchAtt = 0;
374 mailimap_fetch_type *fetchType = 0; 381 mailimap_fetch_type *fetchType = 0;
375 mailimap_set *set = 0; 382 mailimap_set *set = 0;
376 mailimap_body*body_desc = 0; 383 mailimap_body*body_desc = 0;
377 384
378 mb = mail.getMbox().latin1(); 385 mb = mail.getMbox().latin1();
379 386
380 login(); 387 login();
381 if (!m_imap) { 388 if (!m_imap) {
382 return body; 389 return body;
383 } 390 }
384 391
385 err = mailimap_select( m_imap, (char*)mb); 392 err = mailimap_select( m_imap, (char*)mb);
386 if ( err != MAILIMAP_NO_ERROR ) { 393 if ( err != MAILIMAP_NO_ERROR ) {
387 qDebug("error selecting mailbox: %s",m_imap->imap_response); 394 qDebug("error selecting mailbox: %s",m_imap->imap_response);
388 return body; 395 return body;
389 } 396 }
390 397
391 /* the range has to start at 1!!! not with 0!!!! */ 398 /* the range has to start at 1!!! not with 0!!!! */
392 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
393 fetchAtt = mailimap_fetch_att_new_bodystructure(); 400 fetchAtt = mailimap_fetch_att_new_bodystructure();
394 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
395 err = mailimap_fetch( m_imap, set, fetchType, &result ); 402 err = mailimap_fetch( m_imap, set, fetchType, &result );
396 mailimap_set_free( set ); 403 mailimap_set_free( set );
397 mailimap_fetch_type_free( fetchType ); 404 mailimap_fetch_type_free( fetchType );
398 405
399 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
400 mailimap_msg_att * msg_att; 407 mailimap_msg_att * msg_att;
401 msg_att = (mailimap_msg_att*)current->data; 408 msg_att = (mailimap_msg_att*)current->data;
402 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
410 QValueList<int> path;
403 body_desc = item->att_data.att_static->att_data.att_body; 411 body_desc = item->att_data.att_static->att_data.att_body;
404 if (body_desc->bd_type==MAILIMAP_BODY_1PART) { 412 traverseBody(mail,body_desc,body,0,path);
405 searchBodyText(mail,body_desc->bd_data.bd_body_1part,body);
406 } else if (body_desc->bd_type==MAILIMAP_BODY_MPART) {
407 qDebug("Mulitpart mail");
408 searchBodyText(mail,body_desc->bd_data.bd_body_mpart,body);
409 }
410 } else { 413 } else {
411 qDebug("error fetching body: %s",m_imap->imap_response); 414 qDebug("error fetching body: %s",m_imap->imap_response);
412 } 415 }
413 if (result) mailimap_fetch_list_free(result); 416 if (result) mailimap_fetch_list_free(result);
414 return body; 417 return body;
415} 418}
416 419
417/* this routine is just called when the mail has only ONE part.
418 for filling the parts of a multi-part-message there are other
419 routines 'cause we can not simply fetch the whole body. */
420void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body)
421{
422 if (!mailDescription) {
423 return;
424 }
425 QString sub,body_text;
426 RecPart singlePart;
427 QValueList<int> path;
428 fillSinglePart(singlePart,mailDescription);
429 switch (mailDescription->bd_type) {
430 case MAILIMAP_BODY_TYPE_1PART_MSG:
431 path.append(1);
432 body_text = fetchTextPart(mail,path,true,singlePart.Encoding());
433 target_body.setBodytext(body_text);
434 target_body.setDescription(singlePart);
435 break;
436 case MAILIMAP_BODY_TYPE_1PART_TEXT:
437 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
438 path.append(1);
439 body_text = fetchTextPart(mail,path,true,singlePart.Encoding());
440 target_body.setBodytext(body_text);
441 target_body.setDescription(singlePart);
442 break;
443 case MAILIMAP_BODY_TYPE_1PART_BASIC:
444 qDebug("Single attachment");
445 target_body.setBodytext("");
446 target_body.addPart(singlePart);
447 break;
448 default:
449 break;
450 }
451
452 return;
453}
454
455QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 420QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
456{ 421{
457 QStringList l; 422 QStringList l;
458 QString from; 423 QString from;
459 bool named_from; 424 bool named_from;
460 clistcell *current = NULL; 425 clistcell *current = NULL;
461 mailimap_address * current_address=NULL; 426 mailimap_address * current_address=NULL;
462 if (!list) { 427 if (!list) {
463 return l; 428 return l;
464 } 429 }
465 unsigned int count = 0; 430 unsigned int count = 0;
466 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
467 from = ""; 432 from = "";
468 named_from = false; 433 named_from = false;
469 current_address=(mailimap_address*)current->data; 434 current_address=(mailimap_address*)current->data;
470 if (current_address->ad_personal_name){ 435 if (current_address->ad_personal_name){
471 from+=convert_String((const char*)current_address->ad_personal_name); 436 from+=convert_String((const char*)current_address->ad_personal_name);
472 //from+=QString(current_address->ad_personal_name);
473 from+=" "; 437 from+=" ";
474 named_from = true; 438 named_from = true;
475 } 439 }
476 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
477 from+="<"; 441 from+="<";
478 } 442 }
479 if (current_address->ad_mailbox_name) { 443 if (current_address->ad_mailbox_name) {
480 from+=QString(current_address->ad_mailbox_name); 444 from+=QString(current_address->ad_mailbox_name);
481 from+="@"; 445 from+="@";
482 } 446 }
483 if (current_address->ad_host_name) { 447 if (current_address->ad_host_name) {
484 from+=QString(current_address->ad_host_name); 448 from+=QString(current_address->ad_host_name);
485 } 449 }
486 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
487 from+=">"; 451 from+=">";
488 } 452 }
489 l.append(QString(from)); 453 l.append(QString(from));
490 if (++count > 99) { 454 if (++count > 99) {
491 break; 455 break;
492 } 456 }
493 } 457 }
494 return l; 458 return l;
495} 459}
496 460
497encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call) 461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
498{ 462{
499 encodedString*res=new encodedString; 463 encodedString*res=new encodedString;
500 const char*mb; 464 const char*mb;
501 int err; 465 int err;
502 mailimap_fetch_type *fetchType; 466 mailimap_fetch_type *fetchType;
503 mailimap_set *set; 467 mailimap_set *set;
504 clistcell*current,*cur; 468 clistcell*current,*cur;
@@ -528,151 +492,163 @@ encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>
528 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); 492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section);
529 493
530 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
531 495
532 clist*result = 0; 496 clist*result = 0;
533 497
534 err = mailimap_fetch( m_imap, set, fetchType, &result ); 498 err = mailimap_fetch( m_imap, set, fetchType, &result );
535 mailimap_set_free( set ); 499 mailimap_set_free( set );
536 mailimap_fetch_type_free( fetchType ); 500 mailimap_fetch_type_free( fetchType );
537 501
538 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
539 mailimap_msg_att * msg_att; 503 mailimap_msg_att * msg_att;
540 msg_att = (mailimap_msg_att*)current->data; 504 msg_att = (mailimap_msg_att*)current->data;
541 mailimap_msg_att_item*msg_att_item; 505 mailimap_msg_att_item*msg_att_item;
542 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
543 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
544 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
545 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
546 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
547 /* detach - we take over the content */ 511 /* detach - we take over the content */
548 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
549 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
550 } 514 }
551 } 515 }
552 } 516 }
553 } else { 517 } else {
554 qDebug("error fetching text: %s",m_imap->imap_response); 518 qDebug("error fetching text: %s",m_imap->imap_response);
555 } 519 }
556 if (result) mailimap_fetch_list_free(result); 520 if (result) mailimap_fetch_list_free(result);
557 return res; 521 return res;
558} 522}
559 523
560void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion,QValueList<int>recList) 524/* current_recursion is for recursive calls.
525 current_count means the position inside the internal loop! */
526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,
527 int current_recursion,QValueList<int>recList,int current_count)
561{ 528{
562 /* current_recursion is for avoiding ugly mails which has a to deep body-structure */ 529 if (!body || current_recursion>=10) {
563 if (!mailDescription||current_recursion==10) {
564 return; 530 return;
565 } 531 }
566 clistcell*current; 532 ++current_count;
567 mailimap_body*current_body; 533 switch (body->bd_type) {
568 unsigned int count = 0; 534 case MAILIMAP_BODY_1PART:
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 535 {
570 /* the point in the message */ 536 QValueList<int>countlist = recList;
571 ++count; 537 countlist.append(current_count);
572 current_body = (mailimap_body*)current->data; 538 RecPart currentPart;
573 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 539 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
574 QValueList<int>countlist = recList; 540 QString id("");
575 countlist.append(count); 541 currentPart.setPositionlist(countlist);
576 searchBodyText(mail,current_body->bd_data.bd_body_mpart,target_body,current_recursion+1,countlist); 542 for (unsigned int j = 0; j < countlist.count();++j) {
577 } else if (current_body->bd_type==MAILIMAP_BODY_1PART){ 543 id+=(j>0?" ":"");
578 RecPart currentPart; 544 id+=QString("%1").arg(countlist[j]);
579 fillSinglePart(currentPart,current_body->bd_data.bd_body_1part); 545 }
580 QValueList<int>countlist = recList; 546 qDebug("ID = %s",id.latin1());
581 countlist.append(count); 547 currentPart.setIdentifier(id);
582 /* important: Check for is NULL 'cause a body can be empty! */ 548 fillSinglePart(currentPart,part1);
583 if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) { 549 /* important: Check for is NULL 'cause a body can be empty!
584 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding()); 550 And we put it only into the mail if it is the FIRST part */
585 target_body.setDescription(currentPart); 551 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) {
586 target_body.setBodytext(body_text); 552 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding());
587 } else { 553 target_body.setDescription(currentPart);
588 QString id(""); 554 target_body.setBodytext(body_text);
589 for (unsigned int j = 0; j < countlist.count();++j) { 555 } else {
590 id+=(j>0?" ":""); 556 target_body.addPart(currentPart);
591 id+=QString("%1").arg(countlist[j]); 557 }
592 } 558 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
593 qDebug("ID= %s",id.latin1()); 559 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
594 currentPart.setIdentifier(id); 560 }
595 currentPart.setPositionlist(countlist); 561 }
596 target_body.addPart(currentPart); 562 break;
597 } 563 case MAILIMAP_BODY_MPART:
564 {
565 clistcell*current=0;
566 mailimap_body*current_body=0;
567 unsigned int ccount = current_count-1;
568 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
570 current_body = (mailimap_body*)current->data;
571 traverseBody(mail,current_body,target_body,current_recursion+1,recList,ccount);
572 ++ccount;
598 } 573 }
599 } 574 }
575 break;
576 default:
577 break;
578 }
600} 579}
601 580
602void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 581void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
603{ 582{
604 if (!Description) { 583 if (!Description) {
605 return; 584 return;
606 } 585 }
607 switch (Description->bd_type) { 586 switch (Description->bd_type) {
608 case MAILIMAP_BODY_TYPE_1PART_TEXT: 587 case MAILIMAP_BODY_TYPE_1PART_TEXT:
609 target_part.setType("text"); 588 target_part.setType("text");
610 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 589 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
611 break; 590 break;
612 case MAILIMAP_BODY_TYPE_1PART_BASIC: 591 case MAILIMAP_BODY_TYPE_1PART_BASIC:
613 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 592 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
614 break; 593 break;
615 case MAILIMAP_BODY_TYPE_1PART_MSG: 594 case MAILIMAP_BODY_TYPE_1PART_MSG:
595 target_part.setType("message");
616 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 596 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
617 break; 597 break;
618 default: 598 default:
619 break; 599 break;
620 } 600 }
621} 601}
622 602
623void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 603void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
624{ 604{
625 if (!which) { 605 if (!which) {
626 return; 606 return;
627 } 607 }
628 QString sub; 608 QString sub;
629 sub = which->bd_media_text; 609 sub = which->bd_media_text;
630 target_part.setSubtype(sub.lower()); 610 target_part.setSubtype(sub.lower());
631 target_part.setLines(which->bd_lines); 611 target_part.setLines(which->bd_lines);
632 fillBodyFields(target_part,which->bd_fields); 612 fillBodyFields(target_part,which->bd_fields);
633} 613}
634 614
635void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 615void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
636{ 616{
637 if (!which) { 617 if (!which) {
638 return; 618 return;
639 } 619 }
640// QString sub; 620 target_part.setSubtype("rfc822");
641// sub = which->bd_media_text;
642// target_part.setSubtype(sub.lower());
643 qDebug("Message part"); 621 qDebug("Message part");
644 /* we set this type to text/plain */ 622 /* we set this type to text/plain */
645 target_part.setType("text");
646 target_part.setSubtype("plain");
647 target_part.setLines(which->bd_lines); 623 target_part.setLines(which->bd_lines);
648 fillBodyFields(target_part,which->bd_fields); 624 fillBodyFields(target_part,which->bd_fields);
649} 625}
650 626
651void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 627void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
652{ 628{
653 if (!which) { 629 if (!which) {
654 return; 630 return;
655 } 631 }
656 QString type,sub; 632 QString type,sub;
657 switch (which->bd_media_basic->med_type) { 633 switch (which->bd_media_basic->med_type) {
658 case MAILIMAP_MEDIA_BASIC_APPLICATION: 634 case MAILIMAP_MEDIA_BASIC_APPLICATION:
659 type = "application"; 635 type = "application";
660 break; 636 break;
661 case MAILIMAP_MEDIA_BASIC_AUDIO: 637 case MAILIMAP_MEDIA_BASIC_AUDIO:
662 type = "audio"; 638 type = "audio";
663 break; 639 break;
664 case MAILIMAP_MEDIA_BASIC_IMAGE: 640 case MAILIMAP_MEDIA_BASIC_IMAGE:
665 type = "image"; 641 type = "image";
666 break; 642 break;
667 case MAILIMAP_MEDIA_BASIC_MESSAGE: 643 case MAILIMAP_MEDIA_BASIC_MESSAGE:
668 type = "message"; 644 type = "message";
669 break; 645 break;
670 case MAILIMAP_MEDIA_BASIC_VIDEO: 646 case MAILIMAP_MEDIA_BASIC_VIDEO:
671 type = "video"; 647 type = "video";
672 break; 648 break;
673 case MAILIMAP_MEDIA_BASIC_OTHER: 649 case MAILIMAP_MEDIA_BASIC_OTHER:
674 default: 650 default:
675 if (which->bd_media_basic->med_basic_type) { 651 if (which->bd_media_basic->med_basic_type) {
676 type = which->bd_media_basic->med_basic_type; 652 type = which->bd_media_basic->med_basic_type;
677 } else { 653 } else {
678 type = ""; 654 type = "";
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 9b20288..e5846f8 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -1,67 +1,66 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include <qlist.h> 4#include <qlist.h>
5#include "mailwrapper.h" 5#include "mailwrapper.h"
6#include "abstractmail.h" 6#include "abstractmail.h"
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9struct mailimap; 9struct mailimap;
10struct mailimap_body;
10struct mailimap_body_type_1part; 11struct mailimap_body_type_1part;
11struct mailimap_body_type_text; 12struct mailimap_body_type_text;
12struct mailimap_body_type_basic; 13struct mailimap_body_type_basic;
13struct mailimap_body_type_msg; 14struct mailimap_body_type_msg;
14struct mailimap_body_type_mpart; 15struct mailimap_body_type_mpart;
15struct mailimap_body_fields; 16struct mailimap_body_fields;
16struct mailimap_msg_att; 17struct mailimap_msg_att;
17class encodedString; 18class encodedString;
18 19
19class IMAPwrapper : public AbstractMail 20class IMAPwrapper : public AbstractMail
20{ 21{
21 Q_OBJECT 22 Q_OBJECT
22public: 23public:
23 IMAPwrapper( IMAPaccount *a ); 24 IMAPwrapper( IMAPaccount *a );
24 virtual ~IMAPwrapper(); 25 virtual ~IMAPwrapper();
25 virtual QList<Folder>* listFolders(); 26 virtual QList<Folder>* listFolders();
26 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
27 28
28 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
29 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
30 virtual int deleteAllMail(const Folder*folder); 31 virtual int deleteAllMail(const Folder*folder);
31 32
32 virtual RecBody fetchBody(const RecMail&mail); 33 virtual RecBody fetchBody(const RecMail&mail);
33 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
36 37
37 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); 38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false);
38 virtual int deleteMbox(const Folder*folder); 39 virtual int deleteMbox(const Folder*folder);
39 40
40 static void imap_progress( size_t current, size_t maximum ); 41 static void imap_progress( size_t current, size_t maximum );
41 42
42protected: 43protected:
43 RecMail*parse_list_result(mailimap_msg_att*); 44 RecMail*parse_list_result(mailimap_msg_att*);
44 void login(); 45 void login();
45 void logout(); 46 void logout();
46 47
47 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc=""); 48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
48 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call); 49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call);
49 50
50 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
51 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
52
53 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
54 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
55 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
56 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
55 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=0);
57 56
58 /* just helpers */ 57 /* just helpers */
59 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 58 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
60 static QStringList address_list_to_stringlist(clist*list); 59 static QStringList address_list_to_stringlist(clist*list);
61 60
62 61
63 IMAPaccount *account; 62 IMAPaccount *account;
64 mailimap *m_imap; 63 mailimap *m_imap;
65}; 64};
66 65
67#endif 66#endif