Diffstat (limited to 'noncore/net/mail/libmailwrapper/pop3wrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.cpp | 40 |
1 files changed, 32 insertions, 8 deletions
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 @@ -7,33 +7,46 @@ #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; @@ -42,24 +55,25 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) 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(); } @@ -396,51 +410,60 @@ void POP3wrapper::logout() 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; @@ -456,26 +479,27 @@ void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime, 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); } |