summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp50
-rw-r--r--noncore/net/mail/pop3wrapper.cpp50
2 files changed, 78 insertions, 22 deletions
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 2411399..b4a8f4b 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -16,14 +16,14 @@ POP3wrapper::~POP3wrapper()
16 16
17void POP3wrapper::pop3_progress( size_t current, size_t maximum ) 17void POP3wrapper::pop3_progress( size_t current, size_t maximum )
18{ 18{
19 qDebug( "POP3: %i of %i", current, maximum ); 19 //qDebug( "POP3: %i of %i", current, maximum );
20} 20}
21 21
22RecBody POP3wrapper::fetchBody( const RecMail &mail ) 22RecBody POP3wrapper::fetchBody( const RecMail &mail )
23{ 23{
24 int err = MAILPOP3_NO_ERROR; 24 int err = MAILPOP3_NO_ERROR;
25 char *message; 25 char *message;
26 size_t length; 26 size_t length = 0;
27 27
28 login(); 28 login();
29 if ( !m_pop3 ) return RecBody(); 29 if ( !m_pop3 ) return RecBody();
@@ -31,12 +31,9 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
31 err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); 31 err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length );
32 if ( err != MAILPOP3_NO_ERROR ) { 32 if ( err != MAILPOP3_NO_ERROR ) {
33 qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); 33 qDebug( "POP3: error retrieving body with index %i", mail.getNumber() );
34 logout();
35 return RecBody(); 34 return RecBody();
36 } 35 }
37 36
38 logout();
39
40 return parseBody( message ); 37 return parseBody( message );
41} 38}
42 39
@@ -75,24 +72,22 @@ void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
75 if (!m_pop3) return; 72 if (!m_pop3) return;
76 mailpop3_list( m_pop3, &messages ); 73 mailpop3_list( m_pop3, &messages );
77 74
78 //for ( int i = carray_count( messages ); i > 0; i-- ) {
79 for (unsigned int i = 0; i < carray_count(messages);++i) { 75 for (unsigned int i = 0; i < carray_count(messages);++i) {
80 mailpop3_msg_info *info; 76 mailpop3_msg_info *info;
81 int r = mailpop3_get_msg_info(m_pop3,i+1,&info); 77 err = mailpop3_get_msg_info(m_pop3,i+1,&info);
82 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 78 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
83 if ( err != MAILPOP3_NO_ERROR ) { 79 if ( err != MAILPOP3_NO_ERROR ) {
84 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 80 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
85 free(header); 81 free(header);
86 logout();
87 return; 82 return;
88 } 83 }
89 RecMail *mail = parseHeader( header ); 84 RecMail *mail = parseHeader( header );
90 mail->setNumber( info->msg_index ); 85 mail->setNumber( info->msg_index );
91 mail->setWrapper(this); 86 mail->setWrapper(this);
87 mail->setMsgsize(info->msg_size);
92 target.append( mail ); 88 target.append( mail );
93 free(header); 89 free(header);
94 } 90 }
95 logout();
96} 91}
97 92
98RecMail *POP3wrapper::parseHeader( const char *header ) 93RecMail *POP3wrapper::parseHeader( const char *header )
@@ -103,6 +98,9 @@ RecMail *POP3wrapper::parseHeader( const char *header )
103 mailimf_fields *fields; 98 mailimf_fields *fields;
104 mailimf_references * refs; 99 mailimf_references * refs;
105 mailimf_keywords*keys; 100 mailimf_keywords*keys;
101 QString status;
102 QString value;
103 QBitArray mFlags(7);
106 104
107 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 105 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
108 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 106 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
@@ -142,11 +140,31 @@ RecMail *POP3wrapper::parseHeader( const char *header )
142 qDebug("Keyword: %s",(char*)cur->data); 140 qDebug("Keyword: %s",(char*)cur->data);
143 } 141 }
144 break; 142 break;
143 case MAILIMF_FIELD_OPTIONAL_FIELD:
144 status = field->fld_data.fld_optional_field->fld_name;
145 value = field->fld_data.fld_optional_field->fld_value;
146 if (status.lower()=="status") {
147 if (value.lower()=="ro") {
148 mFlags.setBit(FLAG_SEEN);
149 }
150 } else if (status.lower()=="x-status") {
151 qDebug("X-Status: %s",value.latin1());
152 if (value.lower()=="a") {
153
154 mFlags.setBit(FLAG_ANSWERED);
155 }
156 } else {
157// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name,
158// field->fld_data.fld_optional_field->fld_value);
159 }
160 break;
145 default: 161 default:
162 qDebug("Non parsed field");
146 break; 163 break;
147 } 164 }
148 } 165 }
149 if (fields) mailimf_fields_free(fields); 166 if (fields) mailimf_fields_free(fields);
167 mail->setFlags(mFlags);
150 return mail; 168 return mail;
151} 169}
152 170
@@ -244,7 +262,8 @@ QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
244 262
245void POP3wrapper::login() 263void POP3wrapper::login()
246{ 264{
247 if ( m_pop3 != NULL ) logout(); 265 /* we'll hold the line */
266 if ( m_pop3 != NULL ) return;
248 267
249 const char *server, *user, *pass; 268 const char *server, *user, *pass;
250 uint16_t port; 269 uint16_t port;
@@ -297,6 +316,9 @@ void POP3wrapper::logout()
297 316
298QList<Folder>* POP3wrapper::listFolders() 317QList<Folder>* POP3wrapper::listFolders()
299{ 318{
319 /* TODO: integrate MH directories
320 but not vor version 0.1 ;)
321 */
300 QList<Folder> * folders = new QList<Folder>(); 322 QList<Folder> * folders = new QList<Folder>();
301 folders->setAutoDelete( false ); 323 folders->setAutoDelete( false );
302 Folder*inb=new Folder("INBOX"); 324 Folder*inb=new Folder("INBOX");
@@ -309,8 +331,14 @@ QString POP3wrapper::fetchPart(const RecMail&,const RecPart&)
309 return ""; 331 return "";
310} 332}
311 333
312void POP3wrapper::deleteMail(const RecMail&) 334void POP3wrapper::deleteMail(const RecMail&mail)
313{ 335{
336 login();
337 if (!m_pop3) return;
338 int err = mailpop3_dele(m_pop3,mail.getNumber());
339 if (err != MAILPOP3_NO_ERROR) {
340 qDebug("error deleting mail");
341 }
314} 342}
315 343
316void POP3wrapper::answeredMail(const RecMail&) 344void POP3wrapper::answeredMail(const RecMail&)
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 2411399..b4a8f4b 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -16,14 +16,14 @@ POP3wrapper::~POP3wrapper()
16 16
17void POP3wrapper::pop3_progress( size_t current, size_t maximum ) 17void POP3wrapper::pop3_progress( size_t current, size_t maximum )
18{ 18{
19 qDebug( "POP3: %i of %i", current, maximum ); 19 //qDebug( "POP3: %i of %i", current, maximum );
20} 20}
21 21
22RecBody POP3wrapper::fetchBody( const RecMail &mail ) 22RecBody POP3wrapper::fetchBody( const RecMail &mail )
23{ 23{
24 int err = MAILPOP3_NO_ERROR; 24 int err = MAILPOP3_NO_ERROR;
25 char *message; 25 char *message;
26 size_t length; 26 size_t length = 0;
27 27
28 login(); 28 login();
29 if ( !m_pop3 ) return RecBody(); 29 if ( !m_pop3 ) return RecBody();
@@ -31,12 +31,9 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
31 err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); 31 err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length );
32 if ( err != MAILPOP3_NO_ERROR ) { 32 if ( err != MAILPOP3_NO_ERROR ) {
33 qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); 33 qDebug( "POP3: error retrieving body with index %i", mail.getNumber() );
34 logout();
35 return RecBody(); 34 return RecBody();
36 } 35 }
37 36
38 logout();
39
40 return parseBody( message ); 37 return parseBody( message );
41} 38}
42 39
@@ -75,24 +72,22 @@ void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
75 if (!m_pop3) return; 72 if (!m_pop3) return;
76 mailpop3_list( m_pop3, &messages ); 73 mailpop3_list( m_pop3, &messages );
77 74
78 //for ( int i = carray_count( messages ); i > 0; i-- ) {
79 for (unsigned int i = 0; i < carray_count(messages);++i) { 75 for (unsigned int i = 0; i < carray_count(messages);++i) {
80 mailpop3_msg_info *info; 76 mailpop3_msg_info *info;
81 int r = mailpop3_get_msg_info(m_pop3,i+1,&info); 77 err = mailpop3_get_msg_info(m_pop3,i+1,&info);
82 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 78 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
83 if ( err != MAILPOP3_NO_ERROR ) { 79 if ( err != MAILPOP3_NO_ERROR ) {
84 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 80 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
85 free(header); 81 free(header);
86 logout();
87 return; 82 return;
88 } 83 }
89 RecMail *mail = parseHeader( header ); 84 RecMail *mail = parseHeader( header );
90 mail->setNumber( info->msg_index ); 85 mail->setNumber( info->msg_index );
91 mail->setWrapper(this); 86 mail->setWrapper(this);
87 mail->setMsgsize(info->msg_size);
92 target.append( mail ); 88 target.append( mail );
93 free(header); 89 free(header);
94 } 90 }
95 logout();
96} 91}
97 92
98RecMail *POP3wrapper::parseHeader( const char *header ) 93RecMail *POP3wrapper::parseHeader( const char *header )
@@ -103,6 +98,9 @@ RecMail *POP3wrapper::parseHeader( const char *header )
103 mailimf_fields *fields; 98 mailimf_fields *fields;
104 mailimf_references * refs; 99 mailimf_references * refs;
105 mailimf_keywords*keys; 100 mailimf_keywords*keys;
101 QString status;
102 QString value;
103 QBitArray mFlags(7);
106 104
107 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 105 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
108 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 106 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
@@ -142,11 +140,31 @@ RecMail *POP3wrapper::parseHeader( const char *header )
142 qDebug("Keyword: %s",(char*)cur->data); 140 qDebug("Keyword: %s",(char*)cur->data);
143 } 141 }
144 break; 142 break;
143 case MAILIMF_FIELD_OPTIONAL_FIELD:
144 status = field->fld_data.fld_optional_field->fld_name;
145 value = field->fld_data.fld_optional_field->fld_value;
146 if (status.lower()=="status") {
147 if (value.lower()=="ro") {
148 mFlags.setBit(FLAG_SEEN);
149 }
150 } else if (status.lower()=="x-status") {
151 qDebug("X-Status: %s",value.latin1());
152 if (value.lower()=="a") {
153
154 mFlags.setBit(FLAG_ANSWERED);
155 }
156 } else {
157// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name,
158// field->fld_data.fld_optional_field->fld_value);
159 }
160 break;
145 default: 161 default:
162 qDebug("Non parsed field");
146 break; 163 break;
147 } 164 }
148 } 165 }
149 if (fields) mailimf_fields_free(fields); 166 if (fields) mailimf_fields_free(fields);
167 mail->setFlags(mFlags);
150 return mail; 168 return mail;
151} 169}
152 170
@@ -244,7 +262,8 @@ QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
244 262
245void POP3wrapper::login() 263void POP3wrapper::login()
246{ 264{
247 if ( m_pop3 != NULL ) logout(); 265 /* we'll hold the line */
266 if ( m_pop3 != NULL ) return;
248 267
249 const char *server, *user, *pass; 268 const char *server, *user, *pass;
250 uint16_t port; 269 uint16_t port;
@@ -297,6 +316,9 @@ void POP3wrapper::logout()
297 316
298QList<Folder>* POP3wrapper::listFolders() 317QList<Folder>* POP3wrapper::listFolders()
299{ 318{
319 /* TODO: integrate MH directories
320 but not vor version 0.1 ;)
321 */
300 QList<Folder> * folders = new QList<Folder>(); 322 QList<Folder> * folders = new QList<Folder>();
301 folders->setAutoDelete( false ); 323 folders->setAutoDelete( false );
302 Folder*inb=new Folder("INBOX"); 324 Folder*inb=new Folder("INBOX");
@@ -309,8 +331,14 @@ QString POP3wrapper::fetchPart(const RecMail&,const RecPart&)
309 return ""; 331 return "";
310} 332}
311 333
312void POP3wrapper::deleteMail(const RecMail&) 334void POP3wrapper::deleteMail(const RecMail&mail)
313{ 335{
336 login();
337 if (!m_pop3) return;
338 int err = mailpop3_dele(m_pop3,mail.getNumber());
339 if (err != MAILPOP3_NO_ERROR) {
340 qDebug("error deleting mail");
341 }
314} 342}
315 343
316void POP3wrapper::answeredMail(const RecMail&) 344void POP3wrapper::answeredMail(const RecMail&)