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.
316 lines
8.9 KiB
316 lines
8.9 KiB
// kmacctlocal.cpp |
|
|
|
#include "kmacctlocal.h" |
|
#include "kmfoldermbox.h" |
|
#include "kmacctfolder.h" |
|
#include "broadcaststatus.h" |
|
//Added by qt3to4: |
|
using KPIM::BroadcastStatus; |
|
#include "progressmanager.h" |
|
using KPIM::ProgressManager; |
|
|
|
#include "kmfoldermgr.h" |
|
|
|
#include <klocale.h> |
|
#include <kmessagebox.h> |
|
#include <kdebug.h> |
|
#include <kconfiggroup.h> |
|
|
|
#include <QFileInfo> |
|
#include <QTime> |
|
|
|
#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 ), |
|
mProcessingNewMail( false ), mAddedOk( true ), mNumMsgs( 0 ), |
|
mMsgsFetched( 0 ), mMailFolder( 0 ) |
|
{ |
|
mLock = procmail_lockfile; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
KMAcctLocal::~KMAcctLocal() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
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) |
|
{ |
|
if ( mProcessingNewMail ) |
|
return; |
|
|
|
mHasNewMail = false; |
|
mProcessingNewMail = true; |
|
|
|
if ( !preProcess() ) { |
|
mProcessingNewMail = false; |
|
return; |
|
} |
|
|
|
QTime t; |
|
t.start(); |
|
|
|
for ( mMsgsFetched = 0; mMsgsFetched < mNumMsgs; ++mMsgsFetched ) |
|
{ |
|
if ( !fetchMsg() ) |
|
break; |
|
|
|
if (t.elapsed() >= 200) { //hardwired constant |
|
qApp->processEvents(); |
|
t.start(); |
|
} |
|
} |
|
|
|
postProcess(); |
|
mProcessingNewMail = false; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
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\"...", mName)); |
|
|
|
|
|
Q_ASSERT( !mMailCheckProgressItem ); |
|
mMailCheckProgressItem = KPIM::ProgressManager::createProgressItem( |
|
"MailCheck" + mName, |
|
mName, |
|
i18n("Preparing transmission from \"%1\"...", mName), |
|
false, // cannot be canceled |
|
false ); // no tls/ssl |
|
|
|
// run the precommand |
|
if (!runPrecommand(precommand())) |
|
{ |
|
kDebug(5006) <<"cannot run precommand" << precommand(); |
|
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); |
|
kDebug(5006) <<"cannot open file" << mMailFolder->path() <<"/" |
|
<< mMailFolder->name(); |
|
checkDone( mHasNewMail, CheckError ); |
|
BroadcastStatus::instance()->setStatusMsg( i18n( "Transmission failed." )); |
|
return false; |
|
} |
|
|
|
if (!mboxStorage->isLocked()) { |
|
kDebug(5006) <<"mailFolder could not be locked"; |
|
mMailFolder->close( "acctlocalMail" ); |
|
checkDone( mHasNewMail, CheckError ); |
|
QString errMsg = i18n( "Transmission failed: Could not lock %1." , |
|
mMailFolder->location() ); |
|
BroadcastStatus::instance()->setStatusMsg( errMsg ); |
|
return false; |
|
} |
|
|
|
mFolder->open( "acctlocalFold" ); |
|
|
|
mNumMsgs = mMailFolder->count(); |
|
|
|
mMailCheckProgressItem->setTotalItems( 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 = i18n( "Moving message %1 of %2 from %3.", |
|
mMsgsFetched, mNumMsgs, |
|
mMailFolder->location() ); |
|
//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( QIODevice::WriteOnly ) ) { |
|
Q3CString s = msg->asString(); |
|
uint l = s.length(); |
|
if ( l > 0 ) { |
|
QDataStream ds( &fileD0 ); |
|
ds.writeRawData( s.data(), l ); |
|
} |
|
fileD0.close(); // If data is 0 we just create a zero length file. |
|
} |
|
#endif |
|
msg->setStatus( msg->headerField( "Status" ).toLatin1(), |
|
msg->headerField( "X-Status" ).toLatin1()); |
|
if ( !msg->headerField( "X-KMail-EncryptionState" ).isEmpty() ) |
|
msg->setEncryptionStateChar( msg->headerField( "X-KMail-EncryptionState" ).at(0) ); |
|
if ( !msg->headerField( "X-KMail-SignatureState" ).isEmpty() ) |
|
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>" , |
|
mMailFolder->location() , |
|
strerror( rc ) ) ); |
|
} |
|
|
|
if( mMailCheckProgressItem ) { // do this only once... |
|
BroadcastStatus::instance()->setStatusMsgTransmissionCompleted( mName, mNumMsgs ); |
|
mMailCheckProgressItem->setStatus( |
|
i18np( "Fetched 1 message from mailbox %2.", |
|
"Fetched %1 messages from mailbox %2.", |
|
mNumMsgs, 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(KConfigGroup& 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(KConfigGroup& 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; |
|
}
|
|
|