summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-15 02:28:22 (UTC)
committer alwin <alwin>2003-12-15 02:28:22 (UTC)
commit07590207a8306d0184e3c331a71f41a58ccbc96f (patch) (unidiff)
tree0735d5bf28615f407c2b17f68a7acda078649312
parent1413ec0f3f1ed40fad087dfa413585f9fdf03400 (diff)
downloadopie-07590207a8306d0184e3c331a71f41a58ccbc96f.zip
opie-07590207a8306d0184e3c331a71f41a58ccbc96f.tar.gz
opie-07590207a8306d0184e3c331a71f41a58ccbc96f.tar.bz2
pop3wrapper now works in first stage and doesn't segfault anymore
Display an INBOX folder for pop3 accounts to get an more monoton mail interface for different types of mail server. Inbox - Folder get another icon than the other.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp60
-rw-r--r--noncore/net/mail/accountview.h16
-rw-r--r--noncore/net/mail/defines.h2
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp57
-rw-r--r--noncore/net/mail/pop3wrapper.cpp57
5 files changed, 153 insertions, 39 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index d725b87..8e21d39 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -16,33 +16,79 @@ POP3viewItem::POP3viewItem( POP3account *a, QListView *parent )
16 setText( 0, account->getAccountName() ); 16 setText( 0, account->getAccountName() );
17} 17}
18 18
19POP3viewItem::~POP3viewItem() 19POP3viewItem::~POP3viewItem()
20{ 20{
21 delete wrapper; 21 delete wrapper;
22} 22}
23 23
24void POP3viewItem::refresh( QList<RecMail> &target ) 24AbstractMail *POP3viewItem::getWrapper()
25{ 25{
26 qDebug( "POP3: refresh" ); 26 return wrapper;
27 wrapper->listMessages("INBOX", target );
28} 27}
29 28
29void POP3viewItem::refresh( QList<RecMail> & )
30{
31 QList<Folder> *folders = wrapper->listFolders();
32 QListViewItem *child = firstChild();
33 while ( child ) {
34 QListViewItem *tmp = child;
35 child = child->nextSibling();
36 delete tmp;
37 }
38 Folder *it;
39 QListViewItem*item = 0;
40 for ( it = folders->first(); it; it = folders->next() ) {
41 item = new POP3folderItem( it, this , item );
42 item->setSelectable(it->may_select());
43 }
44 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
45 folders->setAutoDelete(false);
46 delete folders;
47}
30 48
31RecBody POP3viewItem::fetchBody( const RecMail &mail ) 49RecBody POP3viewItem::fetchBody( const RecMail &mail )
32{ 50{
33 qDebug( "POP3 fetchBody" ); 51 qDebug( "POP3 fetchBody" );
34 return wrapper->fetchBody( mail ); 52 return wrapper->fetchBody( mail );
35} 53}
36 54
55POP3folderItem::~POP3folderItem()
56{
57 delete folder;
58}
59
60POP3folderItem::POP3folderItem( Folder *folderInit, POP3viewItem *parent , QListViewItem*after )
61 : AccountViewItem( parent,after )
62{
63 folder = folderInit;
64 pop3 = parent;
65 if (folder->getDisplayName().lower()!="inbox") {
66 setPixmap( 0, PIXMAP_POP3FOLDER );
67 } else {
68 setPixmap( 0, PIXMAP_INBOXFOLDER);
69 }
70 setText( 0, folder->getDisplayName() );
71}
72
73void POP3folderItem::refresh(QList<RecMail>&target)
74{
75 if (folder->may_select())
76 pop3->getWrapper()->listMessages( folder->getName(),target );
77}
78
79RecBody POP3folderItem::fetchBody(const RecMail&aMail)
80{
81 return pop3->getWrapper()->fetchBody(aMail);
82}
83
37/** 84/**
38 * IMAP Account stuff 85 * IMAP Account stuff
39 */ 86 */
40
41IMAPviewItem::IMAPviewItem( IMAPaccount *a, QListView *parent ) 87IMAPviewItem::IMAPviewItem( IMAPaccount *a, QListView *parent )
42 : AccountViewItem( parent ) 88 : AccountViewItem( parent )
43{ 89{
44 account = a; 90 account = a;
45 wrapper = AbstractMail::getWrapper( account ); 91 wrapper = AbstractMail::getWrapper( account );
46 setPixmap( 0, PIXMAP_IMAPFOLDER ); 92 setPixmap( 0, PIXMAP_IMAPFOLDER );
47 setText( 0, account->getAccountName() ); 93 setText( 0, account->getAccountName() );
48 setOpen( true ); 94 setOpen( true );
@@ -90,17 +136,21 @@ IMAPfolderItem::~IMAPfolderItem()
90 delete folder; 136 delete folder;
91} 137}
92 138
93IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPviewItem *parent , QListViewItem*after ) 139IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPviewItem *parent , QListViewItem*after )
94 : AccountViewItem( parent,after ) 140 : AccountViewItem( parent,after )
95{ 141{
96 folder = folderInit; 142 folder = folderInit;
97 imap = parent; 143 imap = parent;
98 setPixmap( 0, PIXMAP_IMAPFOLDER ); 144 if (folder->getDisplayName().lower()!="inbox") {
145 setPixmap( 0, PIXMAP_IMAPFOLDER );
146 } else {
147 setPixmap( 0, PIXMAP_INBOXFOLDER);
148 }
99 setText( 0, folder->getDisplayName() ); 149 setText( 0, folder->getDisplayName() );
100} 150}
101 151
102void IMAPfolderItem::refresh(QList<RecMail>&target) 152void IMAPfolderItem::refresh(QList<RecMail>&target)
103{ 153{
104 if (folder->may_select()) 154 if (folder->may_select())
105 imap->getWrapper()->listMessages( folder->getName(),target ); 155 imap->getWrapper()->listMessages( folder->getName(),target );
106} 156}
diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h
index 04f9b7a..d035af4 100644
--- a/noncore/net/mail/accountview.h
+++ b/noncore/net/mail/accountview.h
@@ -26,23 +26,36 @@ public:
26class POP3viewItem : public AccountViewItem 26class POP3viewItem : public AccountViewItem
27{ 27{
28 28
29public: 29public:
30 POP3viewItem( POP3account *a, QListView *parent ); 30 POP3viewItem( POP3account *a, QListView *parent );
31 ~POP3viewItem(); 31 ~POP3viewItem();
32 virtual void refresh( QList<RecMail> &target ); 32 virtual void refresh( QList<RecMail> &target );
33 virtual RecBody fetchBody( const RecMail &mail ); 33 virtual RecBody fetchBody( const RecMail &mail );
34 34 AbstractMail *getWrapper();
35private: 35private:
36 POP3account *account; 36 POP3account *account;
37 AbstractMail *wrapper; 37 AbstractMail *wrapper;
38 38
39}; 39};
40 40
41class POP3folderItem : public AccountViewItem
42{
43
44public:
45 POP3folderItem( Folder *folder, POP3viewItem *parent , QListViewItem*after );
46 ~POP3folderItem();
47 virtual void refresh(QList<RecMail>&);
48 virtual RecBody fetchBody(const RecMail&);
49private:
50 Folder *folder;
51 POP3viewItem *pop3;
52};
53
41class IMAPviewItem : public AccountViewItem 54class IMAPviewItem : public AccountViewItem
42{ 55{
43 56
44public: 57public:
45 IMAPviewItem( IMAPaccount *a, QListView *parent ); 58 IMAPviewItem( IMAPaccount *a, QListView *parent );
46 ~IMAPviewItem(); 59 ~IMAPviewItem();
47 virtual void refresh(QList<RecMail>&); 60 virtual void refresh(QList<RecMail>&);
48 virtual RecBody fetchBody(const RecMail&); 61 virtual RecBody fetchBody(const RecMail&);
@@ -58,17 +71,16 @@ class IMAPfolderItem : public AccountViewItem
58public: 71public:
59 IMAPfolderItem( Folder *folder, IMAPviewItem *parent , QListViewItem*after ); 72 IMAPfolderItem( Folder *folder, IMAPviewItem *parent , QListViewItem*after );
60 ~IMAPfolderItem(); 73 ~IMAPfolderItem();
61 virtual void refresh(QList<RecMail>&); 74 virtual void refresh(QList<RecMail>&);
62 virtual RecBody fetchBody(const RecMail&); 75 virtual RecBody fetchBody(const RecMail&);
63private: 76private:
64 Folder *folder; 77 Folder *folder;
65 IMAPviewItem *imap; 78 IMAPviewItem *imap;
66
67}; 79};
68 80
69class AccountView : public QListView 81class AccountView : public QListView
70{ 82{
71 Q_OBJECT 83 Q_OBJECT
72 84
73public: 85public:
74 AccountView( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); 86 AccountView( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 );
diff --git a/noncore/net/mail/defines.h b/noncore/net/mail/defines.h
index 679459d..c849f1a 100644
--- a/noncore/net/mail/defines.h
+++ b/noncore/net/mail/defines.h
@@ -9,27 +9,29 @@
9#define PIC_SENDQUEUED "opiemail/sendqueued" 9#define PIC_SENDQUEUED "opiemail/sendqueued"
10#define PIC_SHOWFOLDERS "opiemail/showfolders" 10#define PIC_SHOWFOLDERS "opiemail/showfolders"
11#define PIC_SEARCHMAILS "opiemail/searchmails" 11#define PIC_SEARCHMAILS "opiemail/searchmails"
12#define PIC_EDITSETTINGS "opiemail/editsettings" 12#define PIC_EDITSETTINGS "opiemail/editsettings"
13#define PIC_EDITACCOUNTS "opiemail/editaccounts" 13#define PIC_EDITACCOUNTS "opiemail/editaccounts"
14#define PIC_SYNC "opiemail/sync" 14#define PIC_SYNC "opiemail/sync"
15#define PIC_IMAPFOLDER "opiemail/imapfolder" 15#define PIC_IMAPFOLDER "opiemail/imapfolder"
16#define PIC_POP3FOLDER "opiemail/pop3folder" 16#define PIC_POP3FOLDER "opiemail/pop3folder"
17#define PIC_INBOXFOLDER "opiemail/inbox"
17 18
18#define ICON_COMPOSEMAIL QIconSet( Resource::loadPixmap( PIC_COMPOSEMAIL ) ) 19#define ICON_COMPOSEMAIL QIconSet( Resource::loadPixmap( PIC_COMPOSEMAIL ) )
19#define ICON_SENDQUEUED QIconSet( Resource::loadPixmap( PIC_SENDQUEUED ) ) 20#define ICON_SENDQUEUED QIconSet( Resource::loadPixmap( PIC_SENDQUEUED ) )
20#define ICON_SHOWFOLDERS QIconSet( Resource::loadPixmap( PIC_SHOWFOLDERS ) ) 21#define ICON_SHOWFOLDERS QIconSet( Resource::loadPixmap( PIC_SHOWFOLDERS ) )
21#define ICON_SEARCHMAILS QIconSet( Resource::loadPixmap( PIC_SEARCHMAILS ) ) 22#define ICON_SEARCHMAILS QIconSet( Resource::loadPixmap( PIC_SEARCHMAILS ) )
22#define ICON_EDITSETTINGS QIconSet( Resource::loadPixmap( PIC_EDITSETTINGS ) ) 23#define ICON_EDITSETTINGS QIconSet( Resource::loadPixmap( PIC_EDITSETTINGS ) )
23#define ICON_EDITACCOUNTS QIconSet( Resource::loadPixmap( PIC_EDITACCOUNTS ) ) 24#define ICON_EDITACCOUNTS QIconSet( Resource::loadPixmap( PIC_EDITACCOUNTS ) )
24#define ICON_SYNC QIconSet( Resource::loadPixmap( PIC_SYNC ) ) 25#define ICON_SYNC QIconSet( Resource::loadPixmap( PIC_SYNC ) )
25 26
26#define PIXMAP_IMAPFOLDER QPixmap( Resource::loadPixmap( PIC_IMAPFOLDER ) ) 27#define PIXMAP_IMAPFOLDER QPixmap( Resource::loadPixmap( PIC_IMAPFOLDER ) )
27#define PIXMAP_POP3FOLDER QPixmap( Resource::loadPixmap( PIC_POP3FOLDER ) ) 28#define PIXMAP_POP3FOLDER QPixmap( Resource::loadPixmap( PIC_POP3FOLDER ) )
29#define PIXMAP_INBOXFOLDER QPixmap( Resource::loadPixmap( PIC_INBOXFOLDER) )
28 30
29#define IMAP_PORT "143" 31#define IMAP_PORT "143"
30#define IMAP_SSL_PORT "993" 32#define IMAP_SSL_PORT "993"
31#define SMTP_PORT "25" 33#define SMTP_PORT "25"
32#define SMTP_SSL_PORT "465" 34#define SMTP_SSL_PORT "465"
33#define POP3_PORT "110" 35#define POP3_PORT "110"
34#define POP3_SSL_PORT "995" 36#define POP3_SSL_PORT "995"
35#define NNTP_PORT "119" 37#define NNTP_PORT "119"
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 46c854b..2411399 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -1,9 +1,9 @@
1 1#include <stdlib.h>
2#include "pop3wrapper.h" 2#include "pop3wrapper.h"
3#include "mailtypes.h" 3#include "mailtypes.h"
4#include <libetpan/mailpop3.h> 4#include <libetpan/mailpop3.h>
5 5
6POP3wrapper::POP3wrapper( POP3account *a ) 6POP3wrapper::POP3wrapper( POP3account *a )
7{ 7{
8 account = a; 8 account = a;
9 m_pop3 = NULL; 9 m_pop3 = NULL;
@@ -38,68 +38,77 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
38 logout(); 38 logout();
39 39
40 return parseBody( message ); 40 return parseBody( message );
41} 41}
42 42
43RecBody POP3wrapper::parseBody( const char *message ) 43RecBody POP3wrapper::parseBody( const char *message )
44{ 44{
45 int err = MAILIMF_NO_ERROR; 45 int err = MAILIMF_NO_ERROR;
46 size_t curTok; 46 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
47 mailimf_message *result; 47 size_t curTok = 0;
48 mailimf_message *result = 0;
48 RecBody body; 49 RecBody body;
49 50
50 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); 51 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
51 if ( err != MAILIMF_NO_ERROR ) return body; 52 if ( err != MAILIMF_NO_ERROR ) {
53 if (result) mailimf_message_free(result);
54 return body;
55 }
52 56
53 if ( result && result->msg_body && result->msg_body->bd_text ) { 57 if ( result && result->msg_body && result->msg_body->bd_text ) {
54 qDebug( "POP3: bodytext found" ); 58 qDebug( "POP3: bodytext found" );
55 // TODO: why does this line segfault???? gdb says segfault in strlen(), maybe a bug in libetpan. 59 // when curTok isn't set to 0 this line will fault! 'cause upper line faults!
56 body.setBodytext( QString( result->msg_body->bd_text ) ); 60 body.setBodytext( QString( result->msg_body->bd_text ) );
57 } 61 }
58 62 if (result) mailimf_message_free(result);
59 return body; 63 return body;
60} 64}
61 65
62void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) 66void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
63{ 67{
64 int err = MAILPOP3_NO_ERROR; 68 int err = MAILPOP3_NO_ERROR;
65 char *header; 69 char * header = 0;
66 size_t length; 70 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
67 carray *messages; 71 size_t length = 0;
72 carray * messages = 0;
68 73
69 login(); 74 login();
70 if (!m_pop3) return; 75 if (!m_pop3) return;
71 mailpop3_list( m_pop3, &messages ); 76 mailpop3_list( m_pop3, &messages );
72 77
73 for ( int i = carray_count( messages ); i > 0; i-- ) { 78 //for ( int i = carray_count( messages ); i > 0; i-- ) {
74 mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 ); 79 for (unsigned int i = 0; i < carray_count(messages);++i) {
75 80 mailpop3_msg_info *info;
81 int r = mailpop3_get_msg_info(m_pop3,i+1,&info);
76 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 82 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
77 if ( err != MAILPOP3_NO_ERROR ) { 83 if ( err != MAILPOP3_NO_ERROR ) {
78 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 84 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
85 free(header);
79 logout(); 86 logout();
80 return; 87 return;
81 } 88 }
82 RecMail *mail = parseHeader( header ); 89 RecMail *mail = parseHeader( header );
83 mail->setNumber( info->msg_index ); 90 mail->setNumber( info->msg_index );
84 mail->setWrapper(this); 91 mail->setWrapper(this);
85 target.append( mail ); 92 target.append( mail );
93 free(header);
86 } 94 }
87
88 logout(); 95 logout();
89} 96}
90 97
91RecMail *POP3wrapper::parseHeader( const char *header ) 98RecMail *POP3wrapper::parseHeader( const char *header )
92{ 99{
93 int err = MAILIMF_NO_ERROR; 100 int err = MAILIMF_NO_ERROR;
94 size_t curTok; 101 size_t curTok = 0;
95 RecMail *mail = new RecMail(); 102 RecMail *mail = new RecMail();
96 mailimf_fields *fields; 103 mailimf_fields *fields;
97 104 mailimf_references * refs;
105 mailimf_keywords*keys;
106
98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 107 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 108 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
100 mailimf_field *field = (mailimf_field *) current->data; 109 mailimf_field *field = (mailimf_field *) current->data;
101 switch ( field->fld_type ) { 110 switch ( field->fld_type ) {
102 case MAILIMF_FIELD_FROM: 111 case MAILIMF_FIELD_FROM:
103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 112 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
104 break; 113 break;
105 case MAILIMF_FIELD_TO: 114 case MAILIMF_FIELD_TO:
@@ -112,21 +121,37 @@ RecMail *POP3wrapper::parseHeader( const char *header )
112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 121 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
113 break; 122 break;
114 case MAILIMF_FIELD_SUBJECT: 123 case MAILIMF_FIELD_SUBJECT:
115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); 124 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
116 break; 125 break;
117 case MAILIMF_FIELD_ORIG_DATE: 126 case MAILIMF_FIELD_ORIG_DATE:
118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 127 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
119 break; 128 break;
129 case MAILIMF_FIELD_MESSAGE_ID:
130 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
131 break;
132 case MAILIMF_FIELD_REFERENCES:
133 refs = field->fld_data.fld_references;
134 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
135 char * text = (char*)refs->mid_list->first->data;
136 mail->setReplyto(QString(text));
137 }
138 break;
139 case MAILIMF_FIELD_KEYWORDS:
140 keys = field->fld_data.fld_keywords;
141 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
142 qDebug("Keyword: %s",(char*)cur->data);
143 }
144 break;
120 default: 145 default:
121 break; 146 break;
122 } 147 }
123 } 148 }
124 149 if (fields) mailimf_fields_free(fields);
125 return mail; 150 return mail;
126} 151}
127 152
128QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 153QString POP3wrapper::parseDateTime( mailimf_date_time *date )
129{ 154{
130 char tmp[23]; 155 char tmp[23];
131 156
132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 157 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 46c854b..2411399 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -1,9 +1,9 @@
1 1#include <stdlib.h>
2#include "pop3wrapper.h" 2#include "pop3wrapper.h"
3#include "mailtypes.h" 3#include "mailtypes.h"
4#include <libetpan/mailpop3.h> 4#include <libetpan/mailpop3.h>
5 5
6POP3wrapper::POP3wrapper( POP3account *a ) 6POP3wrapper::POP3wrapper( POP3account *a )
7{ 7{
8 account = a; 8 account = a;
9 m_pop3 = NULL; 9 m_pop3 = NULL;
@@ -38,68 +38,77 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
38 logout(); 38 logout();
39 39
40 return parseBody( message ); 40 return parseBody( message );
41} 41}
42 42
43RecBody POP3wrapper::parseBody( const char *message ) 43RecBody POP3wrapper::parseBody( const char *message )
44{ 44{
45 int err = MAILIMF_NO_ERROR; 45 int err = MAILIMF_NO_ERROR;
46 size_t curTok; 46 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
47 mailimf_message *result; 47 size_t curTok = 0;
48 mailimf_message *result = 0;
48 RecBody body; 49 RecBody body;
49 50
50 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); 51 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
51 if ( err != MAILIMF_NO_ERROR ) return body; 52 if ( err != MAILIMF_NO_ERROR ) {
53 if (result) mailimf_message_free(result);
54 return body;
55 }
52 56
53 if ( result && result->msg_body && result->msg_body->bd_text ) { 57 if ( result && result->msg_body && result->msg_body->bd_text ) {
54 qDebug( "POP3: bodytext found" ); 58 qDebug( "POP3: bodytext found" );
55 // TODO: why does this line segfault???? gdb says segfault in strlen(), maybe a bug in libetpan. 59 // when curTok isn't set to 0 this line will fault! 'cause upper line faults!
56 body.setBodytext( QString( result->msg_body->bd_text ) ); 60 body.setBodytext( QString( result->msg_body->bd_text ) );
57 } 61 }
58 62 if (result) mailimf_message_free(result);
59 return body; 63 return body;
60} 64}
61 65
62void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) 66void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
63{ 67{
64 int err = MAILPOP3_NO_ERROR; 68 int err = MAILPOP3_NO_ERROR;
65 char *header; 69 char * header = 0;
66 size_t length; 70 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
67 carray *messages; 71 size_t length = 0;
72 carray * messages = 0;
68 73
69 login(); 74 login();
70 if (!m_pop3) return; 75 if (!m_pop3) return;
71 mailpop3_list( m_pop3, &messages ); 76 mailpop3_list( m_pop3, &messages );
72 77
73 for ( int i = carray_count( messages ); i > 0; i-- ) { 78 //for ( int i = carray_count( messages ); i > 0; i-- ) {
74 mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 ); 79 for (unsigned int i = 0; i < carray_count(messages);++i) {
75 80 mailpop3_msg_info *info;
81 int r = mailpop3_get_msg_info(m_pop3,i+1,&info);
76 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 82 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
77 if ( err != MAILPOP3_NO_ERROR ) { 83 if ( err != MAILPOP3_NO_ERROR ) {
78 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 84 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
85 free(header);
79 logout(); 86 logout();
80 return; 87 return;
81 } 88 }
82 RecMail *mail = parseHeader( header ); 89 RecMail *mail = parseHeader( header );
83 mail->setNumber( info->msg_index ); 90 mail->setNumber( info->msg_index );
84 mail->setWrapper(this); 91 mail->setWrapper(this);
85 target.append( mail ); 92 target.append( mail );
93 free(header);
86 } 94 }
87
88 logout(); 95 logout();
89} 96}
90 97
91RecMail *POP3wrapper::parseHeader( const char *header ) 98RecMail *POP3wrapper::parseHeader( const char *header )
92{ 99{
93 int err = MAILIMF_NO_ERROR; 100 int err = MAILIMF_NO_ERROR;
94 size_t curTok; 101 size_t curTok = 0;
95 RecMail *mail = new RecMail(); 102 RecMail *mail = new RecMail();
96 mailimf_fields *fields; 103 mailimf_fields *fields;
97 104 mailimf_references * refs;
105 mailimf_keywords*keys;
106
98 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 107 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
99 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 108 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
100 mailimf_field *field = (mailimf_field *) current->data; 109 mailimf_field *field = (mailimf_field *) current->data;
101 switch ( field->fld_type ) { 110 switch ( field->fld_type ) {
102 case MAILIMF_FIELD_FROM: 111 case MAILIMF_FIELD_FROM:
103 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 112 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
104 break; 113 break;
105 case MAILIMF_FIELD_TO: 114 case MAILIMF_FIELD_TO:
@@ -112,21 +121,37 @@ RecMail *POP3wrapper::parseHeader( const char *header )
112 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 121 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
113 break; 122 break;
114 case MAILIMF_FIELD_SUBJECT: 123 case MAILIMF_FIELD_SUBJECT:
115 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); 124 mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
116 break; 125 break;
117 case MAILIMF_FIELD_ORIG_DATE: 126 case MAILIMF_FIELD_ORIG_DATE:
118 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 127 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
119 break; 128 break;
129 case MAILIMF_FIELD_MESSAGE_ID:
130 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
131 break;
132 case MAILIMF_FIELD_REFERENCES:
133 refs = field->fld_data.fld_references;
134 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
135 char * text = (char*)refs->mid_list->first->data;
136 mail->setReplyto(QString(text));
137 }
138 break;
139 case MAILIMF_FIELD_KEYWORDS:
140 keys = field->fld_data.fld_keywords;
141 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
142 qDebug("Keyword: %s",(char*)cur->data);
143 }
144 break;
120 default: 145 default:
121 break; 146 break;
122 } 147 }
123 } 148 }
124 149 if (fields) mailimf_fields_free(fields);
125 return mail; 150 return mail;
126} 151}
127 152
128QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 153QString POP3wrapper::parseDateTime( mailimf_date_time *date )
129{ 154{
130 char tmp[23]; 155 char tmp[23];
131 156
132 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 157 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",