00001
00002
00003
#ifdef HAVE_CONFIG_H
00004
#include <config.h>
00005
#endif
00006
00007
#include "kmacctlocal.h"
00008
#include "kmfoldermbox.h"
00009
#include "kmacctfolder.h"
00010
#include "kmbroadcaststatus.h"
00011
#include "kmfoldermgr.h"
00012
00013
#include <kapplication.h>
00014
#include <klocale.h>
00015
#include <kmessagebox.h>
00016
#include <kdebug.h>
00017
#include <kconfig.h>
00018
00019
#include <qfileinfo.h>
00020
00021
#include <stdlib.h>
00022
#include <stdio.h>
00023
#include <errno.h>
00024
#include <assert.h>
00025
00026
00027 KMAcctLocal::KMAcctLocal(KMAcctMgr* aOwner,
const QString& aAccountName):
00028 KMAccount(aOwner, aAccountName)
00029 {
00030 mLock = procmail_lockfile;
00031 }
00032
00033
00034
00035 KMAcctLocal::~KMAcctLocal()
00036 {
00037 }
00038
00039
00040
00041 QString KMAcctLocal::type(
void)
const
00042
{
00043
return "local";
00044 }
00045
00046
00047
00048
void KMAcctLocal::init() {
00049 KMAccount::init();
00050 }
00051
00052
00053
00054
void KMAcctLocal::pseudoAssign(
const KMAccount * a )
00055 {
00056 KMAccount::pseudoAssign( a );
00057
00058
const KMAcctLocal * l = dynamic_cast<const KMAcctLocal*>( a );
00059
if ( !l )
return;
00060
00061 setLocation( l->location() );
00062 setLockType( l->lockType() );
00063 setProcmailLockFileName( l->procmailLockFileName() );
00064 }
00065
00066
00067
void KMAcctLocal::processNewMail(
bool)
00068 {
00069 QTime t;
00070 hasNewMail =
false;
00071
00072
if ( precommand().isEmpty() ) {
00073 QFileInfo fi(
location() );
00074
if ( fi.size() == 0 ) {
00075
KMBroadcastStatus::instance()->
setStatusMsgTransmissionCompleted( 0 );
00076 checkDone(hasNewMail, 0);
00077
return;
00078 }
00079 }
00080
00081 KMFolderMbox mailFolder(0,
location());
00082 mailFolder.setLockType( mLock );
00083
if ( mLock == procmail_lockfile)
00084 mailFolder.setProcmailLockFileName( mProcmailLockFileName );
00085
00086
long num = 0;
00087
long i;
00088
int rc;
00089 KMMessage* msg;
00090
bool addedOk;
00091
00092
if (!mFolder) {
00093 checkDone(hasNewMail, -1);
00094
KMBroadcastStatus::instance()->
setStatusMsg( i18n(
"Transmission failed." ));
00095
return;
00096 }
00097
00098
KMBroadcastStatus::instance()->
reset();
00099
KMBroadcastStatus::instance()->
setStatusMsg(
00100 i18n(
"Preparing transmission from \"%1\"...").arg(mName));
00101
00102
00103
if (!runPrecommand(precommand()))
00104 {
00105 kdDebug(5006) <<
"cannot run precommand " << precommand() << endl;
00106 checkDone(hasNewMail, -1);
00107 }
00108
00109 mailFolder.setAutoCreateIndex(FALSE);
00110
00111 rc = mailFolder.open();
00112
if (rc)
00113 {
00114 QString aStr;
00115 aStr = i18n(
"Cannot open file:");
00116 aStr += mailFolder.path()+
"/"+mailFolder.name();
00117 KMessageBox::sorry(0, aStr);
00118 kdDebug(5006) <<
"cannot open file " << mailFolder.path() <<
"/"
00119 << mailFolder.name() << endl;
00120 checkDone(hasNewMail, -1);
00121
KMBroadcastStatus::instance()->
setStatusMsg( i18n(
"Transmission failed." ));
00122
return;
00123 }
00124
00125
if (mailFolder.isReadOnly()) {
00126 kdDebug(5006) <<
"mailFolder could not be locked" << endl;
00127 mailFolder.close();
00128 checkDone(hasNewMail, -1);
00129 QString errMsg = i18n(
"Transmission failed: Could not lock %1." )
00130 .arg( mailFolder.location() );
00131
KMBroadcastStatus::instance()->
setStatusMsg( errMsg );
00132
return;
00133 }
00134
00135 mFolder->open();
00136
00137 num = mailFolder.count();
00138
00139 addedOk =
true;
00140 t.start();
00141
00142
00143 QString statusMsgStub = i18n(
"Moving message %3 of %2 from %1.")
00144 .arg(mailFolder.location()).arg(num);
00145
00146
KMBroadcastStatus::instance()->
setStatusProgressEnable(
"L" + mName,
true );
00147
for (i=0; i<num; i++)
00148 {
00149
00150
if (!addedOk)
break;
00151
00152
00153
00154
00155 QString
statusMsg = statusMsgStub.arg(i);
00156
KMBroadcastStatus::instance()->
setStatusMsg( statusMsg );
00157
KMBroadcastStatus::instance()->
setStatusProgressPercent(
"L" + mName,
00158 (i*100) / num );
00159
00160 msg = mailFolder.take(0);
00161
if (msg)
00162 {
00163
#if 0
00164
00165 QFile fileD0(
"testdat_xx-0-0" );
00166
if( fileD0.open( IO_WriteOnly ) ) {
00167 QCString s = msg->asString();
00168 uint l = s.length();
00169
if ( l > 0 ) {
00170 QDataStream ds( &fileD0 );
00171 ds.writeRawBytes( s.data(), l );
00172 }
00173 fileD0.close();
00174 }
00175
#endif
00176
msg->setStatus(msg->headerField(
"Status").latin1(),
00177 msg->headerField(
"X-Status").latin1());
00178 msg->setEncryptionStateChar( msg->headerField(
"X-KMail-EncryptionState" ).at(0) );
00179 msg->setSignatureStateChar( msg->headerField(
"X-KMail-SignatureState" ).at(0));
00180
00181 addedOk = processNewMsg(msg);
00182
00183
if (addedOk)
00184 hasNewMail =
true;
00185 }
00186
00187
if (t.elapsed() >= 200) {
00188 kapp->processEvents();
00189 t.start();
00190 }
00191
00192 }
00193
KMBroadcastStatus::instance()->
setStatusProgressEnable(
"L" + mName,
false );
00194
KMBroadcastStatus::instance()->
reset();
00195
00196
if (addedOk)
00197 {
00198 kmkernel->folderMgr()->syncAllFolders();
00199 rc = mailFolder.expunge();
00200
if (rc)
00201 KMessageBox::queuedMessageBox( 0, KMessageBox::Information,
00202 i18n(
"<qt>Cannot remove mail from "
00203
"mailbox <b>%1</b>:<br>%2</qt>" )
00204 .arg( mailFolder.location() )
00205 .arg( strerror( rc ) ) );
00206
KMBroadcastStatus::instance()->
setStatusMsgTransmissionCompleted( num );
00207 }
00208
00209
00210 mailFolder.close();
00211 mFolder->close();
00212
00213 checkDone(hasNewMail, num);
00214
00215
return;
00216 }
00217
00218
00219
00220
void KMAcctLocal::readConfig(KConfig& config)
00221 {
00222 KMAccount::readConfig(config);
00223 mLocation = config.readPathEntry(
"Location", mLocation);
00224 QString locktype = config.readEntry(
"LockType",
"procmail_lockfile" );
00225
00226
if( locktype ==
"procmail_lockfile" ) {
00227 mLock = procmail_lockfile;
00228 mProcmailLockFileName = config.readEntry(
"ProcmailLockFile",
00229 mLocation +
".lock");
00230 }
else if( locktype ==
"mutt_dotlock" )
00231 mLock = mutt_dotlock;
00232
else if( locktype ==
"mutt_dotlock_privileged" )
00233 mLock = mutt_dotlock_privileged;
00234
else if( locktype ==
"none" )
00235 mLock = lock_none;
00236
else mLock = FCNTL;
00237 }
00238
00239
00240
00241
void KMAcctLocal::writeConfig(KConfig& config)
00242 {
00243 KMAccount::writeConfig(config);
00244
00245 config.writePathEntry(
"Location", mLocation);
00246
00247 QString st =
"fcntl";
00248
if (mLock == procmail_lockfile) st =
"procmail_lockfile";
00249
else if (mLock == mutt_dotlock) st =
"mutt_dotlock";
00250
else if (mLock == mutt_dotlock_privileged) st =
"mutt_dotlock_privileged";
00251
else if (mLock == lock_none) st =
"none";
00252 config.writeEntry(
"LockType", st);
00253
00254
if (mLock == procmail_lockfile) {
00255 config.writeEntry(
"ProcmailLockFile", mProcmailLockFileName);
00256 }
00257
00258 }
00259
00260
00261
00262
void KMAcctLocal::setLocation(
const QString& aLocation)
00263 {
00264 mLocation = aLocation;
00265 }
00266
00267
void KMAcctLocal::setProcmailLockFileName(
const QString& s)
00268 {
00269 mProcmailLockFileName = s;
00270 }