summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-09 01:30:26 (UTC)
committer alwin <alwin>2003-12-09 01:30:26 (UTC)
commitb3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a (patch) (side-by-side diff)
tree425529f528eb7718e371523c079b8763b9ec6bb8
parent6142ad15ac50090b95bb5d80116c1750ffc515de (diff)
downloadopie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.zip
opie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.tar.gz
opie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.tar.bz2
- interface change for imapwrapper
- beginning of parsing the body-structure of mails not just simple return the whole body (this moment commented out 'cause it's only working for text/plain type mails)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp2
-rw-r--r--noncore/net/mail/imapwrapper.cpp302
-rw-r--r--noncore/net/mail/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp302
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.h17
-rw-r--r--noncore/net/mail/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/mailwrapper.h17
9 files changed, 427 insertions, 245 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index a531976..1bde886 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -58,13 +58,13 @@ void IMAPfolderItem::refresh(Maillist&target)
{
imap->getWrapper()->listMessages( folder->getName(),target );
}
QString IMAPfolderItem::fetchBody(const RecMail&aMail)
{
- return imap->getWrapper()->fetchBody(folder->getName(),aMail);
+ return imap->getWrapper()->fetchBody(aMail);
}
AccountView::AccountView( QWidget *parent, const char *name, WFlags flags )
: QListView( parent, name, flags )
{
connect( this, SIGNAL( clicked( QListViewItem * ) ),
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -1,84 +1,103 @@
#include <stdlib.h>
#include "imapwrapper.h"
-
+#include <libetpan/mailimap.h>
IMAPwrapper::IMAPwrapper( IMAPaccount *a )
{
account = a;
+ m_imap = 0;
}
-void imap_progress( size_t current, size_t maximum )
+IMAPwrapper::~IMAPwrapper()
+{
+ logout();
+}
+
+void IMAPwrapper::imap_progress( size_t current, size_t maximum )
{
qDebug( "IMAP: %i of %i", current, maximum );
}
-void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+void IMAPwrapper::login()
{
- const char *server, *user, *pass, *mb;
+ logout();
+ const char *server, *user, *pass;
uint16_t port;
int err = MAILIMAP_NO_ERROR;
- clist *result;
- clistcell *current;
- mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
- mailimap_fetch_type *fetchType;
- mailimap_set *set;
- mb = mailbox.latin1();
server = account->getServer().latin1();
port = account->getPort().toUInt();
user = account->getUser().latin1();
pass = account->getPassword().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
- return;
- }
-
+ m_imap = mailimap_new( 20, &imap_progress );
/* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
+ err = mailimap_socket_connect( m_imap, (char*)server, port );
if ( err != MAILIMAP_NO_ERROR &&
err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ qDebug("error connecting server: %s",m_imap->response);
+ mailimap_free( m_imap );
+ m_imap = 0;
return;
}
/* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
+ err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
- return;
+ qDebug("error logging in imap: %s",m_imap->response);
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
}
+}
+
+void IMAPwrapper::logout()
+{
+ int err = MAILIMAP_NO_ERROR;
+ if (!m_imap) return;
+ err = mailimap_logout( m_imap );
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+}
+
+void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+{
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mb = mailbox.latin1();
+ login();
+ if (!m_imap) {
+ return;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return;
}
- int last = imap->selection_info->exists;
+ int last = m_imap->selection_info->exists;
+
if (last == 0) {
qDebug("mailbox has no mails");
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ logout();
return;
}
-
result = clist_new();
/* the range has to start at 1!!! not with 0!!!! */
set = mailimap_set_new_interval( 1, last );
fetchAtt = mailimap_fetch_att_new_envelope();
fetchAttFlags = mailimap_fetch_att_new_flags();
fetchAttDate = mailimap_fetch_att_new_internaldate();
@@ -86,13 +105,13 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
//fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt);
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags);
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
/* cleans up the fetch_att's too! */
mailimap_fetch_type_free( fetchType );
QString date,subject,from;
@@ -103,95 +122,71 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
while ( current != 0 ) {
++i;
msg_att = (mailimap_msg_att*)current->data;
RecMail*m = parse_list_result(msg_att);
if (m) {
m->setNumber(i);
+ m->setMbox(mailbox);
target.append(m);
}
current = current->next;
}
} else {
- qDebug("Error fetching headers: %s",imap->response);
- }
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
+ qDebug("Error fetching headers: %s",m_imap->response);
+ }
+ logout();
clist_free(result);
- mailimap_free( imap );
}
QList<IMAPFolder>* IMAPwrapper::listFolders()
{
- const char *server, *user, *pass, *path, *mask;
- uint16_t port;
+ const char *path, *mask;
int err = MAILIMAP_NO_ERROR;
clist *result;
clistcell *current;
QList<IMAPFolder> * folders = new QList<IMAPFolder>();
folders->setAutoDelete( true );
-
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
- path = account->getPrefix().latin1();
-
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("error mailimap_new");
+ login();
+ if (!m_imap) {
return folders;
}
-
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- mailimap_free(imap);
- qDebug("error imap_socket_connect: %s",imap->response);
- return folders;
- }
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- mailimap_free(imap);
- qDebug("error logging in: %s",imap->response);
- return folders;
- }
/*
* First we have to check for INBOX 'cause it sometimes it's not inside the path.
* We must not forget to filter them out in next loop!
* it seems like ugly code. and yes - it is ugly code. but the best way.
*/
QString temp;
mask = "INBOX" ;
result = clist_new();
mailimap_mailbox_list *list;
- err = mailimap_list( imap, (char*)"", (char*)mask, &result );
+ err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
current = result->first;
for ( int i = result->count; i > 0; i-- ) {
list = (mailimap_mailbox_list *) current->data;
// it is better use the deep copy mechanism of qt itself
// instead of using strdup!
temp = list->mb;
folders->append( new IMAPFolder(temp));
current = current->next;
}
} else {
- qDebug("error fetching folders: %s",imap->response);
+ qDebug("error fetching folders: %s",m_imap->response);
}
mailimap_list_result_free( result );
/*
* second stage - get the other then inbox folders
*/
mask = "*" ;
+ path = account->getPrefix().latin1();
result = clist_new();
- err = mailimap_list( imap, (char*)path, (char*)mask, &result );
+ qDebug(path);
+ err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
current = result->first;
for ( int i = result->count; i > 0; i-- ) {
list = (mailimap_mailbox_list *) current->data;
// it is better use the deep copy mechanism of qt itself
// instead of using strdup!
@@ -200,18 +195,15 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
if (temp.lower()=="inbox")
continue;
folders->append(new IMAPFolder(temp));
}
} else {
- qDebug("error fetching folders");
+ qDebug("error fetching folders %s",m_imap->response);
}
mailimap_list_result_free( result );
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
return folders;
}
RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
{
RecMail * m = 0;
@@ -270,13 +262,12 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
default:
break;
}
} else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) {
mFlags.setBit(FLAG_RECENT);
}
-
cf = cf->next;
}
continue;
}
if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) {
qDebug( "header: \n%s", item->msg_att_static->rfc822_header );
@@ -334,87 +325,166 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
if (m) {
m->setFlags(mFlags);
}
return m;
}
-QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#if 1
+QString IMAPwrapper::fetchBody(const RecMail&mail)
{
QString body = "";
- const char *server, *user, *pass, *mb;
- uint16_t port;
+ const char *mb;
int err = MAILIMAP_NO_ERROR;
clist *result;
clistcell *current;
mailimap_fetch_att *fetchAtt;
mailimap_fetch_type *fetchType;
mailimap_set *set;
- mb = mailbox.latin1();
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
+ mb = mail.getMbox().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
+ login();
+ if (!m_imap) {
+ return body;
+ }
+ /* select mailbox READONLY for operations */
+ err = mailimap_examine( m_imap, (char*)mb);
+ if ( err != MAILIMAP_NO_ERROR ) {
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
- /* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
- return body;
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
}
- /* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
+ clist_free(result);
+ logout();
+ return body;
+}
+
+#else
+QString IMAPwrapper::fetchBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mailimap_body*body_desc;
+
+ mb = mail.getMbox().latin1();
+
+ login();
+ if (!m_imap) {
return body;
}
-
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
+ return body;
+ }
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_body();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+ body_desc = item->msg_att_static->body;
+ if (body_desc->type==MAILIMAP_BODY_1PART) {
+ body = searchBodyText(mail,body_desc->body_1part);
+ } else {
+ }
+
+ } else {
+ qDebug("error fetching body: %s",m_imap->response);
+ }
+
+ clist_free(result);
+ logout();
+ return body;
+}
+#endif
+
+QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
+{
+ QString Body="";
+ if (!mailDescription) {
+ return Body;
+ }
+ switch (mailDescription->type) {
+ case MAILIMAP_BODY_TYPE_1PART_TEXT:
+ return getPlainBody(mail);
+ break;
+ default:
+ break;
+ }
+ return Body;
+}
+
+QString IMAPwrapper::getPlainBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mail.getMbox().latin1();
+
+ if (!m_imap) {
return body;
}
result = clist_new();
/* the range has to start at 1!!! not with 0!!!! */
set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
fetchAtt = mailimap_fetch_att_new_rfc822_text();
fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
mailimap_fetch_type_free( fetchType );
if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
mailimap_msg_att * msg_att;
msg_att = (mailimap_msg_att*)current->data;
mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
-
if (item->msg_att_static && item->msg_att_static->rfc822_text) {
body = item->msg_att_static->rfc822_text;
}
} else {
- qDebug("error fetching text: %s",imap->response);
+ qDebug("error fetching text: %s",m_imap->response);
}
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
clist_free(result);
-
return body;
}
-
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -1,25 +1,33 @@
#ifndef __IMAPWRAPPER
#define __IMAPWRAPPER
#include "mailwrapper.h"
-#include <libetpan/mailimap.h>
+
+struct mailimap;
+struct mailimap_body_type_1part;
class IMAPwrapper : public QObject
{
Q_OBJECT
public:
IMAPwrapper( IMAPaccount *a );
+ virtual ~IMAPwrapper();
QList<IMAPFolder>* listFolders();
void listMessages(const QString & mailbox,Maillist&target );
- QString fetchBody(const QString & mailbox,const RecMail&mail);
+ QString fetchBody(const RecMail&mail);
+ static void imap_progress( size_t current, size_t maximum );
protected:
RecMail*parse_list_result(mailimap_msg_att*);
+ void login();
+ void logout();
+ QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
+ QString getPlainBody(const RecMail&mail);
private:
IMAPaccount *account;
-
+ mailimap *m_imap;
};
#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -1,84 +1,103 @@
#include <stdlib.h>
#include "imapwrapper.h"
-
+#include <libetpan/mailimap.h>
IMAPwrapper::IMAPwrapper( IMAPaccount *a )
{
account = a;
+ m_imap = 0;
}
-void imap_progress( size_t current, size_t maximum )
+IMAPwrapper::~IMAPwrapper()
+{
+ logout();
+}
+
+void IMAPwrapper::imap_progress( size_t current, size_t maximum )
{
qDebug( "IMAP: %i of %i", current, maximum );
}
-void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+void IMAPwrapper::login()
{
- const char *server, *user, *pass, *mb;
+ logout();
+ const char *server, *user, *pass;
uint16_t port;
int err = MAILIMAP_NO_ERROR;
- clist *result;
- clistcell *current;
- mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
- mailimap_fetch_type *fetchType;
- mailimap_set *set;
- mb = mailbox.latin1();
server = account->getServer().latin1();
port = account->getPort().toUInt();
user = account->getUser().latin1();
pass = account->getPassword().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
- return;
- }
-
+ m_imap = mailimap_new( 20, &imap_progress );
/* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
+ err = mailimap_socket_connect( m_imap, (char*)server, port );
if ( err != MAILIMAP_NO_ERROR &&
err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
+ qDebug("error connecting server: %s",m_imap->response);
+ mailimap_free( m_imap );
+ m_imap = 0;
return;
}
/* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
+ err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
- return;
+ qDebug("error logging in imap: %s",m_imap->response);
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
}
+}
+
+void IMAPwrapper::logout()
+{
+ int err = MAILIMAP_NO_ERROR;
+ if (!m_imap) return;
+ err = mailimap_logout( m_imap );
+ err = mailimap_close( m_imap );
+ mailimap_free( m_imap );
+ m_imap = 0;
+}
+
+void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
+{
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mb = mailbox.latin1();
+ login();
+ if (!m_imap) {
+ return;
+ }
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return;
}
- int last = imap->selection_info->exists;
+ int last = m_imap->selection_info->exists;
+
if (last == 0) {
qDebug("mailbox has no mails");
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ logout();
return;
}
-
result = clist_new();
/* the range has to start at 1!!! not with 0!!!! */
set = mailimap_set_new_interval( 1, last );
fetchAtt = mailimap_fetch_att_new_envelope();
fetchAttFlags = mailimap_fetch_att_new_flags();
fetchAttDate = mailimap_fetch_att_new_internaldate();
@@ -86,13 +105,13 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
//fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt);
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags);
mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
/* cleans up the fetch_att's too! */
mailimap_fetch_type_free( fetchType );
QString date,subject,from;
@@ -103,95 +122,71 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
while ( current != 0 ) {
++i;
msg_att = (mailimap_msg_att*)current->data;
RecMail*m = parse_list_result(msg_att);
if (m) {
m->setNumber(i);
+ m->setMbox(mailbox);
target.append(m);
}
current = current->next;
}
} else {
- qDebug("Error fetching headers: %s",imap->response);
- }
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
+ qDebug("Error fetching headers: %s",m_imap->response);
+ }
+ logout();
clist_free(result);
- mailimap_free( imap );
}
QList<IMAPFolder>* IMAPwrapper::listFolders()
{
- const char *server, *user, *pass, *path, *mask;
- uint16_t port;
+ const char *path, *mask;
int err = MAILIMAP_NO_ERROR;
clist *result;
clistcell *current;
QList<IMAPFolder> * folders = new QList<IMAPFolder>();
folders->setAutoDelete( true );
-
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
- path = account->getPrefix().latin1();
-
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("error mailimap_new");
+ login();
+ if (!m_imap) {
return folders;
}
-
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- mailimap_free(imap);
- qDebug("error imap_socket_connect: %s",imap->response);
- return folders;
- }
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- mailimap_free(imap);
- qDebug("error logging in: %s",imap->response);
- return folders;
- }
/*
* First we have to check for INBOX 'cause it sometimes it's not inside the path.
* We must not forget to filter them out in next loop!
* it seems like ugly code. and yes - it is ugly code. but the best way.
*/
QString temp;
mask = "INBOX" ;
result = clist_new();
mailimap_mailbox_list *list;
- err = mailimap_list( imap, (char*)"", (char*)mask, &result );
+ err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
current = result->first;
for ( int i = result->count; i > 0; i-- ) {
list = (mailimap_mailbox_list *) current->data;
// it is better use the deep copy mechanism of qt itself
// instead of using strdup!
temp = list->mb;
folders->append( new IMAPFolder(temp));
current = current->next;
}
} else {
- qDebug("error fetching folders: %s",imap->response);
+ qDebug("error fetching folders: %s",m_imap->response);
}
mailimap_list_result_free( result );
/*
* second stage - get the other then inbox folders
*/
mask = "*" ;
+ path = account->getPrefix().latin1();
result = clist_new();
- err = mailimap_list( imap, (char*)path, (char*)mask, &result );
+ qDebug(path);
+ err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
if ( err == MAILIMAP_NO_ERROR ) {
current = result->first;
for ( int i = result->count; i > 0; i-- ) {
list = (mailimap_mailbox_list *) current->data;
// it is better use the deep copy mechanism of qt itself
// instead of using strdup!
@@ -200,18 +195,15 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
if (temp.lower()=="inbox")
continue;
folders->append(new IMAPFolder(temp));
}
} else {
- qDebug("error fetching folders");
+ qDebug("error fetching folders %s",m_imap->response);
}
mailimap_list_result_free( result );
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
return folders;
}
RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
{
RecMail * m = 0;
@@ -270,13 +262,12 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
default:
break;
}
} else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) {
mFlags.setBit(FLAG_RECENT);
}
-
cf = cf->next;
}
continue;
}
if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) {
qDebug( "header: \n%s", item->msg_att_static->rfc822_header );
@@ -334,87 +325,166 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
if (m) {
m->setFlags(mFlags);
}
return m;
}
-QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail)
+#if 1
+QString IMAPwrapper::fetchBody(const RecMail&mail)
{
QString body = "";
- const char *server, *user, *pass, *mb;
- uint16_t port;
+ const char *mb;
int err = MAILIMAP_NO_ERROR;
clist *result;
clistcell *current;
mailimap_fetch_att *fetchAtt;
mailimap_fetch_type *fetchType;
mailimap_set *set;
- mb = mailbox.latin1();
- server = account->getServer().latin1();
- port = account->getPort().toUInt();
- user = account->getUser().latin1();
- pass = account->getPassword().latin1();
+ mb = mail.getMbox().latin1();
- mailimap *imap = mailimap_new( 20, &imap_progress );
- if ( imap == NULL ) {
- qDebug("IMAP Memory error");
+ login();
+ if (!m_imap) {
+ return body;
+ }
+ /* select mailbox READONLY for operations */
+ err = mailimap_examine( m_imap, (char*)mb);
+ if ( err != MAILIMAP_NO_ERROR ) {
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
return body;
}
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_rfc822_text();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
- /* connect */
- err = mailimap_socket_connect( imap, (char*)server, port );
- if ( err != MAILIMAP_NO_ERROR &&
- err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
- err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
- qDebug("error connecting server: %s",imap->response);
- mailimap_free( imap );
- return body;
+ if (item->msg_att_static && item->msg_att_static->rfc822_text) {
+ body = item->msg_att_static->rfc822_text;
+ }
+ } else {
+ qDebug("error fetching text: %s",m_imap->response);
}
- /* login */
- err = mailimap_login_simple( imap, (char*)user, (char*)pass );
- if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error logging in imap: %s",imap->response);
- err = mailimap_close( imap );
- mailimap_free( imap );
+ clist_free(result);
+ logout();
+ return body;
+}
+
+#else
+QString IMAPwrapper::fetchBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+ mailimap_body*body_desc;
+
+ mb = mail.getMbox().latin1();
+
+ login();
+ if (!m_imap) {
return body;
}
-
/* select mailbox READONLY for operations */
- err = mailimap_examine( imap, (char*)mb);
+ err = mailimap_examine( m_imap, (char*)mb);
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",imap->response);
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
+ qDebug("error selecting mailbox: %s",m_imap->response);
+ logout();
+ return body;
+ }
+ result = clist_new();
+ /* the range has to start at 1!!! not with 0!!!! */
+ set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
+ fetchAtt = mailimap_fetch_att_new_body();
+ fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
+ mailimap_set_free( set );
+ mailimap_fetch_type_free( fetchType );
+
+ if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
+ mailimap_msg_att * msg_att;
+ msg_att = (mailimap_msg_att*)current->data;
+ mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
+ body_desc = item->msg_att_static->body;
+ if (body_desc->type==MAILIMAP_BODY_1PART) {
+ body = searchBodyText(mail,body_desc->body_1part);
+ } else {
+ }
+
+ } else {
+ qDebug("error fetching body: %s",m_imap->response);
+ }
+
+ clist_free(result);
+ logout();
+ return body;
+}
+#endif
+
+QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
+{
+ QString Body="";
+ if (!mailDescription) {
+ return Body;
+ }
+ switch (mailDescription->type) {
+ case MAILIMAP_BODY_TYPE_1PART_TEXT:
+ return getPlainBody(mail);
+ break;
+ default:
+ break;
+ }
+ return Body;
+}
+
+QString IMAPwrapper::getPlainBody(const RecMail&mail)
+{
+ QString body = "";
+ const char *mb;
+ int err = MAILIMAP_NO_ERROR;
+ clist *result;
+ clistcell *current;
+ mailimap_fetch_att *fetchAtt;
+ mailimap_fetch_type *fetchType;
+ mailimap_set *set;
+
+ mb = mail.getMbox().latin1();
+
+ if (!m_imap) {
return body;
}
result = clist_new();
/* the range has to start at 1!!! not with 0!!!! */
set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
fetchAtt = mailimap_fetch_att_new_rfc822_text();
fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
- err = mailimap_fetch( imap, set, fetchType, &result );
+ err = mailimap_fetch( m_imap, set, fetchType, &result );
mailimap_set_free( set );
mailimap_fetch_type_free( fetchType );
if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
mailimap_msg_att * msg_att;
msg_att = (mailimap_msg_att*)current->data;
mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
-
if (item->msg_att_static && item->msg_att_static->rfc822_text) {
body = item->msg_att_static->rfc822_text;
}
} else {
- qDebug("error fetching text: %s",imap->response);
+ qDebug("error fetching text: %s",m_imap->response);
}
-
- err = mailimap_logout( imap );
- err = mailimap_close( imap );
- mailimap_free( imap );
clist_free(result);
-
return body;
}
-
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -1,25 +1,33 @@
#ifndef __IMAPWRAPPER
#define __IMAPWRAPPER
#include "mailwrapper.h"
-#include <libetpan/mailimap.h>
+
+struct mailimap;
+struct mailimap_body_type_1part;
class IMAPwrapper : public QObject
{
Q_OBJECT
public:
IMAPwrapper( IMAPaccount *a );
+ virtual ~IMAPwrapper();
QList<IMAPFolder>* listFolders();
void listMessages(const QString & mailbox,Maillist&target );
- QString fetchBody(const QString & mailbox,const RecMail&mail);
+ QString fetchBody(const RecMail&mail);
+ static void imap_progress( size_t current, size_t maximum );
protected:
RecMail*parse_list_result(mailimap_msg_att*);
+ void login();
+ void logout();
+ QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
+ QString getPlainBody(const RecMail&mail);
private:
IMAPaccount *account;
-
+ mailimap *m_imap;
};
#endif
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.cpp b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
@@ -626,13 +626,13 @@ void MailWrapper::sendMail( Mail mail )
Mail::Mail()
:name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("")
{
}
RecMail::RecMail()
- :subject(""),date(""),msg_number(0),msg_flags(7)
+ :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
{
}
#if 0
void RecMail::setDate(const QString&aDate)
{
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.h b/noncore/net/mail/libmailwrapper/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.h
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.h
@@ -36,12 +36,23 @@ protected:
#define FLAG_DELETED 2
#define FLAG_SEEN 3
#define FLAG_DRAFT 4
#define FLAG_RECENT 5
/* a class to describe mails in a mailbox */
+/* Attention!
+ From programmers point of view it would make sense to
+ store the mail body into this class, too.
+ But: not from the point of view of the device.
+ Mailbodies can be real large. So we request them when
+ needed from the mail-wrapper class direct from the server itself
+ (imap) or from a file-based cache (pop3?)
+ So there is no interface "const QString&body()" but you should
+ make a request to the mailwrapper with this class as parameter to
+ get the body. Same words for the attachments.
+*/
class RecMail
{
public:
RecMail();
virtual ~RecMail(){}
@@ -50,22 +61,24 @@ public:
const QString&getDate()const{ return date; }
void setDate( const QString&a ) { date = a; }
const QString&getFrom()const{ return from; }
void setFrom( const QString&a ) { from = a; }
const QString&getSubject()const { return subject; }
void setSubject( const QString&s ) { subject = s; }
- void setFlags(const QBitArray&flags){msg_flags = flags;}
+ const QString&getMbox()const{return mbox;}
+ void setMbox(const QString&box){mbox = box;}
const QBitArray&getFlags()const{return msg_flags;}
+ void setFlags(const QBitArray&flags){msg_flags = flags;}
#if 0
void setDate(const QString&dstring);
void setDate(const QDateTime&date){mDate = date;}
QString getDate()const{return mDate.toString();}
#endif
protected:
- QString subject,date,from;
+ QString subject,date,from,mbox;
int msg_number;
QBitArray msg_flags;
#if 0
QDateTime mDate;
#endif
};
diff --git a/noncore/net/mail/mailwrapper.cpp b/noncore/net/mail/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/mailwrapper.cpp
+++ b/noncore/net/mail/mailwrapper.cpp
@@ -626,13 +626,13 @@ void MailWrapper::sendMail( Mail mail )
Mail::Mail()
:name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("")
{
}
RecMail::RecMail()
- :subject(""),date(""),msg_number(0),msg_flags(7)
+ :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
{
}
#if 0
void RecMail::setDate(const QString&aDate)
{
diff --git a/noncore/net/mail/mailwrapper.h b/noncore/net/mail/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/mailwrapper.h
+++ b/noncore/net/mail/mailwrapper.h
@@ -36,12 +36,23 @@ protected:
#define FLAG_DELETED 2
#define FLAG_SEEN 3
#define FLAG_DRAFT 4
#define FLAG_RECENT 5
/* a class to describe mails in a mailbox */
+/* Attention!
+ From programmers point of view it would make sense to
+ store the mail body into this class, too.
+ But: not from the point of view of the device.
+ Mailbodies can be real large. So we request them when
+ needed from the mail-wrapper class direct from the server itself
+ (imap) or from a file-based cache (pop3?)
+ So there is no interface "const QString&body()" but you should
+ make a request to the mailwrapper with this class as parameter to
+ get the body. Same words for the attachments.
+*/
class RecMail
{
public:
RecMail();
virtual ~RecMail(){}
@@ -50,22 +61,24 @@ public:
const QString&getDate()const{ return date; }
void setDate( const QString&a ) { date = a; }
const QString&getFrom()const{ return from; }
void setFrom( const QString&a ) { from = a; }
const QString&getSubject()const { return subject; }
void setSubject( const QString&s ) { subject = s; }
- void setFlags(const QBitArray&flags){msg_flags = flags;}
+ const QString&getMbox()const{return mbox;}
+ void setMbox(const QString&box){mbox = box;}
const QBitArray&getFlags()const{return msg_flags;}
+ void setFlags(const QBitArray&flags){msg_flags = flags;}
#if 0
void setDate(const QString&dstring);
void setDate(const QDateTime&date){mDate = date;}
QString getDate()const{return mDate.toString();}
#endif
protected:
- QString subject,date,from;
+ QString subject,date,from,mbox;
int msg_number;
QBitArray msg_flags;
#if 0
QDateTime mDate;
#endif
};