Add two-stage create/send print job support

This commit is contained in:
Anton Thomasson 2022-07-10 17:06:31 +02:00 committed by attah
parent d037600d0f
commit 51c90e6443
6 changed files with 82 additions and 14 deletions

View file

@ -441,3 +441,8 @@ void IppMsg::encode_attr(Bytestream& msg, quint8 tag, QString name, QJsonValue v
break; break;
} }
} }
void IppMsg::setOpAttr(QString name, IppMsg::IppTag type, QJsonValue value)
{
_opAttrs.insert(name, QJsonObject {{"tag", type}, {"value", value}});
}

View file

@ -76,6 +76,8 @@ public:
QJsonArray getJobAttrs() {return _jobAttrs;} QJsonArray getJobAttrs() {return _jobAttrs;}
QJsonObject getOpAttrs() {return _opAttrs;} QJsonObject getOpAttrs() {return _opAttrs;}
void setOpAttr(QString name, IppMsg::IppTag type, QJsonValue value);
quint16 getStatus() {return _status;} quint16 getStatus() {return _status;}

View file

@ -21,6 +21,7 @@ IppPrinter::IppPrinter() : _worker(this)
connect(this, &IppPrinter::doCancelJob, &_worker, &PrinterWorker::cancelJob); connect(this, &IppPrinter::doCancelJob, &_worker, &PrinterWorker::cancelJob);
connect(this, &IppPrinter::doIdentify, &_worker, &PrinterWorker::identify); connect(this, &IppPrinter::doIdentify, &_worker, &PrinterWorker::identify);
connect(this, &IppPrinter::doPrint, &_worker, &PrinterWorker::print); connect(this, &IppPrinter::doPrint, &_worker, &PrinterWorker::print);
connect(this, &IppPrinter::doPrint2, &_worker, &PrinterWorker::print2);
connect(this, &IppPrinter::doGetStrings, &_worker, &PrinterWorker::getStrings); connect(this, &IppPrinter::doGetStrings, &_worker, &PrinterWorker::getStrings);
connect(this, &IppPrinter::doGetImage, &_worker, &PrinterWorker::getImage); connect(this, &IppPrinter::doGetImage, &_worker, &PrinterWorker::getImage);
@ -574,9 +575,6 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
qDebug() << supportedMimeTypes << supportedMimeTypes.contains(mimeType); qDebug() << supportedMimeTypes << supportedMimeTypes.contains(mimeType);
QJsonObject o = opAttrs();
o.insert("job-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", fileinfo.fileName()}});
Params.paperSizeName = getAttrOrDefault(jobAttrs, "media").toString(Params.paperSizeName.c_str()).toStdString(); Params.paperSizeName = getAttrOrDefault(jobAttrs, "media").toString(Params.paperSizeName.c_str()).toStdString();
QString targetFormat = getAttrOrDefault(jobAttrs, "document-format").toString(); QString targetFormat = getAttrOrDefault(jobAttrs, "document-format").toString();
@ -638,8 +636,9 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
jobAttrs.remove("media"); jobAttrs.remove("media");
} }
QJsonObject jobOpAttrs = opAttrs();
// document-format goes in the op-attrs and not the job-attrs // document-format goes in the op-attrs and not the job-attrs
o.insert("document-format", QJsonObject {{"tag", IppMsg::MimeMediaType}, {"value", targetFormat}}); jobOpAttrs.insert("document-format", QJsonObject {{"tag", IppMsg::MimeMediaType}, {"value", targetFormat}});
jobAttrs.remove("document-format"); jobAttrs.remove("document-format");
targetFormat = targetFormatIfAuto(targetFormat, mimeType, supportedMimeTypes); targetFormat = targetFormatIfAuto(targetFormat, mimeType, supportedMimeTypes);
@ -677,7 +676,7 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
Params.paperSizeW = size.width(); Params.paperSizeW = size.width();
Params.paperSizeH = size.height(); Params.paperSizeH = size.height();
qDebug() << "Printing job" << o << jobAttrs; qDebug() << "Printing job" << jobOpAttrs << jobAttrs;
QJsonValue PrinterResolutionRef = getAttrOrDefault(jobAttrs, "printer-resolution"); QJsonValue PrinterResolutionRef = getAttrOrDefault(jobAttrs, "printer-resolution");
Params.hwResW = PrinterResolutionRef.toObject()["x"].toInt(Params.hwResW); Params.hwResW = PrinterResolutionRef.toObject()["x"].toInt(Params.hwResW);
@ -702,10 +701,6 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
} }
} }
qDebug() << "Final op attributes:" << o;
qDebug() << "Final job attributes:" << jobAttrs;
QString Sides = getAttrOrDefault(jobAttrs, "sides").toString(); QString Sides = getAttrOrDefault(jobAttrs, "sides").toString();
if(Sides=="two-sided-long-edge") if(Sides=="two-sided-long-edge")
@ -718,8 +713,34 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
Params.tumble = true; Params.tumble = true;
} }
IppMsg job = mk_msg(IppMsg::PrintJob, o, jobAttrs); QJsonArray supportedOperations = _attrs["operations-supported"].toObject()["value"].toArray();
if(supportedOperations.contains(IppMsg::CreateJob) && supportedOperations.contains(IppMsg::SendDocument))
{
QJsonObject createJobOpAttrs = opAttrs();
createJobOpAttrs.insert("job-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", fileinfo.fileName()}});
qDebug() << "Final create op attributes:" << createJobOpAttrs;
qDebug() << "Final job attributes:" << jobAttrs;
IppMsg createJob = mk_msg(IppMsg::CreateJob, createJobOpAttrs, jobAttrs);
qDebug() << "Final job op attributes:" << jobOpAttrs;
IppMsg sendDoc = mk_msg(IppMsg::SendDocument, jobOpAttrs);
emit doPrint2(filename, mimeType, targetFormat, createJob, sendDoc, Params, margins);
}
else
{
jobOpAttrs.insert("job-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", fileinfo.fileName()}});
qDebug() << "Final op attributes:" << jobOpAttrs;
qDebug() << "Final job attributes:" << jobAttrs;
IppMsg job = mk_msg(IppMsg::PrintJob, jobOpAttrs, jobAttrs);
emit doPrint(filename, mimeType, targetFormat, job, Params, margins); emit doPrint(filename, mimeType, targetFormat, job, Params, margins);
}
} }
bool IppPrinter::getJobs() { bool IppPrinter::getJobs() {

View file

@ -73,6 +73,7 @@ signals:
void doConvertPlaintext(QString filename, Bytestream header, PrintParameters Params); void doConvertPlaintext(QString filename, Bytestream header, PrintParameters Params);
void doPrint(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins); void doPrint(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins);
void doPrint2(QString filename, QString mimeType, QString targetFormat, IppMsg createJob, IppMsg sendDocument, PrintParameters Params, QMargins margins);
void doGetStrings(QUrl url); void doGetStrings(QUrl url);
void doGetImage(QUrl url); void doGetImage(QUrl url);
@ -84,7 +85,6 @@ signals:
public slots: public slots:
void print(QJsonObject attrs, QString file); void print(QJsonObject attrs, QString file);
void onUrlChanged(); void onUrlChanged();
void MaybeGetStrings(); void MaybeGetStrings();
void MaybeGetIcon(bool retry=false); void MaybeGetIcon(bool retry=false);

View file

@ -60,16 +60,55 @@ void PrinterWorker::identify(Bytestream msg)
awaitResult(cr, "identifyFinished"); awaitResult(cr, "identifyFinished");
} }
void PrinterWorker::print2(QString filename, QString mimeType, QString targetFormat, IppMsg createJob, IppMsg sendDocument, PrintParameters Params, QMargins margins)
{
emit busyMessage(tr("Preparing"));
Bytestream header = createJob.encode();
CurlRequester cr(_printer->httpUrl(), CurlRequester::IppRequest, &header);
Bytestream resData;
CURLcode res = cr.await(&resData);
if(res == CURLE_OK)
{
IppMsg resMsg(resData);
qDebug() << resMsg.getOpAttrs() << resMsg.getJobAttrs();
QJsonObject resJobAttrs = resMsg.getJobAttrs()[0].toObject();
if(resMsg.getStatus() <= 0xff && resJobAttrs.contains("job-id"))
{
int jobId = resJobAttrs["job-id"].toObject()["value"].toInt();
sendDocument.setOpAttr("job-id", IppMsg::Integer, jobId);
sendDocument.setOpAttr("last-document", IppMsg::Boolean, true);
print(filename, mimeType, targetFormat, sendDocument, Params, margins);
}
else
{
QMetaObject::invokeMethod(_printer, "printRequestFinished", Qt::QueuedConnection,
Q_ARG(CURLcode, res),
Q_ARG(Bytestream, resData));
}
}
else
{
QMetaObject::invokeMethod(_printer, "printRequestFinished", Qt::QueuedConnection,
Q_ARG(CURLcode, res),
Q_ARG(Bytestream, resData));
}
}
void PrinterWorker::print(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins) void PrinterWorker::print(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins)
{ {
try { try
{
Mimer* mimer = Mimer::instance(); Mimer* mimer = Mimer::instance();
Bytestream contents = job.encode(); Bytestream contents = job.encode();
emit busyMessage(tr("Preparing")); emit busyMessage(tr("Preparing"));
if((mimeType == targetFormat) && (targetFormat == Mimer::Postscript)) if((mimeType == targetFormat) && (targetFormat == Mimer::Postscript))
{ // Can't process Postscript { // Can't process Postscript
justUpload(filename, contents); justUpload(filename, contents);

View file

@ -39,6 +39,7 @@ public slots:
void cancelJob(Bytestream msg); void cancelJob(Bytestream msg);
void identify(Bytestream msg); void identify(Bytestream msg);
void print(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins); void print(QString filename, QString mimeType, QString targetFormat, IppMsg job, PrintParameters Params, QMargins margins);
void print2(QString filename, QString mimeType, QString targetFormat, IppMsg createJob, IppMsg sendDocument, PrintParameters Params, QMargins margins);
signals: signals:
void progress(qint64 done, qint64 pages); void progress(qint64 done, qint64 pages);