You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
5.9 KiB
235 lines
5.9 KiB
// kmacctmaildir.cpp |
|
|
|
#ifdef HAVE_CONFIG_H |
|
#include <config.h> |
|
#endif |
|
|
|
#include <qfileinfo.h> |
|
#include "kmacctmaildir.h" |
|
#include "kmfoldermaildir.h" |
|
#include "kmmessage.h" |
|
#include "kmacctfolder.h" |
|
#include "kmbroadcaststatus.h" |
|
|
|
#include <kapplication.h> |
|
#include <klocale.h> |
|
#include <kmessagebox.h> |
|
#include <kdebug.h> |
|
|
|
#include <stdlib.h> |
|
#include <stdio.h> |
|
#include <errno.h> |
|
#include <assert.h> |
|
|
|
#ifdef HAVE_PATHS_H |
|
#include <paths.h> /* defines _PATH_MAILDIR */ |
|
#endif |
|
|
|
#undef None |
|
|
|
//----------------------------------------------------------------------------- |
|
KMAcctMaildir::KMAcctMaildir(KMAcctMgr* aOwner, const QString& aAccountName): |
|
KMAcctMaildirInherited(aOwner, aAccountName) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
KMAcctMaildir::~KMAcctMaildir() |
|
{ |
|
mLocation = ""; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
QString KMAcctMaildir::type(void) const |
|
{ |
|
return "maildir"; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::init(void) |
|
{ |
|
mLocation = getenv("MAIL"); |
|
if (mLocation.isNull()) { |
|
mLocation = getenv("HOME"); |
|
mLocation += "/Maildir/"; |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::pseudoAssign(KMAccount *account) |
|
{ |
|
assert(account->type() == "maildir"); |
|
KMAcctMaildir *acct = static_cast<KMAcctMaildir*>(account); |
|
setName(acct->name()); |
|
setLocation(acct->location()); |
|
setCheckInterval(acct->checkInterval()); |
|
setCheckExclude(acct->checkExclude()); |
|
setFolder(acct->folder()); |
|
setPrecommand(acct->precommand()); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::processNewMail(bool) |
|
{ |
|
QTime t; |
|
hasNewMail = false; |
|
|
|
if ( precommand().isEmpty() ) { |
|
QFileInfo fi( location() ); |
|
if ( !fi.exists() ) { |
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(0); |
|
QString statusMsg = i18n("Transmission completed, no new messages"); |
|
KMBroadcastStatus::instance()->setStatusMsg( statusMsg ); |
|
return; |
|
} |
|
} |
|
|
|
KMFolderMaildir mailFolder(NULL, location()); |
|
|
|
long num = 0; |
|
long i; |
|
int rc; |
|
KMMessage* msg; |
|
bool addedOk; |
|
|
|
if (!mFolder) { |
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(-1); |
|
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission failed." )); |
|
return; |
|
} |
|
|
|
KMBroadcastStatus::instance()->reset(); |
|
KMBroadcastStatus::instance()->setStatusMsg( |
|
i18n("Preparing transmission from \"%1\"...").arg(mName)); |
|
|
|
// run the precommand |
|
if (!runPrecommand(precommand())) |
|
{ |
|
kdDebug(5006) << "cannot run precommand " << precommand() << endl; |
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(-1); |
|
} |
|
|
|
mailFolder.setAutoCreateIndex(FALSE); |
|
|
|
rc = mailFolder.open(); |
|
if (rc) |
|
{ |
|
QString aStr; |
|
aStr = i18n("Cannot open folder:"); |
|
aStr += mailFolder.path()+"/"+mailFolder.name(); |
|
KMessageBox::sorry(0, aStr); |
|
kdDebug(5006) << "cannot open file " << mailFolder.path() << "/" |
|
<< mailFolder.name() << endl; |
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(-1); |
|
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission failed." )); |
|
return; |
|
} |
|
|
|
if (mailFolder.isReadOnly()) { // mailFolder is locked |
|
mailFolder.close(); |
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(-1); |
|
QString errMsg = i18n( "Transmission failed: Could not lock %1." ) |
|
.arg( mailFolder.location() ); |
|
KMBroadcastStatus::instance()->setStatusMsg( errMsg ); |
|
return; |
|
} |
|
|
|
mFolder->quiet(TRUE); |
|
mFolder->open(); |
|
|
|
|
|
num = mailFolder.count(); |
|
|
|
addedOk = true; |
|
t.start(); |
|
|
|
// prepare the static parts of the status message: |
|
QString statusMsgStub = i18n("Moving message %3 of %2 from %1.") |
|
.arg(mailFolder.location()).arg(num); |
|
|
|
KMBroadcastStatus::instance()->setStatusProgressEnable( true ); |
|
for (i=0; i<num; i++) |
|
{ |
|
|
|
if (!addedOk) break; |
|
if (KMBroadcastStatus::instance()->abortRequested()) break; |
|
|
|
QString statusMsg = statusMsgStub.arg(i); |
|
KMBroadcastStatus::instance()->setStatusMsg( statusMsg ); |
|
KMBroadcastStatus::instance()->setStatusProgressPercent( (i*100) / num ); |
|
|
|
msg = mailFolder.take(0); |
|
if (msg) |
|
{ |
|
msg->setStatus(msg->headerField("Status").latin1(), |
|
msg->headerField("X-Status").latin1()); |
|
addedOk = processNewMsg(msg); |
|
if (addedOk) |
|
hasNewMail = true; |
|
} |
|
|
|
if (t.elapsed() >= 200) { //hardwired constant |
|
kapp->processEvents(); |
|
t.start(); |
|
} |
|
|
|
} |
|
KMBroadcastStatus::instance()->setStatusProgressEnable( false ); |
|
KMBroadcastStatus::instance()->reset(); |
|
|
|
if (addedOk) |
|
{ |
|
rc = mailFolder.expunge(); |
|
if (rc) |
|
KMessageBox::information( 0, i18n("Cannot remove mail from\nmailbox `%1':\n%2").arg(mailFolder.location()).arg(strerror(rc))); |
|
QString statusMsg; |
|
if ( num ) |
|
statusMsg = i18n("Transmission completed, %n new message.", |
|
"Transmission completed, %n new messages.", num); |
|
else |
|
statusMsg = i18n("Transmission completed, no new messages"); |
|
KMBroadcastStatus::instance()->setStatusMsg( statusMsg ); |
|
} |
|
// else warning is written already |
|
|
|
mailFolder.close(); |
|
mFolder->close(); |
|
mFolder->quiet(FALSE); |
|
|
|
emit finishedCheck(hasNewMail); |
|
emit newMailsProcessed(num); |
|
|
|
return; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::readConfig(KConfig& config) |
|
{ |
|
KMAcctMaildirInherited::readConfig(config); |
|
mLocation = config.readEntry("Location", mLocation); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::writeConfig(KConfig& config) |
|
{ |
|
KMAcctMaildirInherited::writeConfig(config); |
|
|
|
config.writeEntry("Location", mLocation); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMAcctMaildir::setLocation(const QString& aLocation) |
|
{ |
|
mLocation = aLocation; |
|
}
|
|
|