00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _kio_scheduler_h
00023 #define _kio_scheduler_h
00024
00025 #include "kio/job.h"
00026 #include "kio/jobclasses.h"
00027 #include <qtimer.h>
00028 #include <qptrdict.h>
00029 #include <qmap.h>
00030
00031 #include <dcopobject.h>
00032
00033 namespace KIO {
00034
00035 class Slave;
00036 class SlaveList;
00037 class SlaveConfig;
00038 class SessionData;
00039
00099 class Scheduler : public QObject, virtual public DCOPObject {
00100 Q_OBJECT
00101
00102 public:
00103 typedef QPtrList<SimpleJob> JobList;
00104
00105
00106 class ProtocolInfo;
00107 class JobData;
00108
00109 ~Scheduler();
00110
00116 static void doJob(SimpleJob *job)
00117 { self()->_doJob(job); }
00118
00124 static void scheduleJob(SimpleJob *job)
00125 { self()->_scheduleJob(job); }
00126
00130 static void cancelJob(SimpleJob *job)
00131 { self()->_cancelJob(job); }
00132
00136 static void jobFinished(KIO::SimpleJob *job, KIO::Slave *slave)
00137 { self()->_jobFinished(job, slave); }
00138
00148 static void putSlaveOnHold(KIO::SimpleJob *job, const KURL &url)
00149 { self()->_putSlaveOnHold(job, url); }
00150
00155 static void removeSlaveOnHold()
00156 { self()->_removeSlaveOnHold(); }
00157
00163 static void publishSlaveOnHold()
00164 { self()->_publishSlaveOnHold(); }
00165
00177 static KIO::Slave *getConnectedSlave(const KURL &url, const KIO::MetaData &config = MetaData() )
00178 { return self()->_getConnectedSlave(url, config); }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 static bool assignJobToSlave(KIO::Slave *slave, KIO::SimpleJob *job)
00198 { return self()->_assignJobToSlave(slave, job); }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 static bool disconnectSlave(KIO::Slave *slave)
00213 { return self()->_disconnectSlave(slave); }
00214
00221 static void registerWindow(QWidget *wid)
00222 { self()->_registerWindow(wid); }
00223
00231 static bool connect( const char *signal, const QObject *receiver,
00232 const char *member)
00233 { return QObject::connect(self(), signal, receiver, member); }
00234
00235 static bool connect( const QObject* sender, const char* signal,
00236 const QObject* receiver, const char* member )
00237 { return QObject::connect(sender, signal, receiver, member); }
00238
00239 static bool disconnect( const QObject* sender, const char* signal,
00240 const QObject* receiver, const char* member )
00241 { return QObject::disconnect(sender, signal, receiver, member); }
00242
00243 bool connect( const QObject *sender, const char *signal,
00244 const char *member )
00245 { return QObject::connect(sender, signal, member); }
00246
00251 static void checkSlaveOnHold(bool b) { self()->_checkSlaveOnHold(b); }
00252
00253 void debug_info();
00254
00255 virtual bool process(const QCString &fun, const QByteArray &data,
00256 QCString& replyType, QByteArray &replyData);
00257
00258 virtual QCStringList functions();
00259
00260 public slots:
00261 void slotSlaveDied(KIO::Slave *slave);
00262 void slotSlaveStatus(pid_t pid, const QCString &protocol,
00263 const QString &host, bool connected);
00264 signals:
00265 void slaveConnected(KIO::Slave *slave);
00266 void slaveError(KIO::Slave *slave, int error, const QString &errorMsg);
00267
00268 protected:
00269 void setupSlave(KIO::Slave *slave, const KURL &url, const QString &protocol, const QString &proxy , bool newSlave, const KIO::MetaData *config=0);
00270 bool startJobScheduled(ProtocolInfo *protInfo);
00271 bool startJobDirect();
00272 Scheduler();
00273
00274 protected slots:
00275 void startStep();
00276 void slotCleanIdleSlaves();
00277 void slotSlaveConnected();
00278 void slotSlaveError(int error, const QString &errorMsg);
00279 void slotScheduleCoSlave();
00281 void slotUnregisterWindow(QObject *);
00282
00283 private:
00284 class ProtocolInfoDict;
00285 class ExtraJobData;
00286
00287 Scheduler(const Scheduler&);
00288 static Scheduler *self();
00289 static Scheduler *instance;
00290 void _doJob(SimpleJob *job);
00291 void _scheduleJob(SimpleJob *job);
00292 void _cancelJob(SimpleJob *job);
00293 void _jobFinished(KIO::SimpleJob *job, KIO::Slave *slave);
00294 void _scheduleCleanup();
00295 void _putSlaveOnHold(KIO::SimpleJob *job, const KURL &url);
00296 void _removeSlaveOnHold();
00297 Slave *_getConnectedSlave(const KURL &url, const KIO::MetaData &metaData );
00298 bool _assignJobToSlave(KIO::Slave *slave, KIO::SimpleJob *job);
00299 bool _disconnectSlave(KIO::Slave *slave);
00300 void _checkSlaveOnHold(bool b);
00301 void _publishSlaveOnHold();
00302 void _registerWindow(QWidget *wid);
00303
00304 Slave *findIdleSlave(ProtocolInfo *protInfo, SimpleJob *job, bool &exact);
00305 Slave *createSlave(ProtocolInfo *protInfo, SimpleJob *job, const KURL &url);
00306
00307
00308 QTimer slaveTimer;
00309 QTimer coSlaveTimer;
00310 QTimer cleanupTimer;
00311 bool busy;
00312
00313 SlaveList *slaveList;
00314 SlaveList *idleSlaves;
00315 SlaveList *coIdleSlaves;
00316
00317 ProtocolInfoDict *protInfoDict;
00318 Slave *slaveOnHold;
00319 KURL urlOnHold;
00320 JobList newJobs;
00321
00322 QPtrDict<JobList> coSlaves;
00323 ExtraJobData *extraJobData;
00324 SlaveConfig *slaveConfig;
00325 SessionData *sessionData;
00326 bool checkOnHold;
00327 QMap<QObject *,long> m_windowList;
00328 protected:
00329 virtual void virtual_hook( int id, void* data );
00330 private:
00331 class SchedulerPrivate* d;
00332 };
00333
00334 };
00335 #endif