-rw-r--r-- | noncore/net/mail/abstractmail.h | 9 | ||||
-rw-r--r-- | noncore/net/mail/accountview.cpp | 179 | ||||
-rw-r--r-- | noncore/net/mail/accountview.h | 27 | ||||
-rw-r--r-- | noncore/net/mail/imapwrapper.cpp | 124 | ||||
-rw-r--r-- | noncore/net/mail/imapwrapper.h | 4 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/abstractmail.h | 9 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.cpp | 124 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.h | 4 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/mailwrapper.cpp | 4 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/mailwrapper.h | 11 | ||||
-rw-r--r-- | noncore/net/mail/mail.pro | 37 | ||||
-rw-r--r-- | noncore/net/mail/mailwrapper.cpp | 4 | ||||
-rw-r--r-- | noncore/net/mail/mailwrapper.h | 11 | ||||
-rw-r--r-- | noncore/net/mail/mainwindow.cpp | 12 | ||||
-rw-r--r-- | noncore/net/mail/newmaildir.cpp | 34 | ||||
-rw-r--r-- | noncore/net/mail/newmaildir.h | 20 | ||||
-rw-r--r-- | noncore/net/mail/newmaildirui.ui | 100 |
17 files changed, 639 insertions, 74 deletions
diff --git a/noncore/net/mail/abstractmail.h b/noncore/net/mail/abstractmail.h index 509b68e..b609aa7 100644 --- a/noncore/net/mail/abstractmail.h +++ b/noncore/net/mail/abstractmail.h @@ -30,2 +30,11 @@ public: virtual void cleanMimeCache(){}; + virtual int deleteAllMail(const Folder*){return 1;} + + /* mail box methods */ + /* parameter is the box to create. + * if the implementing subclass has prefixes, + * them has to be appended automatic. + */ + virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false){return 0;} + virtual int deleteMbox(const Folder*){return 1;} diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp index 59e8bc0..8aac14b 100644 --- a/noncore/net/mail/accountview.cpp +++ b/noncore/net/mail/accountview.cpp @@ -4,2 +4,5 @@ #include "defines.h" +#include "newmaildir.h" +#include <qmessagebox.h> +#include <qpopupmenu.h> @@ -8,3 +11,2 @@ */ - POP3viewItem::POP3viewItem( POP3account *a, QListView *parent ) @@ -130,3 +132,8 @@ void IMAPviewItem::refresh(QList<RecMail>&) { - if (childCount()>0) return; + refreshFolders(false); +} + +void IMAPviewItem::refreshFolders(bool force) +{ + if (childCount()>0 && force==false) return; QList<Folder> *folders = wrapper->listFolders(); @@ -166,3 +173,2 @@ void IMAPviewItem::refresh(QList<RecMail>&) item = new IMAPfolderItem(it,pitem,pitem->firstChild(),this); - item->setSelectable(it->may_select()); /* setup the short name */ @@ -172,3 +178,2 @@ void IMAPviewItem::refresh(QList<RecMail>&) item = new IMAPfolderItem( it, this , item ); - item->setSelectable(it->may_select()); } @@ -178,2 +183,47 @@ void IMAPviewItem::refresh(QList<RecMail>&) +QPopupMenu * IMAPviewItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + m->insertItem(QObject::tr("Refresh folder list","IMAPviewItem"),0); + m->insertItem(QObject::tr("Create new folder","IMAPviewItem"),1); + m->insertSeparator(); + m->insertItem(QObject::tr("Disconnect","IMAPviewItem"),2); + } + return m; +} + +void IMAPviewItem::createNewFolder() +{ + Newmdirdlg ndirdlg; + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + bool makesubs = ndirdlg.subpossible(); + QString delemiter = "/"; + IMAPfolderItem*item = (IMAPfolderItem*)firstChild(); + if (item) { + delemiter = item->Delemiter(); + } + if (wrapper->createMbox(ndir,0,delemiter,makesubs)) { + refreshFolders(true); + } + } +} + +void IMAPviewItem::contextMenuSelected(int id) +{ + qDebug("Id selected: %i",id); + switch (id) { + case 0: + refreshFolders(true); + break; + case 1: + createNewFolder(); + break; + default: + break; + } +} + RecBody IMAPviewItem::fetchBody(const RecMail&) @@ -214,2 +264,7 @@ IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPfolderItem *parent , QLi +const QString& IMAPfolderItem::Delemiter()const +{ + return folder->Separator(); +} + bool IMAPfolderItem::matchName(const QString&name)const @@ -221,4 +276,7 @@ void IMAPfolderItem::refresh(QList<RecMail>&target) { - if (folder->may_select()) + if (folder->may_select()) { imap->getWrapper()->listMessages( folder->getName(),target ); + } else { + target.clear(); + } } @@ -230,2 +288,86 @@ RecBody IMAPfolderItem::fetchBody(const RecMail&aMail) +QPopupMenu * IMAPfolderItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + if (folder->may_select()) { + m->insertItem(QObject::tr("Refresh header list","IMAPfolderItem"),0); + m->insertItem(QObject::tr("Delete all mails","IMAPfolderItem"),1); + } + if (folder->no_inferior()==false) { + m->insertItem(QObject::tr("Create new subfolder","IMAPfolderItem"),2); + } + if (folder->getDisplayName().lower()!="inbox") { + m->insertItem(QObject::tr("Delete folder","IMAPfolderItem"),3); + } + } + return m; +} + +void IMAPfolderItem::deleteAllMails() +{ + int yesno = QMessageBox::warning(0,QObject::tr("Delete all mails","IMAPfolderItem"), + QObject::tr("<center>Realy delete all mails in box <br>%1</center>","IMAPfolderItem").arg(folder->getDisplayName()), + QObject::tr("Yes","IMAPfolderItem"), + QObject::tr("No","IMAPfolderItem"),QString::null,1,1); + qDebug("Auswahl: %i",yesno); + if (yesno == 0) { + if (imap->getWrapper()->deleteAllMail(folder)) { + AccountView * view = (AccountView*)listView(); + if (view) view->refreshCurrent(); + } + } +} + +void IMAPfolderItem::createNewFolder() +{ + Newmdirdlg ndirdlg; + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + bool makesubs = ndirdlg.subpossible(); + QString delemiter = Delemiter(); + if (imap->wrapper->createMbox(ndir,folder,delemiter,makesubs)) { + imap->refreshFolders(true); + } + } +} + +void IMAPfolderItem::deleteFolder() +{ + int yesno = QMessageBox::warning(0,QObject::tr("Delete folder","IMAPfolderItem"), + QObject::tr("<center>Realy delete folder <br><b>%1</b><br>and all if it content?</center>","IMAPfolderItem").arg(folder->getDisplayName()), + QObject::tr("Yes","IMAPfolderItem"), + QObject::tr("No","IMAPfolderItem"),QString::null,1,1); + qDebug("Auswahl: %i",yesno); + if (yesno == 0) { + if (imap->getWrapper()->deleteMbox(folder)) { + /* be carefull - after that this object is destroyd so don't call + * any member of it after that call!!*/ + imap->refreshFolders(true); + } + } +} + +void IMAPfolderItem::contextMenuSelected(int id) +{ + qDebug("Selected id: %i",id); + AccountView * view = (AccountView*)listView(); + switch(id) { + case 0: + view->refreshCurrent(); + break; + case 1: + deleteAllMails(); + break; + case 2: + createNewFolder(); + break; + case 3: + deleteFolder(); + break; + default: + break; + } +} @@ -239,3 +381,6 @@ AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) connect( this, SIGNAL( selectionChanged( QListViewItem * ) ), - SLOT( refresh( QListViewItem * ) ) ); + SLOT( refresh( QListViewItem * ) ) ); + connect( this, SIGNAL( mouseButtonPressed(int, QListViewItem *,const QPoint&,int ) ),this, + SLOT( slotHold( int, QListViewItem *,const QPoint&,int ) ) ); + setSorting(0); @@ -243,2 +388,22 @@ AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) +void AccountView::slotContextMenu(int id) +{ + AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); + if (!view) return; + view->contextMenuSelected(id); +} + +void AccountView::slotHold(int button, QListViewItem * item,const QPoint&,int) +{ + if (button==1) {return;} + if (!item) return; + AccountViewItem *view = static_cast<AccountViewItem *>(item); + QPopupMenu*m = view->getContextMenu(); + if (!m) return; + connect(m,SIGNAL(activated(int)),this,SLOT(slotContextMenu(int))); + m->setFocus(); + m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) ); + delete m; +} + void AccountView::populate( QList<Account> list ) @@ -279,2 +444,3 @@ void AccountView::refreshCurrent() { + m_currentItem = currentItem(); if ( !m_currentItem ) return; @@ -380,2 +546 @@ RecBody MBOXfolderItem::fetchBody(const RecMail&aMail) } - diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h index 35499ac..e7fe038 100644 --- a/noncore/net/mail/accountview.h +++ b/noncore/net/mail/accountview.h @@ -13,2 +13,3 @@ class RecMail; class RecBody; +class QPopupMenu; @@ -23,2 +24,4 @@ public: virtual RecBody fetchBody(const RecMail&)=0; + virtual QPopupMenu * getContextMenu(){return 0;}; + virtual void contextMenuSelected(int){} }; @@ -57,3 +60,3 @@ class IMAPviewItem : public AccountViewItem { - + friend class IMAPfolderItem; public: @@ -64,2 +67,4 @@ public: AbstractMail *getWrapper(); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); @@ -67,2 +72,4 @@ protected: IMAPfolderItem*findSubItem(const QString&path,IMAPfolderItem*start=0); + virtual void refreshFolders(bool force=false); + virtual void createNewFolder(); @@ -83,2 +90,10 @@ public: bool matchName(const QString&name)const; + virtual void deleteAllMails(); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + virtual const QString& Delemiter()const; +protected: + virtual void createNewFolder(); + virtual void deleteFolder(); + private: @@ -128,6 +143,8 @@ public: public slots: - void refreshAll(); - void refresh(QListViewItem *item); - void refreshCurrent(); - + virtual void refreshAll(); + virtual void refresh(QListViewItem *item); + virtual void refreshCurrent(); + virtual void slotHold(int, QListViewItem *,const QPoint&,int); + virtual void slotContextMenu(int id); + signals: diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp index ab20249..406c57c 100644 --- a/noncore/net/mail/imapwrapper.cpp +++ b/noncore/net/mail/imapwrapper.cpp @@ -1,5 +1,4 @@ - #include <stdlib.h> - #include <libetpan/libetpan.h> +#include <qpe/global.h> @@ -73,3 +72,3 @@ void IMAPwrapper::login() err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { - qDebug("error connecting server: %s",m_imap->imap_response); + Global::statusMessage(tr("error connecting imap server: %1").arg(m_imap->imap_response)); mailimap_free( m_imap ); @@ -82,3 +81,3 @@ void IMAPwrapper::login() if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error logging in imap: %s",m_imap->imap_response); + Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); err = mailimap_close( m_imap ); @@ -117,3 +116,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox: %s",m_imap->imap_response); + Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); return; @@ -124,4 +123,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) if (last == 0) { - qDebug("mailbox has no mails"); + Global::statusMessage(tr("Mailbox has no mails")); return; + } else { + Global::statusMessage(tr("Mailbox has %1 mails").arg(last)); } @@ -157,3 +158,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) } else { - qDebug("Error fetching headers: %s",m_imap->imap_response); + Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response)); } @@ -168,2 +169,4 @@ QList<Folder>* IMAPwrapper::listFolders() clistcell *current = 0; + clistcell*cur_flag = 0; + mailimap_mbx_list_flags*bflags = 0; @@ -186,2 +189,4 @@ QList<Folder>* IMAPwrapper::listFolders() QString del; + bool selectable = true; + bool no_inferiors = false; if ( err == MAILIMAP_NO_ERROR ) { @@ -194,4 +199,13 @@ QList<Folder>* IMAPwrapper::listFolders() del = list->mb_delimiter; - folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); current = current->next; + if ( (bflags = list->mb_flag) ) { + selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& + bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); + for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { + if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { + no_inferiors = true; + } + } + } + folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); } @@ -209,4 +223,2 @@ QList<Folder>* IMAPwrapper::listFolders() qDebug(path); - bool selectable = true; - mailimap_mbx_list_flags*bflags; err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); @@ -215,2 +227,3 @@ QList<Folder>* IMAPwrapper::listFolders() for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { + no_inferiors = false; list = (mailimap_mailbox_list *) current->data; @@ -226,5 +239,10 @@ QList<Folder>* IMAPwrapper::listFolders() bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); + for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { + if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { + no_inferiors = true; + } + } } del = list->mb_delimiter; - folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); + folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); } @@ -820 +838,85 @@ encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part) } + +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()); + 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); + set = mailimap_set_new_interval( 1, last ); + err = mailimap_store(m_imap,set,store_flags); + mailimap_set_free( set ); + mailimap_store_att_flags_free(store_flags); + if (err != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); + return 0; + } + qDebug("deleting mail: %s",m_imap->imap_response); + /* should we realy do that at this moment? */ + err = mailimap_expunge(m_imap); + if (err != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); + return 0; + } + qDebug("Delete successfull %s",m_imap->imap_response); + return 1; +} + +int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder) +{ + if (folder.length()==0) return 0; + login(); + if (!m_imap) {return 0;} + QString pre = account->getPrefix(); + if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) { + pre+=delemiter; + } + if (parentfolder) { + pre += parentfolder->getDisplayName()+delemiter; + } + pre+=folder; + if (getsubfolder) { + if (delemiter.length()>0) { + pre+=delemiter; + } else { + Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre)); + return 0; + } + } + qDebug("Creating %s",pre.latin1()); + int res = mailimap_create(m_imap,pre.latin1()); + if (res != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("%1").arg(m_imap->imap_response)); + return 0; + } + return 1; +} + +int IMAPwrapper::deleteMbox(const Folder*folder) +{ + if (!folder) return 0; + login(); + if (!m_imap) {return 0;} + int res = mailimap_delete(m_imap,folder->getName()); + if (res != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("%1").arg(m_imap->imap_response)); + return 0; + } + return 1; +} diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h index f046297..9b20288 100644 --- a/noncore/net/mail/imapwrapper.h +++ b/noncore/net/mail/imapwrapper.h @@ -29,2 +29,3 @@ public: virtual void answeredMail(const RecMail&mail); + virtual int deleteAllMail(const Folder*folder); @@ -35,2 +36,5 @@ public: + virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); + virtual int deleteMbox(const Folder*folder); + static void imap_progress( size_t current, size_t maximum ); diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h index 509b68e..b609aa7 100644 --- a/noncore/net/mail/libmailwrapper/abstractmail.h +++ b/noncore/net/mail/libmailwrapper/abstractmail.h @@ -30,2 +30,11 @@ public: virtual void cleanMimeCache(){}; + virtual int deleteAllMail(const Folder*){return 1;} + + /* mail box methods */ + /* parameter is the box to create. + * if the implementing subclass has prefixes, + * them has to be appended automatic. + */ + virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false){return 0;} + virtual int deleteMbox(const Folder*){return 1;} diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp index ab20249..406c57c 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp @@ -1,5 +1,4 @@ - #include <stdlib.h> - #include <libetpan/libetpan.h> +#include <qpe/global.h> @@ -73,3 +72,3 @@ void IMAPwrapper::login() err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { - qDebug("error connecting server: %s",m_imap->imap_response); + Global::statusMessage(tr("error connecting imap server: %1").arg(m_imap->imap_response)); mailimap_free( m_imap ); @@ -82,3 +81,3 @@ void IMAPwrapper::login() if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error logging in imap: %s",m_imap->imap_response); + Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); err = mailimap_close( m_imap ); @@ -117,3 +116,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox: %s",m_imap->imap_response); + Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); return; @@ -124,4 +123,6 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) if (last == 0) { - qDebug("mailbox has no mails"); + Global::statusMessage(tr("Mailbox has no mails")); return; + } else { + Global::statusMessage(tr("Mailbox has %1 mails").arg(last)); } @@ -157,3 +158,3 @@ void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) } else { - qDebug("Error fetching headers: %s",m_imap->imap_response); + Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response)); } @@ -168,2 +169,4 @@ QList<Folder>* IMAPwrapper::listFolders() clistcell *current = 0; + clistcell*cur_flag = 0; + mailimap_mbx_list_flags*bflags = 0; @@ -186,2 +189,4 @@ QList<Folder>* IMAPwrapper::listFolders() QString del; + bool selectable = true; + bool no_inferiors = false; if ( err == MAILIMAP_NO_ERROR ) { @@ -194,4 +199,13 @@ QList<Folder>* IMAPwrapper::listFolders() del = list->mb_delimiter; - folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); current = current->next; + if ( (bflags = list->mb_flag) ) { + selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& + bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); + for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { + if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { + no_inferiors = true; + } + } + } + folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); } @@ -209,4 +223,2 @@ QList<Folder>* IMAPwrapper::listFolders() qDebug(path); - bool selectable = true; - mailimap_mbx_list_flags*bflags; err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); @@ -215,2 +227,3 @@ QList<Folder>* IMAPwrapper::listFolders() for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { + no_inferiors = false; list = (mailimap_mailbox_list *) current->data; @@ -226,5 +239,10 @@ QList<Folder>* IMAPwrapper::listFolders() bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); + for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { + if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { + no_inferiors = true; + } + } } del = list->mb_delimiter; - folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); + folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); } @@ -820 +838,85 @@ encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part) } + +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()); + 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); + set = mailimap_set_new_interval( 1, last ); + err = mailimap_store(m_imap,set,store_flags); + mailimap_set_free( set ); + mailimap_store_att_flags_free(store_flags); + if (err != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); + return 0; + } + qDebug("deleting mail: %s",m_imap->imap_response); + /* should we realy do that at this moment? */ + err = mailimap_expunge(m_imap); + if (err != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); + return 0; + } + qDebug("Delete successfull %s",m_imap->imap_response); + return 1; +} + +int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder) +{ + if (folder.length()==0) return 0; + login(); + if (!m_imap) {return 0;} + QString pre = account->getPrefix(); + if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) { + pre+=delemiter; + } + if (parentfolder) { + pre += parentfolder->getDisplayName()+delemiter; + } + pre+=folder; + if (getsubfolder) { + if (delemiter.length()>0) { + pre+=delemiter; + } else { + Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre)); + return 0; + } + } + qDebug("Creating %s",pre.latin1()); + int res = mailimap_create(m_imap,pre.latin1()); + if (res != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("%1").arg(m_imap->imap_response)); + return 0; + } + return 1; +} + +int IMAPwrapper::deleteMbox(const Folder*folder) +{ + if (!folder) return 0; + login(); + if (!m_imap) {return 0;} + int res = mailimap_delete(m_imap,folder->getName()); + if (res != MAILIMAP_NO_ERROR) { + Global::statusMessage(tr("%1").arg(m_imap->imap_response)); + return 0; + } + return 1; +} diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h index f046297..9b20288 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.h +++ b/noncore/net/mail/libmailwrapper/imapwrapper.h @@ -29,2 +29,3 @@ public: virtual void answeredMail(const RecMail&mail); + virtual int deleteAllMail(const Folder*folder); @@ -35,2 +36,5 @@ public: + virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); + virtual int deleteMbox(const Folder*folder); + static void imap_progress( size_t current, size_t maximum ); diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.cpp b/noncore/net/mail/libmailwrapper/mailwrapper.cpp index 6479783..9398823 100644 --- a/noncore/net/mail/libmailwrapper/mailwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/mailwrapper.cpp @@ -30,4 +30,4 @@ const QString& Folder::Separator()const -IMAPFolder::IMAPFolder(const QString&name,const QString&sep, bool select,const QString&prefix ) - : Folder( name,sep ),m_MaySelect(select) +IMAPFolder::IMAPFolder(const QString&name,const QString&sep, bool select,bool no_inf, const QString&prefix ) + : Folder( name,sep ),m_MaySelect(select),m_NoInferior(no_inf) { diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.h b/noncore/net/mail/libmailwrapper/mailwrapper.h index 8fd886f..a60777d 100644 --- a/noncore/net/mail/libmailwrapper/mailwrapper.h +++ b/noncore/net/mail/libmailwrapper/mailwrapper.h @@ -71,3 +71,4 @@ public: const QString&getName()const { return name; } - virtual bool may_select()const{return true;}; + virtual bool may_select()const{return true;} + virtual bool no_inferior()const{return true;} const QString&Separator()const; @@ -82,8 +83,8 @@ class IMAPFolder : public Folder public: - IMAPFolder(const QString&name, const QString&sep, bool select=true,const QString&prefix="" ); + IMAPFolder(const QString&name, const QString&sep, bool select=true,bool noinf=false,const QString&prefix="" ); virtual bool may_select()const{return m_MaySelect;} + virtual bool no_inferior()const{return m_NoInferior;} private: - static QString decodeFolderName( const QString &name ); - bool m_MaySelect; - + static QString decodeFolderName( const QString &name ); + bool m_MaySelect,m_NoInferior; }; diff --git a/noncore/net/mail/mail.pro b/noncore/net/mail/mail.pro index ea5fb58..2c15a7b 100644 --- a/noncore/net/mail/mail.pro +++ b/noncore/net/mail/mail.pro @@ -17,9 +17,10 @@ HEADERS = defines.h \ pop3wrapper.h \ - abstractmail.h \ - settingsdialog.h \ - statuswidget.h \ - smtpwrapper.h \ - genericwrapper.h \ - mboxwrapper.h \ - sendmailprogress.h + abstractmail.h \ + settingsdialog.h \ + statuswidget.h \ + smtpwrapper.h \ + genericwrapper.h \ + mboxwrapper.h \ + sendmailprogress.h \ + newmaildir.h @@ -40,9 +41,10 @@ SOURCES = main.cpp \ pop3wrapper.cpp \ - abstractmail.cpp \ - settingsdialog.cpp \ - statuswidget.cpp \ - smtpwrapper.cpp \ - genericwrapper.cpp \ - mboxwrapper.cpp \ - sendmailprogress.cpp + abstractmail.cpp \ + settingsdialog.cpp \ + statuswidget.cpp \ + smtpwrapper.cpp \ + genericwrapper.cpp \ + mboxwrapper.cpp \ + sendmailprogress.cpp \ + newmaildir.cpp @@ -57,5 +59,6 @@ INTERFACES = editaccountsui.ui \ composemailui.ui \ - settingsdialogui.ui \ - statuswidgetui.ui \ - sendmailprogressui.ui + settingsdialogui.ui \ + statuswidgetui.ui \ + sendmailprogressui.ui \ + newmaildirui.ui diff --git a/noncore/net/mail/mailwrapper.cpp b/noncore/net/mail/mailwrapper.cpp index 6479783..9398823 100644 --- a/noncore/net/mail/mailwrapper.cpp +++ b/noncore/net/mail/mailwrapper.cpp @@ -30,4 +30,4 @@ const QString& Folder::Separator()const -IMAPFolder::IMAPFolder(const QString&name,const QString&sep, bool select,const QString&prefix ) - : Folder( name,sep ),m_MaySelect(select) +IMAPFolder::IMAPFolder(const QString&name,const QString&sep, bool select,bool no_inf, const QString&prefix ) + : Folder( name,sep ),m_MaySelect(select),m_NoInferior(no_inf) { diff --git a/noncore/net/mail/mailwrapper.h b/noncore/net/mail/mailwrapper.h index 8fd886f..a60777d 100644 --- a/noncore/net/mail/mailwrapper.h +++ b/noncore/net/mail/mailwrapper.h @@ -71,3 +71,4 @@ public: const QString&getName()const { return name; } - virtual bool may_select()const{return true;}; + virtual bool may_select()const{return true;} + virtual bool no_inferior()const{return true;} const QString&Separator()const; @@ -82,8 +83,8 @@ class IMAPFolder : public Folder public: - IMAPFolder(const QString&name, const QString&sep, bool select=true,const QString&prefix="" ); + IMAPFolder(const QString&name, const QString&sep, bool select=true,bool noinf=false,const QString&prefix="" ); virtual bool may_select()const{return m_MaySelect;} + virtual bool no_inferior()const{return m_NoInferior;} private: - static QString decodeFolderName( const QString &name ); - bool m_MaySelect; - + static QString decodeFolderName( const QString &name ); + bool m_MaySelect,m_NoInferior; }; diff --git a/noncore/net/mail/mainwindow.cpp b/noncore/net/mail/mainwindow.cpp index dc8c188..cf4cbe8 100644 --- a/noncore/net/mail/mainwindow.cpp +++ b/noncore/net/mail/mainwindow.cpp @@ -119,3 +119,2 @@ MainWindow::MainWindow( QWidget *parent, const char *name, WFlags flags ) - slotAdjustLayout(); @@ -123,16 +122,11 @@ MainWindow::MainWindow( QWidget *parent, const char *name, WFlags flags ) QPEApplication::setStylusOperation( mailView->viewport(),QPEApplication::RightOnHold); - + QPEApplication::setStylusOperation( folderView->viewport(),QPEApplication::RightOnHold); + connect( mailView, SIGNAL( mouseButtonClicked(int, QListViewItem *,const QPoint&,int ) ),this, SLOT( mailLeftClicked( int, QListViewItem *,const QPoint&,int ) ) ); - connect( mailView, SIGNAL( mouseButtonPressed(int, QListViewItem *,const QPoint&,int ) ),this, SLOT( mailHold( int, QListViewItem *,const QPoint&,int ) ) ); -#if 0 - connect( mailView, SIGNAL( rightButtonClicked( QListViewItem *,const QPoint&,int ) ),this, - SLOT( mailHold(QListViewItem *,const QPoint&,int) )); -#endif connect(folderView, SIGNAL(refreshMailview(QList<RecMail>*)),this,SLOT(refreshMailView(QList<RecMail>*))); - QTimer::singleShot( 1000, this, SLOT( slotAdjustColumns() ) ); - + QTimer::singleShot( 1000, this, SLOT( slotAdjustColumns() ) ); } diff --git a/noncore/net/mail/newmaildir.cpp b/noncore/net/mail/newmaildir.cpp new file mode 100644 index 0000000..3fc66f4 --- a/dev/null +++ b/noncore/net/mail/newmaildir.cpp @@ -0,0 +1,34 @@ +#include "newmaildir.h" +#include <qdialog.h> +#include <qvariant.h> +#include <qlineedit.h> +#include <qcheckbox.h> + +Newmdirdlg::Newmdirdlg( QWidget* parent, const char* name) + : Newmdirdlgui(parent,name,true),ndir(""),possible_subs(false) +{ +} + +Newmdirdlg::~Newmdirdlg() +{ +} + +void Newmdirdlg::accept() +{ + ndir = dirnameEdit->text(); + possible_subs = subdirsPossibleBox->isChecked(); + if (ndir.isEmpty()) { + return; + } + Newmdirdlgui::accept(); +} + +const QString&Newmdirdlg::Newdir()const +{ + return ndir; +} + +const bool Newmdirdlg::subpossible()const +{ + return possible_subs; +} diff --git a/noncore/net/mail/newmaildir.h b/noncore/net/mail/newmaildir.h new file mode 100644 index 0000000..1eb904e --- a/dev/null +++ b/noncore/net/mail/newmaildir.h @@ -0,0 +1,20 @@ +#include "newmaildirui.h" +#include <qvariant.h> + +class Newmdirdlg : public Newmdirdlgui +{ + Q_OBJECT +public: + Newmdirdlg( QWidget* parent = 0, const char* name = 0); + ~Newmdirdlg(); + + const QString&Newdir()const; + const bool subpossible()const; + +protected slots: + virtual void accept(); + +protected: + QString ndir; + bool possible_subs; +}; diff --git a/noncore/net/mail/newmaildirui.ui b/noncore/net/mail/newmaildirui.ui new file mode 100644 index 0000000..72b2d04 --- a/dev/null +++ b/noncore/net/mail/newmaildirui.ui @@ -0,0 +1,100 @@ +<!DOCTYPE UI><UI> +<class>Newmdirdlgui</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>newmdirdlg</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>223</width> + <height>110</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Enter directory name</string> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout5</cstring> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="0" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>dirnameLabel</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Directory name:</string> + </property> + </widget> + <widget row="0" column="1" > + <class>QLineEdit</class> + <property stdset="1"> + <name>name</name> + <cstring>dirnameEdit</cstring> + </property> + </widget> + </grid> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>subdirsPossibleBox</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Directory contains other subdirs</string> + </property> + </widget> + <spacer> + <property> + <name>name</name> + <cstring>Spacer4</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Vertical</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> +</widget> +</UI> |