29 #include "expirejob.h"
31 #include "globalsettings.h"
32 #include "folderstorage.h"
33 #include "broadcaststatus.h"
34 using KPIM::BroadcastStatus;
35 #include "kmcommands.h"
40 using namespace KMail;
43 #define EXPIREJOB_NRMESSAGES 100
45 #define EXPIREJOB_TIMERINTERVAL 100
61 ExpireJob::ExpireJob(
KMFolder* folder,
bool immediate )
62 :
ScheduledJob( folder, immediate ), mTimer( this ), mCurrentIndex( 0 ),
63 mFolderOpen( false ), mMoveToFolder( 0 )
67 ExpireJob::~ExpireJob()
71 void ExpireJob::kill()
73 Q_ASSERT( mCancellable );
75 if ( mFolderOpen && mSrcFolder && mSrcFolder->storage() )
76 mSrcFolder->storage()->close(
"expirejob" );
80 void ExpireJob::execute()
86 int unreadDays, readDays;
87 mSrcFolder->daysToExpire( unreadDays, readDays );
89 kdDebug(5006) <<
"ExpireJob: deleting unread older than "<< unreadDays <<
" days" << endl;
90 mMaxUnreadTime = time(0) - unreadDays * 3600 * 24;
93 kdDebug(5006) <<
"ExpireJob: deleting read older than "<< readDays <<
" days" << endl;
94 mMaxReadTime = time(0) - readDays * 3600 * 24;
97 if ((mMaxUnreadTime == 0) && (mMaxReadTime == 0)) {
98 kdDebug(5006) <<
"ExpireJob: nothing to do" << endl;
104 mOpeningFolder =
true;
105 storage->
open(
"expirejob" );
106 mOpeningFolder =
false;
108 mCurrentIndex = storage->
count()-1;
109 kdDebug(5006) <<
"ExpireJob: starting to expire in folder " << mSrcFolder->location() << endl;
110 connect( &mTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotDoWork() ) );
111 mTimer.start( EXPIREJOB_TIMERINTERVAL );
116 void ExpireJob::slotDoWork()
120 int stopIndex = mImmediate ? 0 : TQMAX( 0, mCurrentIndex - EXPIREJOB_NRMESSAGES );
121 #ifdef DEBUG_SCHEDULER
122 kdDebug(5006) <<
"ExpireJob: checking messages " << mCurrentIndex <<
" to " << stopIndex << endl;
124 for( ; mCurrentIndex >= stopIndex; mCurrentIndex-- ) {
125 const KMMsgBase *mb = storage->
getMsgBase( mCurrentIndex );
128 if ( ( mb->isImportant() || mb->isTodo() || mb->isWatched() )
129 && GlobalSettings::self()->excludeImportantMailFromExpiry() )
132 time_t maxTime = mb->isUnread() ? mMaxUnreadTime : mMaxReadTime;
134 if (mb->date() < maxTime) {
135 mRemovedMsgs.append( storage->
getMsgBase( mCurrentIndex ) );
138 if ( stopIndex == 0 )
142 void ExpireJob::done()
149 if ( !mRemovedMsgs.isEmpty() ) {
150 int count = mRemovedMsgs.count();
152 mCancellable =
false;
153 if ( mSrcFolder->expireAction() == KMFolder::ExpireDelete ) {
155 kdDebug(5006) <<
"ExpireJob: finished expiring in folder "
156 << mSrcFolder->location()
157 <<
" " << count <<
" messages to remove." << endl;
158 KMMoveCommand* cmd =
new KMMoveCommand( 0, mRemovedMsgs );
159 connect( cmd, TQT_SIGNAL( completed( KMCommand * ) ),
160 this, TQT_SLOT( slotMessagesMoved( KMCommand * ) ) );
163 str = i18n(
"Removing 1 old message from folder %1...",
164 "Removing %n old messages from folder %1...", count )
165 .arg( mSrcFolder->label() );
169 kmkernel->findFolderById( mSrcFolder->expireToFolderId() );
170 if ( !mMoveToFolder ) {
171 str = i18n(
"Cannot expire messages from folder %1: destination "
172 "folder %2 not found" )
173 .arg( mSrcFolder->label(), mSrcFolder->expireToFolderId() );
174 kdWarning(5006) << str << endl;
176 kdDebug(5006) <<
"ExpireJob: finished expiring in folder "
177 << mSrcFolder->location() <<
" "
178 << mRemovedMsgs.count() <<
" messages to move to "
179 << mMoveToFolder->label() << endl;
180 KMMoveCommand* cmd =
new KMMoveCommand( mMoveToFolder, mRemovedMsgs );
181 connect( cmd, TQT_SIGNAL( completed( KMCommand * ) ),
182 this, TQT_SLOT( slotMessagesMoved( KMCommand * ) ) );
185 str = i18n(
"Moving 1 old message from folder %1 to folder %2...",
186 "Moving %n old messages from folder %1 to folder %2...",
188 .arg( mSrcFolder->label(), mMoveToFolder->label() );
192 if ( !str.isEmpty() )
193 BroadcastStatus::instance()->setStatusMsg( str );
195 KConfigGroup group( KMKernel::config(),
"Folder-" + mSrcFolder->idString() );
196 group.writeEntry(
"Current", -1 );
199 mSrcFolder->storage()->close(
"expirejob" );
205 void ExpireJob::slotMessagesMoved( KMCommand *command )
207 mSrcFolder->storage()->close(
"expirejob" );
210 switch ( command->result() ) {
212 if ( mSrcFolder->expireAction() == KMFolder::ExpireDelete ) {
213 msg = i18n(
"Removed 1 old message from folder %1.",
214 "Removed %n old messages from folder %1.",
215 mRemovedMsgs.count() )
216 .arg( mSrcFolder->label() );
219 msg = i18n(
"Moved 1 old message from folder %1 to folder %2.",
220 "Moved %n old messages from folder %1 to folder %2.",
221 mRemovedMsgs.count() )
222 .arg( mSrcFolder->label(), mMoveToFolder->label() );
225 case KMCommand::Failed:
226 if ( mSrcFolder->expireAction() == KMFolder::ExpireDelete ) {
227 msg = i18n(
"Removing old messages from folder %1 failed." )
228 .arg( mSrcFolder->label() );
231 msg = i18n(
"Moving old messages from folder %1 to folder %2 failed." )
232 .arg( mSrcFolder->label(), mMoveToFolder->label() );
235 case KMCommand::Canceled:
236 if ( mSrcFolder->expireAction() == KMFolder::ExpireDelete ) {
237 msg = i18n(
"Removing old messages from folder %1 was canceled." )
238 .arg( mSrcFolder->label() );
241 msg = i18n(
"Moving old messages from folder %1 to folder %2 was "
243 .arg( mSrcFolder->label(), mMoveToFolder->label() );
247 BroadcastStatus::instance()->setStatusMsg( msg );
252 #include "expirejob.moc"