00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kmthreadjob.h"
00021
#include "kmjob.h"
00022
#include "kmjobmanager.h"
00023
00024
#include <qfile.h>
00025
#include <qtextstream.h>
00026
#include <qstringlist.h>
00027
#include <kstandarddirs.h>
00028
00029
#include <errno.h>
00030
#include <sys/types.h>
00031
#include <signal.h>
00032
00033
#define CHARSEP '$'
00034
00035 KMThreadJob::KMThreadJob(
QObject *parent,
const char *name)
00036 :
QObject(parent,name)
00037 {
00038 m_jobs.setAutoDelete(
true);
00039 }
00040
00041 KMThreadJob::~KMThreadJob()
00042 {
00043 }
00044
00045
QString KMThreadJob::jobFile()
00046 {
00047
QString f = locateLocal(
"data",
"kdeprint/printjobs");
00048
return f;
00049 }
00050
00051
bool KMThreadJob::saveJobs()
00052 {
00053
QFile f(jobFile());
00054
if (f.open(IO_WriteOnly))
00055 {
00056
QTextStream t(&f);
00057
QIntDictIterator<KMJob> it(m_jobs);
00058
for (;it.current();++it)
00059 t << it.current()->id() << CHARSEP << it.current()->name() << CHARSEP << it.current()->printer() << CHARSEP << it.current()->owner() << CHARSEP << it.current()->size() << endl;
00060
return true;
00061 }
00062
return false;
00063 }
00064
00065
bool KMThreadJob::loadJobs()
00066 {
00067
QFile f(jobFile());
00068
if (f.exists() && f.open(IO_ReadOnly))
00069 {
00070
QTextStream t(&f);
00071
QString line;
00072
00073 m_jobs.clear();
00074
while (!t.eof())
00075 {
00076 line = t.readLine().stripWhiteSpace();
00077
if (line.isEmpty())
00078
continue;
00079
QStringList ll = QStringList::split(CHARSEP,line,
true);
00080
if (ll.count() == 5)
00081 {
00082 KMJob *job =
new KMJob();
00083 job->setId(ll[0].toInt());
00084 job->setName(ll[1]);
00085 job->setPrinter(ll[2]);
00086 job->setOwner(ll[3]);
00087 job->setSize(ll[4].toInt());
00088 job->setState(KMJob::Printing);
00089 job->setType(KMJob::Threaded);
00090 job->setUri(
"proc:/"+ll[0]);
00091
if (job->id() > 0 && checkJob(job->id()))
00092 m_jobs.insert(job->id(),job);
00093
else
00094
delete job;
00095 }
00096 }
00097
return true;
00098 }
00099
return false;
00100 }
00101
00102
bool KMThreadJob::checkJob(
int ID)
00103 {
00104
return (kill((pid_t)ID,0) == 0 || errno == EPERM);
00105 }
00106
00107 KMJob* KMThreadJob::findJob(
int ID)
00108 {
00109
return m_jobs.find(ID);
00110 }
00111
00112 KMJob* KMThreadJob::findJob(
const QString& uri)
00113 {
00114
if (uri.startsWith(
"proc:/"))
00115 {
00116
int pid = uri.mid(6).toInt();
00117
if (pid > 0)
00118
return m_jobs.find(pid);
00119 }
00120
return NULL;
00121 }
00122
00123
bool KMThreadJob::removeJob(
int ID)
00124 {
00125
if (!checkJob(ID) || kill((pid_t)ID, SIGTERM) == 0)
00126 {
00127 m_jobs.remove(ID);
00128 saveJobs();
00129
return true;
00130 }
00131
else
00132
return false;
00133 }
00134
00135
void KMThreadJob::createJob(
int ID,
const QString& printer,
const QString& name,
const QString& owner,
int size)
00136 {
00137 KMThreadJob mth(0);
00138 KMJob *job =
new KMJob();
00139 job->setId(ID);
00140 job->setPrinter(printer);
00141 job->setName(name);
00142 job->setOwner(owner);
00143 job->setSize(size);
00144 job->setType(KMJob::Threaded);
00145 mth.createJob(job);
00146 }
00147
00148
void KMThreadJob::createJob(KMJob *job)
00149 {
00150
if (job->id() > 0)
00151 {
00152 loadJobs();
00153
if (!m_jobs.find(job->id()))
00154 {
00155 m_jobs.insert(job->id(),job);
00156 saveJobs();
00157 }
00158 }
00159 }
00160
00161
void KMThreadJob::updateManager(KMJobManager *mgr)
00162 {
00163 loadJobs();
00164
QIntDictIterator<KMJob> it(m_jobs);
00165
for (;it.current();++it)
00166 {
00167 KMJob *job =
new KMJob(*(it.current()));
00168 mgr->addJob(job);
00169 }
00170 }