summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp63
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h4
2 files changed, 38 insertions, 29 deletions
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 23c678b..98634a3 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -6,23 +6,41 @@
#include "mailtypes.h"
#include "logindialog.h"
IMAPwrapper::IMAPwrapper( IMAPaccount *a )
: AbstractMail()
{
account = a;
m_imap = 0;
+ m_Lastmbox = "";
}
IMAPwrapper::~IMAPwrapper()
{
logout();
}
+/* to avoid to often select statements in loops etc.
+ we trust that we are logged in and connection is established!*/
+int IMAPwrapper::selectMbox(const QString&mbox)
+{
+ if (mbox == m_Lastmbox) {
+ return MAILIMAP_NO_ERROR;
+ }
+ int err = mailimap_select( m_imap, (char*)mbox.latin1());
+ if ( err != MAILIMAP_NO_ERROR ) {
+ qDebug("error selecting mailbox: %s",m_imap->imap_response);
+ m_Lastmbox = "";
+ return err;
+ }
+ m_Lastmbox = mbox;
+ return err;
+}
+
void IMAPwrapper::imap_progress( size_t current, size_t maximum )
{
qDebug( "IMAP: %i of %i", current, maximum );
}
void IMAPwrapper::login()
{
const char *server, *user, *pass;
@@ -97,37 +115,34 @@ void IMAPwrapper::login()
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;
+ m_Lastmbox = "";
}
void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
{
- const char *mb = 0;
int err = MAILIMAP_NO_ERROR;
clist *result = 0;
clistcell *current;
-// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
mailimap_fetch_type *fetchType = 0;
mailimap_set *set = 0;
- mb = mailbox.latin1();
login();
if (!m_imap) {
return;
}
/* select mailbox READONLY for operations */
- err = mailimap_examine( m_imap, (char*)mb);
+ err = selectMbox(mailbox);
if ( err != MAILIMAP_NO_ERROR ) {
- Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
return;
}
int last = m_imap->imap_selection_info->sel_exists;
if (last == 0) {
Global::statusMessage(tr("Mailbox has no mails"));
return;
@@ -384,20 +399,18 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail)
mailimap_body*body_desc = 0;
mb = mail.getMbox().latin1();
login();
if (!m_imap) {
return body;
}
-
- err = mailimap_select( m_imap, (char*)mb);
+ err = selectMbox(mail.getMbox());
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",m_imap->imap_response);
return body;
}
/* the range has to start at 1!!! not with 0!!!! */
set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
fetchAtt = mailimap_fetch_att_new_bodystructure();
fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
err = mailimap_fetch( m_imap, set, fetchType, &result );
@@ -457,35 +470,32 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
}
}
return l;
}
encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
{
encodedString*res=new encodedString;
- const char*mb;
int err;
mailimap_fetch_type *fetchType;
mailimap_set *set;
clistcell*current,*cur;
mailimap_section_part * section_part = 0;
mailimap_section_spec * section_spec = 0;
mailimap_section * section = 0;
mailimap_fetch_att * fetch_att = 0;
login();
if (!m_imap) {
return res;
}
if (!internal_call) {
- mb = mail.getMbox().latin1();
- err = mailimap_select( m_imap, (char*)mb);
+ err = selectMbox(mail.getMbox());
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox: %s",m_imap->imap_response);
return res;
}
}
set = mailimap_set_new_single(mail.getNumber());
clist*id_list = 0;
/* if path == empty then its a request for the whole rfc822 mail and generates
@@ -768,20 +778,18 @@ void IMAPwrapper::deleteMail(const RecMail&mail)
mailimap_flag_list*flist;
mailimap_set *set;
mailimap_store_att_flags * store_flags;
int err;
login();
if (!m_imap) {
return;
}
- const char *mb = mail.getMbox().latin1();
- err = mailimap_select( m_imap, (char*)mb);
+ err = selectMbox(mail.getMbox());
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox for delete: %s",m_imap->imap_response);
return;
}
flist = mailimap_flag_list_new_empty();
mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
store_flags = mailimap_store_att_flags_new_set_flags(flist);
set = mailimap_set_new_single(mail.getNumber());
err = mailimap_store(m_imap,set,store_flags);
mailimap_set_free( set );
@@ -805,20 +813,18 @@ void IMAPwrapper::answeredMail(const RecMail&mail)
mailimap_flag_list*flist;
mailimap_set *set;
mailimap_store_att_flags * store_flags;
int err;
login();
if (!m_imap) {
return;
}
- const char *mb = mail.getMbox().latin1();
- err = mailimap_select( m_imap, (char*)mb);
+ err = selectMbox(mail.getMbox());
if ( err != MAILIMAP_NO_ERROR ) {
- qDebug("error selecting mailbox for mark: %s",m_imap->imap_response);
return;
}
flist = mailimap_flag_list_new_empty();
mailimap_flag_list_add(flist,mailimap_flag_new_answered());
store_flags = mailimap_store_att_flags_new_add_flags(flist);
set = mailimap_set_new_single(mail.getNumber());
err = mailimap_store(m_imap,set,store_flags);
mailimap_set_free( set );
@@ -867,21 +873,21 @@ int IMAPwrapper::deleteAllMail(const Folder*folder)
{
login();
if (!m_imap) {
return 0;
}
mailimap_flag_list*flist;
mailimap_set *set;
mailimap_store_att_flags * store_flags;
- int err = mailimap_select( m_imap, folder->getName().latin1());
+ int err = selectMbox(folder->getName());
if ( err != MAILIMAP_NO_ERROR ) {
- Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
return 0;
}
+
int last = m_imap->imap_selection_info->sel_exists;
if (last == 0) {
Global::statusMessage(tr("Mailbox has no mails!"));
return 0;
}
flist = mailimap_flag_list_new_empty();
mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
store_flags = mailimap_store_att_flags_new_set_flags(flist);
@@ -1017,35 +1023,36 @@ encodedString* IMAPwrapper::fetchRawBody(const RecMail&mail)
{
// dummy
QValueList<int> path;
return fetchRawPart(mail,path,false);
}
void IMAPwrapper::mvcpAllMails(Folder*fromFolder,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit)
{
- qDebug("mvcp mail imap");
if (targetWrapper != this) {
AbstractMail::mvcpAllMails(fromFolder,targetFolder,targetWrapper,moveit);
qDebug("Using generic");
return;
}
- qDebug("Using internal");
mailimap_set *set = 0;
-
- int err = mailimap_select( m_imap, fromFolder->getName().latin1());
+ login();
+ if (!m_imap) {
+ return;
+ }
+ int err = selectMbox(fromFolder->getName());
if ( err != MAILIMAP_NO_ERROR ) {
- Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
return;
}
-
int last = m_imap->imap_selection_info->sel_exists;
set = mailimap_set_new_interval( 1, last );
err = mailimap_copy(m_imap,set,targetFolder.latin1());
+ mailimap_set_free( set );
if ( err != MAILIMAP_NO_ERROR ) {
- Global::statusMessage(tr("error copy mails: %1").arg(m_imap->imap_response));
+ QString error_msg = tr("error copy mails: %1").arg(m_imap->imap_response);
+ Global::statusMessage(error_msg);
+ qDebug(error_msg);
return;
}
- mailimap_set_free( set );
if (moveit) {
deleteAllMail(fromFolder);
}
}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 07c6210..99986c2 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -49,26 +49,28 @@ public:
virtual const QString&getName()const;
protected:
RecMail*parse_list_result(mailimap_msg_att*);
void login();
virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call);
-
+ int selectMbox(const QString&mbox);
+
void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
void fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which);
void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=1);
/* just helpers */
static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
static QStringList address_list_to_stringlist(clist*list);
IMAPaccount *account;
mailimap *m_imap;
+ QString m_Lastmbox;
};
#endif