summaryrefslogtreecommitdiffstats
path: root/kdeprint/lpr/lpqhelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/lpr/lpqhelper.cpp')
-rw-r--r--kdeprint/lpr/lpqhelper.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/kdeprint/lpr/lpqhelper.cpp b/kdeprint/lpr/lpqhelper.cpp
new file mode 100644
index 000000000..c9f26174b
--- /dev/null
+++ b/kdeprint/lpr/lpqhelper.cpp
@@ -0,0 +1,117 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "lpqhelper.h"
+#include "kmjob.h"
+#include "kpipeprocess.h"
+#include "lprsettings.h"
+
+#include <kstandarddirs.h>
+#include <kprocess.h>
+#include <kdebug.h>
+
+LpqHelper::LpqHelper(QObject *parent, const char *name)
+: QObject(parent, name)
+{
+ m_exepath = KStandardDirs::findExe("lpq");
+}
+
+LpqHelper::~LpqHelper()
+{
+}
+
+KMJob* LpqHelper::parseLineLpr(const QString& line)
+{
+ QString rank = line.left(7);
+ if (!rank[0].isDigit() && rank != "active")
+ return NULL;
+ KMJob *job = new KMJob;
+ job->setState((rank[0].isDigit() ? KMJob::Queued : KMJob::Printing));
+ job->setOwner(line.mid(7, 11).stripWhiteSpace());
+ job->setId(line.mid(18, 5).toInt());
+ job->setName(line.mid(23, 38).stripWhiteSpace());
+ int p = line.find(' ', 61);
+ if (p != -1)
+ {
+ job->setSize(line.mid(61, p-61).toInt() / 1000);
+ }
+ return job;
+}
+
+KMJob* LpqHelper::parseLineLPRng(const QString& line)
+{
+ QString rank = line.left(7).stripWhiteSpace();
+ if (!rank[0].isDigit() && rank != "active" && rank != "hold")
+ return NULL;
+ KMJob *job = new KMJob;
+ job->setState((rank[0].isDigit() ? KMJob::Queued : (rank == "hold" ? KMJob::Held : KMJob::Printing)));
+ int p = line.find('@', 7), q = line.find(' ', 7);
+ job->setOwner(line.mid(7, QMIN(p,q)-7));
+ while (line[q].isSpace())
+ q++;
+ q++;
+ while (line[q].isSpace())
+ q++;
+ p = line.find(' ', q);
+ job->setId(line.mid(q, p-q).toInt());
+ while (line[p].isSpace())
+ p++;
+ q = p+25;
+ while (line[q].isDigit())
+ q--;
+ job->setName(line.mid(p, q-p).stripWhiteSpace());
+ job->setSize(line.mid(q+1, p+26-q).toInt() / 1000);
+ return job;
+}
+
+void LpqHelper::listJobs(QPtrList<KMJob>& jobs, const QString& prname, int limit)
+{
+ KPipeProcess proc;
+ if (!m_exepath.isEmpty() && proc.open(m_exepath + " -P " + KProcess::quote(prname)))
+ {
+ QTextStream t(&proc);
+ QString line;
+ bool lprng = (LprSettings::self()->mode() == LprSettings::LPRng);
+ int count = 0;
+
+ while (!t.atEnd())
+ {
+ line = t.readLine().stripWhiteSpace();
+ if (line.startsWith("Rank"))
+ break;
+ }
+ while (!t.atEnd())
+ {
+ line = t.readLine();
+ if ( limit > 0 && count >= limit )
+ continue;
+ KMJob *job = (lprng ? parseLineLPRng(line) : parseLineLpr(line));
+ if (job)
+ {
+ job->setPrinter(prname);
+ job->setUri("lpd://"+prname+"/"+QString::number(job->id()));
+ jobs.append(job);
+ count++;
+ }
+ else
+ break;
+ }
+ proc.close();
+ }
+}