29#include "jobscheduler.h"
31#include "folderstorage.h"
32#include "kmfoldermgr.h"
37JobScheduler::JobScheduler( TQObject* parent,
const char* name )
38 : TQObject( parent, name ), mTimer( this,
"mTimer" ),
39 mPendingImmediateTasks( 0 ),
40 mCurrentTask( 0 ), mCurrentJob( 0 )
42 connect( &mTimer, TQ_SIGNAL( timeout() ), TQ_SLOT( slotRunNextJob() ) );
47JobScheduler::~JobScheduler()
50 for( TaskList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) {
59 bool immediate = task->isImmediate();
64 for( TaskList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) {
65 if ( (*it)->taskTypeId() == typeId && (*it)->folder() == folder ) {
67 kdDebug(5006) <<
"JobScheduler: already having task type " << typeId <<
" for folder " << folder->
label() << endl;
70 if ( !mCurrentTask && immediate ) {
80 if ( !mCurrentTask && immediate )
84 kdDebug(5006) <<
"JobScheduler: adding task " << task <<
" (type " << task->
taskTypeId()
87 mTaskList.append( task );
89 ++mPendingImmediateTasks;
90 if ( !mCurrentTask && !mTimer.isActive() )
95void JobScheduler::removeTask( TaskList::Iterator& it )
97 if ( (*it)->isImmediate() )
98 --mPendingImmediateTasks;
99 mTaskList.remove( it );
104 if ( mCurrentTask && mCurrentTask->
folder() == folder ) {
105 if ( mCurrentJob->isOpeningFolder() ) {
106#ifdef DEBUG_SCHEDULER
107 kdDebug(5006) <<
"JobScheduler: got the opening-notification for " << folder->
label() <<
" as expected." << endl;
113 if ( mCurrentJob->isCancellable() )
114 interruptCurrentTask();
119void JobScheduler::interruptCurrentTask()
121 Q_ASSERT( mCurrentTask );
122#ifdef DEBUG_SCHEDULER
123 kdDebug(5006) <<
"JobScheduler: interrupting job " << mCurrentJob <<
" for folder " << mCurrentTask->
folder()->
label() << endl;
131void JobScheduler::slotRunNextJob()
133 while ( !mCurrentJob ) {
134#ifdef DEBUG_SCHEDULER
135 kdDebug(5006) <<
"JobScheduler: slotRunNextJob" << endl;
137 Q_ASSERT( mCurrentTask == 0 );
140 for( TaskList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) {
144#ifdef DEBUG_SCHEDULER
145 kdDebug(5006) <<
" folder for task " << (*it) <<
" was deleted" << endl;
148 if ( !mTaskList.isEmpty() )
156 kmkernel->searchFolderMgr()->tryReleasingFolder( folder );
157#ifdef DEBUG_SCHEDULER
158 kdDebug(5006) <<
" looking at folder " << folder->
label()
160 <<
" isOpened=" << (*it)->folder()->isOpened() << endl;
176void JobScheduler::restartTimer()
178 if ( mPendingImmediateTasks > 0 )
182#ifdef DEBUG_SCHEDULER
183 mTimer.start( 10000 );
185 mTimer.start( 1 * 60000 );
192 Q_ASSERT( mCurrentTask == 0 );
193 if ( mCurrentTask ) {
194 interruptCurrentTask();
198 mCurrentJob = mCurrentTask->
run();
199#ifdef DEBUG_SCHEDULER
200 kdDebug(5006) <<
"JobScheduler: task " << mCurrentTask
201 <<
" (type " << mCurrentTask->
taskTypeId() <<
")"
202 <<
" for folder " << mCurrentTask->
folder()->
label()
203 <<
" returned job " << mCurrentJob <<
" "
204 << ( mCurrentJob?mCurrentJob->className():0 ) << endl;
206 if ( !mCurrentJob ) {
209 if ( !mTaskList.isEmpty() )
214 mCurrentTask->
folder()->storage()->
addJob( mCurrentJob );
215 connect( mCurrentJob, TQ_SIGNAL( finished() ),
this, TQ_SLOT( slotJobFinished() ) );
216 mCurrentJob->start();
219void JobScheduler::slotJobFinished()
222#ifdef DEBUG_SCHEDULER
223 kdDebug(5006) <<
"JobScheduler: slotJobFinished" << endl;
228 if ( !mTaskList.isEmpty() )
233void JobScheduler::pause()
235 mPendingImmediateTasks = 0;
236 if ( mCurrentJob && mCurrentJob->isCancellable() )
237 interruptCurrentTask();
241void JobScheduler::resume()
248KMail::ScheduledJob::ScheduledJob(
KMFolder* folder,
bool immediate )
249 : FolderJob( 0, tOther, folder ), mImmediate( immediate ),
250 mOpeningFolder( false )
256#include "jobscheduler.moc"
void addJob(FolderJob *) const
Add job for this folder.
bool isOpened() const
Test if folder is opened.
virtual TQString label() const
Returns the label of the folder for visualization.
TQString location() const
Returns full path to folder file.
void notifyOpeningFolder(KMFolder *folder)
Called by [implementations of] FolderStorage::open() Interrupt any running job for this folder and re...
void registerTask(ScheduledTask *task)
Register a task to be done for a given folder The ownership of the task is transferred to the JobSche...
A scheduled task is some information about a folder job that should be run later.
virtual ScheduledJob * run()=0
Run this task, i.e.
KMFolder * folder() const
The folder which this task is about, 0 if it was deleted meanwhile.
virtual int taskTypeId() const =0
An identifier for the type of task (a bit like TQListViewItem::rtti) This allows to automatically pre...