From c8d0dd53a75b7142a5ce924e4afbea77b86e56b0 Mon Sep 17 00:00:00 2001 From: alwin Date: Mon, 05 Jan 2004 22:21:41 +0000 Subject: bugfix in imapwrapper storemail for all possible mail-accounts raw body fetch in all wrappers unified public interface dialog for selecting a target mailbox started --- (limited to 'noncore/net') diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp index 77fa706..faa6982 100644 --- a/noncore/net/mail/accountview.cpp +++ b/noncore/net/mail/accountview.cpp @@ -3,6 +3,7 @@ #include #include "defines.h" #include "newmaildir.h" +#include "selectstore.h" #include #include @@ -90,20 +91,33 @@ QPopupMenu * POP3folderItem::getContextMenu() if (m) { m->insertItem(QObject::tr("Refresh header list",contextName),0); m->insertItem(QObject::tr("Delete all mails",contextName),1); + m->insertItem(QObject::tr("Download all mails",contextName),2); } return m; } +void POP3folderItem::downloadMails() +{ + Selectstore sels; + sels.showMaximized(); + sels.exec(); +} + void POP3folderItem::contextMenuSelected(int which) { AccountView * view = (AccountView*)listView(); switch (which) { case 0: + /* must be 'cause pop3 lists are cached */ + pop3->getWrapper()->logout(); view->refreshCurrent(); break; case 1: deleteAllMail(pop3->getWrapper(),folder); break; + case 2: + downloadMails(); + break; default: break; } @@ -158,11 +172,8 @@ void IMAPviewItem::refresh(QList&) refreshFolders(false); } -void IMAPviewItem::refreshFolders(bool force) +void IMAPviewItem::removeChilds() { - if (childCount()>0 && force==false) return; - QList *folders = wrapper->listFolders(); - QListViewItem *child = firstChild(); while ( child ) { QListViewItem *tmp = child; @@ -170,6 +181,16 @@ void IMAPviewItem::refreshFolders(bool force) delete tmp; } +} + +void IMAPviewItem::refreshFolders(bool force) +{ + if (childCount()>0 && force==false) return; + + removeChilds(); + + QList *folders = wrapper->listFolders(); + Folder *it; QListViewItem*item = 0; QListViewItem*titem = 0; @@ -246,6 +267,10 @@ void IMAPviewItem::contextMenuSelected(int id) case 1: createNewFolder(); break; + case 2: + removeChilds(); + wrapper->logout(); + break; default: break; } diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h index 1d2bf19..7131192 100644 --- a/noncore/net/mail/accountview.h +++ b/noncore/net/mail/accountview.h @@ -55,6 +55,9 @@ public: virtual QPopupMenu * getContextMenu(); virtual void contextMenuSelected(int); +protected: + void downloadMails(); + private: Folder *folder; POP3viewItem *pop3; @@ -78,6 +81,7 @@ protected: IMAPfolderItem*findSubItem(const QString&path,IMAPfolderItem*start=0); virtual void refreshFolders(bool force=false); virtual void createNewFolder(); + virtual void removeChilds(); private: IMAPaccount *account; diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h index 7c060db..9770991 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.h +++ b/noncore/net/mail/libmailwrapper/abstractmail.h @@ -26,6 +26,7 @@ public: virtual QString fetchTextPart(const RecMail&mail,const RecPart&part)=0; virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part)=0; virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part)=0; + virtual encodedString* fetchRawBody(const RecMail&mail)=0; virtual void deleteMail(const RecMail&mail)=0; virtual void answeredMail(const RecMail&mail)=0; diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp index 95b317a..d252159 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp @@ -466,6 +466,10 @@ encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList 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) { @@ -480,17 +484,24 @@ encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList } } set = mailimap_set_new_single(mail.getNumber()); - clist*id_list=clist_new(); - for (unsigned j=0; j < path.count();++j) { - uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); - *p_id = path[j]; - clist_append(id_list,p_id); - } - mailimap_section_part * section_part = mailimap_section_part_new(id_list); - mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); - mailimap_section * section = mailimap_section_new(section_spec); - mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); + clist*id_list = 0; + + /* if path == empty then its a request for the whole rfc822 mail and generates + a "fetch (body[])" statement on imap server */ + if (path.count()>0 ) { + id_list = clist_new(); + for (unsigned j=0; j < path.count();++j) { + uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); + *p_id = path[j]; + clist_append(id_list,p_id); + } + section_part = mailimap_section_part_new(id_list); + section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); + } + + section = mailimap_section_new(section_spec); + fetch_att = mailimap_fetch_att_new_body_section(section); fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); clist*result = 0; @@ -955,24 +966,28 @@ void IMAPwrapper::statusFolder(folderStat&target_stat,const QString & mailbox) r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_RECENT); r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_UNSEEN); r = mailimap_status(m_imap, mailbox.latin1(), att_list, &status); - for (cur = clist_begin(status->st_info_list); - cur != NULL ; cur = clist_next(cur)) { - mailimap_status_info * status_info; - status_info = (mailimap_status_info *)clist_content(cur); - switch (status_info->st_att) { - case MAILIMAP_STATUS_ATT_MESSAGES: - target_stat.message_count = status_info->st_value; - break; - case MAILIMAP_STATUS_ATT_RECENT: - target_stat.message_recent = status_info->st_value; - break; - case MAILIMAP_STATUS_ATT_UNSEEN: - target_stat.message_unseen = status_info->st_value; - break; + if (r==MAILIMAP_NO_ERROR&&status->st_info_list!=0) { + for (cur = clist_begin(status->st_info_list); + cur != NULL ; cur = clist_next(cur)) { + mailimap_status_info * status_info; + status_info = (mailimap_status_info *)clist_content(cur); + switch (status_info->st_att) { + case MAILIMAP_STATUS_ATT_MESSAGES: + target_stat.message_count = status_info->st_value; + break; + case MAILIMAP_STATUS_ATT_RECENT: + target_stat.message_recent = status_info->st_value; + break; + case MAILIMAP_STATUS_ATT_UNSEEN: + target_stat.message_unseen = status_info->st_value; + break; + } } + } else { + qDebug("Error retrieving status"); } - mailimap_mailbox_data_status_free(status); - mailimap_status_att_list_free(att_list); + if (status) mailimap_mailbox_data_status_free(status); + if (att_list) mailimap_status_att_list_free(att_list); } void IMAPwrapper::storeMessage(const char*msg,size_t length, const QString&folder) @@ -990,3 +1005,10 @@ const QString&IMAPwrapper::getType()const { return account->getType(); } + +encodedString* IMAPwrapper::fetchRawBody(const RecMail&mail) +{ + // dummy + QValueList path; + return fetchRawPart(mail,path,false); +} diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h index 6a9c411..b246f58 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.h +++ b/noncore/net/mail/libmailwrapper/imapwrapper.h @@ -36,6 +36,7 @@ public: virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); + virtual encodedString* fetchRawBody(const RecMail&mail); virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); virtual int deleteMbox(const Folder*folder); diff --git a/noncore/net/mail/libmailwrapper/mboxwrapper.cpp b/noncore/net/mail/libmailwrapper/mboxwrapper.cpp index 60f7507..3a0b30a 100644 --- a/noncore/net/mail/libmailwrapper/mboxwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/mboxwrapper.cpp @@ -172,7 +172,7 @@ void MBOXwrapper::storeMessage(const char*msg,size_t length, const QString&folde mailmbox_done(f); } -void MBOXwrapper::fetchRawBody(const RecMail&mail,char**target,size_t*length) +encodedString* MBOXwrapper::fetchRawBody(const RecMail&mail) { RecBody body; mailstorage*storage = mailstorage_new(NULL); @@ -190,14 +190,14 @@ void MBOXwrapper::fetchRawBody(const RecMail&mail,char**target,size_t*length) Global::statusMessage(tr("Error initializing mbox")); mailfolder_free(folder); mailstorage_free(storage); - return; + return 0; } r = mailsession_get_message(folder->fld_session, mail.getNumber(), &msg); if (r != MAIL_NO_ERROR) { Global::statusMessage(tr("Error fetching mail %i").arg(mail.getNumber())); mailfolder_free(folder); mailstorage_free(storage); - return; + return 0; } r = mailmessage_fetch(msg,&data,&size); if (r != MAIL_NO_ERROR) { @@ -205,13 +205,14 @@ void MBOXwrapper::fetchRawBody(const RecMail&mail,char**target,size_t*length) mailfolder_free(folder); mailstorage_free(storage); mailmessage_free(msg); - return; + return 0; } - *target = data; - *length = size; + encodedString*result = new encodedString(data,size); + mailfolder_free(folder); mailstorage_free(storage); mailmessage_free(msg); + return result; } void MBOXwrapper::deleteMails(const QString & mailbox,QList &target) diff --git a/noncore/net/mail/libmailwrapper/mboxwrapper.h b/noncore/net/mail/libmailwrapper/mboxwrapper.h index f97fce2..2794014 100644 --- a/noncore/net/mail/libmailwrapper/mboxwrapper.h +++ b/noncore/net/mail/libmailwrapper/mboxwrapper.h @@ -6,6 +6,7 @@ class RecMail; class RecBody; +class encodedString; struct mailmbox_folder; class MBOXwrapper : public Genericwrapper @@ -30,7 +31,7 @@ public: virtual RecBody fetchBody( const RecMail &mail ); static void mbox_progress( size_t current, size_t maximum ); - virtual void fetchRawBody(const RecMail&mail,char**target,size_t*length); + virtual encodedString* fetchRawBody(const RecMail&mail); virtual void deleteMails(const QString & mailbox,QList &target); virtual int deleteAllMail(const Folder*); virtual const QString&getType()const; diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp index 45408dd..72c145b 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp @@ -228,12 +228,19 @@ void POP3wrapper::statusFolder(folderStat&target_stat,const QString&) &target_stat.message_recent,&target_stat.message_unseen); } -void POP3wrapper::fetchRawBody(const RecMail&mail,char**target,size_t*length) +encodedString* POP3wrapper::fetchRawBody(const RecMail&mail) { + char*target=0; + size_t length=0; + encodedString*res = 0; mailmessage * mailmsg = 0; int err = mailsession_get_message(m_folder->fld_session, mail.getNumber(), &mailmsg); - err = mailmessage_fetch(mailmsg,target,length); + err = mailmessage_fetch(mailmsg,&target,&length); if (mailmsg) mailmessage_free(mailmsg); + if (target) { + res = new encodedString(target,length); + } + return res; } const QString&POP3wrapper::getType()const diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.h b/noncore/net/mail/libmailwrapper/pop3wrapper.h index b7e8f27..f0307b6 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.h +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.h @@ -5,6 +5,7 @@ #include "genericwrapper.h" #include +class encodedString; struct mailstorage; struct mailfolder; @@ -26,7 +27,7 @@ public: virtual int deleteAllMail(const Folder*); virtual RecBody fetchBody( const RecMail &mail ); - virtual void fetchRawBody(const RecMail&mail,char**target,size_t*length); + virtual encodedString* fetchRawBody(const RecMail&mail); virtual void logout(); virtual const QString&getType()const; static void pop3_progress( size_t current, size_t maximum ); diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp index e054365..00181ff 100644 --- a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp @@ -485,7 +485,7 @@ void SMTPwrapper::progress( size_t current, size_t maximum ) } } -void SMTPwrapper::storeMail(char*mail, size_t length, const QString&box) +void SMTPwrapper::storeMail(const char*mail, size_t length, const QString&box) { if (!mail) return; QString localfolders = AbstractMail::defaultLocalfolder(); @@ -536,7 +536,7 @@ void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) if (rcpts) smtp_address_list_free( rcpts ); } -int SMTPwrapper::smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp ) +int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) { char *server, *user, *pass; bool ssl; @@ -640,8 +640,6 @@ void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which) { - char*data = 0; - size_t length = 0; size_t curTok = 0; mailimf_fields *fields = 0; mailimf_field*ffrom = 0; @@ -649,11 +647,11 @@ int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which) char*from = 0; int res = 0; - wrap->fetchRawBody(*which,&data,&length); + encodedString * data = wrap->fetchRawBody(*which); if (!data) return 0; - int err = mailimf_fields_parse( data, length, &curTok, &fields ); + int err = mailimf_fields_parse( data->Content(), data->Length(), &curTok, &fields ); if (err != MAILIMF_NO_ERROR) { - free(data); + delete data; delete wrap; return 0; } @@ -662,16 +660,15 @@ int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which) ffrom = getField(fields, MAILIMF_FIELD_FROM ); from = getFrom(ffrom); - qDebug("Size: %i vs. %i",length,strlen(data)); if (rcpts && from) { - res = smtpSend(from,rcpts,data,length,smtp ); + res = smtpSend(from,rcpts,data->Content(),data->Length(),smtp ); } if (fields) { mailimf_fields_free(fields); fields = 0; } if (data) { - free(data); + delete data; } if (from) { free(from); diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.h b/noncore/net/mail/libmailwrapper/smtpwrapper.h index 4a4352f..04fc4b0 100644 --- a/noncore/net/mail/libmailwrapper/smtpwrapper.h +++ b/noncore/net/mail/libmailwrapper/smtpwrapper.h @@ -47,14 +47,14 @@ protected: void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ); clist *createRcptList( mailimf_fields *fields ); - static void storeMail(char*mail, size_t length, const QString&box); + static void storeMail(const char*mail, size_t length, const QString&box); static QString mailsmtpError( int err ); static void progress( size_t current, size_t maximum ); static void addRcpts( clist *list, mailimf_address_list *addr_list ); static char *getFrom( mailmime *mail ); static char *getFrom( mailimf_field *ffrom); static mailimf_field *getField( mailimf_fields *fields, int type ); - int smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp ); + int smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ); void storeMail(mailmime*mail, const QString&box); Settings *settings; diff --git a/noncore/net/mail/mail.pro b/noncore/net/mail/mail.pro index 96ffaa8..1abd2e8 100644 --- a/noncore/net/mail/mail.pro +++ b/noncore/net/mail/mail.pro @@ -11,7 +11,8 @@ HEADERS = defines.h \ mailistviewitem.h \ settingsdialog.h \ statuswidget.h \ - newmaildir.h + newmaildir.h \ + selectstore.h SOURCES = main.cpp \ opiemail.cpp \ @@ -24,7 +25,8 @@ SOURCES = main.cpp \ viewmailbase.cpp \ settingsdialog.cpp \ statuswidget.cpp \ - newmaildir.cpp + newmaildir.cpp \ + selectstore.cpp INTERFACES = editaccountsui.ui \ selectmailtypeui.ui \ @@ -36,7 +38,8 @@ INTERFACES = editaccountsui.ui \ composemailui.ui \ settingsdialogui.ui \ statuswidgetui.ui \ - newmaildirui.ui + newmaildirui.ui \ + selectstoreui.ui INCLUDEPATH += $(OPIEDIR)/include diff --git a/noncore/net/mail/selectstore.cpp b/noncore/net/mail/selectstore.cpp new file mode 100644 index 0000000..28ab5a8 --- a/dev/null +++ b/noncore/net/mail/selectstore.cpp @@ -0,0 +1,19 @@ +#include "selectstore.h" + +Selectstore::Selectstore(QWidget* parent, const char* name) + :selectstoreui(parent,name,true) +{ + +} + +Selectstore::~Selectstore() +{ +} + +void Selectstore::slotCreateNewFolder() +{ +} + +void Selectstore::slotMoveMail() +{ +} diff --git a/noncore/net/mail/selectstore.h b/noncore/net/mail/selectstore.h new file mode 100644 index 0000000..8b8e8ee --- a/dev/null +++ b/noncore/net/mail/selectstore.h @@ -0,0 +1,19 @@ +#ifndef _SELECTSTORE_H +#define _SELECTSTORE_H + +#include "selectstoreui.h" + +class Selectstore:public selectstoreui +{ + Q_OBJECT +public: + Selectstore(QWidget* parent = 0, const char* name = 0); + virtual ~Selectstore(); + +protected: + virtual void slotCreateNewFolder(); + virtual void slotMoveMail(); +protected slots: + +}; +#endif diff --git a/noncore/net/mail/selectstoreui.ui b/noncore/net/mail/selectstoreui.ui new file mode 100644 index 0000000..3741b71 --- a/dev/null +++ b/noncore/net/mail/selectstoreui.ui @@ -0,0 +1,244 @@ + +selectstoreui + + QDialog + + name + selectstoreui + + + geometry + + 0 + 0 + 190 + 273 + + + + caption + Select target box + + + layoutMargin + + + layoutSpacing + + + + margin + 2 + + + spacing + 2 + + + QLabel + + name + headlabel + + + text + <b>Store mail(s) to</b> + + + alignment + AlignCenter + + + hAlign + + + + QLayoutWidget + + name + Layout2 + + + + margin + 0 + + + spacing + 6 + + + QComboBox + + name + folderSelection + + + sizePolicy + + 3 + 0 + + + + + QLabel + + name + folderLabel + + + text + Folder: + + + alignment + AlignVCenter|AlignRight + + + hAlign + + + + QComboBox + + name + accountSelection + + + sizePolicy + + 3 + 0 + + + + + QLabel + + name + accountlabel + + + sizePolicy + + 1 + 1 + + + + text + Account: + + + alignment + AlignVCenter|AlignRight + + + hAlign + + + + + + Line + + name + Line1 + + + orientation + Horizontal + + + + QCheckBox + + name + newFoldersel + + + text + Create new folder + + + + QLineEdit + + name + newFolderedit + + + enabled + false + + + + Line + + name + Line2 + + + orientation + Horizontal + + + + QCheckBox + + name + selMove + + + text + Move mail(s) + + + + + name + Spacer2 + + + orientation + Vertical + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + + + + selMove + clicked() + selectstoreui + slotMoveMail() + + + newFoldersel + clicked() + selectstoreui + slotCreateNewFolder() + + slotMoveMail() + slotCreateNewFolder() + + + accountSelection + folderSelection + newFoldersel + newFolderedit + selMove + + -- cgit v0.9.0.2