-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.cpp | 1 | ||||
-rw-r--r-- | noncore/net/mail/pop3wrapper.cpp | 1 |
2 files changed, 2 insertions, 0 deletions
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp index 2aaff30..72f3c36 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp @@ -1,157 +1,158 @@ #include "pop3wrapper.h" #include "mailtypes.h" #include <libetpan/mailpop3.h> POP3wrapper::POP3wrapper( POP3account *a ) { account = a; m_pop3 = NULL; } POP3wrapper::~POP3wrapper() { logout(); } void POP3wrapper::pop3_progress( size_t current, size_t maximum ) { qDebug( "POP3: %i of %i", current, maximum ); } void POP3wrapper::listMessages( QList<RecMail> &target ) { int err = MAILPOP3_NO_ERROR; char *header; size_t length; carray *messages; login(); + if (!m_pop3) return; mailpop3_list( m_pop3, &messages ); for ( int i = carray_count( messages ); i > 0; i-- ) { mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 ); err = mailpop3_header( m_pop3, info->index, &header, &length ); if ( err != MAILPOP3_NO_ERROR ) { qDebug( "POP3: error retrieving header msgid: %i", info->index ); logout(); return; } RecMail *mail = parseHeader( header ); mail->setNumber( info->index ); target.append( mail ); } logout(); } RecMail *POP3wrapper::parseHeader( const char *header ) { int err = MAILIMF_NO_ERROR; size_t curTok; RecMail *mail = new RecMail(); mailimf_fields *fields; err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); for ( clistiter *current = clist_begin( fields->list ); current != NULL; current = current->next ) { mailimf_field *field = (mailimf_field *) current->data; switch ( field->type ) { case MAILIMF_FIELD_FROM: mail->setFrom( *parseMailboxList( field->field.from->mb_list ) ); break; case MAILIMF_FIELD_TO: mail->setTo( *parseAddressList( field->field.to->addr_list ) ); break; case MAILIMF_FIELD_CC: mail->setCC( *parseAddressList( field->field.cc->addr_list ) ); break; case MAILIMF_FIELD_BCC: mail->setBcc( *parseAddressList( field->field.bcc->addr_list ) ); break; case MAILIMF_FIELD_SUBJECT: mail->setSubject( QString( field->field.subject->value ) ); break; case MAILIMF_FIELD_ORIG_DATE: mail->setDate( *parseDateTime( field->field.orig_date->date_time ) ); break; default: break; } } return mail; } QString *POP3wrapper::parseDateTime( mailimf_date_time *date ) { char tmp[23]; snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", date->day, date->month, date->year, date->hour, date->min, date->sec, date->zone ); QString *result = new QString( tmp ); return result; } QString *POP3wrapper::parseAddressList( mailimf_address_list *list ) { QString *result = new QString( "" ); bool first = true; for ( clistiter *current = clist_begin( list->list ); current != NULL; current = current->next ) { mailimf_address *addr = (mailimf_address *) current->data; if ( !first ) { result->append( "," ); } else { first = false; } QString *tmp; switch ( addr->type ) { case MAILIMF_ADDRESS_MAILBOX: tmp = parseMailbox( addr->mailbox ); result->append( *tmp ); delete tmp; break; case MAILIMF_ADDRESS_GROUP: tmp = parseGroup( addr->group ); result->append( *tmp ); delete tmp; break; default: qDebug( "POP3: unkown mailimf address type" ); break; } } return result; } QString *POP3wrapper::parseGroup( mailimf_group *group ) { QString *result = new QString( "" ); result->append( group->display_name ); result->append( ": " ); if ( group->mb_list != NULL ) { QString *tmp = parseMailboxList( group->mb_list ); result->append( *tmp ); delete tmp; } result->append( ";" ); return result; } QString *POP3wrapper::parseMailbox( mailimf_mailbox *box ) { QString *result = new QString( "" ); if ( box->display_name == NULL ) { result->append( box->addr_spec ); diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp index 2aaff30..72f3c36 100644 --- a/noncore/net/mail/pop3wrapper.cpp +++ b/noncore/net/mail/pop3wrapper.cpp @@ -1,157 +1,158 @@ #include "pop3wrapper.h" #include "mailtypes.h" #include <libetpan/mailpop3.h> POP3wrapper::POP3wrapper( POP3account *a ) { account = a; m_pop3 = NULL; } POP3wrapper::~POP3wrapper() { logout(); } void POP3wrapper::pop3_progress( size_t current, size_t maximum ) { qDebug( "POP3: %i of %i", current, maximum ); } void POP3wrapper::listMessages( QList<RecMail> &target ) { int err = MAILPOP3_NO_ERROR; char *header; size_t length; carray *messages; login(); + if (!m_pop3) return; mailpop3_list( m_pop3, &messages ); for ( int i = carray_count( messages ); i > 0; i-- ) { mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 ); err = mailpop3_header( m_pop3, info->index, &header, &length ); if ( err != MAILPOP3_NO_ERROR ) { qDebug( "POP3: error retrieving header msgid: %i", info->index ); logout(); return; } RecMail *mail = parseHeader( header ); mail->setNumber( info->index ); target.append( mail ); } logout(); } RecMail *POP3wrapper::parseHeader( const char *header ) { int err = MAILIMF_NO_ERROR; size_t curTok; RecMail *mail = new RecMail(); mailimf_fields *fields; err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); for ( clistiter *current = clist_begin( fields->list ); current != NULL; current = current->next ) { mailimf_field *field = (mailimf_field *) current->data; switch ( field->type ) { case MAILIMF_FIELD_FROM: mail->setFrom( *parseMailboxList( field->field.from->mb_list ) ); break; case MAILIMF_FIELD_TO: mail->setTo( *parseAddressList( field->field.to->addr_list ) ); break; case MAILIMF_FIELD_CC: mail->setCC( *parseAddressList( field->field.cc->addr_list ) ); break; case MAILIMF_FIELD_BCC: mail->setBcc( *parseAddressList( field->field.bcc->addr_list ) ); break; case MAILIMF_FIELD_SUBJECT: mail->setSubject( QString( field->field.subject->value ) ); break; case MAILIMF_FIELD_ORIG_DATE: mail->setDate( *parseDateTime( field->field.orig_date->date_time ) ); break; default: break; } } return mail; } QString *POP3wrapper::parseDateTime( mailimf_date_time *date ) { char tmp[23]; snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", date->day, date->month, date->year, date->hour, date->min, date->sec, date->zone ); QString *result = new QString( tmp ); return result; } QString *POP3wrapper::parseAddressList( mailimf_address_list *list ) { QString *result = new QString( "" ); bool first = true; for ( clistiter *current = clist_begin( list->list ); current != NULL; current = current->next ) { mailimf_address *addr = (mailimf_address *) current->data; if ( !first ) { result->append( "," ); } else { first = false; } QString *tmp; switch ( addr->type ) { case MAILIMF_ADDRESS_MAILBOX: tmp = parseMailbox( addr->mailbox ); result->append( *tmp ); delete tmp; break; case MAILIMF_ADDRESS_GROUP: tmp = parseGroup( addr->group ); result->append( *tmp ); delete tmp; break; default: qDebug( "POP3: unkown mailimf address type" ); break; } } return result; } QString *POP3wrapper::parseGroup( mailimf_group *group ) { QString *result = new QString( "" ); result->append( group->display_name ); result->append( ": " ); if ( group->mb_list != NULL ) { QString *tmp = parseMailboxList( group->mb_list ); result->append( *tmp ); delete tmp; } result->append( ";" ); return result; } QString *POP3wrapper::parseMailbox( mailimf_mailbox *box ) { QString *result = new QString( "" ); if ( box->display_name == NULL ) { result->append( box->addr_spec ); |