summaryrefslogtreecommitdiffstats
path: root/kdeprint/cups/kmcupsjobmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/cups/kmcupsjobmanager.cpp')
-rw-r--r--kdeprint/cups/kmcupsjobmanager.cpp452
1 files changed, 0 insertions, 452 deletions
diff --git a/kdeprint/cups/kmcupsjobmanager.cpp b/kdeprint/cups/kmcupsjobmanager.cpp
deleted file mode 100644
index 58de0818a..000000000
--- a/kdeprint/cups/kmcupsjobmanager.cpp
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * This file is part of the KDE libraries
- * Copyright (c) 2001 Michael Goffioul <tdeprint@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 "kmcupsjobmanager.h"
-#include "kmcupsmanager.h"
-#include "kmjob.h"
-#include "cupsinfos.h"
-#include "ipprequest.h"
-#include "pluginaction.h"
-#include "kprinter.h"
-#include "kprinterpropertydialog.h"
-#include "kmuimanager.h"
-#include "kmfactory.h"
-#include "kpdriverpage.h"
-#include "kpschedulepage.h"
-#include "kpcopiespage.h"
-#include "kptagspage.h"
-
-#include <klocale.h>
-#include <kdebug.h>
-#include <kurl.h>
-
-KMCupsJobManager::KMCupsJobManager(TQObject *parent, const char *name, const TQStringList & /*args*/)
-: KMJobManager(parent,name)
-{
-}
-
-KMCupsJobManager::~KMCupsJobManager()
-{
-}
-
-int KMCupsJobManager::actions()
-{
- return KMJob::All;
-}
-
-bool KMCupsJobManager::sendCommandSystemJob(const TQPtrList<KMJob>& jobs, int action, const TQString& argstr)
-{
- IppRequest req;
- TQString uri;
- bool value(true);
-
- TQPtrListIterator<KMJob> it(jobs);
- for (;it.current() && value;++it)
- {
- // hypothesis: job operation are always done on local jobs. The only operation
- // allowed on remote jobs is listing (done elsewhere).
-
- req.addURI(IPP_TAG_OPERATION,"job-uri",it.current()->uri());
- req.addName(IPP_TAG_OPERATION,"requesting-user-name",CupsInfos::self()->login());
- /*
- TQString jobHost;
- if (!it.current()->uri().isEmpty())
- {
- KURL url(it.current()->uri());
- req.setHost(url.host());
- req.setPort(url.port());
- jobHost = url.host();
- }
- */
-
- switch (action)
- {
- case KMJob::Remove:
- req.setOperation(IPP_CANCEL_JOB);
- break;
- case KMJob::Hold:
- req.setOperation(IPP_HOLD_JOB);
- break;
- case KMJob::Resume:
- req.setOperation(IPP_RELEASE_JOB);
- break;
- case KMJob::Restart:
- req.setOperation(IPP_RESTART_JOB);
- break;
- case KMJob::Move:
- if (argstr.isEmpty()) return false;
- req.setOperation(CUPS_MOVE_JOB);
- uri =
- TQString::tqfromLatin1("ipp://%1/printers/%2").arg(CupsInfos::self()->hostaddr(),
- argstr);
- req.addURI(IPP_TAG_OPERATION, "job-printer-uri", uri);
- break;
- default:
- return false;
- }
-
- if (!(value = req.doRequest("/jobs/")))
- KMManager::self()->setErrorMsg(req.statusMessage());
- }
-
- return value;
-}
-
-bool KMCupsJobManager::listJobs(const TQString& prname, KMJobManager::JobType type, int limit)
-{
- IppRequest req;
- TQStringList keys;
- CupsInfos *infos = CupsInfos::self();
-
- // wanted attributes
- keys.append("job-id");
- keys.append("job-uri");
- keys.append("job-name");
- keys.append("job-state");
- keys.append("job-printer-uri");
- keys.append("job-k-octets");
- keys.append("job-originating-user-name");
- keys.append("job-k-octets-completed");
- keys.append("job-media-sheets");
- keys.append("job-media-sheets-completed");
- keys.append("job-priority");
- keys.append("job-billing");
-
- req.setOperation(IPP_GET_JOBS);
-
- // add printer-uri
- KMPrinter *mp = KMManager::self()->findPrinter(prname);
- if (!mp)
- return false;
-
- if (!mp->uri().isEmpty())
- {
- req.addURI(IPP_TAG_OPERATION, "printer-uri", mp->uri().prettyURL());
- /*
- req.setHost(mp->uri().host());
- req.setPort(mp->uri().port());
- */
- }
- else
- req.addURI(IPP_TAG_OPERATION, "printer-uri", TQString("ipp://%1/%2/%3").arg(infos->hostaddr(),
- (mp&&mp->isClass())?"classes":"printers", prname));
-
- // other attributes
- req.addKeyword(IPP_TAG_OPERATION, "requested-attributes", keys);
- if (type == KMJobManager::CompletedJobs)
- req.addKeyword(IPP_TAG_OPERATION,"which-jobs",TQString::tqfromLatin1("completed"));
- if (limit > 0)
- req.addInteger(IPP_TAG_OPERATION,"limit",limit);
-
- // send request
- if (req.doRequest("/"))
- parseListAnswer(req, mp);
- else
- return false;
-
- return true;
-}
-
-void KMCupsJobManager::parseListAnswer(IppRequest& req, KMPrinter *pr)
-{
- ipp_attribute_t *attr = req.first();
- KMJob *job = new KMJob();
- TQString uri;
- while (attr)
- {
- TQString name(attr->name);
- if (name == "job-id") job->setId(attr->values[0].integer);
- else if (name == "job-uri") job->setUri(TQString::fromLocal8Bit(attr->values[0].string.text));
- else if (name == "job-name") job->setName(TQString::fromLocal8Bit(attr->values[0].string.text));
- else if (name == "job-state")
- {
- switch (attr->values[0].integer)
- {
- case IPP_JOB_PENDING:
- job->setState(KMJob::Queued);
- break;
- case IPP_JOB_HELD:
- job->setState(KMJob::Held);
- break;
- case IPP_JOB_PROCESSING:
- job->setState(KMJob::Printing);
- break;
- case IPP_JOB_STOPPED:
- job->setState(KMJob::Error);
- break;
- case IPP_JOB_CANCELLED:
- job->setState(KMJob::Cancelled);
- break;
- case IPP_JOB_ABORTED:
- job->setState(KMJob::Aborted);
- break;
- case IPP_JOB_COMPLETED:
- job->setState(KMJob::Completed);
- break;
- default:
- job->setState(KMJob::Unknown);
- break;
- }
- }
- else if (name == "job-k-octets") job->setSize(attr->values[0].integer);
- else if (name == "job-originating-user-name") job->setOwner(TQString::fromLocal8Bit(attr->values[0].string.text));
- else if (name == "job-k-octets-completed") job->setProcessedSize(attr->values[0].integer);
- else if (name == "job-media-sheets") job->setPages(attr->values[0].integer);
- else if (name == "job-media-sheets-completed") job->setProcessedPages(attr->values[0].integer);
- else if (name == "job-printer-uri" && !pr->isRemote())
- {
- TQString str(attr->values[0].string.text);
- int p = str.findRev('/');
- if (p != -1)
- job->setPrinter(str.mid(p+1));
- }
- else if (name == "job-priority")
- {
- job->setAttribute(0, TQString::tqfromLatin1("%1").arg(attr->values[0].integer, 3));
- }
- else if (name == "job-billing")
- {
- job->setAttributeCount(2);
- job->setAttribute(1, TQString::fromLocal8Bit(attr->values[0].string.text));
- }
-
- if (name.isEmpty() || attr == req.last())
- {
- if (job->printer().isEmpty())
- job->setPrinter(pr->printerName());
- job->setRemote(pr->isRemote());
- addJob(job); // don't use job after this call !!!
- job = new KMJob();
- }
-
- attr = attr->next;
- }
- delete job;
-}
-
-bool KMCupsJobManager::doPluginAction(int ID, const TQPtrList<KMJob>& jobs)
-{
- switch (ID)
- {
- case 0:
- if (jobs.count() == 1)
- return jobIppReport(jobs.getFirst());
- break;
- case 1:
- return changePriority(jobs, true);
- case 2:
- return changePriority(jobs, false);
- case 3:
- return editJobAttributes(jobs.getFirst());
- }
- return false;
-}
-
-bool KMCupsJobManager::jobIppReport(KMJob *j)
-{
- IppRequest req;
-
- req.setOperation(IPP_GET_JOB_ATTRIBUTES);
- req.addURI(IPP_TAG_OPERATION, "job-uri", j->uri());
- bool result(true);
- /*
- if (!j->uri().isEmpty())
- {
- KURL url(j->uri());
- req.setHost(url.host());
- req.setPort(url.port());
- }
- */
- if ((result=req.doRequest("/")))
- static_cast<KMCupsManager*>(KMManager::self())->ippReport(req, IPP_TAG_JOB, i18n("Job Report"));
- else
- KMManager::self()->setErrorMsg(i18n("Unable to retrieve job information: ")+req.statusMessage());
- return result;
-}
-
-TQValueList<KAction*> KMCupsJobManager::createPluginActions(KActionCollection *coll)
-{
- TQValueList<KAction*> list;
- KAction *act(0);
-
- list << (act = new PluginAction(0, i18n("&Job IPP Report"), "tdeprint_report", 0, coll, "plugin_ipp"));
- act->setGroup("plugin");
- list << (act = new PluginAction(1, i18n("&Increase Priority"), "up", 0, coll, "plugin_prioup"));
- act->setGroup("plugin");
- list << (act = new PluginAction(2, i18n("&Decrease Priority"), "down", 0, coll, "plugin_priodown"));
- act->setGroup("plugin");
- list << (act = new PluginAction(3, i18n("&Edit Attributes..."), "edit", 0, coll, "plugin_editjob"));
- act->setGroup("plugin");
-
- return list;
-}
-
-void KMCupsJobManager::validatePluginActions(KActionCollection *coll, const TQPtrList<KMJob>& joblist)
-{
- TQPtrListIterator<KMJob> it(joblist);
- bool flag(true);
- for (; it.current(); ++it)
- {
- flag = (flag && it.current()->type() == KMJob::System
- && (it.current()->state() == KMJob::Queued || it.current()->state() == KMJob::Held)
- /*&& !it.current()->isRemote()*/);
- }
- flag = (flag && joblist.count() > 0);
- KAction *a;
- if ( ( a = coll->action( "plugin_ipp" ) ) )
- a->setEnabled( joblist.count() == 1 );
- if ( ( a = coll->action( "plugin_prioup" ) ) )
- a->setEnabled( flag );
- if ( ( a = coll->action( "plugin_priodown" ) ) )
- a->setEnabled( flag );
- if ( ( a = coll->action( "plugin_editjob" ) ) )
- a->setEnabled( flag && ( joblist.count() == 1 ) );
-}
-
-bool KMCupsJobManager::changePriority(const TQPtrList<KMJob>& jobs, bool up)
-{
- TQPtrListIterator<KMJob> it(jobs);
- bool result(true);
- for (; it.current() && result; ++it)
- {
- int value = it.current()->attribute(0).toInt();
- if (up) value = TQMIN(value+10, 100);
- else value = TQMAX(value-10, 1);
-
- IppRequest req;
- /*
- if (!it.current()->uri().isEmpty())
- {
- KURL url(it.current()->uri());
- req.setHost(url.host());
- req.setPort(url.port());
- }
- */
- req.setOperation(IPP_SET_JOB_ATTRIBUTES);
- req.addURI(IPP_TAG_OPERATION, "job-uri", it.current()->uri());
- req.addName(IPP_TAG_OPERATION, "requesting-user-name", CupsInfos::self()->login());
- req.addInteger(IPP_TAG_JOB, "job-priority", value);
-
- if (!(result = req.doRequest("/jobs/")))
- KMManager::self()->setErrorMsg(i18n("Unable to change job priority: ")+req.statusMessage());
- }
- return result;
-}
-
-static TQString processRange(const TQString& range)
-{
- TQStringList l = TQStringList::split(',', range, false);
- TQString s;
- for (TQStringList::ConstIterator it=l.begin(); it!=l.end(); ++it)
- {
- s.append(*it);
- if ((*it).find('-') == -1)
- s.append("-").append(*it);
- s.append(",");
- }
- if (!s.isEmpty())
- s.truncate(s.length()-1);
- return s;
-}
-
-bool KMCupsJobManager::editJobAttributes(KMJob *j)
-{
- IppRequest req;
-
- req.setOperation(IPP_GET_JOB_ATTRIBUTES);
- req.addURI(IPP_TAG_OPERATION, "job-uri", j->uri());
- /*
- if (!j->uri().isEmpty())
- {
- KURL url(j->uri());
- req.setHost(url.host());
- req.setPort(url.port());
- }
- */
- if (!req.doRequest("/"))
- {
- KMManager::self()->setErrorMsg(i18n("Unable to retrieve job information: ")+req.statusMessage());
- return false;
- }
-
- TQMap<TQString,TQString> opts = req.toMap(IPP_TAG_JOB);
- // translate the "Copies" option to non-CUPS syntax
- if (opts.contains("copies"))
- opts["kde-copies"] = opts["copies"];
- if (opts.contains("page-set"))
- opts["kde-pageset"] = (opts["page-set"] == "even" ? "2" : (opts["page-set"] == "odd" ? "1" : "0"));
- if (opts.contains("OutputOrder"))
- opts["kde-pageorder"] = opts["OutputOrder"];
- if (opts.contains("multiple-document-handling"))
- opts["kde-collate"] = (opts["multiple-document-handling"] == "separate-documents-collated-copies" ? "Collate" : "Uncollate");
- if (opts.contains("page-ranges"))
- opts["kde-range"] = opts["page-ranges"];
-
- // find printer and construct dialog
- KMPrinter *prt = KMManager::self()->findPrinter(j->printer());
- if (!prt)
- {
- KMManager::self()->setErrorMsg(i18n("Unable to find printer %1.").arg(j->printer()));
- return false;
- }
- KMManager::self()->completePrinterShort(prt);
- KPrinter::ApplicationType oldAppType = KPrinter::applicationType();
- KPrinter::setApplicationType(KPrinter::StandAlone);
- KPrinterPropertyDialog dlg(prt);
- dlg.setDriver(KMManager::self()->loadPrinterDriver(prt));
- KMFactory::self()->uiManager()->setupPrinterPropertyDialog(&dlg);
- KPrinter::setApplicationType( oldAppType );
- if (dlg.driver())
- dlg.addPage(new KPDriverPage(prt, dlg.driver(), &dlg));
- dlg.addPage(new KPCopiesPage(0, &dlg));
- dlg.addPage(new KPSchedulePage(&dlg));
- dlg.addPage(new KPTagsPage(true, &dlg));
- dlg.setOptions(opts);
- dlg.enableSaveButton(false);
- dlg.setCaption(i18n("Attributes of Job %1@%2 (%3)").arg(j->id()).arg(j->printer()).arg(j->name()));
- if (dlg.exec())
- {
- opts.clear();
- // include default values to override non-default values
- dlg.getOptions(opts, true);
- // translate the "Copies" options from non-CUPS syntax
- opts["copies"] = opts["kde-copies"];
- opts["OutputOrder"] = opts["kde-pageorder"];
- opts["multiple-document-handling"] = (opts["kde-collate"] == "Collate" ? "separate-documents-collated-copies" : "separate-documents-uncollated-copies");
- opts["page-set"] = (opts["kde-pageset"] == "1" ? "odd" : (opts["kde-pageset"] == "2" ? "even" : "all"));
- // it seems CUPS is buggy. Disable page-ranges modification, otherwise nothing gets printed
- opts["page-ranges"] = processRange(opts["kde-range"]);
-
- req.init();
- req.setOperation(IPP_SET_JOB_ATTRIBUTES);
- req.addURI(IPP_TAG_OPERATION, "job-uri", j->uri());
- req.addName(IPP_TAG_OPERATION, "requesting-user-name", CupsInfos::self()->login());
- req.setMap(opts);
- //req.dump(1);
- if (!req.doRequest("/jobs/"))
- {
- KMManager::self()->setErrorMsg(i18n("Unable to set job attributes: ")+req.statusMessage());
- return false;
- }
- }
-
- return true;
-}
-
-#include "kmcupsjobmanager.moc"