harbour-seaprint/src/ippprinter.cpp

187 lines
5.8 KiB
C++
Raw Normal View History

2019-12-01 22:27:00 +03:00
#include "ippprinter.h"
IppPrinter::IppPrinter()
{
_nam = new QNetworkAccessManager(this);
2019-12-08 15:55:56 +03:00
_print_nam = new QNetworkAccessManager(this);
_jobs_nam = new QNetworkAccessManager(this);
2019-12-01 22:27:00 +03:00
connect(_nam, SIGNAL(finished(QNetworkReply*)),this, SLOT(getPrinterAttributesFinished(QNetworkReply*)));
2019-12-08 15:55:56 +03:00
connect(_print_nam, SIGNAL(finished(QNetworkReply*)),this, SLOT(printRequestFinished(QNetworkReply*)));
connect(_jobs_nam, SIGNAL(finished(QNetworkReply*)),this, SLOT(getJobsRequestFinished(QNetworkReply*)));
2019-12-01 22:27:00 +03:00
QObject::connect(this, &IppPrinter::urlChanged, this, &IppPrinter::onUrlChanged);
}
IppPrinter::~IppPrinter() {
delete _nam;
2019-12-08 15:55:56 +03:00
delete _print_nam;
delete _jobs_nam;
2019-12-01 22:27:00 +03:00
}
void IppPrinter::setUrl(QString url)
{
if(url != _url)
{
_url = url;
emit urlChanged();
}
}
void IppPrinter::onUrlChanged()
{
_attrs = QJsonObject();
emit attrsChanged();
QNetworkRequest request;
QUrl url("http://"+_url);
qDebug() << _url << url.port();
if(url.port() == -1) {
url.setPort(631);
}
request.setUrl(url);
// request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/ipp");
QJsonObject o
{
{"attributes-charset", QJsonObject {{"tag", IppMsg::Charset}, {"value", "utf-8"}}},
{"attributes-natural-language", QJsonObject {{"tag", IppMsg::NaturalLanguage}, {"value", "en-us"}}},
{"printer-uri", QJsonObject {{"tag", IppMsg::Uri}, {"value", "ipp://"+_url}}},
{"requesting-user-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", "nemo"}}}
};
IppMsg msg = IppMsg(o);
_nam->post(request, msg.encode(IppMsg::GetPrinterAttrs));
}
void IppPrinter::getPrinterAttributesFinished(QNetworkReply *reply)
{
2019-12-08 15:55:56 +03:00
qDebug() << reply->error() << reply->errorString() << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString();
2019-12-01 22:27:00 +03:00
if(reply->error() == QNetworkReply::NoError)
{
try {
IppMsg resp(reply);
2019-12-08 15:55:56 +03:00
qDebug() << resp.getStatus() << resp.getOpAttrs() << resp.getPrinterAttrs();
2019-12-01 22:27:00 +03:00
_attrs = resp.getPrinterAttrs();
emit attrsChanged();
}
catch(std::exception e)
{
qDebug() << e.what();
}
}
}
2019-12-08 15:55:56 +03:00
void IppPrinter::printRequestFinished(QNetworkReply *reply)
2019-12-01 22:27:00 +03:00
{
if(reply->error() == QNetworkReply::NoError)
{
try {
IppMsg resp(reply);
2019-12-06 22:18:48 +03:00
qDebug() << resp.getStatus() << resp.getOpAttrs() << resp.getJobAttrs();
2019-12-08 15:55:56 +03:00
_jobAttrs = resp.getJobAttrs()[0].toObject();
2019-12-01 22:27:00 +03:00
emit jobAttrsChanged();
}
catch(std::exception e)
{
qDebug() << e.what();
}
}
}
2019-12-08 15:55:56 +03:00
void IppPrinter::getJobsRequestFinished(QNetworkReply *reply)
{
if(reply->error() == QNetworkReply::NoError)
{
try {
IppMsg resp(reply);
qDebug() << resp.getStatus() << resp.getOpAttrs() << resp.getJobAttrs();
_jobs = resp.getJobAttrs();
emit jobsChanged();
}
catch(std::exception e)
{
qDebug() << e.what();
}
}
}
2019-12-01 22:27:00 +03:00
bool IppPrinter::print(QJsonObject attrs, QString filename){
qDebug() << "printing" << filename << attrs;
QFile file(filename);
bool file_ok = file.open(QIODevice::ReadOnly);
if(!file_ok)
return false;
QFileInfo fileinfo(file);
QNetworkRequest request;
QUrl url("http://"+_url);
2019-12-01 22:36:56 +03:00
if(url.port() == -1) {
url.setPort(631);
}
2019-12-01 22:27:00 +03:00
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/ipp");
QJsonObject o
{
{"attributes-charset", QJsonObject {{"tag", IppMsg::Charset}, {"value", "utf-8"}}},
{"attributes-natural-language", QJsonObject {{"tag", IppMsg::NaturalLanguage}, {"value", "en-us"}}},
{"printer-uri", QJsonObject {{"tag", IppMsg::Uri}, {"value", "ipp://"+_url}}},
{"requesting-user-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", "nemo"}}},
{"job-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", fileinfo.fileName()}}},
};
2019-12-06 22:18:48 +03:00
// Only include if printer supports it
// if (filename.endsWith("pdf"))
// {
// attrs.insert("document-format", QJsonObject {{"tag", 73}, {"value", "application/pdf"}});
// }
// else if (filename.endsWith("jpg")) {
// attrs.insert("document-format", QJsonObject {{"tag", 73}, {"value", "image/jpeg"}});
// }
2019-12-07 16:40:36 +03:00
qDebug() << "Printing job" << o << attrs;
2019-12-01 22:27:00 +03:00
IppMsg job = IppMsg(o, attrs);
QByteArray contents = job.encode(IppMsg::PrintJob);
QByteArray filedata = file.readAll();
contents = contents.append(filedata);
2019-12-08 15:55:56 +03:00
_print_nam->post(request, contents);
2019-12-01 22:27:00 +03:00
file.close();
return true;
}
2019-12-08 15:55:56 +03:00
bool IppPrinter::getJobs() {
qDebug() << "getting jobs";
QJsonObject o
{
{"attributes-charset", QJsonObject {{"tag", IppMsg::Charset}, {"value", "utf-8"}}},
{"attributes-natural-language", QJsonObject {{"tag", IppMsg::NaturalLanguage}, {"value", "en-us"}}},
{"printer-uri", QJsonObject {{"tag", IppMsg::Uri}, {"value", "ipp://"+_url}}},
{"requesting-user-name", QJsonObject {{"tag", IppMsg::NameWithoutLanguage}, {"value", "nemo"}}}
};
IppMsg job = IppMsg(o, QJsonObject());
QNetworkRequest request;
QUrl url("http://"+_url);
if(url.port() == -1) {
url.setPort(631);
}
QByteArray contents = job.encode(IppMsg::GetJobs);
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/ipp");
_jobs_nam->post(request, contents);
return true;
}