// kmacctlocal.cpp #ifdef HAVE_CONFIG_H #include #endif #include #include "kmacctlocal.h" #include "kmfolder.h" #include "kmmessage.h" #include "kmacctfolder.h" #include "kmglobal.h" #include "kmbroadcaststatus.h" #include #include #include #include #include #include #include #include #ifdef HAVE_PATHS_H #include /* defines _PATH_MAILDIR */ #endif #ifndef _PATH_MAILDIR #define _PATH_MAILDIR "/var/spool/mail" #endif //----------------------------------------------------------------------------- KMAcctLocal::KMAcctLocal(KMAcctMgr* aOwner, const char* aAccountName): KMAcctLocalInherited(aOwner, aAccountName) { initMetaObject(); mLock = FCNTL; } //----------------------------------------------------------------------------- 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"); } } //----------------------------------------------------------------------------- void KMAcctLocal::pseudoAssign(KMAccount *account) { assert(account->type() == "local"); KMAcctLocal *acct = static_cast(account); setName(acct->name()); setLocation(acct->location()); setCheckInterval(acct->checkInterval()); setCheckExclude(acct->checkExclude()); setLockType(acct->lockType()); setFolder(acct->folder()); setPrecommand(acct->precommand()); } //----------------------------------------------------------------------------- void KMAcctLocal::processNewMail(bool) { QTime t; KMFolder mailFolder(NULL, location()); mailFolder.setLockType( mLock ); long num = 0; long i; int rc; KMMessage* msg; bool addedOk; hasNewMail = false; 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); } kapp->processEvents(); 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; iabortRequested()) 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", "fcntl" ); if( locktype == "procmail_lockfile" ) mLock = procmail_lockfile; 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); } //----------------------------------------------------------------------------- void KMAcctLocal::setLocation(const QString& aLocation) { mLocation = aLocation; }