author | alwin <alwin> | 2004-01-08 12:26:29 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-01-08 12:26:29 (UTC) |
commit | b85bc4484bcc0a53557b4759c3e9e58dc9059138 (patch) (side-by-side diff) | |
tree | 16fa84076bc8f2e3125db815db3c2628286e62f1 | |
parent | 3cb4363abdb17d2898b4792390672375ffcd2493 (diff) | |
download | opie-b85bc4484bcc0a53557b4759c3e9e58dc9059138.zip opie-b85bc4484bcc0a53557b4759c3e9e58dc9059138.tar.gz opie-b85bc4484bcc0a53557b4759c3e9e58dc9059138.tar.bz2 |
last selected mbox will hold so it will not called so often in outside loops
(it could cause segmentation faults, too - there is another bug in libetpan
I didn't found yet)
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.cpp | 63 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.h | 4 |
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 @@ -8,19 +8,37 @@ 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() @@ -99,33 +117,30 @@ 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) { @@ -386,16 +401,14 @@ RecBody IMAPwrapper::fetchBody(const RecMail&mail) 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(); @@ -459,13 +472,12 @@ 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; @@ -474,16 +486,14 @@ encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int> 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; @@ -770,16 +780,14 @@ void IMAPwrapper::deleteMail(const RecMail&mail) 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()); @@ -807,16 +815,14 @@ void IMAPwrapper::answeredMail(const RecMail&mail) 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()); @@ -869,17 +875,17 @@ int IMAPwrapper::deleteAllMail(const Folder*folder) 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(); @@ -1019,33 +1025,34 @@ encodedString* IMAPwrapper::fetchRawBody(const RecMail&mail) 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 @@ -51,13 +51,14 @@ public: 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); @@ -66,9 +67,10 @@ protected: 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 |