-rw-r--r-- | noncore/net/mail/abstractmail.cpp | 23 | ||||
-rw-r--r-- | noncore/net/mail/abstractmail.h | 1 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/abstractmail.cpp | 23 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/abstractmail.h | 1 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.cpp | 43 | ||||
-rw-r--r-- | noncore/net/mail/pop3wrapper.cpp | 43 |
6 files changed, 124 insertions, 10 deletions
diff --git a/noncore/net/mail/abstractmail.cpp b/noncore/net/mail/abstractmail.cpp index 92a46f1..b7e5eaa 100644 --- a/noncore/net/mail/abstractmail.cpp +++ b/noncore/net/mail/abstractmail.cpp @@ -41,8 +41,31 @@ encodedString* AbstractMail::decode_String(const encodedString*text,const QStrin encodedString* result = new encodedString(); if (err == MAILIMF_NO_ERROR) { result->setContent(result_text,target_length); } qDebug("Decode string finished"); return result; } + +QString AbstractMail::convert_String(const char*text) +{ +#if 0 + size_t index = 0; + char*res = 0; + + qDebug("encode start %s",text); + /* attention - doesn't work with arm systems! */ + int err = mailmime_encoded_phrase_parse("iso-8859-1", + text, strlen(text),&index, "iso-8859-1",&res); + qDebug("encode end"); + if (err != MAILIMF_NO_ERROR) { + if (res) free(res); + return QString(text); + } + QString result(res); + free(res); + return result; +#else + return QString(text); +#endif +} diff --git a/noncore/net/mail/abstractmail.h b/noncore/net/mail/abstractmail.h index f1a8468..c16e9c0 100644 --- a/noncore/net/mail/abstractmail.h +++ b/noncore/net/mail/abstractmail.h @@ -26,10 +26,11 @@ public: virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part)=0; virtual void deleteMail(const RecMail&mail)=0; virtual void answeredMail(const RecMail&mail)=0; static AbstractMail* getWrapper(IMAPaccount *a); static AbstractMail* getWrapper(POP3account *a); static encodedString*decode_String(const encodedString*text,const QString&enc); + static QString convert_String(const char*text); }; #endif diff --git a/noncore/net/mail/libmailwrapper/abstractmail.cpp b/noncore/net/mail/libmailwrapper/abstractmail.cpp index 92a46f1..b7e5eaa 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.cpp +++ b/noncore/net/mail/libmailwrapper/abstractmail.cpp @@ -41,8 +41,31 @@ encodedString* AbstractMail::decode_String(const encodedString*text,const QStrin encodedString* result = new encodedString(); if (err == MAILIMF_NO_ERROR) { result->setContent(result_text,target_length); } qDebug("Decode string finished"); return result; } + +QString AbstractMail::convert_String(const char*text) +{ +#if 0 + size_t index = 0; + char*res = 0; + + qDebug("encode start %s",text); + /* attention - doesn't work with arm systems! */ + int err = mailmime_encoded_phrase_parse("iso-8859-1", + text, strlen(text),&index, "iso-8859-1",&res); + qDebug("encode end"); + if (err != MAILIMF_NO_ERROR) { + if (res) free(res); + return QString(text); + } + QString result(res); + free(res); + return result; +#else + return QString(text); +#endif +} diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h index f1a8468..c16e9c0 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.h +++ b/noncore/net/mail/libmailwrapper/abstractmail.h @@ -26,10 +26,11 @@ public: virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part)=0; virtual void deleteMail(const RecMail&mail)=0; virtual void answeredMail(const RecMail&mail)=0; static AbstractMail* getWrapper(IMAPaccount *a); static AbstractMail* getWrapper(POP3account *a); static encodedString*decode_String(const encodedString*text,const QString&enc); + static QString convert_String(const char*text); }; #endif diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp index 30f80ff..22a4c70 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp @@ -1,15 +1,19 @@ #include <stdlib.h> #include "pop3wrapper.h" #include "mailtypes.h" #include <libetpan/mailpop3.h> #include <libetpan/mailmime.h> +#include <libetpan/data_message_driver.h> #include <qfile.h> +/* we don't fetch messages larger than 5 MB */ +#define HARD_MSG_SIZE_LIMIT 5242880 + POP3wrapper::POP3wrapper( POP3account *a ) { account = a; m_pop3 = NULL; msgTempName = a->getFileName()+"_msg_cache"; last_msg_id = 0; } @@ -32,20 +36,25 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) int err = MAILPOP3_NO_ERROR; char *message; size_t length = 0; login(); if ( !m_pop3 ) { return RecBody(); } + RecBody body; QFile msg_cache(msgTempName); + if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { + qDebug("Message to large: %i",mail.Msgsize()); + return body; + } if (mail.getNumber()!=last_msg_id) { if (msg_cache.exists()) { msg_cache.remove(); } msg_cache.open(IO_ReadWrite|IO_Truncate); last_msg_id = mail.getNumber(); err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); if ( err != MAILPOP3_NO_ERROR ) { @@ -74,45 +83,70 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) } RecBody POP3wrapper::parseMail( char *message ) { int err = MAILIMF_NO_ERROR; /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ size_t curTok = 0; mailimf_message *result = 0; + mailmessage * msg=0; + struct mailmime * mime=0; + struct mailmime_single_fields fields; + RecBody body; err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); if ( err != MAILIMF_NO_ERROR ) { if (result) mailimf_message_free(result); return body; } - struct mailimf_body * b = 0; - struct mailimf_fields * f = 0; +#if 0 + char*body_msg = message; + if ( result && result->msg_body && result->msg_body->bd_text ) { + body_msg = (char*)result->msg_body->bd_text; + result->msg_body->bd_text = 0; + } + + msg = mailmessage_new(); + mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); + generic_message_t * msg_data; + msg_data = (generic_message_t *)msg->msg_data; + msg_data->msg_fetched = 1; + msg_data->msg_message = body_msg; + msg_data->msg_length = strlen(body_msg); + memset(&fields, 0, sizeof(struct mailmime_single_fields)); + err = mailmessage_get_bodystructure(msg,&mime); + if (mime->mm_mime_fields != NULL) { + mailmime_single_fields_init(&fields, mime->mm_mime_fields, + mime->mm_content_type); + } +#endif +#if 1 if ( result && result->msg_body && result->msg_body->bd_text ) { qDebug( "POP3: bodytext found" ); // when curTok isn't set to 0 this line will fault! 'cause upper line faults! body.setBodytext( QString( result->msg_body->bd_text ) ); #if 0 curTok = 0; mailmime_content*mresult = 0; size_t index = 0; mailmime_content_parse(result->msg_body->bd_text, strlen(result->msg_body->bd_text),&index,&mresult); if (mresult) { mailmime_content_free(mresult); } #endif mailimf_message_free(result); } +#endif return body; } void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) { int err = MAILPOP3_NO_ERROR; char * header = 0; /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ @@ -167,17 +201,17 @@ RecMail *POP3wrapper::parseHeader( const char *header ) break; case MAILIMF_FIELD_CC: mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); break; case MAILIMF_FIELD_BCC: mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); break; case MAILIMF_FIELD_SUBJECT: - mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); + mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); break; case MAILIMF_FIELD_ORIG_DATE: mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); break; case MAILIMF_FIELD_MESSAGE_ID: mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); break; case MAILIMF_FIELD_REFERENCES: @@ -198,17 +232,16 @@ RecMail *POP3wrapper::parseHeader( const char *header ) value = field->fld_data.fld_optional_field->fld_value; if (status.lower()=="status") { if (value.lower()=="ro") { mFlags.setBit(FLAG_SEEN); } } else if (status.lower()=="x-status") { qDebug("X-Status: %s",value.latin1()); if (value.lower()=="a") { - mFlags.setBit(FLAG_ANSWERED); } } else { // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, // field->fld_data.fld_optional_field->fld_value); } break; default: @@ -279,17 +312,17 @@ QString POP3wrapper::parseGroup( mailimf_group *group ) QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) { QString result( "" ); if ( box->mb_display_name == NULL ) { result.append( box->mb_addr_spec ); } else { - result.append( box->mb_display_name ); + result.append( convert_String(box->mb_display_name).latin1() ); result.append( " <" ); result.append( box->mb_addr_spec ); result.append( ">" ); } return result; } diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp index 30f80ff..22a4c70 100644 --- a/noncore/net/mail/pop3wrapper.cpp +++ b/noncore/net/mail/pop3wrapper.cpp @@ -1,15 +1,19 @@ #include <stdlib.h> #include "pop3wrapper.h" #include "mailtypes.h" #include <libetpan/mailpop3.h> #include <libetpan/mailmime.h> +#include <libetpan/data_message_driver.h> #include <qfile.h> +/* we don't fetch messages larger than 5 MB */ +#define HARD_MSG_SIZE_LIMIT 5242880 + POP3wrapper::POP3wrapper( POP3account *a ) { account = a; m_pop3 = NULL; msgTempName = a->getFileName()+"_msg_cache"; last_msg_id = 0; } @@ -32,20 +36,25 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) int err = MAILPOP3_NO_ERROR; char *message; size_t length = 0; login(); if ( !m_pop3 ) { return RecBody(); } + RecBody body; QFile msg_cache(msgTempName); + if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { + qDebug("Message to large: %i",mail.Msgsize()); + return body; + } if (mail.getNumber()!=last_msg_id) { if (msg_cache.exists()) { msg_cache.remove(); } msg_cache.open(IO_ReadWrite|IO_Truncate); last_msg_id = mail.getNumber(); err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); if ( err != MAILPOP3_NO_ERROR ) { @@ -74,45 +83,70 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) } RecBody POP3wrapper::parseMail( char *message ) { int err = MAILIMF_NO_ERROR; /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ size_t curTok = 0; mailimf_message *result = 0; + mailmessage * msg=0; + struct mailmime * mime=0; + struct mailmime_single_fields fields; + RecBody body; err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); if ( err != MAILIMF_NO_ERROR ) { if (result) mailimf_message_free(result); return body; } - struct mailimf_body * b = 0; - struct mailimf_fields * f = 0; +#if 0 + char*body_msg = message; + if ( result && result->msg_body && result->msg_body->bd_text ) { + body_msg = (char*)result->msg_body->bd_text; + result->msg_body->bd_text = 0; + } + + msg = mailmessage_new(); + mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); + generic_message_t * msg_data; + msg_data = (generic_message_t *)msg->msg_data; + msg_data->msg_fetched = 1; + msg_data->msg_message = body_msg; + msg_data->msg_length = strlen(body_msg); + memset(&fields, 0, sizeof(struct mailmime_single_fields)); + err = mailmessage_get_bodystructure(msg,&mime); + if (mime->mm_mime_fields != NULL) { + mailmime_single_fields_init(&fields, mime->mm_mime_fields, + mime->mm_content_type); + } +#endif +#if 1 if ( result && result->msg_body && result->msg_body->bd_text ) { qDebug( "POP3: bodytext found" ); // when curTok isn't set to 0 this line will fault! 'cause upper line faults! body.setBodytext( QString( result->msg_body->bd_text ) ); #if 0 curTok = 0; mailmime_content*mresult = 0; size_t index = 0; mailmime_content_parse(result->msg_body->bd_text, strlen(result->msg_body->bd_text),&index,&mresult); if (mresult) { mailmime_content_free(mresult); } #endif mailimf_message_free(result); } +#endif return body; } void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) { int err = MAILPOP3_NO_ERROR; char * header = 0; /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ @@ -167,17 +201,17 @@ RecMail *POP3wrapper::parseHeader( const char *header ) break; case MAILIMF_FIELD_CC: mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); break; case MAILIMF_FIELD_BCC: mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); break; case MAILIMF_FIELD_SUBJECT: - mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) ); + mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); break; case MAILIMF_FIELD_ORIG_DATE: mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); break; case MAILIMF_FIELD_MESSAGE_ID: mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); break; case MAILIMF_FIELD_REFERENCES: @@ -198,17 +232,16 @@ RecMail *POP3wrapper::parseHeader( const char *header ) value = field->fld_data.fld_optional_field->fld_value; if (status.lower()=="status") { if (value.lower()=="ro") { mFlags.setBit(FLAG_SEEN); } } else if (status.lower()=="x-status") { qDebug("X-Status: %s",value.latin1()); if (value.lower()=="a") { - mFlags.setBit(FLAG_ANSWERED); } } else { // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, // field->fld_data.fld_optional_field->fld_value); } break; default: @@ -279,17 +312,17 @@ QString POP3wrapper::parseGroup( mailimf_group *group ) QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) { QString result( "" ); if ( box->mb_display_name == NULL ) { result.append( box->mb_addr_spec ); } else { - result.append( box->mb_display_name ); + result.append( convert_String(box->mb_display_name).latin1() ); result.append( " <" ); result.append( box->mb_addr_spec ); result.append( ">" ); } return result; } |