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.
323 lines
8.9 KiB
323 lines
8.9 KiB
15 years ago
|
// kmacctlocal.cpp
|
||
|
|
||
|
#ifdef HAVE_CONFIG_H
|
||
|
#include <config.h>
|
||
|
#endif
|
||
|
|
||
|
#include "kmacctlocal.h"
|
||
|
#include "kmfoldermbox.h"
|
||
|
#include "kmacctfolder.h"
|
||
|
#include "broadcaststatus.h"
|
||
|
using KPIM::BroadcastStatus;
|
||
|
#include "progressmanager.h"
|
||
|
using KPIM::ProgressManager;
|
||
|
|
||
|
#include "kmfoldermgr.h"
|
||
|
|
||
|
#include <kapplication.h>
|
||
|
#include <klocale.h>
|
||
|
#include <kmessagebox.h>
|
||
|
#include <kdebug.h>
|
||
|
#include <kconfig.h>
|
||
|
|
||
|
#include <qfileinfo.h>
|
||
|
#include <qstylesheet.h>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <errno.h>
|
||
|
#include <assert.h>
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
KMAcctLocal::KMAcctLocal(AccountManager* aOwner, const QString& aAccountName, uint id):
|
||
|
KMAccount(aOwner, aAccountName, id), mHasNewMail( false ),
|
||
|
mAddedOk( true ), mNumMsgs( 0 ),
|
||
|
mMsgsFetched( 0 ), mMailFolder( 0 )
|
||
|
{
|
||
|
mLock = procmail_lockfile;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
KMAcctLocal::~KMAcctLocal()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
QString KMAcctLocal::type(void) const
|
||
|
{
|
||
|
return "local";
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::init() {
|
||
|
KMAccount::init();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::pseudoAssign( const KMAccount * a )
|
||
|
{
|
||
|
KMAccount::pseudoAssign( a );
|
||
|
|
||
|
const KMAcctLocal * l = dynamic_cast<const KMAcctLocal*>( a );
|
||
|
if ( !l ) return;
|
||
|
|
||
|
setLocation( l->location() );
|
||
|
setLockType( l->lockType() );
|
||
|
setProcmailLockFileName( l->procmailLockFileName() );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::processNewMail(bool)
|
||
|
{
|
||
|
mHasNewMail = false;
|
||
|
|
||
|
if ( !preProcess() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
QTime t;
|
||
|
t.start();
|
||
|
|
||
|
for ( mMsgsFetched = 0; mMsgsFetched < mNumMsgs; ++mMsgsFetched )
|
||
|
{
|
||
|
if ( !fetchMsg() )
|
||
|
break;
|
||
|
|
||
|
if (t.elapsed() >= 200) { //hardwired constant
|
||
|
kapp->processEvents();
|
||
|
t.start();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
postProcess();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool KMAcctLocal::preProcess()
|
||
|
{
|
||
|
if ( precommand().isEmpty() ) {
|
||
|
QFileInfo fi( location() );
|
||
|
if ( fi.size() == 0 ) {
|
||
|
BroadcastStatus::instance()->setStatusMsgTransmissionCompleted( mName, 0 );
|
||
|
checkDone( mHasNewMail, CheckOK );
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
mMailFolder = new KMFolder( 0, location(), KMFolderTypeMbox,
|
||
|
false /* no index */, false /* don't export sernums */ );
|
||
|
KMFolderMbox* mboxStorage =
|
||
|
static_cast<KMFolderMbox*>(mMailFolder->storage());
|
||
|
mboxStorage->setLockType( mLock );
|
||
|
if ( mLock == procmail_lockfile)
|
||
|
mboxStorage->setProcmailLockFileName( mProcmailLockFileName );
|
||
|
|
||
|
if (!mFolder) {
|
||
|
checkDone( mHasNewMail, CheckError );
|
||
|
BroadcastStatus::instance()->setStatusMsg( i18n( "Transmission failed." ));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//BroadcastStatus::instance()->reset();
|
||
|
BroadcastStatus::instance()->setStatusMsg(
|
||
|
i18n("Preparing transmission from \"%1\"...").arg(mName));
|
||
|
|
||
|
|
||
|
Q_ASSERT( !mMailCheckProgressItem );
|
||
|
QString escapedName = QStyleSheet::escape( mName );
|
||
|
mMailCheckProgressItem = KPIM::ProgressManager::createProgressItem(
|
||
|
"MailCheck" + mName,
|
||
|
escapedName,
|
||
|
i18n("Preparing transmission from \"%1\"...").arg( escapedName ),
|
||
|
false, // cannot be canceled
|
||
|
false ); // no tls/ssl
|
||
|
|
||
|
// run the precommand
|
||
|
if (!runPrecommand(precommand()))
|
||
|
{
|
||
|
kdDebug(5006) << "cannot run precommand " << precommand() << endl;
|
||
|
checkDone( mHasNewMail, CheckError );
|
||
|
BroadcastStatus::instance()->setStatusMsg( i18n( "Running precommand failed." ));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const int rc = mMailFolder->open("acctlocalMail");
|
||
|
if ( rc != 0 ) {
|
||
|
QString aStr;
|
||
|
aStr = i18n("Cannot open file:");
|
||
|
aStr += mMailFolder->path()+"/"+mMailFolder->name();
|
||
|
KMessageBox::sorry(0, aStr);
|
||
|
kdDebug(5006) << "cannot open file " << mMailFolder->path() << "/"
|
||
|
<< mMailFolder->name() << endl;
|
||
|
checkDone( mHasNewMail, CheckError );
|
||
|
BroadcastStatus::instance()->setStatusMsg( i18n( "Transmission failed." ));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (!mboxStorage->isLocked()) {
|
||
|
kdDebug(5006) << "mailFolder could not be locked" << endl;
|
||
|
mMailFolder->close("acctlocalMail");
|
||
|
checkDone( mHasNewMail, CheckError );
|
||
|
QString errMsg = i18n( "Transmission failed: Could not lock %1." )
|
||
|
.arg( mMailFolder->location() );
|
||
|
BroadcastStatus::instance()->setStatusMsg( errMsg );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
mFolder->open("acctlocalFold");
|
||
|
|
||
|
mNumMsgs = mMailFolder->count();
|
||
|
|
||
|
mMailCheckProgressItem->setTotalItems( mNumMsgs );
|
||
|
|
||
|
// prepare the static parts of the status message:
|
||
|
mStatusMsgStub = i18n("Moving message %3 of %2 from %1.")
|
||
|
.arg(mMailFolder->location()).arg( mNumMsgs );
|
||
|
|
||
|
//BroadcastStatus::instance()->setStatusProgressEnable( "L" + mName, true );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool KMAcctLocal::fetchMsg()
|
||
|
{
|
||
|
KMMessage* msg;
|
||
|
|
||
|
/* This causes mail eating
|
||
|
if (kmkernel->mailCheckAborted()) break; */
|
||
|
|
||
|
const QString statusMsg = mStatusMsgStub.arg( mMsgsFetched );
|
||
|
//BroadcastStatus::instance()->setStatusMsg( statusMsg );
|
||
|
mMailCheckProgressItem->incCompletedItems();
|
||
|
mMailCheckProgressItem->updateProgress();
|
||
|
mMailCheckProgressItem->setStatus( statusMsg );
|
||
|
|
||
|
msg = mMailFolder->take(0);
|
||
|
if (msg)
|
||
|
{
|
||
|
#if 0
|
||
|
// debug code, don't remove
|
||
|
QFile fileD0( "testdat_xx-0-0" );
|
||
|
if( fileD0.open( IO_WriteOnly ) ) {
|
||
|
QCString s = msg->asString();
|
||
|
uint l = s.length();
|
||
|
if ( l > 0 ) {
|
||
|
QDataStream ds( &fileD0 );
|
||
|
ds.writeRawBytes( s.data(), l );
|
||
|
}
|
||
|
fileD0.close(); // If data is 0 we just create a zero length file.
|
||
|
}
|
||
|
#endif
|
||
|
msg->setStatus(msg->headerField("Status").latin1(),
|
||
|
msg->headerField("X-Status").latin1());
|
||
|
msg->setEncryptionStateChar( msg->headerField( "X-KMail-EncryptionState" ).at(0) );
|
||
|
msg->setSignatureStateChar( msg->headerField( "X-KMail-SignatureState" ).at(0));
|
||
|
msg->setComplete(true);
|
||
|
msg->updateAttachmentState();
|
||
|
|
||
|
mAddedOk = processNewMsg(msg);
|
||
|
|
||
|
if (mAddedOk)
|
||
|
mHasNewMail = true;
|
||
|
|
||
|
return mAddedOk;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::postProcess()
|
||
|
{
|
||
|
if (mAddedOk)
|
||
|
{
|
||
|
kmkernel->folderMgr()->syncAllFolders();
|
||
|
const int rc = mMailFolder->expunge();
|
||
|
if ( rc != 0 ) {
|
||
|
KMessageBox::queuedMessageBox( 0, KMessageBox::Information,
|
||
|
i18n( "<qt>Cannot remove mail from "
|
||
|
"mailbox <b>%1</b>:<br>%2</qt>" )
|
||
|
.arg( mMailFolder->location() )
|
||
|
.arg( strerror( rc ) ) );
|
||
|
}
|
||
|
|
||
|
if( mMailCheckProgressItem ) { // do this only once...
|
||
|
BroadcastStatus::instance()->setStatusMsgTransmissionCompleted( mName, mNumMsgs );
|
||
|
mMailCheckProgressItem->setStatus(
|
||
|
i18n( "Fetched 1 message from mailbox %1.",
|
||
|
"Fetched %n messages from mailbox %1.",
|
||
|
mNumMsgs ).arg( mMailFolder->location() ) );
|
||
|
mMailCheckProgressItem->setComplete();
|
||
|
mMailCheckProgressItem = 0;
|
||
|
}
|
||
|
}
|
||
|
// else warning is written already
|
||
|
|
||
|
mMailFolder->close("acctlocalMail");
|
||
|
delete mMailFolder; mMailFolder = 0;
|
||
|
|
||
|
mFolder->close("acctlocalFold");
|
||
|
|
||
|
checkDone( mHasNewMail, CheckOK );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::readConfig(KConfig& config)
|
||
|
{
|
||
|
KMAccount::readConfig(config);
|
||
|
mLocation = config.readPathEntry("Location", mLocation);
|
||
|
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 = lock_none;
|
||
|
else mLock = FCNTL;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void KMAcctLocal::writeConfig(KConfig& config)
|
||
|
{
|
||
|
KMAccount::writeConfig(config);
|
||
|
|
||
|
config.writePathEntry("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 == lock_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(const QString& s)
|
||
|
{
|
||
|
mProcmailLockFileName = s;
|
||
|
}
|