author | alwin <alwin> | 2003-12-20 13:36:34 (UTC) |
---|---|---|
committer | alwin <alwin> | 2003-12-20 13:36:34 (UTC) |
commit | adb369c28cac7600b3912d6a3fdb645f1b1d571d (patch) (side-by-side diff) | |
tree | 554fc2f00a3ea97aad6ef0382e4cc1aec3def070 /noncore | |
parent | d9ffcee06ec97f4a9e00ff0a9071d7a58e5075a1 (diff) | |
download | opie-adb369c28cac7600b3912d6a3fdb645f1b1d571d.zip opie-adb369c28cac7600b3912d6a3fdb645f1b1d571d.tar.gz opie-adb369c28cac7600b3912d6a3fdb645f1b1d571d.tar.bz2 |
fetching attachments from a pop3mail works.
this moment the whole message will be hold in memory until
I have an idea for a clean(!) filebased cache which will not get to
large.
Thats why the biggest pop3 mail we can fetch is 5MB, this should be
enough.
-rw-r--r-- | noncore/net/mail/abstractmail.cpp | 15 | ||||
-rw-r--r-- | noncore/net/mail/abstractmail.h | 3 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/abstractmail.cpp | 15 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/abstractmail.h | 3 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.cpp | 40 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.h | 7 | ||||
-rw-r--r-- | noncore/net/mail/pop3wrapper.cpp | 40 | ||||
-rw-r--r-- | noncore/net/mail/pop3wrapper.h | 7 |
8 files changed, 112 insertions, 18 deletions
diff --git a/noncore/net/mail/abstractmail.cpp b/noncore/net/mail/abstractmail.cpp index 3d76c96..626b9aa 100644 --- a/noncore/net/mail/abstractmail.cpp +++ b/noncore/net/mail/abstractmail.cpp @@ -1,30 +1,32 @@ #include "abstractmail.h" #include "imapwrapper.h" #include "pop3wrapper.h" #include "mailtypes.h" #include <qstring.h> +#include <qfile.h> +#include <qtextstream.h> #include <stdlib.h> #include <libetpan/mailmime_content.h> AbstractMail* AbstractMail::getWrapper(IMAPaccount *a) { return new IMAPwrapper(a); } AbstractMail* AbstractMail::getWrapper(POP3account *a) { return new POP3wrapper(a); } encodedString* AbstractMail::decode_String(const encodedString*text,const QString&enc) { qDebug("Decode string start"); char*result_text; size_t index = 0; /* reset for recursive use! */ size_t target_length = 0; result_text = 0; int mimetype = MAILMIME_MECHANISM_7BIT; if (enc.lower()=="quoted-printable") { mimetype = MAILMIME_MECHANISM_QUOTED_PRINTABLE; @@ -45,24 +47,37 @@ encodedString* AbstractMail::decode_String(const encodedString*text,const QStrin } qDebug("Decode string finished"); return result; } QString AbstractMail::convert_String(const char*text) { size_t index = 0; char*res = 0; /* attention - doesn't work with arm systems! */ int err = mailmime_encoded_phrase_parse("iso-8859-1", text, strlen(text),&index, "iso-8859-1",&res); if (err != MAILIMF_NO_ERROR) { if (res) free(res); return QString(text); } if (res) { QString result(res); free(res); return result; } return QString(text); } + +/* cp & paste from launcher */ +QString AbstractMail::gen_attachment_id() +{ + QFile file( "/proc/sys/kernel/random/uuid" ); + if (!file.open(IO_ReadOnly ) ) + return QString::null; + + QTextStream stream(&file); + + return "{" + stream.read().stripWhiteSpace() + "}"; +} + diff --git a/noncore/net/mail/abstractmail.h b/noncore/net/mail/abstractmail.h index c16e9c0..8dd2e12 100644 --- a/noncore/net/mail/abstractmail.h +++ b/noncore/net/mail/abstractmail.h @@ -9,28 +9,31 @@ class RecBody; class RecPart; class IMAPwrapper; class POP3wrapper; class Folder; class encodedString; class AbstractMail:public QObject { Q_OBJECT public: AbstractMail(){}; virtual ~AbstractMail(){} virtual QList<Folder>* listFolders()=0; virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0; virtual RecBody fetchBody(const RecMail&mail)=0; virtual QString fetchTextPart(const RecMail&mail,const RecPart&part)=0; virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part)=0; 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); + +protected: static encodedString*decode_String(const encodedString*text,const QString&enc); static QString convert_String(const char*text); + static QString gen_attachment_id(); }; #endif diff --git a/noncore/net/mail/libmailwrapper/abstractmail.cpp b/noncore/net/mail/libmailwrapper/abstractmail.cpp index 3d76c96..626b9aa 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.cpp +++ b/noncore/net/mail/libmailwrapper/abstractmail.cpp @@ -1,30 +1,32 @@ #include "abstractmail.h" #include "imapwrapper.h" #include "pop3wrapper.h" #include "mailtypes.h" #include <qstring.h> +#include <qfile.h> +#include <qtextstream.h> #include <stdlib.h> #include <libetpan/mailmime_content.h> AbstractMail* AbstractMail::getWrapper(IMAPaccount *a) { return new IMAPwrapper(a); } AbstractMail* AbstractMail::getWrapper(POP3account *a) { return new POP3wrapper(a); } encodedString* AbstractMail::decode_String(const encodedString*text,const QString&enc) { qDebug("Decode string start"); char*result_text; size_t index = 0; /* reset for recursive use! */ size_t target_length = 0; result_text = 0; int mimetype = MAILMIME_MECHANISM_7BIT; if (enc.lower()=="quoted-printable") { mimetype = MAILMIME_MECHANISM_QUOTED_PRINTABLE; @@ -45,24 +47,37 @@ encodedString* AbstractMail::decode_String(const encodedString*text,const QStrin } qDebug("Decode string finished"); return result; } QString AbstractMail::convert_String(const char*text) { size_t index = 0; char*res = 0; /* attention - doesn't work with arm systems! */ int err = mailmime_encoded_phrase_parse("iso-8859-1", text, strlen(text),&index, "iso-8859-1",&res); if (err != MAILIMF_NO_ERROR) { if (res) free(res); return QString(text); } if (res) { QString result(res); free(res); return result; } return QString(text); } + +/* cp & paste from launcher */ +QString AbstractMail::gen_attachment_id() +{ + QFile file( "/proc/sys/kernel/random/uuid" ); + if (!file.open(IO_ReadOnly ) ) + return QString::null; + + QTextStream stream(&file); + + return "{" + stream.read().stripWhiteSpace() + "}"; +} + diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h index c16e9c0..8dd2e12 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.h +++ b/noncore/net/mail/libmailwrapper/abstractmail.h @@ -9,28 +9,31 @@ class RecBody; class RecPart; class IMAPwrapper; class POP3wrapper; class Folder; class encodedString; class AbstractMail:public QObject { Q_OBJECT public: AbstractMail(){}; virtual ~AbstractMail(){} virtual QList<Folder>* listFolders()=0; virtual void listMessages(const QString & mailbox,QList<RecMail>&target )=0; virtual RecBody fetchBody(const RecMail&mail)=0; virtual QString fetchTextPart(const RecMail&mail,const RecPart&part)=0; virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part)=0; 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); + +protected: static encodedString*decode_String(const encodedString*text,const QString&enc); static QString convert_String(const char*text); + static QString gen_attachment_id(); }; #endif diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp index 65cd4ba..d3447f4 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp @@ -1,77 +1,91 @@ #include <stdlib.h> #include "pop3wrapper.h" #include "mailtypes.h" #include "logindialog.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; + bodyCache.clear(); } POP3wrapper::~POP3wrapper() { logout(); QFile msg_cache(msgTempName); if (msg_cache.exists()) { msg_cache.remove(); } + cleanUpCache(); +} + +void POP3wrapper::cleanUpCache() +{ + QMap<QString,encodedString*>::Iterator it = bodyCache.begin(); + for (;it!=bodyCache.end();++it) { + encodedString*t = it.data(); + //it.setValue(0); + if (t) delete t; + } + bodyCache.clear(); } void POP3wrapper::pop3_progress( size_t current, size_t maximum ) { //qDebug( "POP3: %i of %i", current, maximum ); } 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; } + cleanUpCache(); 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 ) { qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); last_msg_id = 0; return RecBody(); } msg_cache.writeBlock(message,length); } else { QString msg=""; msg_cache.open(IO_ReadOnly); message = new char[4096]; memset(message,0,4096); while (msg_cache.readBlock(message,4095)>0) { msg+=message; memset(message,0,4096); } delete message; message = (char*)malloc(msg.length()+1*sizeof(char)); @@ -384,110 +398,120 @@ void POP3wrapper::login() } void POP3wrapper::logout() { int err = MAILPOP3_NO_ERROR; if ( m_pop3 == NULL ) return; err = mailpop3_quit( m_pop3 ); mailpop3_free( m_pop3 ); m_pop3 = NULL; } QList<Folder>* POP3wrapper::listFolders() { /* TODO: integrate MH directories but not before version 0.1 ;) */ QList<Folder> * folders = new QList<Folder>(); folders->setAutoDelete( false ); Folder*inb=new Folder("INBOX","/"); folders->append(inb); return folders; } -QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) +QString POP3wrapper::fetchTextPart(const RecMail&mail,const RecPart&part) { - return ""; + encodedString*t = fetchDecodedPart(mail,part); + QString text=t->Content(); + delete t; + return text; } void POP3wrapper::deleteMail(const RecMail&mail) { login(); if (!m_pop3) return; int err = mailpop3_dele(m_pop3,mail.getNumber()); if (err != MAILPOP3_NO_ERROR) { qDebug("error deleting mail"); } } void POP3wrapper::answeredMail(const RecMail&) { } -encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&part) { - return new encodedString(); + QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier()); + if (it==bodyCache.end()) return new encodedString(); + encodedString*t = decode_String(it.data(),part.Encoding()); + return t; } -encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchRawPart(const RecMail&mail,const RecPart&part) { - return new encodedString(); + QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier()); + if (it==bodyCache.end()) return new encodedString(); + encodedString*t = it.data(); + return t; } void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) { if (current_rec >= 10) { qDebug("too deep recursion!"); } if (!message || !mime) { return; } int r; char*data = 0; size_t len; clistiter * cur = 0; int res; QString b; RecPart part; switch (mime->mm_type) { case MAILMIME_SINGLE: r = mailmessage_fetch_section(message,mime,&data,&len); part.setSize(len); fillSingleBody(part,message,mime); if (part.Type()=="text" && target.Bodytext().isNull()) { encodedString*r = new encodedString(); r->setContent(data,len); encodedString*res = decode_String(r,part.Encoding()); b = QString(res->Content()); delete r; delete res; target.setBodytext(b); target.setDescription(part); } else { - /* TODO: Add the content to a list and store it for later use */ - if (data) free(data); + b = gen_attachment_id(); + part.setIdentifier(b); + bodyCache[b]=new encodedString(data,len); target.addPart(part); } break; case MAILMIME_MULTIPLE: for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); } break; case MAILMIME_MESSAGE: if (mime->mm_data.mm_message.mm_msg_mime != NULL) { traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); } break; } } QString POP3wrapper::getencoding(mailmime_mechanism*aEnc) { QString enc="7bit"; if (!aEnc) return enc; switch(aEnc->enc_type) { case MAILMIME_MECHANISM_7BIT: enc = "7bit"; break; diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.h b/noncore/net/mail/libmailwrapper/pop3wrapper.h index b17928e..a31a145 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.h +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.h @@ -1,58 +1,63 @@ #ifndef __POP3WRAPPER #define __POP3WRAPPER #include "mailwrapper.h" #include "abstractmail.h" +#include <qmap.h> +#include <qstring.h> class RecMail; class RecBody; class encodedString; struct mailpop3; struct mailmessage; struct mailmime; struct mailmime_mechanism; class POP3wrapper : public AbstractMail { Q_OBJECT public: POP3wrapper( POP3account *a ); virtual ~POP3wrapper(); /* mailbox will be ignored */ virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); virtual QList<Folder>* listFolders(); virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); virtual void deleteMail(const RecMail&mail); virtual void answeredMail(const RecMail&mail); RecBody fetchBody( const RecMail &mail ); static void pop3_progress( size_t current, size_t maximum ); protected: void login(); void logout(); RecMail *parseHeader( const char *header ); RecBody parseMail( char *message ); QString parseMailboxList( mailimf_mailbox_list *list ); QString parseMailbox( mailimf_mailbox *box ); QString parseGroup( mailimf_group *group ); QString parseAddressList( mailimf_address_list *list ); QString parseDateTime( mailimf_date_time *date ); - static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); + void cleanUpCache(); + + void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); static void fillParameters(RecPart&target,clist*parameters); static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc); POP3account *account; mailpop3 *m_pop3; QString msgTempName; unsigned int last_msg_id; + QMap<QString,encodedString*> bodyCache; }; #endif diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp index 65cd4ba..d3447f4 100644 --- a/noncore/net/mail/pop3wrapper.cpp +++ b/noncore/net/mail/pop3wrapper.cpp @@ -1,77 +1,91 @@ #include <stdlib.h> #include "pop3wrapper.h" #include "mailtypes.h" #include "logindialog.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; + bodyCache.clear(); } POP3wrapper::~POP3wrapper() { logout(); QFile msg_cache(msgTempName); if (msg_cache.exists()) { msg_cache.remove(); } + cleanUpCache(); +} + +void POP3wrapper::cleanUpCache() +{ + QMap<QString,encodedString*>::Iterator it = bodyCache.begin(); + for (;it!=bodyCache.end();++it) { + encodedString*t = it.data(); + //it.setValue(0); + if (t) delete t; + } + bodyCache.clear(); } void POP3wrapper::pop3_progress( size_t current, size_t maximum ) { //qDebug( "POP3: %i of %i", current, maximum ); } 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; } + cleanUpCache(); 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 ) { qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); last_msg_id = 0; return RecBody(); } msg_cache.writeBlock(message,length); } else { QString msg=""; msg_cache.open(IO_ReadOnly); message = new char[4096]; memset(message,0,4096); while (msg_cache.readBlock(message,4095)>0) { msg+=message; memset(message,0,4096); } delete message; message = (char*)malloc(msg.length()+1*sizeof(char)); @@ -384,110 +398,120 @@ void POP3wrapper::login() } void POP3wrapper::logout() { int err = MAILPOP3_NO_ERROR; if ( m_pop3 == NULL ) return; err = mailpop3_quit( m_pop3 ); mailpop3_free( m_pop3 ); m_pop3 = NULL; } QList<Folder>* POP3wrapper::listFolders() { /* TODO: integrate MH directories but not before version 0.1 ;) */ QList<Folder> * folders = new QList<Folder>(); folders->setAutoDelete( false ); Folder*inb=new Folder("INBOX","/"); folders->append(inb); return folders; } -QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) +QString POP3wrapper::fetchTextPart(const RecMail&mail,const RecPart&part) { - return ""; + encodedString*t = fetchDecodedPart(mail,part); + QString text=t->Content(); + delete t; + return text; } void POP3wrapper::deleteMail(const RecMail&mail) { login(); if (!m_pop3) return; int err = mailpop3_dele(m_pop3,mail.getNumber()); if (err != MAILPOP3_NO_ERROR) { qDebug("error deleting mail"); } } void POP3wrapper::answeredMail(const RecMail&) { } -encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&part) { - return new encodedString(); + QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier()); + if (it==bodyCache.end()) return new encodedString(); + encodedString*t = decode_String(it.data(),part.Encoding()); + return t; } -encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchRawPart(const RecMail&mail,const RecPart&part) { - return new encodedString(); + QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier()); + if (it==bodyCache.end()) return new encodedString(); + encodedString*t = it.data(); + return t; } void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) { if (current_rec >= 10) { qDebug("too deep recursion!"); } if (!message || !mime) { return; } int r; char*data = 0; size_t len; clistiter * cur = 0; int res; QString b; RecPart part; switch (mime->mm_type) { case MAILMIME_SINGLE: r = mailmessage_fetch_section(message,mime,&data,&len); part.setSize(len); fillSingleBody(part,message,mime); if (part.Type()=="text" && target.Bodytext().isNull()) { encodedString*r = new encodedString(); r->setContent(data,len); encodedString*res = decode_String(r,part.Encoding()); b = QString(res->Content()); delete r; delete res; target.setBodytext(b); target.setDescription(part); } else { - /* TODO: Add the content to a list and store it for later use */ - if (data) free(data); + b = gen_attachment_id(); + part.setIdentifier(b); + bodyCache[b]=new encodedString(data,len); target.addPart(part); } break; case MAILMIME_MULTIPLE: for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); } break; case MAILMIME_MESSAGE: if (mime->mm_data.mm_message.mm_msg_mime != NULL) { traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); } break; } } QString POP3wrapper::getencoding(mailmime_mechanism*aEnc) { QString enc="7bit"; if (!aEnc) return enc; switch(aEnc->enc_type) { case MAILMIME_MECHANISM_7BIT: enc = "7bit"; break; diff --git a/noncore/net/mail/pop3wrapper.h b/noncore/net/mail/pop3wrapper.h index b17928e..a31a145 100644 --- a/noncore/net/mail/pop3wrapper.h +++ b/noncore/net/mail/pop3wrapper.h @@ -1,58 +1,63 @@ #ifndef __POP3WRAPPER #define __POP3WRAPPER #include "mailwrapper.h" #include "abstractmail.h" +#include <qmap.h> +#include <qstring.h> class RecMail; class RecBody; class encodedString; struct mailpop3; struct mailmessage; struct mailmime; struct mailmime_mechanism; class POP3wrapper : public AbstractMail { Q_OBJECT public: POP3wrapper( POP3account *a ); virtual ~POP3wrapper(); /* mailbox will be ignored */ virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); virtual QList<Folder>* listFolders(); virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); virtual void deleteMail(const RecMail&mail); virtual void answeredMail(const RecMail&mail); RecBody fetchBody( const RecMail &mail ); static void pop3_progress( size_t current, size_t maximum ); protected: void login(); void logout(); RecMail *parseHeader( const char *header ); RecBody parseMail( char *message ); QString parseMailboxList( mailimf_mailbox_list *list ); QString parseMailbox( mailimf_mailbox *box ); QString parseGroup( mailimf_group *group ); QString parseAddressList( mailimf_address_list *list ); QString parseDateTime( mailimf_date_time *date ); - static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); + void cleanUpCache(); + + void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); static void fillParameters(RecPart&target,clist*parameters); static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc); POP3account *account; mailpop3 *m_pop3; QString msgTempName; unsigned int last_msg_id; + QMap<QString,encodedString*> bodyCache; }; #endif |