summaryrefslogtreecommitdiff
authoralwin <alwin>2004-01-08 02:52:13 (UTC)
committer alwin <alwin>2004-01-08 02:52:13 (UTC)
commit05d47b2603adfab0e16f7395e34b7aa56ce6d8de (patch) (side-by-side diff)
tree4253654acb70b859fd0d32981132dffd35092b9f
parentdfa1477a28ecd90e08cf09aeecbe816e94bec0b5 (diff)
downloadopie-05d47b2603adfab0e16f7395e34b7aa56ce6d8de.zip
opie-05d47b2603adfab0e16f7395e34b7aa56ce6d8de.tar.gz
opie-05d47b2603adfab0e16f7395e34b7aa56ce6d8de.tar.bz2
move/copy mails to another folder resides inside wrappers so we can
use special funs of libetpan and/or mailserver itself (eg. imap) libetpan 0.32 requires for that feature a patch! (see libetpanstuff/) accounts marked as "offline" get a new icon TODO: - when creating a new folder while copy/move on imap-server, get the real resulting foldername when using prefix - implement usage of copy/move inside one mbox using special etpan funs
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp40
-rw-r--r--noncore/net/mail/accountview.h1
-rw-r--r--noncore/net/mail/defines.h3
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.cpp19
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.h2
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp31
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h1
7 files changed, 83 insertions, 14 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index eea021f..b7de7b9 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -1,46 +1,59 @@
#include "accountview.h"
#include <libmailwrapper/mailtypes.h>
#include <libmailwrapper/abstractmail.h>
#include "defines.h"
#include "newmaildir.h"
#include "selectstore.h"
#include <qmessagebox.h>
#include <qpopupmenu.h>
+#define SETPIX(x) if (!account->getOffline()) {setPixmap( 0,x);} else {setPixmap( 0, PIXMAP_OFFLINE );}
/**
* POP3 Account stuff
*/
POP3viewItem::POP3viewItem( POP3account *a, AccountView *parent )
: AccountViewItem( parent )
{
account = a;
wrapper = AbstractMail::getWrapper( account );
- setPixmap( 0, PIXMAP_POP3FOLDER );
+ SETPIX(PIXMAP_POP3FOLDER);
+#if 0
+ if (!account->getOffline()) {
+ setPixmap( 0, );
+ } else {
+ setPixmap( 0, PIXMAP_OFFLINE );
+ }
+#endif
setText( 0, account->getAccountName() );
setOpen( true );
}
POP3viewItem::~POP3viewItem()
{
delete wrapper;
}
AbstractMail *POP3viewItem::getWrapper()
{
return wrapper;
}
void POP3viewItem::refresh( QList<RecMail> & )
{
+ refresh();
+}
+
+void POP3viewItem::refresh()
+{
if (account->getOffline()) return;
QList<Folder> *folders = wrapper->listFolders();
QListViewItem *child = firstChild();
while ( child ) {
QListViewItem *tmp = child;
child = child->nextSibling();
delete tmp;
}
Folder *it;
QListViewItem*item = 0;
for ( it = folders->first(); it; it = folders->next() ) {
item = new POP3folderItem( it, this , item );
@@ -80,24 +93,26 @@ void POP3viewItem::disconnect()
delete tmp;
}
wrapper->logout();
}
void POP3viewItem::setOnOffline()
{
if (!account->getOffline()) {
disconnect();
}
account->setOffline(!account->getOffline());
account->save();
+ SETPIX(PIXMAP_POP3FOLDER);
+ refresh();
}
void POP3viewItem::contextMenuSelected(int which)
{
switch (which) {
case 0:
disconnect();
break;
case 1:
setOnOffline();
break;
}
@@ -169,25 +184,25 @@ void POP3folderItem::contextMenuSelected(int which)
break;
}
}
/**
* IMAP Account stuff
*/
IMAPviewItem::IMAPviewItem( IMAPaccount *a, AccountView *parent )
: AccountViewItem( parent )
{
account = a;
wrapper = AbstractMail::getWrapper( account );
- setPixmap( 0, PIXMAP_IMAPFOLDER );
+ SETPIX(PIXMAP_IMAPFOLDER);
setText( 0, account->getAccountName() );
setOpen( true );
}
IMAPviewItem::~IMAPviewItem()
{
delete wrapper;
}
AbstractMail *IMAPviewItem::getWrapper()
{
return wrapper;
@@ -328,24 +343,25 @@ void IMAPviewItem::contextMenuSelected(int id)
break;
case 2:
removeChilds();
wrapper->logout();
break;
case 3:
if (account->getOffline()==false) {
removeChilds();
wrapper->logout();
}
account->setOffline(!account->getOffline());
account->save();
+ SETPIX(PIXMAP_IMAPFOLDER);
refreshFolders(false);
break;
default:
break;
}
}
RecBody IMAPviewItem::fetchBody(const RecMail&)
{
return RecBody();
}
@@ -656,48 +672,44 @@ void AccountView::setupFolderselect(Selectstore*sels)
sels->addAccounts(mboxAccounts[i]->getWrapper(),sFolders);
}
for (i=0; i < imapAccounts.count();++i) {
if (imapAccounts[i]->offline())
continue;
imapAccounts[i]->refreshFolders(false);
sels->addAccounts(imapAccounts[i]->getWrapper(),imapAccounts[i]->subFolders());
}
}
void AccountView::downloadMails(Folder*fromFolder,AbstractMail*fromWrapper)
{
- unsigned int i = 0;
AbstractMail*targetMail = 0;
QString targetFolder = "";
Selectstore sels;
setupFolderselect(&sels);
if (!sels.exec()) return;
targetMail = sels.currentMail();
targetFolder = sels.currentFolder();
if ( (fromWrapper==targetMail && fromFolder->getName()==targetFolder) ||
targetFolder.isEmpty()) {
return;
}
-
- QList<RecMail> t;
- fromWrapper->listMessages(fromFolder->getName(),t);
- encodedString*st = 0;
- for (i = 0; i < t.count();++i) {
- RecMail*r = t.at(i);
- st = fromWrapper->fetchRawBody(*r);
- if (st) {
- targetMail->storeMessage(st->Content(),st->Length(),targetFolder);
- delete st;
- }
+ if (sels.newFolder() && !targetMail->createMbox(targetFolder)) {
+ QMessageBox::critical(0,tr("Error creating new Folder"),
+ tr("<center>Error while creating<br>new folder - breaking.</center>"));
+ return;
}
+ qDebug("Targetfolder: %s",targetFolder.latin1());
+ qDebug("Fromfolder: %s",fromFolder->getName().latin1());
+ fromWrapper->mvcpAllMails(fromFolder,targetFolder,targetMail,sels.moveMails());
+ refreshCurrent();
}
/**
* MBOX Account stuff
*/
MBOXviewItem::MBOXviewItem( const QString&aPath, AccountView *parent )
: AccountViewItem( parent )
{
m_Path = aPath;
/* be carefull - the space within settext is wanted - thats why the string twice */
wrapper = AbstractMail::getWrapper( m_Path,"Local Folders");
diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h
index 48f52c7..df916c1 100644
--- a/noncore/net/mail/accountview.h
+++ b/noncore/net/mail/accountview.h
@@ -39,24 +39,25 @@ class POP3viewItem : public AccountViewItem
public:
POP3viewItem( POP3account *a, AccountView *parent );
virtual ~POP3viewItem();
virtual void refresh( QList<RecMail> &target );
virtual RecBody fetchBody( const RecMail &mail );
AbstractMail *getWrapper();
virtual QPopupMenu * getContextMenu();
virtual void contextMenuSelected(int);
protected:
POP3account *account;
+ virtual void refresh();
AbstractMail *wrapper;
void disconnect();
void setOnOffline();
};
class POP3folderItem : public AccountViewItem
{
public:
POP3folderItem( Folder *folder, POP3viewItem *parent , QListViewItem*after );
virtual ~POP3folderItem();
virtual void refresh(QList<RecMail>&);
diff --git a/noncore/net/mail/defines.h b/noncore/net/mail/defines.h
index ebe8e08..d840f09 100644
--- a/noncore/net/mail/defines.h
+++ b/noncore/net/mail/defines.h
@@ -7,38 +7,41 @@
#define PIC_COMPOSEMAIL "mail/composemail"
#define PIC_SENDQUEUED "mail/sendqueued"
#define PIC_SHOWFOLDERS "mail/showfolders"
#define PIC_SYNC "mail/sync"
#define PIC_IMAPFOLDER "mail/imapfolder"
#define PIC_MBOXFOLDER "mail/mboxfolder"
#define PIC_POP3FOLDER "mail/pop3folder"
#define PIC_INBOXFOLDER "mail/inbox"
#define PIC_OUTBOXFOLDER "mail/outbox"
#define PIC_LOCALFOLDER "mail/localfolder"
+#define PIC_OFFLINE "mail/notconnected"
+
#define ICON_COMPOSEMAIL QIconSet( Resource::loadPixmap( PIC_COMPOSEMAIL ) )
#define ICON_SENDQUEUED QIconSet( Resource::loadPixmap( PIC_SENDQUEUED ) )
#define ICON_SHOWFOLDERS QIconSet( Resource::loadPixmap( PIC_SHOWFOLDERS ) )
#define ICON_SEARCHMAILS QIconSet( Resource::loadPixmap( PIC_SEARCHMAILS ) )
#define ICON_EDITSETTINGS QIconSet( Resource::loadPixmap( PIC_EDITSETTINGS ) )
#define ICON_EDITACCOUNTS QIconSet( Resource::loadPixmap( PIC_EDITACCOUNTS ) )
#define ICON_SYNC QIconSet( Resource::loadPixmap( PIC_SYNC ) )
#define PIXMAP_IMAPFOLDER QPixmap( Resource::loadPixmap( PIC_IMAPFOLDER ) )
#define PIXMAP_POP3FOLDER QPixmap( Resource::loadPixmap( PIC_POP3FOLDER ) )
#define PIXMAP_INBOXFOLDER QPixmap( Resource::loadPixmap( PIC_INBOXFOLDER) )
#define PIXMAP_MBOXFOLDER QPixmap( Resource::loadPixmap( PIC_MBOXFOLDER ) )
#define PIXMAP_OUTBOXFOLDER QPixmap( Resource::loadPixmap( PIC_OUTBOXFOLDER) )
#define PIXMAP_LOCALFOLDER QPixmap( Resource::loadPixmap( PIC_LOCALFOLDER) )
+#define PIXMAP_OFFLINE QPixmap( Resource::loadPixmap( PIC_OFFLINE) )
#define IMAP_PORT "143"
#define IMAP_SSL_PORT "993"
#define SMTP_PORT "25"
#define SMTP_SSL_PORT "465"
#define POP3_PORT "110"
#define POP3_SSL_PORT "995"
#define NNTP_PORT "119"
#define NNTP_SSL_PORT "563"
/* used for decoding imapfoldername */
#define UNDEFINED 64
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.cpp b/noncore/net/mail/libmailwrapper/abstractmail.cpp
index 3dd2fce..4b4c728 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.cpp
+++ b/noncore/net/mail/libmailwrapper/abstractmail.cpp
@@ -95,12 +95,31 @@ int AbstractMail::createMbox(const QString&,const Folder*,const QString& delemit
QString AbstractMail::defaultLocalfolder()
{
QString f = getenv( "HOME" );
f += "/Applications/opiemail/localmail";
return f;
}
/* temporary - will be removed when implemented in all classes */
void AbstractMail::deleteMails(const QString &,QList<RecMail> &)
{
}
+
+void AbstractMail::mvcpAllMails(Folder*fromFolder,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit)
+{
+ QList<RecMail> t;
+ listMessages(fromFolder->getName(),t);
+ encodedString*st = 0;
+ while (t.count()>0) {
+ RecMail*r = t.at(0);
+ st = fetchRawBody(*r);
+ if (st) {
+ targetWrapper->storeMessage(st->Content(),st->Length(),targetFolder);
+ delete st;
+ }
+ t.removeFirst();
+ }
+ if (moveit) {
+ deleteAllMail(fromFolder);
+ }
+}
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h
index 15d83cb..8debaae 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.h
+++ b/noncore/net/mail/libmailwrapper/abstractmail.h
@@ -26,24 +26,26 @@ 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;
virtual int deleteAllMail(const Folder*)=0;
virtual void deleteMails(const QString & FolderName,QList<RecMail> &target);
virtual int deleteMbox(const Folder*)=0;
virtual void storeMessage(const char*msg,size_t length, const QString&folder)=0;
+ virtual void mvcpAllMails(Folder*fromFolder,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit);
+
virtual void cleanMimeCache(){};
/* 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);
virtual void logout()=0;
static AbstractMail* getWrapper(IMAPaccount *a);
static AbstractMail* getWrapper(POP3account *a);
/* mbox only! */
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index bb74de9..23c678b 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -1000,21 +1000,52 @@ void IMAPwrapper::storeMessage(const char*msg,size_t length, const QString&folde
if (r != MAILIMAP_NO_ERROR) {
Global::statusMessage("Error storing mail!");
}
}
const QString&IMAPwrapper::getType()const
{
return account->getType();
}
const QString&IMAPwrapper::getName()const
{
+ qDebug("Get name: %s",account->getAccountName().latin1());
return account->getAccountName();
}
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());
+ 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());
+ if ( err != MAILIMAP_NO_ERROR ) {
+ Global::statusMessage(tr("error copy mails: %1").arg(m_imap->imap_response));
+ 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 b2bd7e9..07c6210 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -22,24 +22,25 @@ class IMAPwrapper : public AbstractMail
Q_OBJECT
public:
IMAPwrapper( IMAPaccount *a );
virtual ~IMAPwrapper();
virtual QList<Folder>* listFolders();
virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
virtual void statusFolder(folderStat&target_stat,const QString & mailbox="INBOX");
virtual void deleteMail(const RecMail&mail);
virtual void answeredMail(const RecMail&mail);
virtual int deleteAllMail(const Folder*folder);
virtual void storeMessage(const char*msg,size_t length, const QString&folder);
+ virtual void mvcpAllMails(Folder*fromFolder,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit);
virtual RecBody fetchBody(const RecMail&mail);
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);
static void imap_progress( size_t current, size_t maximum );