78
void SchedulerPlugin::stopCalculation( ScheduleManager *sm )
80
foreach ( SchedulerThread *j, m_jobs ) {
81
if ( sm == j->mainManager() ) {
87
void SchedulerPlugin::haltCalculation( ScheduleManager *sm )
89
qDebug()<<"SchedulerPlugin::haltCalculation:"<<sm;
90
foreach ( SchedulerThread *j, m_jobs ) {
91
if ( sm == j->mainManager() ) {
96
sm->setCalculationResult( ScheduleManager::CalculationCanceled );
97
sm->setScheduling( false );
100
void SchedulerPlugin::stopCalculation( SchedulerThread *job )
102
job->stopScheduling();
105
void SchedulerPlugin::haltCalculation( SchedulerThread *job )
107
qDebug()<<"SchedulerPlugin::haltCalculation:"<<job<<m_jobs.contains( job );
108
disconnect(this, 0, job, 0 );
109
job->haltScheduling();
110
if ( m_jobs.contains( job ) ) {
111
qDebug()<<"SchedulerPlugin::haltCalculation: remove"<<job;
112
m_jobs.removeAt( m_jobs.indexOf( job ) );
116
void SchedulerPlugin::slotSyncData()
122
void SchedulerPlugin::updateProgress()
124
foreach ( SchedulerThread *j, m_jobs ) {
125
ScheduleManager *sm = j->mainManager();
126
if ( sm->maxProgress() != j->maxProgress() ) {
127
sm->setMaxProgress( j->maxProgress() );
129
sm->setProgress( j->progress() );
133
void SchedulerPlugin::updateLog()
135
foreach ( SchedulerThread *j, m_jobs ) {
140
void SchedulerPlugin::updateLog( SchedulerThread *j )
142
ScheduleManager *sm = j->mainManager();
143
Project *p = j->mainProject();
144
Q_ASSERT( p == &(sm->project()) );
145
QList<Schedule::Log> logs;
146
//qDebug()<<"SchedulerPlugin::updateLog:"<<j<<logs.count();
147
foreach ( const Schedule::Log log, j->log() ) {
148
// map log from temporary project to real project
149
Schedule::Log l = log;
151
const Resource *r = l.resource;
152
l.resource = sm->project().findResource( l.resource->id() );
153
// qDebug()<<"SchedulerPlugin::updateLog: mapped"<<r<<l.resource;
154
Q_ASSERT( r != l.resource );
155
Q_ASSERT( l.resource->project() == p );
158
const Node *n = l.node;
159
if ( l.node->type() == Node::Type_Project ) {
160
l.node = &( sm->project() );
162
l.node = sm->project().findNode( l.node->id() );
164
// qDebug()<<"SchedulerPlugin::updateLog: mapped"<<n<<l.node;
165
Q_ASSERT( n != l.node );
166
Q_ASSERT( l.node->projectNode() == p );
170
sm->slotAddLog( logs );
173
void SchedulerPlugin::updateProject( const Project *tp, const ScheduleManager *tm, Project *mp, ScheduleManager *sm ) const
179
//qDebug()<<"SchedulerPlugin::updateProject:"<<tp<<tp->name()<<"->"<<mp<<mp->name()<<sm;
180
Q_ASSERT( tp != mp && tm != sm );
181
long sid = tm->scheduleId();
182
Q_ASSERT( sid == sm->scheduleId() );
184
XMLLoaderObject status;
185
status.setVersion( KPLATO_FILE_SYNTAX_VERSION );
186
status.setProject( mp );
187
status.setProjectSpec( mp->timeSpec() );
189
foreach ( const Node *tn, tp->allNodes() ) {
190
Node *mn = mp->findNode( tn->id() );
193
updateNode( tn, mn, sid, status );
196
// update main schedule and appointments
197
updateAppointments( tp, tm, mp, sm, status );
200
void SchedulerPlugin::updateNode( const Node *tn, Node *mn, long sid, XMLLoaderObject &status ) const
202
//qDebug()<<"SchedulerPlugin::updateNode:"<<tn<<tn->name()<<"->"<<mn<<mn->name();
203
NodeSchedule *s = static_cast<NodeSchedule*>( tn->schedule( sid ) );
205
kWarning()<<"SchedulerPlugin::updateNode:"<<"Task:"<<tn->name()<<"could not find schedule with id:"<<sid;
208
QDomDocument doc( "tmp" );
209
QDomElement e = doc.createElement( "schedules" );
210
doc.appendChild( e );
213
Q_ASSERT( ! mn->findSchedule( sid ) );
214
s = static_cast<NodeSchedule*>( mn->schedule( sid ) );
216
s = new NodeSchedule();
219
xd.setContent( doc.toString() );
220
KoXmlElement se = xd.documentElement().namedItem( "schedule" ).toElement();
221
Q_ASSERT( ! se.isNull() );
223
s->loadXML( se, status );
224
s->setDeleted( false );
226
mn->addSchedule( s );
229
void SchedulerPlugin::updateAppointments( const Project *tp, const ScheduleManager *tm, Project *mp, ScheduleManager *sm, XMLLoaderObject &status ) const
231
MainSchedule *sch = tm->expected();
233
Q_ASSERT( sch != sm->expected() );
234
Q_ASSERT( sch->id() == sm->expected()->id() );
236
QDomDocument doc( "tmp" );
237
QDomElement e = doc.createElement( "schedule" );
238
doc.appendChild( e );
240
tp->saveAppointments( e, sch->id() );
243
xd.setContent( doc.toString() );
244
KoXmlElement se = xd.namedItem( "schedule" ).toElement();
245
Q_ASSERT( ! se.isNull() );
247
bool ret = sm->loadMainSchedule( sm->expected(), se, status ); // also loads appointments
249
mp->setCurrentSchedule( sch->id() );
250
sm->expected()->setPhaseNames( sch->phaseNames() );
254
//----------------------
255
SchedulerThread::SchedulerThread( Project *project, ScheduleManager *manager, QObject *parent )
257
m_mainproject( project ),
258
m_mainmanager( manager ),
259
m_mainmanagerId( manager->managerId() ),
262
m_stopScheduling(false ),
263
m_haltScheduling( false ),
266
KGlobal::ref(); // keep locale around
268
manager->createSchedules(); // creates expected() to get log messages during calculation
270
QDomDocument document( "kplato" );
271
saveProject( project, document );
273
m_pdoc.setContent( document.toString() );
276
connect( this, SIGNAL(started()), this, SLOT(slotStarted()));
277
connect( this, SIGNAL(finished()), this, SLOT(slotFinished()));
280
SchedulerThread::~SchedulerThread()
282
qDebug()<<"SchedulerThread::~SchedulerThread:"<<QThread::currentThreadId();
288
void SchedulerThread::setMaxProgress( int value )
290
m_maxprogressMutex.lock();
291
m_maxprogress = value;
292
m_maxprogressMutex.unlock();
293
emit maxProgressChanged( value, m_mainmanager );
296
int SchedulerThread::maxProgress() const
298
QMutexLocker m( &m_maxprogressMutex );
299
return m_maxprogress;
302
void SchedulerThread::setProgress( int value )
304
m_progressMutex.lock();
306
m_progressMutex.unlock();
307
emit progressChanged( value, m_mainmanager );
310
int SchedulerThread::progress() const
312
QMutexLocker m( &m_progressMutex );
316
void SchedulerThread::slotAddLog( KPlato::Schedule::Log log )
318
//qDebug()<<"SchedulerThread::slotAddLog:"<<log;
319
QMutexLocker m( &m_logMutex );
323
QList<Schedule::Log> SchedulerThread::log()
325
QMutexLocker m( &m_logMutex );
326
QList<KPlato::Schedule::Log> l = m_logs;
332
void SchedulerThread::slotStarted()
334
emit jobStarted( this );
337
void SchedulerThread::slotFinished()
339
if ( m_haltScheduling ) {
342
emit jobFinished( this );
346
void SchedulerThread::doRun()
353
ScheduleManager *SchedulerThread::manager() const
355
QMutexLocker m( &m_managerMutex );
359
Project *SchedulerThread::project() const
361
QMutexLocker m( &m_projectMutex );
365
void SchedulerThread::stopScheduling()
367
qDebug()<<"SchedulerThread::stopScheduling:";
368
m_stopScheduling = true;
371
void SchedulerThread::haltScheduling()
373
qDebug()<<"SchedulerThread::haltScheduling:";
374
m_haltScheduling = true;
378
void SchedulerThread::saveProject( Project *project, QDomDocument &document )
380
document.appendChild( document.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
382
QDomElement doc = document.createElement( "kplato" );
383
doc.setAttribute( "editor", "KPlato" );
384
doc.setAttribute( "mime", "application/x-vnd.kde.kplato" );
385
doc.setAttribute( "version", KPLATO_FILE_SYNTAX_VERSION );
386
document.appendChild( doc );
387
project->save( doc );
391
bool SchedulerThread::loadProject( Project *project, const KoXmlDocument &doc )
393
KoXmlElement pel = doc.documentElement().namedItem( "project" ).toElement();
394
if ( pel.isNull() ) {
397
XMLLoaderObject status;
398
status.setVersion( KPLATO_FILE_SYNTAX_VERSION );
399
status.setProject( project );
400
return project->load( pel, status );
67
404
} //namespace KPlato