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.
 
 
 

264 lines
6.5 KiB

// kmacctlocal.cpp
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qdatetime.h>
#include <qfileinfo.h>
#include "kmacctlocal.h"
#include "kmfolder.h"
#include "kmmessage.h"
#include "kmacctfolder.h"
#include "kmglobal.h"
#include "kmbroadcaststatus.h"
#include <kapp.h>
#include <kconfig.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kdebug.h>
#ifdef HAVE_PATHS_H
#include <paths.h> /* defines _PATH_MAILDIR */
#endif
#ifndef _PATH_MAILDIR
#define _PATH_MAILDIR "/var/spool/mail"
#endif
#undef None
//-----------------------------------------------------------------------------
KMAcctLocal::KMAcctLocal(KMAcctMgr* aOwner, const char* aAccountName):
KMAcctLocalInherited(aOwner, aAccountName)
{
mLock = procmail_lockfile;
}
//-----------------------------------------------------------------------------
KMAcctLocal::~KMAcctLocal()
{
mLocation = "";
}
//-----------------------------------------------------------------------------
const char* KMAcctLocal::type(void) const
{
return "local";
}
//-----------------------------------------------------------------------------
void KMAcctLocal::init(void)
{
mLocation = getenv("MAIL");
if (mLocation.isNull()) {
mLocation = _PATH_MAILDIR;
mLocation += "/";
mLocation += getenv("USER");
}
setProcmailLockFileName("");
}
//-----------------------------------------------------------------------------
void KMAcctLocal::pseudoAssign(KMAccount *account)
{
assert(account->type() == "local");
KMAcctLocal *acct = static_cast<KMAcctLocal*>(account);
setName(acct->name());
setLocation(acct->location());
setCheckInterval(acct->checkInterval());
setCheckExclude(acct->checkExclude());
setLockType(acct->lockType());
setProcmailLockFileName(acct->procmailLockFileName());
setFolder(acct->folder());
setPrecommand(acct->precommand());
}
//-----------------------------------------------------------------------------
void KMAcctLocal::processNewMail(bool)
{
QTime t;
hasNewMail = false;
QFileInfo fi( location() );
if ( fi.size() == 0 && precommand().isEmpty() ) {
emit finishedCheck(hasNewMail);
return;
}
KMFolder mailFolder(NULL, location());
mailFolder.setLockType( mLock );
if ( mLock == procmail_lockfile)
mailFolder.setProcmailLockFileName( mProcmailLockFileName );
long num = 0;
long i;
int rc;
KMMessage* msg;
bool addedOk;
if (!mFolder) {
emit finishedCheck(hasNewMail);
return;
}
KMBroadcastStatus::instance()->reset();
KMBroadcastStatus::instance()->setStatusMsg(
i18n("Preparing transmission from %1...").arg(mailFolder.name()));
// run the precommand
if (!runPrecommand(precommand()))
{
perror("cannot run precommand "+precommand());
emit finishedCheck(hasNewMail);
}
mailFolder.setAutoCreateIndex(FALSE);
rc = mailFolder.open();
if (rc)
{
QString aStr;
aStr = i18n("Cannot open file:");
aStr += mailFolder.path()+"/"+mailFolder.name();
KMessageBox::sorry(0, aStr);
perror("cannot open file "+mailFolder.path()+"/"+mailFolder.name());
emit finishedCheck(hasNewMail);
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission completed." ));
return;
}
if (mailFolder.isReadOnly()) { // mailFolder is locked
kdDebug() << "mailFolder could not be locked" << endl;
mailFolder.close();
emit finishedCheck(hasNewMail);
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission completed." ));
return;
}
mFolder->quiet(TRUE);
mFolder->open();
num = mailFolder.count();
addedOk = true;
t.start();
KMBroadcastStatus::instance()->setStatusProgressEnable( true );
for (i=0; i<num; i++)
{
if (!addedOk) break;
if (KMBroadcastStatus::instance()->abortRequested()) break;
KMBroadcastStatus::instance()->setStatusMsg( i18n("Message ") +
QString("%1/%2").arg(i).arg(num) );
KMBroadcastStatus::instance()->setStatusProgressPercent( (i*100) / num );
msg = mailFolder.take(0);
if (msg)
{
msg->setStatus(msg->headerField("Status"), msg->headerField("X-Status"));
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))));
KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission completed." ));
}
// else warning is written already
mailFolder.close();
mFolder->close();
mFolder->quiet(FALSE);
emit finishedCheck(hasNewMail);
return;
}
//-----------------------------------------------------------------------------
void KMAcctLocal::readConfig(KConfig& config)
{
QString defaultPath(_PATH_MAILDIR);
defaultPath += "/";
defaultPath += getenv("USER");
KMAcctLocalInherited::readConfig(config);
mLocation = config.readEntry("Location", defaultPath);
QString locktype = config.readEntry("LockType", "procmail_lockfile" );
if( locktype == "procmail_lockfile" ) {
mLock = procmail_lockfile;
mProcmailLockFileName = config.readEntry("ProcmailLockFile",
mLocation + ".lock");
} else if( locktype == "mutt_dotlock" )
mLock = mutt_dotlock;
else if( locktype == "mutt_dotlock_privileged" )
mLock = mutt_dotlock_privileged;
else if( locktype == "none" )
mLock = None;
else mLock = FCNTL;
}
//-----------------------------------------------------------------------------
void KMAcctLocal::writeConfig(KConfig& config)
{
KMAcctLocalInherited::writeConfig(config);
config.writeEntry("Location", mLocation);
QString st = "fcntl";
if (mLock == procmail_lockfile) st = "procmail_lockfile";
else if (mLock == mutt_dotlock) st = "mutt_dotlock";
else if (mLock == mutt_dotlock_privileged) st = "mutt_dotlock_privileged";
else if (mLock == None) st = "none";
config.writeEntry("LockType", st);
if (mLock == procmail_lockfile) {
config.writeEntry("ProcmailLockFile", mProcmailLockFileName);
}
}
//-----------------------------------------------------------------------------
void KMAcctLocal::setLocation(const QString& aLocation)
{
mLocation = aLocation;
}
void
KMAcctLocal::setProcmailLockFileName(QString s)
{
if (s && !s.isEmpty())
mProcmailLockFileName = s;
else
mProcmailLockFileName = mLocation + ".lock";
}