summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-30 00:14:47 (UTC)
committer alwin <alwin>2003-12-30 00:14:47 (UTC)
commitb636d3d91e8456b22bc450b3d7f3a862b7f615a9 (patch) (side-by-side diff)
tree2d7fe53175453a28e4e1d08496f6f611221c1936
parent2ecab614a6b91658b1608c62134cd14e257e55b7 (diff)
downloadopie-b636d3d91e8456b22bc450b3d7f3a862b7f615a9.zip
opie-b636d3d91e8456b22bc450b3d7f3a862b7f615a9.tar.gz
opie-b636d3d91e8456b22bc450b3d7f3a862b7f615a9.tar.bz2
re-worked pop3 (use the more generic interface)
shared some more functions between mbox and pop3
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/genericwrapper.cpp69
-rw-r--r--noncore/net/mail/genericwrapper.h2
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.cpp69
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.h2
-rw-r--r--noncore/net/mail/libmailwrapper/mboxwrapper.cpp72
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp166
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.h5
-rw-r--r--noncore/net/mail/mboxwrapper.cpp72
-rw-r--r--noncore/net/mail/pop3wrapper.cpp166
-rw-r--r--noncore/net/mail/pop3wrapper.h5
10 files changed, 284 insertions, 344 deletions
diff --git a/noncore/net/mail/genericwrapper.cpp b/noncore/net/mail/genericwrapper.cpp
index c1b6e48..bef6ae5 100644
--- a/noncore/net/mail/genericwrapper.cpp
+++ b/noncore/net/mail/genericwrapper.cpp
@@ -1,27 +1,26 @@
#include "genericwrapper.h"
-#include <libetpan/mailmime.h>
-#include <libetpan/data_message_driver.h>
+#include <libetpan/libetpan.h>
#include "mailtypes.h"
Genericwrapper::Genericwrapper()
: AbstractMail()
{
bodyCache.clear();
}
Genericwrapper::~Genericwrapper()
{
cleanMimeCache();
}
void Genericwrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
{
if (!mime) {
return;
}
mailmime_field*field = 0;
mailmime_single_fields fields;
memset(&fields, 0, sizeof(struct mailmime_single_fields));
if (mime->mm_mime_fields != NULL) {
mailmime_single_fields_init(&fields, mime->mm_mime_fields,
mime->mm_content_type);
@@ -370,24 +369,90 @@ encodedString* Genericwrapper::fetchRawPart(const RecMail&mail,const RecPart&par
if (it==bodyCache.end()) return new encodedString();
encodedString*t = it.data();
return t;
}
QString Genericwrapper::fetchTextPart(const RecMail&mail,const RecPart&part)
{
encodedString*t = fetchDecodedPart(mail,part);
QString text=t->Content();
delete t;
return text;
}
void Genericwrapper::cleanMimeCache()
{
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();
qDebug("Genericwrapper: cache cleaned");
}
+
+void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox)
+{
+ int r;
+ mailmessage_list * env_list = 0;
+ r = mailsession_get_messages_list(session,&env_list);
+ if (r != MAIL_NO_ERROR) {
+ qDebug("Error message list");
+ return;
+ }
+ r = mailsession_get_envelopes_list(session, env_list);
+ if (r != MAIL_NO_ERROR) {
+ qDebug("Error filling message list");
+ if (env_list) {
+ mailmessage_list_free(env_list);
+ }
+ return;
+ }
+ mailimf_references * refs;
+ uint32_t i = 0;
+ for(; i < carray_count(env_list->msg_tab) ; ++i) {
+ mailmessage * msg;
+ QBitArray mFlags(7);
+ msg = (mailmessage*)carray_get(env_list->msg_tab, i);
+ if (msg->msg_fields == NULL) {
+ qDebug("could not fetch envelope of message %i", i);
+ continue;
+ }
+ RecMail * mail = new RecMail();
+ mail->setWrapper(this);
+ mail_flags * flag_result = 0;
+ r = mailmessage_get_flags(msg,&flag_result);
+ if (r == MAIL_ERROR_NOT_IMPLEMENTED) {
+ mFlags.setBit(FLAG_SEEN);
+ }
+ mailimf_single_fields single_fields;
+ mailimf_single_fields_init(&single_fields, msg->msg_fields);
+ mail->setMsgsize(msg->msg_size);
+ mail->setFlags(mFlags);
+ mail->setMbox(mailbox);
+ mail->setNumber(i+1);
+ if (single_fields.fld_subject)
+ mail->setSubject( convert_String(single_fields.fld_subject->sbj_value));
+ if (single_fields.fld_from)
+ mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list));
+ if (single_fields.fld_to)
+ mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) );
+ if (single_fields.fld_cc)
+ mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
+ if (single_fields.fld_bcc)
+ mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
+ if (single_fields.fld_orig_date)
+ mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
+ if (single_fields.fld_message_id->mid_value)
+ mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
+ refs = single_fields.fld_references;
+ if (refs && refs->mid_list && clist_count(refs->mid_list)) {
+ char * text = (char*)refs->mid_list->first->data;
+ mail->setReplyto(QString(text));
+ }
+ target.append(mail);
+ }
+ if (env_list) {
+ mailmessage_list_free(env_list);
+ }
+}
diff --git a/noncore/net/mail/genericwrapper.h b/noncore/net/mail/genericwrapper.h
index 90c4b50..54d6ea9 100644
--- a/noncore/net/mail/genericwrapper.h
+++ b/noncore/net/mail/genericwrapper.h
@@ -1,57 +1,59 @@
#ifndef __GENERIC_WRAPPER_H
#define __GENERIC_WRAPPER_H
#include "abstractmail.h"
#include <qmap.h>
#include <qstring.h>
#include <libetpan/clist.h>
class RecMail;
class RecBody;
class encodedString;
struct mailpop3;
struct mailmessage;
struct mailmime;
struct mailmime_mechanism;
struct mailimf_mailbox_list;
struct mailimf_mailbox;
struct mailimf_date_time;
struct mailimf_group;
struct mailimf_address_list;
+struct mailsession;
/* this class hold just the funs shared between
* mbox and pop3 (later mh, too) mail access.
* it is not desigend to make a instance of it!
*/
class Genericwrapper : public AbstractMail
{
Q_OBJECT
public:
Genericwrapper();
virtual ~Genericwrapper();
virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
virtual void cleanMimeCache();
protected:
RecMail *parseHeader( const char *header );
RecBody parseMail( mailmessage * msg );
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 );
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 getencoding(mailmime_mechanism*aEnc);
+ virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox);
QString msgTempName;
unsigned int last_msg_id;
QMap<QString,encodedString*> bodyCache;
};
#endif
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.cpp b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
index c1b6e48..bef6ae5 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
@@ -1,27 +1,26 @@
#include "genericwrapper.h"
-#include <libetpan/mailmime.h>
-#include <libetpan/data_message_driver.h>
+#include <libetpan/libetpan.h>
#include "mailtypes.h"
Genericwrapper::Genericwrapper()
: AbstractMail()
{
bodyCache.clear();
}
Genericwrapper::~Genericwrapper()
{
cleanMimeCache();
}
void Genericwrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
{
if (!mime) {
return;
}
mailmime_field*field = 0;
mailmime_single_fields fields;
memset(&fields, 0, sizeof(struct mailmime_single_fields));
if (mime->mm_mime_fields != NULL) {
mailmime_single_fields_init(&fields, mime->mm_mime_fields,
mime->mm_content_type);
@@ -370,24 +369,90 @@ encodedString* Genericwrapper::fetchRawPart(const RecMail&mail,const RecPart&par
if (it==bodyCache.end()) return new encodedString();
encodedString*t = it.data();
return t;
}
QString Genericwrapper::fetchTextPart(const RecMail&mail,const RecPart&part)
{
encodedString*t = fetchDecodedPart(mail,part);
QString text=t->Content();
delete t;
return text;
}
void Genericwrapper::cleanMimeCache()
{
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();
qDebug("Genericwrapper: cache cleaned");
}
+
+void Genericwrapper::parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox)
+{
+ int r;
+ mailmessage_list * env_list = 0;
+ r = mailsession_get_messages_list(session,&env_list);
+ if (r != MAIL_NO_ERROR) {
+ qDebug("Error message list");
+ return;
+ }
+ r = mailsession_get_envelopes_list(session, env_list);
+ if (r != MAIL_NO_ERROR) {
+ qDebug("Error filling message list");
+ if (env_list) {
+ mailmessage_list_free(env_list);
+ }
+ return;
+ }
+ mailimf_references * refs;
+ uint32_t i = 0;
+ for(; i < carray_count(env_list->msg_tab) ; ++i) {
+ mailmessage * msg;
+ QBitArray mFlags(7);
+ msg = (mailmessage*)carray_get(env_list->msg_tab, i);
+ if (msg->msg_fields == NULL) {
+ qDebug("could not fetch envelope of message %i", i);
+ continue;
+ }
+ RecMail * mail = new RecMail();
+ mail->setWrapper(this);
+ mail_flags * flag_result = 0;
+ r = mailmessage_get_flags(msg,&flag_result);
+ if (r == MAIL_ERROR_NOT_IMPLEMENTED) {
+ mFlags.setBit(FLAG_SEEN);
+ }
+ mailimf_single_fields single_fields;
+ mailimf_single_fields_init(&single_fields, msg->msg_fields);
+ mail->setMsgsize(msg->msg_size);
+ mail->setFlags(mFlags);
+ mail->setMbox(mailbox);
+ mail->setNumber(i+1);
+ if (single_fields.fld_subject)
+ mail->setSubject( convert_String(single_fields.fld_subject->sbj_value));
+ if (single_fields.fld_from)
+ mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list));
+ if (single_fields.fld_to)
+ mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) );
+ if (single_fields.fld_cc)
+ mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
+ if (single_fields.fld_bcc)
+ mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
+ if (single_fields.fld_orig_date)
+ mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
+ if (single_fields.fld_message_id->mid_value)
+ mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
+ refs = single_fields.fld_references;
+ if (refs && refs->mid_list && clist_count(refs->mid_list)) {
+ char * text = (char*)refs->mid_list->first->data;
+ mail->setReplyto(QString(text));
+ }
+ target.append(mail);
+ }
+ if (env_list) {
+ mailmessage_list_free(env_list);
+ }
+}
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.h b/noncore/net/mail/libmailwrapper/genericwrapper.h
index 90c4b50..54d6ea9 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.h
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.h
@@ -1,57 +1,59 @@
#ifndef __GENERIC_WRAPPER_H
#define __GENERIC_WRAPPER_H
#include "abstractmail.h"
#include <qmap.h>
#include <qstring.h>
#include <libetpan/clist.h>
class RecMail;
class RecBody;
class encodedString;
struct mailpop3;
struct mailmessage;
struct mailmime;
struct mailmime_mechanism;
struct mailimf_mailbox_list;
struct mailimf_mailbox;
struct mailimf_date_time;
struct mailimf_group;
struct mailimf_address_list;
+struct mailsession;
/* this class hold just the funs shared between
* mbox and pop3 (later mh, too) mail access.
* it is not desigend to make a instance of it!
*/
class Genericwrapper : public AbstractMail
{
Q_OBJECT
public:
Genericwrapper();
virtual ~Genericwrapper();
virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
virtual void cleanMimeCache();
protected:
RecMail *parseHeader( const char *header );
RecBody parseMail( mailmessage * msg );
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 );
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 getencoding(mailmime_mechanism*aEnc);
+ virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox);
QString msgTempName;
unsigned int last_msg_id;
QMap<QString,encodedString*> bodyCache;
};
#endif
diff --git a/noncore/net/mail/libmailwrapper/mboxwrapper.cpp b/noncore/net/mail/libmailwrapper/mboxwrapper.cpp
index 162a0c9..0aa33dd 100644
--- a/noncore/net/mail/libmailwrapper/mboxwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/mboxwrapper.cpp
@@ -14,119 +14,55 @@ MBOXwrapper::MBOXwrapper(const QString & mbox_dir)
dir.mkdir(MBOXPath);
}
}
MBOXwrapper::~MBOXwrapper()
{
}
void MBOXwrapper::listMessages(const QString & mailbox, QList<RecMail> &target )
{
mailstorage*storage = mailstorage_new(NULL);
QString p = MBOXPath+"/";
p+=mailbox;
int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
mailfolder*folder;
folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
r = mailfolder_connect(folder);
if (r != MAIL_NO_ERROR) {
qDebug("Error initializing mbox");
mailfolder_free(folder);
mailstorage_free(storage);
return;
}
- mailmessage_list * env_list = 0;
- r = mailsession_get_messages_list(folder->fld_session,&env_list);
- if (r != MAIL_NO_ERROR) {
- qDebug("Error message list");
- mailfolder_free(folder);
- mailstorage_free(storage);
- return;
- }
- r = mailsession_get_envelopes_list(folder->fld_session, env_list);
- if (r != MAIL_NO_ERROR) {
- qDebug("Error filling message list");
- if (env_list) {
- mailmessage_list_free(env_list);
- }
- mailfolder_free(folder);
- mailstorage_free(storage);
- return;
- }
- mailimf_references * refs;
-
- uint32_t i = 0;
- for(; i < carray_count(env_list->msg_tab) ; ++i) {
- mailmessage * msg;
- QBitArray mFlags(7);
- msg = (mailmessage*)carray_get(env_list->msg_tab, i);
- if (msg->msg_fields == NULL) {
- qDebug("could not fetch envelope of message %i", i);
- continue;
- }
- RecMail * mail = new RecMail();
- mail->setWrapper(this);
- mail_flags * flag_result = 0;
- r = mailmessage_get_flags(msg,&flag_result);
- if (r == MAIL_ERROR_NOT_IMPLEMENTED) {
- mFlags.setBit(FLAG_SEEN);
- }
- mailimf_single_fields single_fields;
- mailimf_single_fields_init(&single_fields, msg->msg_fields);
- mail->setMsgsize(msg->msg_size);
- mail->setFlags(mFlags);
- mail->setMbox(mailbox);
- mail->setNumber(i+1);
- if (single_fields.fld_subject)
- mail->setSubject( convert_String(single_fields.fld_subject->sbj_value));
- if (single_fields.fld_from)
- mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list));
- if (single_fields.fld_to)
- mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) );
- if (single_fields.fld_cc)
- mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
- if (single_fields.fld_bcc)
- mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
- if (single_fields.fld_orig_date)
- mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
- if (single_fields.fld_message_id->mid_value)
- mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
- refs = single_fields.fld_references;
- if (refs && refs->mid_list && clist_count(refs->mid_list)) {
- char * text = (char*)refs->mid_list->first->data;
- mail->setReplyto(QString(text));
- }
-
- target.append(mail);
- }
- if (env_list) {
- mailmessage_list_free(env_list);
- }
+
+ parseList(target,folder->fld_session,mailbox);
+
mailfolder_disconnect(folder);
mailfolder_free(folder);
mailstorage_free(storage);
- Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(i));
+ Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
}
QList<Folder>* MBOXwrapper::listFolders()
{
QList<Folder> * folders = new QList<Folder>();
folders->setAutoDelete( false );
QDir dir(MBOXPath);
if (!dir.exists()) return folders;
dir.setFilter(QDir::Files|QDir::Writable|QDir::Readable);
QStringList entries = dir.entryList();
QStringList::ConstIterator it = entries.begin();
for (;it!=entries.end();++it) {
Folder*inb=new Folder(*it,"/");
folders->append(inb);
}
return folders;
}
void MBOXwrapper::deleteMail(const RecMail&mail)
{
mailstorage*storage = mailstorage_new(NULL);
QString p = MBOXPath+"/";
p+=mail.getMbox();
int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 2e70dee..de90dd1 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -1,254 +1,218 @@
#include <stdlib.h>
#include "pop3wrapper.h"
#include "mailtypes.h"
#include "logindialog.h"
#include <libetpan/libetpan.h>
#include <qpe/global.h>
#include <qfile.h>
+#include <qstring.h>
/* we don't fetch messages larger than 5 MB */
#define HARD_MSG_SIZE_LIMIT 5242880
POP3wrapper::POP3wrapper( POP3account *a )
: Genericwrapper()
{
account = a;
m_pop3 = NULL;
+ m_folder = NULL;
msgTempName = a->getFileName()+"_msg_cache";
last_msg_id = 0;
}
POP3wrapper::~POP3wrapper()
{
logout();
QFile msg_cache(msgTempName);
if (msg_cache.exists()) {
msg_cache.remove();
}
}
void POP3wrapper::pop3_progress( size_t current, size_t maximum )
{
- //qDebug( "POP3: %i of %i", current, maximum );
+ qDebug( "POP3: %i of %i", current, maximum );
}
RecBody POP3wrapper::fetchBody( const RecMail &mail )
{
int err = MAILPOP3_NO_ERROR;
- char *message;
+ char *message = 0;
size_t length = 0;
login();
if ( !m_pop3 ) {
return RecBody();
}
RecBody body;
- mailmessage * msg = 0;
-
- QFile msg_cache(msgTempName);
-
+ mailmessage * mailmsg;
if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) {
qDebug("Message to large: %i",mail.Msgsize());
return body;
}
+
+ QFile msg_cache(msgTempName);
+
cleanMimeCache();
+
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();
- }
+ err = mailsession_get_message(m_folder->fld_session, mail.getNumber(), &mailmsg);
+ err = mailmessage_fetch(mailmsg,&message,&length);
msg_cache.writeBlock(message,length);
- } else {
+ } 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));
memset(message,0,msg.length()+1);
memcpy(message,msg.latin1(),msg.length());
+ /* transform to libetpan stuff */
+ mailmsg = mailmessage_new();
+ mailmessage_init(mailmsg, NULL, data_message_driver, 0, strlen(message));
+ generic_message_t * msg_data;
+ msg_data = (generic_message_t *)mailmsg->msg_data;
+ msg_data->msg_fetched = 1;
+ msg_data->msg_message = message;
+ msg_data->msg_length = strlen(message);
}
+ body = parseMail(mailmsg);
- /* transform to libetpan stuff */
- msg = mailmessage_new();
- mailmessage_init(msg, NULL, data_message_driver, 0, strlen(message));
- generic_message_t * msg_data;
- msg_data = (generic_message_t *)msg->msg_data;
- msg_data->msg_fetched = 1;
- msg_data->msg_message = message;
- msg_data->msg_length = strlen(message);
-
- /* parse the mail */
- body = parseMail(msg);
-
/* clean up */
- mailmessage_free(msg);
- free(message);
-
- /* finish */
+ if (mailmsg) mailmessage_free(mailmsg);
+ if (message) free(message);
+
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!!!!!!!!!!!!!!!!! */
- size_t length = 0;
- carray * messages = 0;
-
login();
if (!m_pop3) return;
-
- mailpop3_list( m_pop3, &messages );
-
- for (unsigned int i = 0; i < carray_count(messages);++i) {
- mailpop3_msg_info *info;
- err = mailpop3_get_msg_info(m_pop3,i+1,&info);
- if (info->msg_deleted)
- continue;
- err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
- free(header);
- return;
- }
- RecMail *mail = parseHeader( header );
- mail->setNumber( info->msg_index );
- mail->setWrapper(this);
- mail->setMsgsize(info->msg_size);
- target.append( mail );
- free(header);
- }
- Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(carray_count(messages)-m_pop3->pop3_deleted_count));
+ uint32_t res_messages,res_recent,res_unseen;
+ mailsession_status_folder(m_folder->fld_session,"INBOX",&res_messages,&res_recent,&res_unseen);
+ parseList(target,m_folder->fld_session,"INBOX");
+ Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages));
}
void POP3wrapper::login()
{
/* we'll hold the line */
if ( m_pop3 != NULL ) return;
const char *server, *user, *pass;
uint16_t port;
int err = MAILPOP3_NO_ERROR;
server = account->getServer().latin1();
port = account->getPort().toUInt();
if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
login.show();
if ( QDialog::Accepted == login.exec() ) {
// ok
- user = strdup( login.getUser().latin1() );
- pass = strdup( login.getPassword().latin1() );
+ user = login.getUser().latin1();
+ pass = login.getPassword().latin1();
} else {
// cancel
qDebug( "POP3: Login canceled" );
return;
}
} else {
user = account->getUser().latin1();
pass = account->getPassword().latin1();
}
- m_pop3 = mailpop3_new( 200, &pop3_progress );
+ bool ssl = account->getSSL();
- // connect
- if (account->getSSL()) {
- err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
- } else {
- err = mailpop3_socket_connect( m_pop3, (char*)server, port );
- }
+ m_pop3=mailstorage_new(NULL);
+ pop3_mailstorage_init(m_pop3,(char*)server,port,NULL,CONNECTION_TYPE_TRY_STARTTLS,POP3_AUTH_TYPE_TRY_APOP,
+ (char*)user,(char*)pass,0,0,0);
+
+ m_folder = mailfolder_new(m_pop3, NULL, NULL);
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "pop3: error connecting to %s\n reason: %s", server,
- m_pop3->pop3_response );
- mailpop3_free( m_pop3 );
+ if (m_folder==0) {
+ Global::statusMessage(tr("Error initializing folder"));
+ mailstorage_free(m_pop3);
m_pop3 = NULL;
return;
}
- qDebug( "POP3: connected!" );
-
- // login
- // TODO: decide if apop or plain login should be used
- err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
- logout();
- return;
+ err = mailfolder_connect(m_folder);
+ if (err != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error initializing folder"));
+ mailfolder_free(m_folder);
+ m_folder = 0;
+ mailstorage_free(m_pop3);
+ m_pop3 = 0;
}
-
qDebug( "POP3: logged in!" );
}
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;
+ mailfolder_free(m_folder);
+ m_folder = 0;
+ mailstorage_free(m_pop3);
+ m_pop3 = 0;
}
QList<Folder>* POP3wrapper::listFolders()
{
QList<Folder> * folders = new QList<Folder>();
folders->setAutoDelete( false );
Folder*inb=new Folder("INBOX","/");
folders->append(inb);
return folders;
}
void POP3wrapper::deleteMail(const RecMail&mail)
{
login();
if (!m_pop3) return;
- int err = mailpop3_dele(m_pop3,mail.getNumber());
- if (err != MAILPOP3_NO_ERROR) {
+ int err = mailsession_remove_message(m_folder->fld_session,mail.getNumber());
+ if (err != MAIL_NO_ERROR) {
Global::statusMessage(tr("error deleting mail"));
}
}
void POP3wrapper::answeredMail(const RecMail&)
{
}
int POP3wrapper::deleteAllMail(const Folder*)
{
login();
if (!m_pop3) return 0;
- carray * messages = 0;
-
- /* if connected this info is cached! */
- int err = 0;
- mailpop3_list( m_pop3, &messages );
-
int res = 1;
- for (unsigned int i = 0; messages!=0 && i < carray_count(messages);++i) {
- mailpop3_msg_info *info;
- err = mailpop3_get_msg_info(m_pop3,i+1,&info);
- if (info->msg_deleted)
- continue;
- err = mailpop3_dele(m_pop3,i+1);
- if (err != MAILPOP3_NO_ERROR) {
+
+ uint32_t result = 0;
+ int err = mailsession_messages_number(m_folder->fld_session,NULL,&result);
+ if (err != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error getting folder info"));
+ return 0;
+ }
+ for (unsigned int i = 0; i < result; ++i) {
+ err = mailsession_remove_message(m_folder->fld_session,i+1);
+ if (err != MAIL_NO_ERROR) {
Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
- res = 0;
- break;
+ res=0;
}
- }
+ break;
+ }
return res;
}
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.h b/noncore/net/mail/libmailwrapper/pop3wrapper.h
index 2efffdd..b3a42be 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.h
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.h
@@ -1,34 +1,37 @@
#ifndef __POP3WRAPPER
#define __POP3WRAPPER
#include "mailwrapper.h"
#include "genericwrapper.h"
#include <qstring.h>
+struct mailstorage;
+struct mailfolder;
class POP3wrapper : public Genericwrapper
{
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 void deleteMail(const RecMail&mail);
virtual void answeredMail(const RecMail&mail);
virtual int deleteAllMail(const Folder*);
virtual RecBody fetchBody( const RecMail &mail );
static void pop3_progress( size_t current, size_t maximum );
protected:
void login();
void logout();
POP3account *account;
- mailpop3 *m_pop3;
+ mailstorage*m_pop3;
+ mailfolder*m_folder;
};
#endif
diff --git a/noncore/net/mail/mboxwrapper.cpp b/noncore/net/mail/mboxwrapper.cpp
index 162a0c9..0aa33dd 100644
--- a/noncore/net/mail/mboxwrapper.cpp
+++ b/noncore/net/mail/mboxwrapper.cpp
@@ -14,119 +14,55 @@ MBOXwrapper::MBOXwrapper(const QString & mbox_dir)
dir.mkdir(MBOXPath);
}
}
MBOXwrapper::~MBOXwrapper()
{
}
void MBOXwrapper::listMessages(const QString & mailbox, QList<RecMail> &target )
{
mailstorage*storage = mailstorage_new(NULL);
QString p = MBOXPath+"/";
p+=mailbox;
int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
mailfolder*folder;
folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
r = mailfolder_connect(folder);
if (r != MAIL_NO_ERROR) {
qDebug("Error initializing mbox");
mailfolder_free(folder);
mailstorage_free(storage);
return;
}
- mailmessage_list * env_list = 0;
- r = mailsession_get_messages_list(folder->fld_session,&env_list);
- if (r != MAIL_NO_ERROR) {
- qDebug("Error message list");
- mailfolder_free(folder);
- mailstorage_free(storage);
- return;
- }
- r = mailsession_get_envelopes_list(folder->fld_session, env_list);
- if (r != MAIL_NO_ERROR) {
- qDebug("Error filling message list");
- if (env_list) {
- mailmessage_list_free(env_list);
- }
- mailfolder_free(folder);
- mailstorage_free(storage);
- return;
- }
- mailimf_references * refs;
-
- uint32_t i = 0;
- for(; i < carray_count(env_list->msg_tab) ; ++i) {
- mailmessage * msg;
- QBitArray mFlags(7);
- msg = (mailmessage*)carray_get(env_list->msg_tab, i);
- if (msg->msg_fields == NULL) {
- qDebug("could not fetch envelope of message %i", i);
- continue;
- }
- RecMail * mail = new RecMail();
- mail->setWrapper(this);
- mail_flags * flag_result = 0;
- r = mailmessage_get_flags(msg,&flag_result);
- if (r == MAIL_ERROR_NOT_IMPLEMENTED) {
- mFlags.setBit(FLAG_SEEN);
- }
- mailimf_single_fields single_fields;
- mailimf_single_fields_init(&single_fields, msg->msg_fields);
- mail->setMsgsize(msg->msg_size);
- mail->setFlags(mFlags);
- mail->setMbox(mailbox);
- mail->setNumber(i+1);
- if (single_fields.fld_subject)
- mail->setSubject( convert_String(single_fields.fld_subject->sbj_value));
- if (single_fields.fld_from)
- mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list));
- if (single_fields.fld_to)
- mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) );
- if (single_fields.fld_cc)
- mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
- if (single_fields.fld_bcc)
- mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
- if (single_fields.fld_orig_date)
- mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
- if (single_fields.fld_message_id->mid_value)
- mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
- refs = single_fields.fld_references;
- if (refs && refs->mid_list && clist_count(refs->mid_list)) {
- char * text = (char*)refs->mid_list->first->data;
- mail->setReplyto(QString(text));
- }
-
- target.append(mail);
- }
- if (env_list) {
- mailmessage_list_free(env_list);
- }
+
+ parseList(target,folder->fld_session,mailbox);
+
mailfolder_disconnect(folder);
mailfolder_free(folder);
mailstorage_free(storage);
- Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(i));
+ Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
}
QList<Folder>* MBOXwrapper::listFolders()
{
QList<Folder> * folders = new QList<Folder>();
folders->setAutoDelete( false );
QDir dir(MBOXPath);
if (!dir.exists()) return folders;
dir.setFilter(QDir::Files|QDir::Writable|QDir::Readable);
QStringList entries = dir.entryList();
QStringList::ConstIterator it = entries.begin();
for (;it!=entries.end();++it) {
Folder*inb=new Folder(*it,"/");
folders->append(inb);
}
return folders;
}
void MBOXwrapper::deleteMail(const RecMail&mail)
{
mailstorage*storage = mailstorage_new(NULL);
QString p = MBOXPath+"/";
p+=mail.getMbox();
int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 2e70dee..de90dd1 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -1,254 +1,218 @@
#include <stdlib.h>
#include "pop3wrapper.h"
#include "mailtypes.h"
#include "logindialog.h"
#include <libetpan/libetpan.h>
#include <qpe/global.h>
#include <qfile.h>
+#include <qstring.h>
/* we don't fetch messages larger than 5 MB */
#define HARD_MSG_SIZE_LIMIT 5242880
POP3wrapper::POP3wrapper( POP3account *a )
: Genericwrapper()
{
account = a;
m_pop3 = NULL;
+ m_folder = NULL;
msgTempName = a->getFileName()+"_msg_cache";
last_msg_id = 0;
}
POP3wrapper::~POP3wrapper()
{
logout();
QFile msg_cache(msgTempName);
if (msg_cache.exists()) {
msg_cache.remove();
}
}
void POP3wrapper::pop3_progress( size_t current, size_t maximum )
{
- //qDebug( "POP3: %i of %i", current, maximum );
+ qDebug( "POP3: %i of %i", current, maximum );
}
RecBody POP3wrapper::fetchBody( const RecMail &mail )
{
int err = MAILPOP3_NO_ERROR;
- char *message;
+ char *message = 0;
size_t length = 0;
login();
if ( !m_pop3 ) {
return RecBody();
}
RecBody body;
- mailmessage * msg = 0;
-
- QFile msg_cache(msgTempName);
-
+ mailmessage * mailmsg;
if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) {
qDebug("Message to large: %i",mail.Msgsize());
return body;
}
+
+ QFile msg_cache(msgTempName);
+
cleanMimeCache();
+
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();
- }
+ err = mailsession_get_message(m_folder->fld_session, mail.getNumber(), &mailmsg);
+ err = mailmessage_fetch(mailmsg,&message,&length);
msg_cache.writeBlock(message,length);
- } else {
+ } 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));
memset(message,0,msg.length()+1);
memcpy(message,msg.latin1(),msg.length());
+ /* transform to libetpan stuff */
+ mailmsg = mailmessage_new();
+ mailmessage_init(mailmsg, NULL, data_message_driver, 0, strlen(message));
+ generic_message_t * msg_data;
+ msg_data = (generic_message_t *)mailmsg->msg_data;
+ msg_data->msg_fetched = 1;
+ msg_data->msg_message = message;
+ msg_data->msg_length = strlen(message);
}
+ body = parseMail(mailmsg);
- /* transform to libetpan stuff */
- msg = mailmessage_new();
- mailmessage_init(msg, NULL, data_message_driver, 0, strlen(message));
- generic_message_t * msg_data;
- msg_data = (generic_message_t *)msg->msg_data;
- msg_data->msg_fetched = 1;
- msg_data->msg_message = message;
- msg_data->msg_length = strlen(message);
-
- /* parse the mail */
- body = parseMail(msg);
-
/* clean up */
- mailmessage_free(msg);
- free(message);
-
- /* finish */
+ if (mailmsg) mailmessage_free(mailmsg);
+ if (message) free(message);
+
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!!!!!!!!!!!!!!!!! */
- size_t length = 0;
- carray * messages = 0;
-
login();
if (!m_pop3) return;
-
- mailpop3_list( m_pop3, &messages );
-
- for (unsigned int i = 0; i < carray_count(messages);++i) {
- mailpop3_msg_info *info;
- err = mailpop3_get_msg_info(m_pop3,i+1,&info);
- if (info->msg_deleted)
- continue;
- err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
- free(header);
- return;
- }
- RecMail *mail = parseHeader( header );
- mail->setNumber( info->msg_index );
- mail->setWrapper(this);
- mail->setMsgsize(info->msg_size);
- target.append( mail );
- free(header);
- }
- Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(carray_count(messages)-m_pop3->pop3_deleted_count));
+ uint32_t res_messages,res_recent,res_unseen;
+ mailsession_status_folder(m_folder->fld_session,"INBOX",&res_messages,&res_recent,&res_unseen);
+ parseList(target,m_folder->fld_session,"INBOX");
+ Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages));
}
void POP3wrapper::login()
{
/* we'll hold the line */
if ( m_pop3 != NULL ) return;
const char *server, *user, *pass;
uint16_t port;
int err = MAILPOP3_NO_ERROR;
server = account->getServer().latin1();
port = account->getPort().toUInt();
if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
login.show();
if ( QDialog::Accepted == login.exec() ) {
// ok
- user = strdup( login.getUser().latin1() );
- pass = strdup( login.getPassword().latin1() );
+ user = login.getUser().latin1();
+ pass = login.getPassword().latin1();
} else {
// cancel
qDebug( "POP3: Login canceled" );
return;
}
} else {
user = account->getUser().latin1();
pass = account->getPassword().latin1();
}
- m_pop3 = mailpop3_new( 200, &pop3_progress );
+ bool ssl = account->getSSL();
- // connect
- if (account->getSSL()) {
- err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
- } else {
- err = mailpop3_socket_connect( m_pop3, (char*)server, port );
- }
+ m_pop3=mailstorage_new(NULL);
+ pop3_mailstorage_init(m_pop3,(char*)server,port,NULL,CONNECTION_TYPE_TRY_STARTTLS,POP3_AUTH_TYPE_TRY_APOP,
+ (char*)user,(char*)pass,0,0,0);
+
+ m_folder = mailfolder_new(m_pop3, NULL, NULL);
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "pop3: error connecting to %s\n reason: %s", server,
- m_pop3->pop3_response );
- mailpop3_free( m_pop3 );
+ if (m_folder==0) {
+ Global::statusMessage(tr("Error initializing folder"));
+ mailstorage_free(m_pop3);
m_pop3 = NULL;
return;
}
- qDebug( "POP3: connected!" );
-
- // login
- // TODO: decide if apop or plain login should be used
- err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
- if ( err != MAILPOP3_NO_ERROR ) {
- qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
- logout();
- return;
+ err = mailfolder_connect(m_folder);
+ if (err != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error initializing folder"));
+ mailfolder_free(m_folder);
+ m_folder = 0;
+ mailstorage_free(m_pop3);
+ m_pop3 = 0;
}
-
qDebug( "POP3: logged in!" );
}
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;
+ mailfolder_free(m_folder);
+ m_folder = 0;
+ mailstorage_free(m_pop3);
+ m_pop3 = 0;
}
QList<Folder>* POP3wrapper::listFolders()
{
QList<Folder> * folders = new QList<Folder>();
folders->setAutoDelete( false );
Folder*inb=new Folder("INBOX","/");
folders->append(inb);
return folders;
}
void POP3wrapper::deleteMail(const RecMail&mail)
{
login();
if (!m_pop3) return;
- int err = mailpop3_dele(m_pop3,mail.getNumber());
- if (err != MAILPOP3_NO_ERROR) {
+ int err = mailsession_remove_message(m_folder->fld_session,mail.getNumber());
+ if (err != MAIL_NO_ERROR) {
Global::statusMessage(tr("error deleting mail"));
}
}
void POP3wrapper::answeredMail(const RecMail&)
{
}
int POP3wrapper::deleteAllMail(const Folder*)
{
login();
if (!m_pop3) return 0;
- carray * messages = 0;
-
- /* if connected this info is cached! */
- int err = 0;
- mailpop3_list( m_pop3, &messages );
-
int res = 1;
- for (unsigned int i = 0; messages!=0 && i < carray_count(messages);++i) {
- mailpop3_msg_info *info;
- err = mailpop3_get_msg_info(m_pop3,i+1,&info);
- if (info->msg_deleted)
- continue;
- err = mailpop3_dele(m_pop3,i+1);
- if (err != MAILPOP3_NO_ERROR) {
+
+ uint32_t result = 0;
+ int err = mailsession_messages_number(m_folder->fld_session,NULL,&result);
+ if (err != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error getting folder info"));
+ return 0;
+ }
+ for (unsigned int i = 0; i < result; ++i) {
+ err = mailsession_remove_message(m_folder->fld_session,i+1);
+ if (err != MAIL_NO_ERROR) {
Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
- res = 0;
- break;
+ res=0;
}
- }
+ break;
+ }
return res;
}
diff --git a/noncore/net/mail/pop3wrapper.h b/noncore/net/mail/pop3wrapper.h
index 2efffdd..b3a42be 100644
--- a/noncore/net/mail/pop3wrapper.h
+++ b/noncore/net/mail/pop3wrapper.h
@@ -1,34 +1,37 @@
#ifndef __POP3WRAPPER
#define __POP3WRAPPER
#include "mailwrapper.h"
#include "genericwrapper.h"
#include <qstring.h>
+struct mailstorage;
+struct mailfolder;
class POP3wrapper : public Genericwrapper
{
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 void deleteMail(const RecMail&mail);
virtual void answeredMail(const RecMail&mail);
virtual int deleteAllMail(const Folder*);
virtual RecBody fetchBody( const RecMail &mail );
static void pop3_progress( size_t current, size_t maximum );
protected:
void login();
void logout();
POP3account *account;
- mailpop3 *m_pop3;
+ mailstorage*m_pop3;
+ mailfolder*m_folder;
};
#endif