summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-14 17:33:16 (UTC)
committer alwin <alwin>2003-12-14 17:33:16 (UTC)
commit353e1da81b235d7798763bce76428fb473108fb6 (patch) (unidiff)
treee9b8f8cbe3ee37512a1c9fc0409185f4fb6c9883
parent87425f2b26c01cc9bcc9bfac21a707462b410f13 (diff)
downloadopie-353e1da81b235d7798763bce76428fb473108fb6.zip
opie-353e1da81b235d7798763bce76428fb473108fb6.tar.gz
opie-353e1da81b235d7798763bce76428fb473108fb6.tar.bz2
- replied mails will get the flag answered
- text fix in preparing the message for a reply
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/abstractmail.h1
-rw-r--r--noncore/net/mail/imapwrapper.cpp30
-rw-r--r--noncore/net/mail/imapwrapper.h1
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.h1
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp30
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h1
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp4
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.h1
-rw-r--r--noncore/net/mail/pop3wrapper.cpp4
-rw-r--r--noncore/net/mail/pop3wrapper.h1
-rw-r--r--noncore/net/mail/viewmail.cpp11
11 files changed, 81 insertions, 4 deletions
diff --git a/noncore/net/mail/abstractmail.h b/noncore/net/mail/abstractmail.h
index 0a1719d..62e0715 100644
--- a/noncore/net/mail/abstractmail.h
+++ b/noncore/net/mail/abstractmail.h
@@ -1,30 +1,31 @@
1#ifndef __abstract_mail_ 1#ifndef __abstract_mail_
2#define __abstract_mail_ 2#define __abstract_mail_
3 3
4#include <qobject.h> 4#include <qobject.h>
5#include "settings.h" 5#include "settings.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9class RecPart; 9class RecPart;
10class IMAPwrapper; 10class IMAPwrapper;
11class POP3wrapper; 11class POP3wrapper;
12class Folder; 12class Folder;
13 13
14class AbstractMail:public QObject 14class AbstractMail:public QObject
15{ 15{
16 Q_OBJECT 16 Q_OBJECT
17public: 17public:
18 AbstractMail(){}; 18 AbstractMail(){};
19 virtual ~AbstractMail(){} 19 virtual ~AbstractMail(){}
20 virtual QList<Folder>* listFolders()=0; 20 virtual QList<Folder>* listFolders()=0;
21 virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0; 21 virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0;
22 virtual RecBody fetchBody(const RecMail&mail)=0; 22 virtual RecBody fetchBody(const RecMail&mail)=0;
23 virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0; 23 virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0;
24 virtual void deleteMail(const RecMail&mail)=0; 24 virtual void deleteMail(const RecMail&mail)=0;
25 virtual void answeredMail(const RecMail&mail)=0;
25 26
26 static AbstractMail* getWrapper(IMAPaccount *a); 27 static AbstractMail* getWrapper(IMAPaccount *a);
27 static AbstractMail* getWrapper(POP3account *a); 28 static AbstractMail* getWrapper(POP3account *a);
28}; 29};
29 30
30#endif 31#endif
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index 912a412..b253b49 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -550,192 +550,222 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mai
550 target_body.setBodytext(body_text); 550 target_body.setBodytext(body_text);
551 } else { 551 } else {
552 QString id(""); 552 QString id("");
553 for (unsigned int j = 0; j < clist.count();++j) { 553 for (unsigned int j = 0; j < clist.count();++j) {
554 id+=(j>0?" ":""); 554 id+=(j>0?" ":"");
555 id+=QString("%1").arg(clist[j]); 555 id+=QString("%1").arg(clist[j]);
556 } 556 }
557 qDebug("ID= %s",id.latin1()); 557 qDebug("ID= %s",id.latin1());
558 currentPart.setIdentifier(id); 558 currentPart.setIdentifier(id);
559 currentPart.setPositionlist(clist); 559 currentPart.setPositionlist(clist);
560 target_body.addPart(currentPart); 560 target_body.addPart(currentPart);
561 } 561 }
562 } 562 }
563 } 563 }
564} 564}
565 565
566void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 566void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
567{ 567{
568 if (!Description) { 568 if (!Description) {
569 return; 569 return;
570 } 570 }
571 switch (Description->bd_type) { 571 switch (Description->bd_type) {
572 case MAILIMAP_BODY_TYPE_1PART_TEXT: 572 case MAILIMAP_BODY_TYPE_1PART_TEXT:
573 target_part.setType("text"); 573 target_part.setType("text");
574 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 574 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
575 break; 575 break;
576 case MAILIMAP_BODY_TYPE_1PART_BASIC: 576 case MAILIMAP_BODY_TYPE_1PART_BASIC:
577 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 577 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
578 break; 578 break;
579 case MAILIMAP_BODY_TYPE_1PART_MSG: 579 case MAILIMAP_BODY_TYPE_1PART_MSG:
580 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 580 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
581 break; 581 break;
582 default: 582 default:
583 break; 583 break;
584 } 584 }
585} 585}
586 586
587void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 587void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
588{ 588{
589 if (!which) { 589 if (!which) {
590 return; 590 return;
591 } 591 }
592 QString sub; 592 QString sub;
593 sub = which->bd_media_text; 593 sub = which->bd_media_text;
594 target_part.setSubtype(sub.lower()); 594 target_part.setSubtype(sub.lower());
595 target_part.setLines(which->bd_lines); 595 target_part.setLines(which->bd_lines);
596 fillBodyFields(target_part,which->bd_fields); 596 fillBodyFields(target_part,which->bd_fields);
597} 597}
598 598
599void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 599void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
600{ 600{
601 if (!which) { 601 if (!which) {
602 return; 602 return;
603 } 603 }
604// QString sub; 604// QString sub;
605// sub = which->bd_media_text; 605// sub = which->bd_media_text;
606// target_part.setSubtype(sub.lower()); 606// target_part.setSubtype(sub.lower());
607 qDebug("Message part"); 607 qDebug("Message part");
608 /* we set this type to text/plain */ 608 /* we set this type to text/plain */
609 target_part.setType("text"); 609 target_part.setType("text");
610 target_part.setSubtype("plain"); 610 target_part.setSubtype("plain");
611 target_part.setLines(which->bd_lines); 611 target_part.setLines(which->bd_lines);
612 fillBodyFields(target_part,which->bd_fields); 612 fillBodyFields(target_part,which->bd_fields);
613} 613}
614 614
615void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 615void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
616{ 616{
617 if (!which) { 617 if (!which) {
618 return; 618 return;
619 } 619 }
620 QString type,sub; 620 QString type,sub;
621 switch (which->bd_media_basic->med_type) { 621 switch (which->bd_media_basic->med_type) {
622 case MAILIMAP_MEDIA_BASIC_APPLICATION: 622 case MAILIMAP_MEDIA_BASIC_APPLICATION:
623 type = "application"; 623 type = "application";
624 break; 624 break;
625 case MAILIMAP_MEDIA_BASIC_AUDIO: 625 case MAILIMAP_MEDIA_BASIC_AUDIO:
626 type = "audio"; 626 type = "audio";
627 break; 627 break;
628 case MAILIMAP_MEDIA_BASIC_IMAGE: 628 case MAILIMAP_MEDIA_BASIC_IMAGE:
629 type = "image"; 629 type = "image";
630 break; 630 break;
631 case MAILIMAP_MEDIA_BASIC_MESSAGE: 631 case MAILIMAP_MEDIA_BASIC_MESSAGE:
632 type = "message"; 632 type = "message";
633 break; 633 break;
634 case MAILIMAP_MEDIA_BASIC_VIDEO: 634 case MAILIMAP_MEDIA_BASIC_VIDEO:
635 type = "video"; 635 type = "video";
636 break; 636 break;
637 case MAILIMAP_MEDIA_BASIC_OTHER: 637 case MAILIMAP_MEDIA_BASIC_OTHER:
638 default: 638 default:
639 if (which->bd_media_basic->med_basic_type) { 639 if (which->bd_media_basic->med_basic_type) {
640 type = which->bd_media_basic->med_basic_type; 640 type = which->bd_media_basic->med_basic_type;
641 } else { 641 } else {
642 type = ""; 642 type = "";
643 } 643 }
644 break; 644 break;
645 } 645 }
646 if (which->bd_media_basic->med_subtype) { 646 if (which->bd_media_basic->med_subtype) {
647 sub = which->bd_media_basic->med_subtype; 647 sub = which->bd_media_basic->med_subtype;
648 } else { 648 } else {
649 sub = ""; 649 sub = "";
650 } 650 }
651 qDebug("Type = %s/%s",type.latin1(),sub.latin1()); 651 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
652 target_part.setType(type.lower()); 652 target_part.setType(type.lower());
653 target_part.setSubtype(sub.lower()); 653 target_part.setSubtype(sub.lower());
654 fillBodyFields(target_part,which->bd_fields); 654 fillBodyFields(target_part,which->bd_fields);
655} 655}
656 656
657void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which) 657void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
658{ 658{
659 if (!which) return; 659 if (!which) return;
660 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { 660 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) {
661 clistcell*cur; 661 clistcell*cur;
662 mailimap_single_body_fld_param*param=0; 662 mailimap_single_body_fld_param*param=0;
663 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 663 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
664 param = (mailimap_single_body_fld_param*)cur->data; 664 param = (mailimap_single_body_fld_param*)cur->data;
665 if (param) { 665 if (param) {
666 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 666 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
667 } 667 }
668 } 668 }
669 } 669 }
670 mailimap_body_fld_enc*enc = which->bd_encoding; 670 mailimap_body_fld_enc*enc = which->bd_encoding;
671 QString encoding(""); 671 QString encoding("");
672 switch (enc->enc_type) { 672 switch (enc->enc_type) {
673 case MAILIMAP_BODY_FLD_ENC_7BIT: 673 case MAILIMAP_BODY_FLD_ENC_7BIT:
674 encoding = "7bit"; 674 encoding = "7bit";
675 break; 675 break;
676 case MAILIMAP_BODY_FLD_ENC_8BIT: 676 case MAILIMAP_BODY_FLD_ENC_8BIT:
677 encoding = "8bit"; 677 encoding = "8bit";
678 break; 678 break;
679 case MAILIMAP_BODY_FLD_ENC_BINARY: 679 case MAILIMAP_BODY_FLD_ENC_BINARY:
680 encoding="binary"; 680 encoding="binary";
681 break; 681 break;
682 case MAILIMAP_BODY_FLD_ENC_BASE64: 682 case MAILIMAP_BODY_FLD_ENC_BASE64:
683 encoding="base64"; 683 encoding="base64";
684 break; 684 break;
685 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: 685 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
686 encoding="quoted-printable"; 686 encoding="quoted-printable";
687 break; 687 break;
688 case MAILIMAP_BODY_FLD_ENC_OTHER: 688 case MAILIMAP_BODY_FLD_ENC_OTHER:
689 default: 689 default:
690 if (enc->enc_value) { 690 if (enc->enc_value) {
691 char*t=enc->enc_value; 691 char*t=enc->enc_value;
692 encoding=QString(enc->enc_value); 692 encoding=QString(enc->enc_value);
693 enc->enc_value=0L; 693 enc->enc_value=0L;
694 free(t); 694 free(t);
695 } 695 }
696 } 696 }
697 target_part.setEncoding(encoding); 697 target_part.setEncoding(encoding);
698 target_part.setSize(which->bd_size); 698 target_part.setSize(which->bd_size);
699} 699}
700 700
701QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part) 701QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part)
702{ 702{
703 return fetchPart(mail,part.Positionlist(),false); 703 return fetchPart(mail,part.Positionlist(),false);
704} 704}
705 705
706void IMAPwrapper::deleteMail(const RecMail&mail) 706void IMAPwrapper::deleteMail(const RecMail&mail)
707{ 707{
708 mailimap_flag_list*flist; 708 mailimap_flag_list*flist;
709 mailimap_set *set; 709 mailimap_set *set;
710 mailimap_store_att_flags * store_flags; 710 mailimap_store_att_flags * store_flags;
711 int err; 711 int err;
712 login(); 712 login();
713 if (!m_imap) { 713 if (!m_imap) {
714 return; 714 return;
715 } 715 }
716 const char *mb = mail.getMbox().latin1(); 716 const char *mb = mail.getMbox().latin1();
717 err = mailimap_select( m_imap, (char*)mb); 717 err = mailimap_select( m_imap, (char*)mb);
718 if ( err != MAILIMAP_NO_ERROR ) { 718 if ( err != MAILIMAP_NO_ERROR ) {
719 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response); 719 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response);
720 return; 720 return;
721 } 721 }
722 flist = mailimap_flag_list_new_empty(); 722 flist = mailimap_flag_list_new_empty();
723 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 723 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
724 store_flags = mailimap_store_att_flags_new_set_flags(flist); 724 store_flags = mailimap_store_att_flags_new_set_flags(flist);
725 set = mailimap_set_new_single(mail.getNumber()); 725 set = mailimap_set_new_single(mail.getNumber());
726 err = mailimap_store(m_imap,set,store_flags); 726 err = mailimap_store(m_imap,set,store_flags);
727 mailimap_set_free( set ); 727 mailimap_set_free( set );
728 mailimap_store_att_flags_free(store_flags); 728 mailimap_store_att_flags_free(store_flags);
729 729
730 if (err != MAILIMAP_NO_ERROR) { 730 if (err != MAILIMAP_NO_ERROR) {
731 qDebug("error deleting mail: %s",m_imap->imap_response); 731 qDebug("error deleting mail: %s",m_imap->imap_response);
732 return; 732 return;
733 } 733 }
734 qDebug("deleting mail: %s",m_imap->imap_response); 734 qDebug("deleting mail: %s",m_imap->imap_response);
735 /* should we realy do that at this moment? */ 735 /* should we realy do that at this moment? */
736 err = mailimap_expunge(m_imap); 736 err = mailimap_expunge(m_imap);
737 if (err != MAILIMAP_NO_ERROR) { 737 if (err != MAILIMAP_NO_ERROR) {
738 qDebug("error deleting mail: %s",m_imap->imap_response); 738 qDebug("error deleting mail: %s",m_imap->imap_response);
739 } 739 }
740 qDebug("Delete successfull %s",m_imap->imap_response); 740 qDebug("Delete successfull %s",m_imap->imap_response);
741} 741}
742
743void IMAPwrapper::answeredMail(const RecMail&mail)
744{
745 mailimap_flag_list*flist;
746 mailimap_set *set;
747 mailimap_store_att_flags * store_flags;
748 int err;
749 login();
750 if (!m_imap) {
751 return;
752 }
753 const char *mb = mail.getMbox().latin1();
754 err = mailimap_select( m_imap, (char*)mb);
755 if ( err != MAILIMAP_NO_ERROR ) {
756 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response);
757 return;
758 }
759 flist = mailimap_flag_list_new_empty();
760 mailimap_flag_list_add(flist,mailimap_flag_new_answered());
761 store_flags = mailimap_store_att_flags_new_set_flags(flist);
762 set = mailimap_set_new_single(mail.getNumber());
763 err = mailimap_store(m_imap,set,store_flags);
764 mailimap_set_free( set );
765 mailimap_store_att_flags_free(store_flags);
766
767 if (err != MAILIMAP_NO_ERROR) {
768 qDebug("error marking mail: %s",m_imap->imap_response);
769 return;
770 }
771}
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 4f4d575..700d512 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -1,55 +1,56 @@
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 7
8struct mailimap; 8struct mailimap;
9struct mailimap_body_type_1part; 9struct mailimap_body_type_1part;
10struct mailimap_body_type_text; 10struct mailimap_body_type_text;
11struct mailimap_body_type_basic; 11struct mailimap_body_type_basic;
12struct mailimap_body_type_msg; 12struct mailimap_body_type_msg;
13struct mailimap_body_type_mpart; 13struct mailimap_body_type_mpart;
14struct mailimap_body_fields; 14struct mailimap_body_fields;
15struct mailimap_msg_att; 15struct mailimap_msg_att;
16 16
17class IMAPwrapper : public AbstractMail 17class IMAPwrapper : public AbstractMail
18{ 18{
19 Q_OBJECT 19 Q_OBJECT
20public: 20public:
21 IMAPwrapper( IMAPaccount *a ); 21 IMAPwrapper( IMAPaccount *a );
22 virtual ~IMAPwrapper(); 22 virtual ~IMAPwrapper();
23 virtual QList<Folder>* listFolders(); 23 virtual QList<Folder>* listFolders();
24 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 24 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
25 virtual RecBody fetchBody(const RecMail&mail); 25 virtual RecBody fetchBody(const RecMail&mail);
26 virtual QString fetchPart(const RecMail&mail,const RecPart&part); 26 virtual QString fetchPart(const RecMail&mail,const RecPart&part);
27 virtual void deleteMail(const RecMail&mail); 27 virtual void deleteMail(const RecMail&mail);
28 virtual void answeredMail(const RecMail&mail);
28 29
29 static void imap_progress( size_t current, size_t maximum ); 30 static void imap_progress( size_t current, size_t maximum );
30 31
31protected: 32protected:
32 RecMail*parse_list_result(mailimap_msg_att*); 33 RecMail*parse_list_result(mailimap_msg_att*);
33 void login(); 34 void login();
34 void logout(); 35 void logout();
35 36
36 virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false); 37 virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false);
37 38
38 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body); 39 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
39 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>()); 40 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
40 41
41 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 42 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
42 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 43 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
43 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 44 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
44 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 45 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
45 46
46 /* just helpers */ 47 /* just helpers */
47 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 48 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
48 static QStringList address_list_to_stringlist(clist*list); 49 static QStringList address_list_to_stringlist(clist*list);
49 50
50private: 51private:
51 IMAPaccount *account; 52 IMAPaccount *account;
52 mailimap *m_imap; 53 mailimap *m_imap;
53}; 54};
54 55
55#endif 56#endif
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h
index 0a1719d..62e0715 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.h
+++ b/noncore/net/mail/libmailwrapper/abstractmail.h
@@ -1,30 +1,31 @@
1#ifndef __abstract_mail_ 1#ifndef __abstract_mail_
2#define __abstract_mail_ 2#define __abstract_mail_
3 3
4#include <qobject.h> 4#include <qobject.h>
5#include "settings.h" 5#include "settings.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9class RecPart; 9class RecPart;
10class IMAPwrapper; 10class IMAPwrapper;
11class POP3wrapper; 11class POP3wrapper;
12class Folder; 12class Folder;
13 13
14class AbstractMail:public QObject 14class AbstractMail:public QObject
15{ 15{
16 Q_OBJECT 16 Q_OBJECT
17public: 17public:
18 AbstractMail(){}; 18 AbstractMail(){};
19 virtual ~AbstractMail(){} 19 virtual ~AbstractMail(){}
20 virtual QList<Folder>* listFolders()=0; 20 virtual QList<Folder>* listFolders()=0;
21 virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0; 21 virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0;
22 virtual RecBody fetchBody(const RecMail&mail)=0; 22 virtual RecBody fetchBody(const RecMail&mail)=0;
23 virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0; 23 virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0;
24 virtual void deleteMail(const RecMail&mail)=0; 24 virtual void deleteMail(const RecMail&mail)=0;
25 virtual void answeredMail(const RecMail&mail)=0;
25 26
26 static AbstractMail* getWrapper(IMAPaccount *a); 27 static AbstractMail* getWrapper(IMAPaccount *a);
27 static AbstractMail* getWrapper(POP3account *a); 28 static AbstractMail* getWrapper(POP3account *a);
28}; 29};
29 30
30#endif 31#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 912a412..b253b49 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -550,192 +550,222 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mai
550 target_body.setBodytext(body_text); 550 target_body.setBodytext(body_text);
551 } else { 551 } else {
552 QString id(""); 552 QString id("");
553 for (unsigned int j = 0; j < clist.count();++j) { 553 for (unsigned int j = 0; j < clist.count();++j) {
554 id+=(j>0?" ":""); 554 id+=(j>0?" ":"");
555 id+=QString("%1").arg(clist[j]); 555 id+=QString("%1").arg(clist[j]);
556 } 556 }
557 qDebug("ID= %s",id.latin1()); 557 qDebug("ID= %s",id.latin1());
558 currentPart.setIdentifier(id); 558 currentPart.setIdentifier(id);
559 currentPart.setPositionlist(clist); 559 currentPart.setPositionlist(clist);
560 target_body.addPart(currentPart); 560 target_body.addPart(currentPart);
561 } 561 }
562 } 562 }
563 } 563 }
564} 564}
565 565
566void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 566void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
567{ 567{
568 if (!Description) { 568 if (!Description) {
569 return; 569 return;
570 } 570 }
571 switch (Description->bd_type) { 571 switch (Description->bd_type) {
572 case MAILIMAP_BODY_TYPE_1PART_TEXT: 572 case MAILIMAP_BODY_TYPE_1PART_TEXT:
573 target_part.setType("text"); 573 target_part.setType("text");
574 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 574 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
575 break; 575 break;
576 case MAILIMAP_BODY_TYPE_1PART_BASIC: 576 case MAILIMAP_BODY_TYPE_1PART_BASIC:
577 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 577 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
578 break; 578 break;
579 case MAILIMAP_BODY_TYPE_1PART_MSG: 579 case MAILIMAP_BODY_TYPE_1PART_MSG:
580 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 580 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
581 break; 581 break;
582 default: 582 default:
583 break; 583 break;
584 } 584 }
585} 585}
586 586
587void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 587void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
588{ 588{
589 if (!which) { 589 if (!which) {
590 return; 590 return;
591 } 591 }
592 QString sub; 592 QString sub;
593 sub = which->bd_media_text; 593 sub = which->bd_media_text;
594 target_part.setSubtype(sub.lower()); 594 target_part.setSubtype(sub.lower());
595 target_part.setLines(which->bd_lines); 595 target_part.setLines(which->bd_lines);
596 fillBodyFields(target_part,which->bd_fields); 596 fillBodyFields(target_part,which->bd_fields);
597} 597}
598 598
599void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 599void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
600{ 600{
601 if (!which) { 601 if (!which) {
602 return; 602 return;
603 } 603 }
604// QString sub; 604// QString sub;
605// sub = which->bd_media_text; 605// sub = which->bd_media_text;
606// target_part.setSubtype(sub.lower()); 606// target_part.setSubtype(sub.lower());
607 qDebug("Message part"); 607 qDebug("Message part");
608 /* we set this type to text/plain */ 608 /* we set this type to text/plain */
609 target_part.setType("text"); 609 target_part.setType("text");
610 target_part.setSubtype("plain"); 610 target_part.setSubtype("plain");
611 target_part.setLines(which->bd_lines); 611 target_part.setLines(which->bd_lines);
612 fillBodyFields(target_part,which->bd_fields); 612 fillBodyFields(target_part,which->bd_fields);
613} 613}
614 614
615void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 615void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
616{ 616{
617 if (!which) { 617 if (!which) {
618 return; 618 return;
619 } 619 }
620 QString type,sub; 620 QString type,sub;
621 switch (which->bd_media_basic->med_type) { 621 switch (which->bd_media_basic->med_type) {
622 case MAILIMAP_MEDIA_BASIC_APPLICATION: 622 case MAILIMAP_MEDIA_BASIC_APPLICATION:
623 type = "application"; 623 type = "application";
624 break; 624 break;
625 case MAILIMAP_MEDIA_BASIC_AUDIO: 625 case MAILIMAP_MEDIA_BASIC_AUDIO:
626 type = "audio"; 626 type = "audio";
627 break; 627 break;
628 case MAILIMAP_MEDIA_BASIC_IMAGE: 628 case MAILIMAP_MEDIA_BASIC_IMAGE:
629 type = "image"; 629 type = "image";
630 break; 630 break;
631 case MAILIMAP_MEDIA_BASIC_MESSAGE: 631 case MAILIMAP_MEDIA_BASIC_MESSAGE:
632 type = "message"; 632 type = "message";
633 break; 633 break;
634 case MAILIMAP_MEDIA_BASIC_VIDEO: 634 case MAILIMAP_MEDIA_BASIC_VIDEO:
635 type = "video"; 635 type = "video";
636 break; 636 break;
637 case MAILIMAP_MEDIA_BASIC_OTHER: 637 case MAILIMAP_MEDIA_BASIC_OTHER:
638 default: 638 default:
639 if (which->bd_media_basic->med_basic_type) { 639 if (which->bd_media_basic->med_basic_type) {
640 type = which->bd_media_basic->med_basic_type; 640 type = which->bd_media_basic->med_basic_type;
641 } else { 641 } else {
642 type = ""; 642 type = "";
643 } 643 }
644 break; 644 break;
645 } 645 }
646 if (which->bd_media_basic->med_subtype) { 646 if (which->bd_media_basic->med_subtype) {
647 sub = which->bd_media_basic->med_subtype; 647 sub = which->bd_media_basic->med_subtype;
648 } else { 648 } else {
649 sub = ""; 649 sub = "";
650 } 650 }
651 qDebug("Type = %s/%s",type.latin1(),sub.latin1()); 651 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
652 target_part.setType(type.lower()); 652 target_part.setType(type.lower());
653 target_part.setSubtype(sub.lower()); 653 target_part.setSubtype(sub.lower());
654 fillBodyFields(target_part,which->bd_fields); 654 fillBodyFields(target_part,which->bd_fields);
655} 655}
656 656
657void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which) 657void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
658{ 658{
659 if (!which) return; 659 if (!which) return;
660 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { 660 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) {
661 clistcell*cur; 661 clistcell*cur;
662 mailimap_single_body_fld_param*param=0; 662 mailimap_single_body_fld_param*param=0;
663 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 663 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
664 param = (mailimap_single_body_fld_param*)cur->data; 664 param = (mailimap_single_body_fld_param*)cur->data;
665 if (param) { 665 if (param) {
666 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 666 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
667 } 667 }
668 } 668 }
669 } 669 }
670 mailimap_body_fld_enc*enc = which->bd_encoding; 670 mailimap_body_fld_enc*enc = which->bd_encoding;
671 QString encoding(""); 671 QString encoding("");
672 switch (enc->enc_type) { 672 switch (enc->enc_type) {
673 case MAILIMAP_BODY_FLD_ENC_7BIT: 673 case MAILIMAP_BODY_FLD_ENC_7BIT:
674 encoding = "7bit"; 674 encoding = "7bit";
675 break; 675 break;
676 case MAILIMAP_BODY_FLD_ENC_8BIT: 676 case MAILIMAP_BODY_FLD_ENC_8BIT:
677 encoding = "8bit"; 677 encoding = "8bit";
678 break; 678 break;
679 case MAILIMAP_BODY_FLD_ENC_BINARY: 679 case MAILIMAP_BODY_FLD_ENC_BINARY:
680 encoding="binary"; 680 encoding="binary";
681 break; 681 break;
682 case MAILIMAP_BODY_FLD_ENC_BASE64: 682 case MAILIMAP_BODY_FLD_ENC_BASE64:
683 encoding="base64"; 683 encoding="base64";
684 break; 684 break;
685 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: 685 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
686 encoding="quoted-printable"; 686 encoding="quoted-printable";
687 break; 687 break;
688 case MAILIMAP_BODY_FLD_ENC_OTHER: 688 case MAILIMAP_BODY_FLD_ENC_OTHER:
689 default: 689 default:
690 if (enc->enc_value) { 690 if (enc->enc_value) {
691 char*t=enc->enc_value; 691 char*t=enc->enc_value;
692 encoding=QString(enc->enc_value); 692 encoding=QString(enc->enc_value);
693 enc->enc_value=0L; 693 enc->enc_value=0L;
694 free(t); 694 free(t);
695 } 695 }
696 } 696 }
697 target_part.setEncoding(encoding); 697 target_part.setEncoding(encoding);
698 target_part.setSize(which->bd_size); 698 target_part.setSize(which->bd_size);
699} 699}
700 700
701QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part) 701QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part)
702{ 702{
703 return fetchPart(mail,part.Positionlist(),false); 703 return fetchPart(mail,part.Positionlist(),false);
704} 704}
705 705
706void IMAPwrapper::deleteMail(const RecMail&mail) 706void IMAPwrapper::deleteMail(const RecMail&mail)
707{ 707{
708 mailimap_flag_list*flist; 708 mailimap_flag_list*flist;
709 mailimap_set *set; 709 mailimap_set *set;
710 mailimap_store_att_flags * store_flags; 710 mailimap_store_att_flags * store_flags;
711 int err; 711 int err;
712 login(); 712 login();
713 if (!m_imap) { 713 if (!m_imap) {
714 return; 714 return;
715 } 715 }
716 const char *mb = mail.getMbox().latin1(); 716 const char *mb = mail.getMbox().latin1();
717 err = mailimap_select( m_imap, (char*)mb); 717 err = mailimap_select( m_imap, (char*)mb);
718 if ( err != MAILIMAP_NO_ERROR ) { 718 if ( err != MAILIMAP_NO_ERROR ) {
719 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response); 719 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response);
720 return; 720 return;
721 } 721 }
722 flist = mailimap_flag_list_new_empty(); 722 flist = mailimap_flag_list_new_empty();
723 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 723 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
724 store_flags = mailimap_store_att_flags_new_set_flags(flist); 724 store_flags = mailimap_store_att_flags_new_set_flags(flist);
725 set = mailimap_set_new_single(mail.getNumber()); 725 set = mailimap_set_new_single(mail.getNumber());
726 err = mailimap_store(m_imap,set,store_flags); 726 err = mailimap_store(m_imap,set,store_flags);
727 mailimap_set_free( set ); 727 mailimap_set_free( set );
728 mailimap_store_att_flags_free(store_flags); 728 mailimap_store_att_flags_free(store_flags);
729 729
730 if (err != MAILIMAP_NO_ERROR) { 730 if (err != MAILIMAP_NO_ERROR) {
731 qDebug("error deleting mail: %s",m_imap->imap_response); 731 qDebug("error deleting mail: %s",m_imap->imap_response);
732 return; 732 return;
733 } 733 }
734 qDebug("deleting mail: %s",m_imap->imap_response); 734 qDebug("deleting mail: %s",m_imap->imap_response);
735 /* should we realy do that at this moment? */ 735 /* should we realy do that at this moment? */
736 err = mailimap_expunge(m_imap); 736 err = mailimap_expunge(m_imap);
737 if (err != MAILIMAP_NO_ERROR) { 737 if (err != MAILIMAP_NO_ERROR) {
738 qDebug("error deleting mail: %s",m_imap->imap_response); 738 qDebug("error deleting mail: %s",m_imap->imap_response);
739 } 739 }
740 qDebug("Delete successfull %s",m_imap->imap_response); 740 qDebug("Delete successfull %s",m_imap->imap_response);
741} 741}
742
743void IMAPwrapper::answeredMail(const RecMail&mail)
744{
745 mailimap_flag_list*flist;
746 mailimap_set *set;
747 mailimap_store_att_flags * store_flags;
748 int err;
749 login();
750 if (!m_imap) {
751 return;
752 }
753 const char *mb = mail.getMbox().latin1();
754 err = mailimap_select( m_imap, (char*)mb);
755 if ( err != MAILIMAP_NO_ERROR ) {
756 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response);
757 return;
758 }
759 flist = mailimap_flag_list_new_empty();
760 mailimap_flag_list_add(flist,mailimap_flag_new_answered());
761 store_flags = mailimap_store_att_flags_new_set_flags(flist);
762 set = mailimap_set_new_single(mail.getNumber());
763 err = mailimap_store(m_imap,set,store_flags);
764 mailimap_set_free( set );
765 mailimap_store_att_flags_free(store_flags);
766
767 if (err != MAILIMAP_NO_ERROR) {
768 qDebug("error marking mail: %s",m_imap->imap_response);
769 return;
770 }
771}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 4f4d575..700d512 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -1,55 +1,56 @@
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 7
8struct mailimap; 8struct mailimap;
9struct mailimap_body_type_1part; 9struct mailimap_body_type_1part;
10struct mailimap_body_type_text; 10struct mailimap_body_type_text;
11struct mailimap_body_type_basic; 11struct mailimap_body_type_basic;
12struct mailimap_body_type_msg; 12struct mailimap_body_type_msg;
13struct mailimap_body_type_mpart; 13struct mailimap_body_type_mpart;
14struct mailimap_body_fields; 14struct mailimap_body_fields;
15struct mailimap_msg_att; 15struct mailimap_msg_att;
16 16
17class IMAPwrapper : public AbstractMail 17class IMAPwrapper : public AbstractMail
18{ 18{
19 Q_OBJECT 19 Q_OBJECT
20public: 20public:
21 IMAPwrapper( IMAPaccount *a ); 21 IMAPwrapper( IMAPaccount *a );
22 virtual ~IMAPwrapper(); 22 virtual ~IMAPwrapper();
23 virtual QList<Folder>* listFolders(); 23 virtual QList<Folder>* listFolders();
24 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 24 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
25 virtual RecBody fetchBody(const RecMail&mail); 25 virtual RecBody fetchBody(const RecMail&mail);
26 virtual QString fetchPart(const RecMail&mail,const RecPart&part); 26 virtual QString fetchPart(const RecMail&mail,const RecPart&part);
27 virtual void deleteMail(const RecMail&mail); 27 virtual void deleteMail(const RecMail&mail);
28 virtual void answeredMail(const RecMail&mail);
28 29
29 static void imap_progress( size_t current, size_t maximum ); 30 static void imap_progress( size_t current, size_t maximum );
30 31
31protected: 32protected:
32 RecMail*parse_list_result(mailimap_msg_att*); 33 RecMail*parse_list_result(mailimap_msg_att*);
33 void login(); 34 void login();
34 void logout(); 35 void logout();
35 36
36 virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false); 37 virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false);
37 38
38 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body); 39 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
39 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>()); 40 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
40 41
41 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 42 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
42 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 43 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
43 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 44 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
44 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 45 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
45 46
46 /* just helpers */ 47 /* just helpers */
47 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 48 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
48 static QStringList address_list_to_stringlist(clist*list); 49 static QStringList address_list_to_stringlist(clist*list);
49 50
50private: 51private:
51 IMAPaccount *account; 52 IMAPaccount *account;
52 mailimap *m_imap; 53 mailimap *m_imap;
53}; 54};
54 55
55#endif 56#endif
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 5065d29..46c854b 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -98,192 +98,196 @@ RecMail *POP3wrapper::parseHeader( const char *header )
98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
100 mailimf_field *field = (mailimf_field *) current->data; 100 mailimf_field *field = (mailimf_field *) current->data;
101 switch ( field->fld_type ) { 101 switch ( field->fld_type ) {
102 case MAILIMF_FIELD_FROM: 102 case MAILIMF_FIELD_FROM:
103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
104 break; 104 break;
105 case MAILIMF_FIELD_TO: 105 case MAILIMF_FIELD_TO:
106 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 106 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
107 break; 107 break;
108 case MAILIMF_FIELD_CC: 108 case MAILIMF_FIELD_CC:
109 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 109 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
110 break; 110 break;
111 case MAILIMF_FIELD_BCC: 111 case MAILIMF_FIELD_BCC:
112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
113 break; 113 break;
114 case MAILIMF_FIELD_SUBJECT: 114 case MAILIMF_FIELD_SUBJECT:
115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); 115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
116 break; 116 break;
117 case MAILIMF_FIELD_ORIG_DATE: 117 case MAILIMF_FIELD_ORIG_DATE:
118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
119 break; 119 break;
120 default: 120 default:
121 break; 121 break;
122 } 122 }
123 } 123 }
124 124
125 return mail; 125 return mail;
126} 126}
127 127
128QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 128QString POP3wrapper::parseDateTime( mailimf_date_time *date )
129{ 129{
130 char tmp[23]; 130 char tmp[23];
131 131
132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
133 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); 133 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
134 134
135 return QString( tmp ); 135 return QString( tmp );
136} 136}
137 137
138QString POP3wrapper::parseAddressList( mailimf_address_list *list ) 138QString POP3wrapper::parseAddressList( mailimf_address_list *list )
139{ 139{
140 QString result( "" ); 140 QString result( "" );
141 141
142 bool first = true; 142 bool first = true;
143 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 143 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
144 mailimf_address *addr = (mailimf_address *) current->data; 144 mailimf_address *addr = (mailimf_address *) current->data;
145 145
146 if ( !first ) { 146 if ( !first ) {
147 result.append( "," ); 147 result.append( "," );
148 } else { 148 } else {
149 first = false; 149 first = false;
150 } 150 }
151 151
152 switch ( addr->ad_type ) { 152 switch ( addr->ad_type ) {
153 case MAILIMF_ADDRESS_MAILBOX: 153 case MAILIMF_ADDRESS_MAILBOX:
154 result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); 154 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
155 break; 155 break;
156 case MAILIMF_ADDRESS_GROUP: 156 case MAILIMF_ADDRESS_GROUP:
157 result.append( parseGroup( addr->ad_data.ad_group ) ); 157 result.append( parseGroup( addr->ad_data.ad_group ) );
158 break; 158 break;
159 default: 159 default:
160 qDebug( "POP3: unkown mailimf address type" ); 160 qDebug( "POP3: unkown mailimf address type" );
161 break; 161 break;
162 } 162 }
163 } 163 }
164 164
165 return result; 165 return result;
166} 166}
167 167
168QString POP3wrapper::parseGroup( mailimf_group *group ) 168QString POP3wrapper::parseGroup( mailimf_group *group )
169{ 169{
170 QString result( "" ); 170 QString result( "" );
171 171
172 result.append( group->grp_display_name ); 172 result.append( group->grp_display_name );
173 result.append( ": " ); 173 result.append( ": " );
174 174
175 if ( group->grp_mb_list != NULL ) { 175 if ( group->grp_mb_list != NULL ) {
176 result.append( parseMailboxList( group->grp_mb_list ) ); 176 result.append( parseMailboxList( group->grp_mb_list ) );
177 } 177 }
178 178
179 result.append( ";" ); 179 result.append( ";" );
180 180
181 return result; 181 return result;
182} 182}
183 183
184QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) 184QString POP3wrapper::parseMailbox( mailimf_mailbox *box )
185{ 185{
186 QString result( "" ); 186 QString result( "" );
187 187
188 if ( box->mb_display_name == NULL ) { 188 if ( box->mb_display_name == NULL ) {
189 result.append( box->mb_addr_spec ); 189 result.append( box->mb_addr_spec );
190 } else { 190 } else {
191 result.append( box->mb_display_name ); 191 result.append( box->mb_display_name );
192 result.append( " <" ); 192 result.append( " <" );
193 result.append( box->mb_addr_spec ); 193 result.append( box->mb_addr_spec );
194 result.append( ">" ); 194 result.append( ">" );
195 } 195 }
196 196
197 return result; 197 return result;
198} 198}
199 199
200QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) 200QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
201{ 201{
202 QString result( "" ); 202 QString result( "" );
203 203
204 bool first = true; 204 bool first = true;
205 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { 205 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
206 mailimf_mailbox *box = (mailimf_mailbox *) current->data; 206 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
207 207
208 if ( !first ) { 208 if ( !first ) {
209 result.append( "," ); 209 result.append( "," );
210 } else { 210 } else {
211 first = false; 211 first = false;
212 } 212 }
213 213
214 result.append( parseMailbox( box ) ); 214 result.append( parseMailbox( box ) );
215 } 215 }
216 216
217 return result; 217 return result;
218} 218}
219 219
220void POP3wrapper::login() 220void POP3wrapper::login()
221{ 221{
222 if ( m_pop3 != NULL ) logout(); 222 if ( m_pop3 != NULL ) logout();
223 223
224 const char *server, *user, *pass; 224 const char *server, *user, *pass;
225 uint16_t port; 225 uint16_t port;
226 int err = MAILPOP3_NO_ERROR; 226 int err = MAILPOP3_NO_ERROR;
227 227
228 server = account->getServer().latin1(); 228 server = account->getServer().latin1();
229 port = account->getPort().toUInt(); 229 port = account->getPort().toUInt();
230 user = account->getUser().latin1(); 230 user = account->getUser().latin1();
231 pass = account->getPassword().latin1(); 231 pass = account->getPassword().latin1();
232 232
233 m_pop3 = mailpop3_new( 200, &pop3_progress ); 233 m_pop3 = mailpop3_new( 200, &pop3_progress );
234 234
235 // connect 235 // connect
236 if (account->getSSL()) { 236 if (account->getSSL()) {
237 err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); 237 err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
238 } else { 238 } else {
239 err = mailpop3_socket_connect( m_pop3, (char*)server, port ); 239 err = mailpop3_socket_connect( m_pop3, (char*)server, port );
240 } 240 }
241 241
242 if ( err != MAILPOP3_NO_ERROR ) { 242 if ( err != MAILPOP3_NO_ERROR ) {
243 qDebug( "pop3: error connecting to %s\n reason: %s", server, 243 qDebug( "pop3: error connecting to %s\n reason: %s", server,
244 m_pop3->pop3_response ); 244 m_pop3->pop3_response );
245 mailpop3_free( m_pop3 ); 245 mailpop3_free( m_pop3 );
246 m_pop3 = NULL; 246 m_pop3 = NULL;
247 return; 247 return;
248 } 248 }
249 qDebug( "POP3: connected!" ); 249 qDebug( "POP3: connected!" );
250 250
251 // login 251 // login
252 // TODO: decide if apop or plain login should be used 252 // TODO: decide if apop or plain login should be used
253 err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); 253 err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
254 if ( err != MAILPOP3_NO_ERROR ) { 254 if ( err != MAILPOP3_NO_ERROR ) {
255 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); 255 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
256 logout(); 256 logout();
257 return; 257 return;
258 } 258 }
259 259
260 qDebug( "POP3: logged in!" ); 260 qDebug( "POP3: logged in!" );
261} 261}
262 262
263void POP3wrapper::logout() 263void POP3wrapper::logout()
264{ 264{
265 int err = MAILPOP3_NO_ERROR; 265 int err = MAILPOP3_NO_ERROR;
266 if ( m_pop3 == NULL ) return; 266 if ( m_pop3 == NULL ) return;
267 err = mailpop3_quit( m_pop3 ); 267 err = mailpop3_quit( m_pop3 );
268 mailpop3_free( m_pop3 ); 268 mailpop3_free( m_pop3 );
269 m_pop3 = NULL; 269 m_pop3 = NULL;
270} 270}
271 271
272 272
273QList<Folder>* POP3wrapper::listFolders() 273QList<Folder>* POP3wrapper::listFolders()
274{ 274{
275 QList<Folder> * folders = new QList<Folder>(); 275 QList<Folder> * folders = new QList<Folder>();
276 folders->setAutoDelete( false ); 276 folders->setAutoDelete( false );
277 Folder*inb=new Folder("INBOX"); 277 Folder*inb=new Folder("INBOX");
278 folders->append(inb); 278 folders->append(inb);
279 return folders; 279 return folders;
280} 280}
281 281
282QString POP3wrapper::fetchPart(const RecMail&,const RecPart&) 282QString POP3wrapper::fetchPart(const RecMail&,const RecPart&)
283{ 283{
284 return ""; 284 return "";
285} 285}
286 286
287void POP3wrapper::deleteMail(const RecMail&) 287void POP3wrapper::deleteMail(const RecMail&)
288{ 288{
289} 289}
290
291void POP3wrapper::answeredMail(const RecMail&)
292{
293}
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.h b/noncore/net/mail/libmailwrapper/pop3wrapper.h
index ef972c8..6ff8d62 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.h
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.h
@@ -1,43 +1,44 @@
1#ifndef __POP3WRAPPER 1#ifndef __POP3WRAPPER
2#define __POP3WRAPPER 2#define __POP3WRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include "abstractmail.h" 5#include "abstractmail.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9struct mailpop3; 9struct mailpop3;
10 10
11class POP3wrapper : public AbstractMail 11class POP3wrapper : public AbstractMail
12{ 12{
13 Q_OBJECT 13 Q_OBJECT
14 14
15public: 15public:
16 POP3wrapper( POP3account *a ); 16 POP3wrapper( POP3account *a );
17 virtual ~POP3wrapper(); 17 virtual ~POP3wrapper();
18 /* mailbox will be ignored */ 18 /* mailbox will be ignored */
19 virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); 19 virtual void listMessages(const QString & mailbox, QList<RecMail> &target );
20 virtual QList<Folder>* listFolders(); 20 virtual QList<Folder>* listFolders();
21 virtual QString fetchPart(const RecMail&mail,const RecPart&part); 21 virtual QString fetchPart(const RecMail&mail,const RecPart&part);
22 virtual void deleteMail(const RecMail&mail); 22 virtual void deleteMail(const RecMail&mail);
23 virtual void answeredMail(const RecMail&mail);
23 24
24 RecBody fetchBody( const RecMail &mail ); 25 RecBody fetchBody( const RecMail &mail );
25 static void pop3_progress( size_t current, size_t maximum ); 26 static void pop3_progress( size_t current, size_t maximum );
26 27
27protected: 28protected:
28 void login(); 29 void login();
29 void logout(); 30 void logout();
30 31
31private: 32private:
32 RecMail *parseHeader( const char *header ); 33 RecMail *parseHeader( const char *header );
33 RecBody parseBody( const char *message ); 34 RecBody parseBody( const char *message );
34 QString parseMailboxList( mailimf_mailbox_list *list ); 35 QString parseMailboxList( mailimf_mailbox_list *list );
35 QString parseMailbox( mailimf_mailbox *box ); 36 QString parseMailbox( mailimf_mailbox *box );
36 QString parseGroup( mailimf_group *group ); 37 QString parseGroup( mailimf_group *group );
37 QString parseAddressList( mailimf_address_list *list ); 38 QString parseAddressList( mailimf_address_list *list );
38 QString parseDateTime( mailimf_date_time *date ); 39 QString parseDateTime( mailimf_date_time *date );
39 POP3account *account; 40 POP3account *account;
40 mailpop3 *m_pop3; 41 mailpop3 *m_pop3;
41}; 42};
42 43
43#endif 44#endif
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 5065d29..46c854b 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -98,192 +98,196 @@ RecMail *POP3wrapper::parseHeader( const char *header )
98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
100 mailimf_field *field = (mailimf_field *) current->data; 100 mailimf_field *field = (mailimf_field *) current->data;
101 switch ( field->fld_type ) { 101 switch ( field->fld_type ) {
102 case MAILIMF_FIELD_FROM: 102 case MAILIMF_FIELD_FROM:
103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
104 break; 104 break;
105 case MAILIMF_FIELD_TO: 105 case MAILIMF_FIELD_TO:
106 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 106 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
107 break; 107 break;
108 case MAILIMF_FIELD_CC: 108 case MAILIMF_FIELD_CC:
109 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 109 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
110 break; 110 break;
111 case MAILIMF_FIELD_BCC: 111 case MAILIMF_FIELD_BCC:
112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
113 break; 113 break;
114 case MAILIMF_FIELD_SUBJECT: 114 case MAILIMF_FIELD_SUBJECT:
115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); 115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
116 break; 116 break;
117 case MAILIMF_FIELD_ORIG_DATE: 117 case MAILIMF_FIELD_ORIG_DATE:
118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
119 break; 119 break;
120 default: 120 default:
121 break; 121 break;
122 } 122 }
123 } 123 }
124 124
125 return mail; 125 return mail;
126} 126}
127 127
128QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 128QString POP3wrapper::parseDateTime( mailimf_date_time *date )
129{ 129{
130 char tmp[23]; 130 char tmp[23];
131 131
132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
133 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); 133 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
134 134
135 return QString( tmp ); 135 return QString( tmp );
136} 136}
137 137
138QString POP3wrapper::parseAddressList( mailimf_address_list *list ) 138QString POP3wrapper::parseAddressList( mailimf_address_list *list )
139{ 139{
140 QString result( "" ); 140 QString result( "" );
141 141
142 bool first = true; 142 bool first = true;
143 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 143 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
144 mailimf_address *addr = (mailimf_address *) current->data; 144 mailimf_address *addr = (mailimf_address *) current->data;
145 145
146 if ( !first ) { 146 if ( !first ) {
147 result.append( "," ); 147 result.append( "," );
148 } else { 148 } else {
149 first = false; 149 first = false;
150 } 150 }
151 151
152 switch ( addr->ad_type ) { 152 switch ( addr->ad_type ) {
153 case MAILIMF_ADDRESS_MAILBOX: 153 case MAILIMF_ADDRESS_MAILBOX:
154 result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); 154 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
155 break; 155 break;
156 case MAILIMF_ADDRESS_GROUP: 156 case MAILIMF_ADDRESS_GROUP:
157 result.append( parseGroup( addr->ad_data.ad_group ) ); 157 result.append( parseGroup( addr->ad_data.ad_group ) );
158 break; 158 break;
159 default: 159 default:
160 qDebug( "POP3: unkown mailimf address type" ); 160 qDebug( "POP3: unkown mailimf address type" );
161 break; 161 break;
162 } 162 }
163 } 163 }
164 164
165 return result; 165 return result;
166} 166}
167 167
168QString POP3wrapper::parseGroup( mailimf_group *group ) 168QString POP3wrapper::parseGroup( mailimf_group *group )
169{ 169{
170 QString result( "" ); 170 QString result( "" );
171 171
172 result.append( group->grp_display_name ); 172 result.append( group->grp_display_name );
173 result.append( ": " ); 173 result.append( ": " );
174 174
175 if ( group->grp_mb_list != NULL ) { 175 if ( group->grp_mb_list != NULL ) {
176 result.append( parseMailboxList( group->grp_mb_list ) ); 176 result.append( parseMailboxList( group->grp_mb_list ) );
177 } 177 }
178 178
179 result.append( ";" ); 179 result.append( ";" );
180 180
181 return result; 181 return result;
182} 182}
183 183
184QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) 184QString POP3wrapper::parseMailbox( mailimf_mailbox *box )
185{ 185{
186 QString result( "" ); 186 QString result( "" );
187 187
188 if ( box->mb_display_name == NULL ) { 188 if ( box->mb_display_name == NULL ) {
189 result.append( box->mb_addr_spec ); 189 result.append( box->mb_addr_spec );
190 } else { 190 } else {
191 result.append( box->mb_display_name ); 191 result.append( box->mb_display_name );
192 result.append( " <" ); 192 result.append( " <" );
193 result.append( box->mb_addr_spec ); 193 result.append( box->mb_addr_spec );
194 result.append( ">" ); 194 result.append( ">" );
195 } 195 }
196 196
197 return result; 197 return result;
198} 198}
199 199
200QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) 200QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
201{ 201{
202 QString result( "" ); 202 QString result( "" );
203 203
204 bool first = true; 204 bool first = true;
205 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { 205 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
206 mailimf_mailbox *box = (mailimf_mailbox *) current->data; 206 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
207 207
208 if ( !first ) { 208 if ( !first ) {
209 result.append( "," ); 209 result.append( "," );
210 } else { 210 } else {
211 first = false; 211 first = false;
212 } 212 }
213 213
214 result.append( parseMailbox( box ) ); 214 result.append( parseMailbox( box ) );
215 } 215 }
216 216
217 return result; 217 return result;
218} 218}
219 219
220void POP3wrapper::login() 220void POP3wrapper::login()
221{ 221{
222 if ( m_pop3 != NULL ) logout(); 222 if ( m_pop3 != NULL ) logout();
223 223
224 const char *server, *user, *pass; 224 const char *server, *user, *pass;
225 uint16_t port; 225 uint16_t port;
226 int err = MAILPOP3_NO_ERROR; 226 int err = MAILPOP3_NO_ERROR;
227 227
228 server = account->getServer().latin1(); 228 server = account->getServer().latin1();
229 port = account->getPort().toUInt(); 229 port = account->getPort().toUInt();
230 user = account->getUser().latin1(); 230 user = account->getUser().latin1();
231 pass = account->getPassword().latin1(); 231 pass = account->getPassword().latin1();
232 232
233 m_pop3 = mailpop3_new( 200, &pop3_progress ); 233 m_pop3 = mailpop3_new( 200, &pop3_progress );
234 234
235 // connect 235 // connect
236 if (account->getSSL()) { 236 if (account->getSSL()) {
237 err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); 237 err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
238 } else { 238 } else {
239 err = mailpop3_socket_connect( m_pop3, (char*)server, port ); 239 err = mailpop3_socket_connect( m_pop3, (char*)server, port );
240 } 240 }
241 241
242 if ( err != MAILPOP3_NO_ERROR ) { 242 if ( err != MAILPOP3_NO_ERROR ) {
243 qDebug( "pop3: error connecting to %s\n reason: %s", server, 243 qDebug( "pop3: error connecting to %s\n reason: %s", server,
244 m_pop3->pop3_response ); 244 m_pop3->pop3_response );
245 mailpop3_free( m_pop3 ); 245 mailpop3_free( m_pop3 );
246 m_pop3 = NULL; 246 m_pop3 = NULL;
247 return; 247 return;
248 } 248 }
249 qDebug( "POP3: connected!" ); 249 qDebug( "POP3: connected!" );
250 250
251 // login 251 // login
252 // TODO: decide if apop or plain login should be used 252 // TODO: decide if apop or plain login should be used
253 err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); 253 err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
254 if ( err != MAILPOP3_NO_ERROR ) { 254 if ( err != MAILPOP3_NO_ERROR ) {
255 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); 255 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
256 logout(); 256 logout();
257 return; 257 return;
258 } 258 }
259 259
260 qDebug( "POP3: logged in!" ); 260 qDebug( "POP3: logged in!" );
261} 261}
262 262
263void POP3wrapper::logout() 263void POP3wrapper::logout()
264{ 264{
265 int err = MAILPOP3_NO_ERROR; 265 int err = MAILPOP3_NO_ERROR;
266 if ( m_pop3 == NULL ) return; 266 if ( m_pop3 == NULL ) return;
267 err = mailpop3_quit( m_pop3 ); 267 err = mailpop3_quit( m_pop3 );
268 mailpop3_free( m_pop3 ); 268 mailpop3_free( m_pop3 );
269 m_pop3 = NULL; 269 m_pop3 = NULL;
270} 270}
271 271
272 272
273QList<Folder>* POP3wrapper::listFolders() 273QList<Folder>* POP3wrapper::listFolders()
274{ 274{
275 QList<Folder> * folders = new QList<Folder>(); 275 QList<Folder> * folders = new QList<Folder>();
276 folders->setAutoDelete( false ); 276 folders->setAutoDelete( false );
277 Folder*inb=new Folder("INBOX"); 277 Folder*inb=new Folder("INBOX");
278 folders->append(inb); 278 folders->append(inb);
279 return folders; 279 return folders;
280} 280}
281 281
282QString POP3wrapper::fetchPart(const RecMail&,const RecPart&) 282QString POP3wrapper::fetchPart(const RecMail&,const RecPart&)
283{ 283{
284 return ""; 284 return "";
285} 285}
286 286
287void POP3wrapper::deleteMail(const RecMail&) 287void POP3wrapper::deleteMail(const RecMail&)
288{ 288{
289} 289}
290
291void POP3wrapper::answeredMail(const RecMail&)
292{
293}
diff --git a/noncore/net/mail/pop3wrapper.h b/noncore/net/mail/pop3wrapper.h
index ef972c8..6ff8d62 100644
--- a/noncore/net/mail/pop3wrapper.h
+++ b/noncore/net/mail/pop3wrapper.h
@@ -1,43 +1,44 @@
1#ifndef __POP3WRAPPER 1#ifndef __POP3WRAPPER
2#define __POP3WRAPPER 2#define __POP3WRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include "abstractmail.h" 5#include "abstractmail.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9struct mailpop3; 9struct mailpop3;
10 10
11class POP3wrapper : public AbstractMail 11class POP3wrapper : public AbstractMail
12{ 12{
13 Q_OBJECT 13 Q_OBJECT
14 14
15public: 15public:
16 POP3wrapper( POP3account *a ); 16 POP3wrapper( POP3account *a );
17 virtual ~POP3wrapper(); 17 virtual ~POP3wrapper();
18 /* mailbox will be ignored */ 18 /* mailbox will be ignored */
19 virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); 19 virtual void listMessages(const QString & mailbox, QList<RecMail> &target );
20 virtual QList<Folder>* listFolders(); 20 virtual QList<Folder>* listFolders();
21 virtual QString fetchPart(const RecMail&mail,const RecPart&part); 21 virtual QString fetchPart(const RecMail&mail,const RecPart&part);
22 virtual void deleteMail(const RecMail&mail); 22 virtual void deleteMail(const RecMail&mail);
23 virtual void answeredMail(const RecMail&mail);
23 24
24 RecBody fetchBody( const RecMail &mail ); 25 RecBody fetchBody( const RecMail &mail );
25 static void pop3_progress( size_t current, size_t maximum ); 26 static void pop3_progress( size_t current, size_t maximum );
26 27
27protected: 28protected:
28 void login(); 29 void login();
29 void logout(); 30 void logout();
30 31
31private: 32private:
32 RecMail *parseHeader( const char *header ); 33 RecMail *parseHeader( const char *header );
33 RecBody parseBody( const char *message ); 34 RecBody parseBody( const char *message );
34 QString parseMailboxList( mailimf_mailbox_list *list ); 35 QString parseMailboxList( mailimf_mailbox_list *list );
35 QString parseMailbox( mailimf_mailbox *box ); 36 QString parseMailbox( mailimf_mailbox *box );
36 QString parseGroup( mailimf_group *group ); 37 QString parseGroup( mailimf_group *group );
37 QString parseAddressList( mailimf_address_list *list ); 38 QString parseAddressList( mailimf_address_list *list );
38 QString parseDateTime( mailimf_date_time *date ); 39 QString parseDateTime( mailimf_date_time *date );
39 POP3account *account; 40 POP3account *account;
40 mailpop3 *m_pop3; 41 mailpop3 *m_pop3;
41}; 42};
42 43
43#endif 44#endif
diff --git a/noncore/net/mail/viewmail.cpp b/noncore/net/mail/viewmail.cpp
index e53f4a3..68d3c51 100644
--- a/noncore/net/mail/viewmail.cpp
+++ b/noncore/net/mail/viewmail.cpp
@@ -70,258 +70,261 @@ default:
70curItem=new AttachItem(attachments,curItem,type,"Mailbody",desc,-1); 70curItem=new AttachItem(attachments,curItem,type,"Mailbody",desc,-1);
71QString filename = ""; 71QString filename = "";
72for (unsigned int i = 0; i < body.Parts().count();++i) { 72for (unsigned int i = 0; i < body.Parts().count();++i) {
73 type = body.Parts()[i].Type()+"/"+body.Parts()[i].Subtype(); 73 type = body.Parts()[i].Type()+"/"+body.Parts()[i].Subtype();
74 part_plist_t::ConstIterator it = body.Parts()[i].Parameters().begin(); 74 part_plist_t::ConstIterator it = body.Parts()[i].Parameters().begin();
75 for (;it!=body.Parts()[i].Parameters().end();++it) { 75 for (;it!=body.Parts()[i].Parameters().end();++it) {
76 if (it.key().lower()=="name") { 76 if (it.key().lower()=="name") {
77 filename=it.data(); 77 filename=it.data();
78 } 78 }
79 } 79 }
80 s = body.Parts()[i].Size(); 80 s = body.Parts()[i].Size();
81 w = 0; 81 w = 0;
82 while (s>1024) { 82 while (s>1024) {
83 s/=1024; 83 s/=1024;
84 ++w; 84 ++w;
85 if (w>=2) break; 85 if (w>=2) break;
86 } 86 }
87 switch(w) { 87 switch(w) {
88 case 1: 88 case 1:
89 q="k"; 89 q="k";
90 break; 90 break;
91 case 2: 91 case 2:
92 q="M"; 92 q="M";
93 break; 93 break;
94 default: 94 default:
95 q=""; 95 q="";
96 break; 96 break;
97 } 97 }
98 QTextOStream o(&desc); 98 QTextOStream o(&desc);
99 if (w>0) o.precision(2); else o.precision(0); 99 if (w>0) o.precision(2); else o.precision(0);
100 o.setf(QTextStream::fixed); 100 o.setf(QTextStream::fixed);
101 o << s << " " << q << "Byte"; 101 o << s << " " << q << "Byte";
102 curItem=new AttachItem(attachments,curItem,type,filename,desc,i); 102 curItem=new AttachItem(attachments,curItem,type,filename,desc,i);
103} 103}
104} 104}
105 105
106void ViewMail::slotItemClicked( QListViewItem * item , const QPoint & point, int c ) { 106void ViewMail::slotItemClicked( QListViewItem * item , const QPoint & point, int c ) {
107 if (!item ) 107 if (!item )
108 return; 108 return;
109 109
110 QPopupMenu *menu = new QPopupMenu(); 110 QPopupMenu *menu = new QPopupMenu();
111 int ret=0; 111 int ret=0;
112 112
113 if ( item->text( 0 ).left( 4 ) == "text" ) { 113 if ( item->text( 0 ).left( 4 ) == "text" ) {
114 menu->insertItem( tr( "Show Text" ), 1 ); 114 menu->insertItem( tr( "Show Text" ), 1 );
115 } 115 }
116 menu->insertItem( tr( "Save Attachment" ), 0 ); 116 menu->insertItem( tr( "Save Attachment" ), 0 );
117 menu->insertSeparator(1); 117 menu->insertSeparator(1);
118 118
119 ret = menu->exec( point, 0 ); 119 ret = menu->exec( point, 0 );
120 120
121 switch(ret) { 121 switch(ret) {
122 case 0: 122 case 0:
123 { MimeTypes types; 123 { MimeTypes types;
124 types.insert( "all", "*" ); 124 types.insert( "all", "*" );
125 QString str = OFileDialog::getSaveFileName( 1, 125 QString str = OFileDialog::getSaveFileName( 1,
126 "/", item->text( 1 ) , types, 0 ); 126 "/", item->text( 1 ) , types, 0 );
127 127
128 if( !str.isEmpty() ) { 128 if( !str.isEmpty() ) {
129 qDebug( "first we will need a MIME wrapper" ); 129 qDebug( "first we will need a MIME wrapper" );
130 } 130 }
131 } 131 }
132 break ; 132 break ;
133 133
134 case 1: 134 case 1:
135 if ( ( ( AttachItem* )item )->Partnumber() == -1 ) { 135 if ( ( ( AttachItem* )item )->Partnumber() == -1 ) {
136 setText(); 136 setText();
137 } else { 137 } else {
138 if ( m_recMail.Wrapper() != 0l ) { // make sure that there is a wrapper , even after delete or simular actions 138 if ( m_recMail.Wrapper() != 0l ) { // make sure that there is a wrapper , even after delete or simular actions
139 browser->setText( m_recMail.Wrapper()->fetchPart( m_recMail, m_body.Parts()[ ( ( AttachItem* )item )->Partnumber() ] ) ); 139 browser->setText( m_recMail.Wrapper()->fetchPart( m_recMail, m_body.Parts()[ ( ( AttachItem* )item )->Partnumber() ] ) );
140 } 140 }
141 } 141 }
142 break; 142 break;
143 } 143 }
144 delete menu; 144 delete menu;
145} 145}
146 146
147 147
148void ViewMail::setMail( RecMail mail ) { 148void ViewMail::setMail( RecMail mail ) {
149 149
150m_recMail = mail; 150m_recMail = mail;
151 151
152m_mail[0] = mail.getFrom(); 152m_mail[0] = mail.getFrom();
153m_mail[1] = mail.getSubject(); 153m_mail[1] = mail.getSubject();
154m_mail[3] = mail.getDate(); 154m_mail[3] = mail.getDate();
155m_mail[4] = mail.Msgid(); 155m_mail[4] = mail.Msgid();
156 156
157m_mail2[0] = mail.To(); 157m_mail2[0] = mail.To();
158m_mail2[1] = mail.CC(); 158m_mail2[1] = mail.CC();
159m_mail2[2] = mail.Bcc(); 159m_mail2[2] = mail.Bcc();
160 160
161setText(); 161setText();
162} 162}
163 163
164 164
165 165
166ViewMail::ViewMail( QWidget *parent, const char *name, WFlags fl) 166ViewMail::ViewMail( QWidget *parent, const char *name, WFlags fl)
167 : ViewMailBase(parent, name, fl), _inLoop(false) 167 : ViewMailBase(parent, name, fl), _inLoop(false)
168{ 168{
169 m_gotBody = false; 169 m_gotBody = false;
170 170
171 connect(reply, SIGNAL(activated()), SLOT(slotReply())); 171 connect(reply, SIGNAL(activated()), SLOT(slotReply()));
172 connect(forward, SIGNAL(activated()), SLOT(slotForward())); 172 connect(forward, SIGNAL(activated()), SLOT(slotForward()));
173 connect( deleteMail, SIGNAL( activated() ), SLOT( slotDeleteMail( ) ) ); 173 connect( deleteMail, SIGNAL( activated() ), SLOT( slotDeleteMail( ) ) );
174 174
175 attachments->setEnabled(m_gotBody); 175 attachments->setEnabled(m_gotBody);
176 connect( attachments, SIGNAL( clicked ( QListViewItem *, const QPoint & , int ) ), SLOT( slotItemClicked( QListViewItem *, const QPoint & , int ) ) ); 176 connect( attachments, SIGNAL( clicked ( QListViewItem *, const QPoint & , int ) ), SLOT( slotItemClicked( QListViewItem *, const QPoint & , int ) ) );
177 177
178} 178}
179 179
180void ViewMail::setText() 180void ViewMail::setText()
181{ 181{
182 182
183 QString toString; 183 QString toString;
184 QString ccString; 184 QString ccString;
185 QString bccString; 185 QString bccString;
186 186
187 for ( QStringList::Iterator it = ( m_mail2[0] ).begin(); it != ( m_mail2[0] ).end(); ++it ) { 187 for ( QStringList::Iterator it = ( m_mail2[0] ).begin(); it != ( m_mail2[0] ).end(); ++it ) {
188 toString += (*it); 188 toString += (*it);
189 } 189 }
190 for ( QStringList::Iterator it = ( m_mail2[1] ).begin(); it != ( m_mail2[1] ).end(); ++it ) { 190 for ( QStringList::Iterator it = ( m_mail2[1] ).begin(); it != ( m_mail2[1] ).end(); ++it ) {
191 ccString += (*it); 191 ccString += (*it);
192 } 192 }
193 for ( QStringList::Iterator it = ( m_mail2[2] ).begin(); it != ( m_mail2[2] ).end(); ++it ) { 193 for ( QStringList::Iterator it = ( m_mail2[2] ).begin(); it != ( m_mail2[2] ).end(); ++it ) {
194 bccString += (*it); 194 bccString += (*it);
195 } 195 }
196 196
197 setCaption( caption().arg( m_mail[0] ) ); 197 setCaption( caption().arg( m_mail[0] ) );
198 198
199 m_mailHtml = "<html><body>" 199 m_mailHtml = "<html><body>"
200 "<table width=\"100%\" border=\"0\"><tr bgcolor=\"#FFDD76\"><td>" 200 "<table width=\"100%\" border=\"0\"><tr bgcolor=\"#FFDD76\"><td>"
201 "<div align=left><b>" + deHtml( m_mail[1] ) + "</b></div>" 201 "<div align=left><b>" + deHtml( m_mail[1] ) + "</b></div>"
202 "</td></tr><tr bgcolor=\"#EEEEE6\"><td>" 202 "</td></tr><tr bgcolor=\"#EEEEE6\"><td>"
203 "<b>" + tr( "From" ) + ": </b><font color=#6C86C0>" + deHtml( m_mail[0] ) + "</font><br>" 203 "<b>" + tr( "From" ) + ": </b><font color=#6C86C0>" + deHtml( m_mail[0] ) + "</font><br>"
204 "<b>" + tr( "To" ) + ": </b><font color=#6C86C0>" + deHtml( toString ) + "</font><br><b>" + 204 "<b>" + tr( "To" ) + ": </b><font color=#6C86C0>" + deHtml( toString ) + "</font><br><b>" +
205 tr( "Cc" ) + ": </b>" + deHtml( ccString ) + "<br>" 205 tr( "Cc" ) + ": </b>" + deHtml( ccString ) + "<br>"
206 "<b>" + tr( "Date" ) + ": </b> " + m_mail[3] + 206 "<b>" + tr( "Date" ) + ": </b> " + m_mail[3] +
207 "</td></tr></table><font face=fixed>"; 207 "</td></tr></table><font face=fixed>";
208 208
209 browser->setText( QString( m_mailHtml) + deHtml( m_mail[2] ) + "</font></html>" ); 209 browser->setText( QString( m_mailHtml) + deHtml( m_mail[2] ) + "</font></html>" );
210 // remove later in favor of a real handling 210 // remove later in favor of a real handling
211 m_gotBody = true; 211 m_gotBody = true;
212} 212}
213 213
214 214
215ViewMail::~ViewMail() 215ViewMail::~ViewMail()
216{ 216{
217 hide(); 217 hide();
218} 218}
219 219
220void ViewMail::hide() 220void ViewMail::hide()
221{ 221{
222 QWidget::hide(); 222 QWidget::hide();
223 223
224 if (_inLoop) { 224 if (_inLoop) {
225 _inLoop = false; 225 _inLoop = false;
226 qApp->exit_loop(); 226 qApp->exit_loop();
227 227
228 } 228 }
229 229
230} 230}
231 231
232void ViewMail::exec() 232void ViewMail::exec()
233{ 233{
234 show(); 234 show();
235 235
236 if (!_inLoop) { 236 if (!_inLoop) {
237 _inLoop = true; 237 _inLoop = true;
238 qApp->enter_loop(); 238 qApp->enter_loop();
239 } 239 }
240 240
241} 241}
242 242
243QString ViewMail::deHtml(const QString &string) 243QString ViewMail::deHtml(const QString &string)
244{ 244{
245 QString string_ = string; 245 QString string_ = string;
246 string_.replace(QRegExp("&"), "&amp;"); 246 string_.replace(QRegExp("&"), "&amp;");
247 string_.replace(QRegExp("<"), "&lt;"); 247 string_.replace(QRegExp("<"), "&lt;");
248 string_.replace(QRegExp(">"), "&gt;"); 248 string_.replace(QRegExp(">"), "&gt;");
249 string_.replace(QRegExp("\\n"), "<br>"); 249 string_.replace(QRegExp("\\n"), "<br>");
250 return string_; 250 return string_;
251} 251}
252 252
253void ViewMail::slotReply() 253void ViewMail::slotReply()
254{ 254{
255 if (!m_gotBody) { 255 if (!m_gotBody) {
256 QMessageBox::information(this, tr("Error"), tr("<p>The mail body is not yet downloaded, so you cannot reply yet."), tr("Ok")); 256 QMessageBox::information(this, tr("Error"), tr("<p>The mail body is not yet downloaded, so you cannot reply yet."), tr("Ok"));
257 return; 257 return;
258 } 258 }
259 259
260 QString rtext; 260 QString rtext;
261 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose 261 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose
262 .arg( m_mail[1] ) 262 .arg( m_mail[0] )
263 .arg( m_mail[3] ); 263 .arg( m_mail[3] );
264 264
265 QString text = m_mail[2]; 265 QString text = m_mail[2];
266 QStringList lines = QStringList::split(QRegExp("\\n"), text); 266 QStringList lines = QStringList::split(QRegExp("\\n"), text);
267 QStringList::Iterator it; 267 QStringList::Iterator it;
268 for (it = lines.begin(); it != lines.end(); it++) { 268 for (it = lines.begin(); it != lines.end(); it++) {
269 rtext += "> " + *it + "\n"; 269 rtext += "> " + *it + "\n";
270 } 270 }
271 rtext += "\n"; 271 rtext += "\n";
272 272
273 QString prefix; 273 QString prefix;
274 if ( m_mail[1].find(QRegExp("^Re: *$")) != -1) prefix = ""; 274 if ( m_mail[1].find(QRegExp("^Re: *$")) != -1) prefix = "";
275 else prefix = "Re: "; // no i18n on purpose 275 else prefix = "Re: "; // no i18n on purpose
276 276
277 Settings *settings = new Settings(); 277 Settings *settings = new Settings();
278 ComposeMail composer( settings ,this, 0, true); 278 ComposeMail composer( settings ,this, 0, true);
279 composer.setTo( m_mail[0] ); 279 composer.setTo( m_mail[0] );
280 composer.setSubject( "Re: " + m_mail[1] ); 280 composer.setSubject( "Re: " + m_mail[1] );
281 composer.setMessage( rtext ); 281 composer.setMessage( rtext );
282 composer.showMaximized(); 282 composer.showMaximized();
283 composer.exec(); 283 if ( QDialog::Accepted==composer.exec()) {
284 284 m_recMail.Wrapper()->answeredMail(m_recMail);
285 }
285} 286}
286 287
287void ViewMail::slotForward() 288void ViewMail::slotForward()
288{ 289{
289 if (!m_gotBody) { 290 if (!m_gotBody) {
290 QMessageBox::information(this, tr("Error"), tr("<p>The mail body is not yet downloaded, so you cannot forward yet."), tr("Ok")); 291 QMessageBox::information(this, tr("Error"), tr("<p>The mail body is not yet downloaded, so you cannot forward yet."), tr("Ok"));
291 return; 292 return;
292 } 293 }
293 294
294 QString ftext; 295 QString ftext;
295 ftext += QString("\n----- Forwarded message from %1 -----\n\n") 296 ftext += QString("\n----- Forwarded message from %1 -----\n\n")
296 .arg( m_mail[0] ); 297 .arg( m_mail[0] );
297 if (!m_mail[3].isNull()) 298 if (!m_mail[3].isNull())
298 ftext += QString("Date: %1\n") 299 ftext += QString("Date: %1\n")
299 .arg( m_mail[3] ); 300 .arg( m_mail[3] );
300 if (!m_mail[0].isNull()) 301 if (!m_mail[0].isNull())
301 ftext += QString("From: %1\n") 302 ftext += QString("From: %1\n")
302 .arg( m_mail[0] ); 303 .arg( m_mail[0] );
303 if (!m_mail[1].isNull()) 304 if (!m_mail[1].isNull())
304 ftext += QString("Subject: %1\n") 305 ftext += QString("Subject: %1\n")
305 .arg( m_mail[1] ); 306 .arg( m_mail[1] );
306 307
307 ftext += QString("\n%1\n") 308 ftext += QString("\n%1\n")
308 .arg( m_mail[2]); 309 .arg( m_mail[2]);
309 310
310 ftext += QString("----- End forwarded message -----\n"); 311 ftext += QString("----- End forwarded message -----\n");
311 312
312 Settings *settings = new Settings(); 313 Settings *settings = new Settings();
313 ComposeMail composer( settings ,this, 0, true); 314 ComposeMail composer( settings ,this, 0, true);
314 composer.setSubject( "Fwd: " + m_mail[1] ); 315 composer.setSubject( "Fwd: " + m_mail[1] );
315 composer.setMessage( ftext ); 316 composer.setMessage( ftext );
316 composer.showMaximized(); 317 composer.showMaximized();
317 composer.exec(); 318 if ( QDialog::Accepted==composer.exec()) {
319
320 }
318} 321}
319 322
320void ViewMail::slotDeleteMail( ) 323void ViewMail::slotDeleteMail( )
321{ 324{
322 if ( QMessageBox::warning(this, tr("Delete Mail"), QString( tr("<p>Do you really want to delete this mail? <br><br>" ) + m_mail[0] + " - " + m_mail[1] ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { 325 if ( QMessageBox::warning(this, tr("Delete Mail"), QString( tr("<p>Do you really want to delete this mail? <br><br>" ) + m_mail[0] + " - " + m_mail[1] ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
323 m_recMail.Wrapper()->deleteMail( m_recMail ); 326 m_recMail.Wrapper()->deleteMail( m_recMail );
324 hide(); 327 hide();
325 deleted = true; 328 deleted = true;
326 } 329 }
327} 330}