lpqhelper.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "lpqhelper.h"
00021 #include "kmjob.h"
00022 #include "kpipeprocess.h"
00023 #include "lprsettings.h"
00024
00025 #include <kstandarddirs.h>
00026 #include <kprocess.h>
00027 #include <kdebug.h>
00028
00029 LpqHelper::LpqHelper(QObject *parent, const char *name)
00030 : QObject(parent, name)
00031 {
00032 m_exepath = KStandardDirs::findExe("lpq");
00033 }
00034
00035 LpqHelper::~LpqHelper()
00036 {
00037 }
00038
00039 KMJob* LpqHelper::parseLineLpr(const QString& line)
00040 {
00041 QString rank = line.left(7);
00042 if (!rank[0].isDigit() && rank != "active")
00043 return NULL;
00044 KMJob *job = new KMJob;
00045 job->setState((rank[0].isDigit() ? KMJob::Queued : KMJob::Printing));
00046 job->setOwner(line.mid(7, 11).stripWhiteSpace());
00047 job->setId(line.mid(18, 5).toInt());
00048 job->setName(line.mid(23, 38).stripWhiteSpace());
00049 int p = line.find(' ', 61);
00050 if (p != -1)
00051 {
00052 job->setSize(line.mid(61, p-61).toInt() / 1000);
00053 }
00054 return job;
00055 }
00056
00057 KMJob* LpqHelper::parseLineLPRng(const QString& line)
00058 {
00059 QString rank = line.left(7).stripWhiteSpace();
00060 if (!rank[0].isDigit() && rank != "active" && rank != "hold")
00061 return NULL;
00062 KMJob *job = new KMJob;
00063 job->setState((rank[0].isDigit() ? KMJob::Queued : (rank == "hold" ? KMJob::Held : KMJob::Printing)));
00064 int p = line.find('@', 7), q = line.find(' ', 7);
00065 job->setOwner(line.mid(7, QMIN(p,q)-7));
00066 while (line[q].isSpace())
00067 q++;
00068 q++;
00069 while (line[q].isSpace())
00070 q++;
00071 p = line.find(' ', q);
00072 job->setId(line.mid(q, p-q).toInt());
00073 while (line[p].isSpace())
00074 p++;
00075 q = p+25;
00076 while (line[q].isDigit())
00077 q--;
00078 job->setName(line.mid(p, q-p).stripWhiteSpace());
00079 job->setSize(line.mid(q+1, p+26-q).toInt() / 1000);
00080 return job;
00081 }
00082
00083 void LpqHelper::listJobs(QPtrList<KMJob>& jobs, const QString& prname, int limit)
00084 {
00085 KPipeProcess proc;
00086 if (!m_exepath.isEmpty() && proc.open(m_exepath + " -P " + KProcess::quote(prname)))
00087 {
00088 QTextStream t(&proc);
00089 QString line;
00090 bool lprng = (LprSettings::self()->mode() == LprSettings::LPRng);
00091 int count = 0;
00092
00093 while (!t.atEnd())
00094 {
00095 line = t.readLine().stripWhiteSpace();
00096 if (line.startsWith("Rank"))
00097 break;
00098 }
00099 while (!t.atEnd())
00100 {
00101 line = t.readLine();
00102 if ( limit > 0 && count >= limit )
00103 continue;
00104 KMJob *job = (lprng ? parseLineLPRng(line) : parseLineLpr(line));
00105 if (job)
00106 {
00107 job->setPrinter(prname);
00108 job->setUri("lpd://"+prname+"/"+QString::number(job->id()));
00109 jobs.append(job);
00110 count++;
00111 }
00112 else
00113 break;
00114 }
00115 proc.close();
00116 }
00117 }
|