From adb369c28cac7600b3912d6a3fdb645f1b1d571d Mon Sep 17 00:00:00 2001 From: alwin Date: Sat, 20 Dec 2003 13:36:34 +0000 Subject: 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. --- (limited to 'noncore') 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 @@ -4,6 +4,8 @@ #include "mailtypes.h" #include +#include +#include #include #include @@ -66,3 +68,16 @@ QString AbstractMail::convert_String(const char*text) } 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 @@ -30,7 +30,10 @@ public: 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 @@ -4,6 +4,8 @@ #include "mailtypes.h" #include +#include +#include #include #include @@ -66,3 +68,16 @@ QString AbstractMail::convert_String(const char*text) } 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 @@ -30,7 +30,10 @@ public: 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 @@ -16,6 +16,7 @@ POP3wrapper::POP3wrapper( POP3account *a ) m_pop3 = NULL; msgTempName = a->getFileName()+"_msg_cache"; last_msg_id = 0; + bodyCache.clear(); } POP3wrapper::~POP3wrapper() @@ -25,6 +26,18 @@ POP3wrapper::~POP3wrapper() if (msg_cache.exists()) { msg_cache.remove(); } + cleanUpCache(); +} + +void POP3wrapper::cleanUpCache() +{ + QMap::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 ) @@ -51,6 +64,7 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) qDebug("Message to large: %i",mail.Msgsize()); return body; } + cleanUpCache(); if (mail.getNumber()!=last_msg_id) { if (msg_cache.exists()) { msg_cache.remove(); @@ -405,9 +419,12 @@ QList* POP3wrapper::listFolders() 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) @@ -424,14 +441,20 @@ void POP3wrapper::answeredMail(const RecMail&) { } -encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&part) { - return new encodedString(); + QMap::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::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) @@ -465,8 +488,9 @@ void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime, 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; 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 @@ -3,6 +3,8 @@ #include "mailwrapper.h" #include "abstractmail.h" +#include +#include class RecMail; class RecBody; @@ -44,7 +46,9 @@ protected: 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); @@ -53,6 +57,7 @@ protected: mailpop3 *m_pop3; QString msgTempName; unsigned int last_msg_id; + QMap 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 @@ -16,6 +16,7 @@ POP3wrapper::POP3wrapper( POP3account *a ) m_pop3 = NULL; msgTempName = a->getFileName()+"_msg_cache"; last_msg_id = 0; + bodyCache.clear(); } POP3wrapper::~POP3wrapper() @@ -25,6 +26,18 @@ POP3wrapper::~POP3wrapper() if (msg_cache.exists()) { msg_cache.remove(); } + cleanUpCache(); +} + +void POP3wrapper::cleanUpCache() +{ + QMap::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 ) @@ -51,6 +64,7 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) qDebug("Message to large: %i",mail.Msgsize()); return body; } + cleanUpCache(); if (mail.getNumber()!=last_msg_id) { if (msg_cache.exists()) { msg_cache.remove(); @@ -405,9 +419,12 @@ QList* POP3wrapper::listFolders() 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) @@ -424,14 +441,20 @@ void POP3wrapper::answeredMail(const RecMail&) { } -encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) +encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&part) { - return new encodedString(); + QMap::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::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) @@ -465,8 +488,9 @@ void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime, 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; 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 @@ -3,6 +3,8 @@ #include "mailwrapper.h" #include "abstractmail.h" +#include +#include class RecMail; class RecBody; @@ -44,7 +46,9 @@ protected: 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); @@ -53,6 +57,7 @@ protected: mailpop3 *m_pop3; QString msgTempName; unsigned int last_msg_id; + QMap bodyCache; }; #endif -- cgit v0.9.0.2