bool KMCupsJobManager::changePriority(const QPtrList<KMJob>& jobs, bool up) { QPtrListIterator<KMJob> it(jobs); bool result(true); for (; it.current() && result; ++it) { int value = it.current()->attribute(0).toInt(); if (up) value = QMIN(value+10, 100); else value = QMAX(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; }
bool KMCupsJobManager::sendCommandSystemJob(const QPtrList<KMJob>& jobs, int action, const QString& argstr) { IppRequest req; QString uri; bool value(true); QPtrListIterator<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()); /* QString 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 = QString::fromLatin1("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::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; }
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; } QMap<QString,QString> 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; }