Add two-stage create/send print job support
This commit is contained in:
parent
d037600d0f
commit
51c90e6443
6 changed files with 82 additions and 14 deletions
|
@ -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}});
|
||||||
|
}
|
||||||
|
|
|
@ -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;}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,10 +713,36 @@ 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() {
|
||||||
|
|
||||||
qDebug() << "getting jobs";
|
qDebug() << "getting jobs";
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue