// -*- c++ -*-
/* This file is part of the KDE libraries
Copyright (C) 2000 Stephan Kulow
Waldo Bastian
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef _kio_scheduler_h
#define _kio_scheduler_h
#include "kio/job.h"
#include "kio/jobclasses.h"
#include
#include
#include
namespace KIO {
class Slave;
class SlaveList;
class SlaveConfig;
class SessionData;
/**
* The KIO::Scheduler manages io-slaves for the application.
* It also queues jobs and assigns the job to a slave when one
* becomes available.
*
* There are 3 possible ways for a job to get a slave:
*
* 1) Direct.
* This is the default. When you create a job the
* KIO::Scheduler will be notified and will find either an existing
* slave that is idle or it will create a new slave for the job.
*
* Example:
* TransferJob *job = KIO::get(KURL("http://www.kde.org"));
*
*
* 2) Scheduled
* If you create a lot of jobs, you might want not want to have a
* slave for each job. If you schedule a job, a maximum number
* of slaves will be created. When more jobs arrive, they will be
* queued. When a slave is finished with a job, it will be assigned
* a job from the queue.
*
* Example:
*
* TransferJob *job = KIO::get(KURL("http://www.kde.org"));
* KIO::Scheduler::scheduleJob(job);
*
*
* 3) Connection Oriented
* For some operations it is important that multiple jobs use
* the same connection. This can only be ensured if all these jobs
* use the same slave.
*
* You can ask the scheduler to open a slave for connection oriented
* operations. You can then use the scheduler to assign jobs to this
* slave. The jobs will be queued and the slave will handle these jobs
* one after the other.
*
* Example:
*
* Slave *slave = KIO::Scheduler::getConnectedSlave(
* KURL("pop3://bastian:password@mail.kde.org"));
* TransferJob *job1 = KIO::get(
* KURL("pop3://bastian:password@mail.kde.org/msg1"));
* KIO::Scheduler::assignJobToSlave(slave, job1);
* TransferJob *job2 = KIO::get(
* KURL("pop3://bastian:password@mail.kde.org/msg2"));
* KIO::Scheduler::assignJobToSlave(slave, job2);
* TransferJob *job3 = KIO::get(
* KURL("pop3://bastian:password@mail.kde.org/msg3"));
* KIO::Scheduler::assignJobToSlave(slave, job3);
*
* // ... Wait for jobs to finish...
*
* KIO::Scheduler::disconnectSlave(slave);
*
**/
class Scheduler : public QObject, virtual public DCOPObject {
Q_OBJECT
public:
typedef QPtrList JobList;
// InfoDict needs Info, so we can't declare it private
class ProtocolInfo;
class JobData;
~Scheduler();
/**
* Register @p job with the scheduler.
* The default is to create a new slave for the job if no slave
* is available. This can be changed by calling @ref scheduleJob.
*/
static void doJob(SimpleJob *job)
{ self()->_doJob(job); }
/**
* Calling ths function makes that @p job gets scheduled for later
* execution, if multiple jobs are registered it might wait for
* other jobs to finish.
*/
static void scheduleJob(SimpleJob *job)
{ self()->_scheduleJob(job); }
/**
* Stop the execution of a job.
*/
static void cancelJob(SimpleJob *job)
{ self()->_cancelJob(job); }
/**
* Called when a job is done.
*/
static void jobFinished(KIO::SimpleJob *job, KIO::Slave *slave)
{ self()->_jobFinished(job, slave); }
/**
* Puts a slave on notice. A next job may reuse this slave if it
* requests the same URL.
*
* A job can be put on hold after it has emit'ed its mimetype.
* Based on the mimetype, the program can give control to another
* component in the same process which can then resume the job
* by simply asking for the same URL again.
*/
static void putSlaveOnHold(KIO::SimpleJob *job, const KURL &url)
{ self()->_putSlaveOnHold(job, url); }
/**
* Removes any slave that might have been put on hold. If a slave
* was put on hold it will be killed.
*/
static void removeSlaveOnHold()
{ self()->_removeSlaveOnHold(); }
/**
* Send the slave that was put on hold back to KLauncher. This
* allows another process to take over the slave and resume the job
* the that was started.
*/
static void publishSlaveOnHold()
{ self()->_publishSlaveOnHold(); }
/**
* Requests a slave for use in connection-oriented mode.
*
* @param url This defines the username,password,host & port to
* connect with.
* @param config Configuration data for the slave.
*
* @return A pointer to a connected slave or 0 if an error occured.
* @see assignJobToSlave
* @see disconnectSlave
*/
static KIO::Slave *getConnectedSlave(const KURL &url, const KIO::MetaData &config = MetaData() )
{ return self()->_getConnectedSlave(url, config); }
/*
* Uses @p slave to do @p job.
*
* @param slave The slave to use. The slave must have been obtained
* with a call to @ref getConnectedSlave and must not
* be currently assigned to any other job.
* @param job The job to do.
*
* @return true is successfull, false otherwise.
*
* This function should be called immediately after creating a Job.
*
* @see getConnectedSlave
* @see disconnectSlave
* @see slaveConnected
* @see slaveError
*/
static bool assignJobToSlave(KIO::Slave *slave, KIO::SimpleJob *job)
{ return self()->_assignJobToSlave(slave, job); }
/*
* Disconnects @p slave.
*
* @param slave The slave to disconnect. The slave must have been
* obtained with a call to @ref getConnectedSlave
* and must not be assigned to any job.
*
* @return true is successfull, false otherwise.
*
* @see getConnectedSlave
* @see assignJobToSlave
*/
static bool disconnectSlave(KIO::Slave *slave)
{ return self()->_disconnectSlave(slave); }
/**
* Function to connect signals emitted by the scheduler.
*
* @see slaveConnected
* @see slaveError
*/
static bool connect( const char *signal, const QObject *receiver,
const char *member)
{ return QObject::connect(self(), signal, receiver, member); }
static bool connect( const QObject* sender, const char* signal,
const QObject* receiver, const char* member )
{ return QObject::connect(sender, signal, receiver, member); }
static bool disconnect( const QObject* sender, const char* signal,
const QObject* receiver, const char* member )
{ return QObject::disconnect(sender, signal, receiver, member); }
bool connect( const QObject *sender, const char *signal,
const char *member )
{ return QObject::connect(sender, signal, member); }
/**
* When true, the next job will check whether KLauncher has a slave
* on hold that is suitable for the job.
*/
static void checkSlaveOnHold(bool b) { self()->_checkSlaveOnHold(b); }
void debug_info();
virtual bool process(const QCString &fun, const QByteArray &data,
QCString& replyType, QByteArray &replyData);
virtual QCStringList functions();
public slots:
void slotSlaveDied(KIO::Slave *slave);
void slotSlaveStatus(pid_t pid, const QCString &protocol,
const QString &host, bool connected);
signals:
void slaveConnected(KIO::Slave *slave);
void slaveError(KIO::Slave *slave, int error, const QString &errorMsg);
protected:
void setupSlave(KIO::Slave *slave, const KURL &url, const QString &protocol, const QString &proxy , bool newSlave, const KIO::MetaData *config=0);
bool startJobScheduled(ProtocolInfo *protInfo);
bool startJobDirect();
Scheduler();
protected slots:
void startStep();
void slotCleanIdleSlaves();
void slotSlaveConnected();
void slotSlaveError(int error, const QString &errorMsg);
void slotScheduleCoSlave();
private:
class ProtocolInfoDict;
class ExtraJobData;
Scheduler(const Scheduler&);
static Scheduler *self();
static Scheduler *instance;
void _doJob(SimpleJob *job);
void _scheduleJob(SimpleJob *job);
void _cancelJob(SimpleJob *job);
void _jobFinished(KIO::SimpleJob *job, KIO::Slave *slave);
void _scheduleCleanup();
void _putSlaveOnHold(KIO::SimpleJob *job, const KURL &url);
void _removeSlaveOnHold();
Slave *_getConnectedSlave(const KURL &url, const KIO::MetaData &metaData );
bool _assignJobToSlave(KIO::Slave *slave, KIO::SimpleJob *job);
bool _disconnectSlave(KIO::Slave *slave);
void _checkSlaveOnHold(bool b);
void _publishSlaveOnHold();
Slave *findIdleSlave(ProtocolInfo *protInfo, SimpleJob *job, bool &exact);
Slave *createSlave(ProtocolInfo *protInfo, SimpleJob *job, const KURL &url);
QTimer slaveTimer;
QTimer coSlaveTimer;
QTimer cleanupTimer;
bool busy;
SlaveList *slaveList;
SlaveList *idleSlaves;
SlaveList *coIdleSlaves;
ProtocolInfoDict *protInfoDict;
Slave *slaveOnHold;
KURL urlOnHold;
JobList newJobs;
QPtrDict coSlaves;
ExtraJobData *extraJobData;
SlaveConfig *slaveConfig;
SessionData *sessionData;
bool checkOnHold;
protected:
virtual void virtual_hook( int id, void* data );
private:
class SchedulerPrivate* d;
};
};
#endif
Generated by: dfaure on faure on Tue Apr 16 08:49:48 2002, using kdoc 2.0a53. |