Make await an explicit step on CurlRequester
This commit is contained in:
parent
071c39b6f3
commit
da923e3a32
4 changed files with 50 additions and 25 deletions
|
@ -59,22 +59,14 @@ CurlRequester::CurlRequester(QUrl addr, Role role)
|
||||||
if(res != CURLE_OK)
|
if(res != CURLE_OK)
|
||||||
qDebug() << "curl_easy_perform() failed: " << curl_easy_strerror(res);
|
qDebug() << "curl_easy_perform() failed: " << curl_easy_strerror(res);
|
||||||
|
|
||||||
emit done(res, buf);
|
_result = res;
|
||||||
|
_resultMsg = buf;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
CurlRequester::~CurlRequester()
|
CurlRequester::~CurlRequester()
|
||||||
{
|
{
|
||||||
while(!_canWrite.tryAcquire(1, 500))
|
await();
|
||||||
{
|
|
||||||
if(!_worker.isRunning())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_done = true;
|
|
||||||
_canRead.release();
|
|
||||||
_worker.waitForFinished();
|
|
||||||
|
|
||||||
if(_dest != nullptr)
|
if(_dest != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -85,6 +77,22 @@ CurlRequester::~CurlRequester()
|
||||||
curl_easy_cleanup(_curl);
|
curl_easy_cleanup(_curl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CURLcode CurlRequester::await(Bytestream* data)
|
||||||
|
{
|
||||||
|
while(_worker.isRunning() && !_canWrite.tryAcquire(1, 500))
|
||||||
|
{}
|
||||||
|
|
||||||
|
_done = true;
|
||||||
|
_canRead.release();
|
||||||
|
_worker.waitForFinished();
|
||||||
|
|
||||||
|
if(data != nullptr)
|
||||||
|
{
|
||||||
|
(*data) = _resultMsg;
|
||||||
|
}
|
||||||
|
return _result;
|
||||||
|
}
|
||||||
|
|
||||||
bool CurlRequester::write(const char *data, size_t size)
|
bool CurlRequester::write(const char *data, size_t size)
|
||||||
{
|
{
|
||||||
qDebug() << "write " << size;
|
qDebug() << "write " << size;
|
||||||
|
|
|
@ -22,6 +22,8 @@ public:
|
||||||
CurlRequester(QUrl addr, Role role = IppRequest);
|
CurlRequester(QUrl addr, Role role = IppRequest);
|
||||||
~CurlRequester();
|
~CurlRequester();
|
||||||
|
|
||||||
|
CURLcode await(Bytestream* = nullptr);
|
||||||
|
|
||||||
bool write(const char *data, size_t size);
|
bool write(const char *data, size_t size);
|
||||||
size_t requestWrite(char* dest, size_t size);
|
size_t requestWrite(char* dest, size_t size);
|
||||||
|
|
||||||
|
@ -32,9 +34,6 @@ public:
|
||||||
return bytes_to_write;
|
return bytes_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
signals:
|
|
||||||
void done(CURLcode, Bytestream);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CurlRequester();
|
CurlRequester();
|
||||||
|
|
||||||
|
@ -61,6 +60,9 @@ private:
|
||||||
bool _reading;
|
bool _reading;
|
||||||
bool _done;
|
bool _done;
|
||||||
|
|
||||||
|
CURLcode _result;
|
||||||
|
Bytestream _resultMsg;
|
||||||
|
|
||||||
char* _dest;
|
char* _dest;
|
||||||
size_t _size;
|
size_t _size;
|
||||||
size_t _offset;
|
size_t _offset;
|
||||||
|
|
|
@ -26,42 +26,42 @@ PrinterWorker::PrinterWorker(IppPrinter* parent)
|
||||||
void PrinterWorker::getStrings(QUrl url)
|
void PrinterWorker::getStrings(QUrl url)
|
||||||
{
|
{
|
||||||
CurlRequester cr(url, CurlRequester::HttpGetRequest);
|
CurlRequester cr(url, CurlRequester::HttpGetRequest);
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::getStringsFinished);
|
awaitResult(cr, "getStringsFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::getImage(QUrl url)
|
void PrinterWorker::getImage(QUrl url)
|
||||||
{
|
{
|
||||||
CurlRequester cr(url, CurlRequester::HttpGetRequest);
|
CurlRequester cr(url, CurlRequester::HttpGetRequest);
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::getImageFinished);
|
awaitResult(cr, "getImageFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PrinterWorker::getPrinterAttributes(Bytestream msg)
|
void PrinterWorker::getPrinterAttributes(Bytestream msg)
|
||||||
{
|
{
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::getPrinterAttributesFinished);
|
|
||||||
cr.write((char*)msg.raw(), msg.size());
|
cr.write((char*)msg.raw(), msg.size());
|
||||||
|
awaitResult(cr, "getPrinterAttributesFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::getJobs(Bytestream msg)
|
void PrinterWorker::getJobs(Bytestream msg)
|
||||||
{
|
{
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::getJobsRequestFinished);
|
|
||||||
cr.write((char*)msg.raw(), msg.size());
|
cr.write((char*)msg.raw(), msg.size());
|
||||||
|
awaitResult(cr, "getJobsRequestFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::cancelJob(Bytestream msg)
|
void PrinterWorker::cancelJob(Bytestream msg)
|
||||||
{
|
{
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::cancelJobFinished);
|
|
||||||
cr.write((char*)msg.raw(), msg.size());
|
cr.write((char*)msg.raw(), msg.size());
|
||||||
|
awaitResult(cr, "cancelJobFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::identify(Bytestream msg)
|
void PrinterWorker::identify(Bytestream msg)
|
||||||
{
|
{
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::identifyFinished);
|
|
||||||
cr.write((char*)msg.raw(), msg.size());
|
cr.write((char*)msg.raw(), msg.size());
|
||||||
|
awaitResult(cr, "identifyFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
@ -127,7 +127,6 @@ void PrinterWorker::justUpload(QString filename, Bytestream header)
|
||||||
emit busyMessage(tr("Printing"));
|
emit busyMessage(tr("Printing"));
|
||||||
|
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::printRequestFinished);
|
|
||||||
|
|
||||||
QFile file(filename);
|
QFile file(filename);
|
||||||
file.open(QFile::ReadOnly);
|
file.open(QFile::ReadOnly);
|
||||||
|
@ -136,6 +135,8 @@ void PrinterWorker::justUpload(QString filename, Bytestream header)
|
||||||
QByteArray tmp = file.readAll();
|
QByteArray tmp = file.readAll();
|
||||||
OK(cr.write(tmp.data(), tmp.length()));
|
OK(cr.write(tmp.data(), tmp.length()));
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
awaitResult(cr, "printRequestFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::printImageAsImage(QString filename, Bytestream header, QString targetFormat)
|
void PrinterWorker::printImageAsImage(QString filename, Bytestream header, QString targetFormat)
|
||||||
|
@ -163,7 +164,6 @@ void PrinterWorker::printImageAsImage(QString filename, Bytestream header, QStri
|
||||||
Bytestream OutBts;
|
Bytestream OutBts;
|
||||||
|
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::printRequestFinished);
|
|
||||||
|
|
||||||
if(mimeType == Mimer::JPEG && targetFormat == Mimer::JPEG)
|
if(mimeType == Mimer::JPEG && targetFormat == Mimer::JPEG)
|
||||||
{
|
{
|
||||||
|
@ -227,12 +227,13 @@ void PrinterWorker::printImageAsImage(QString filename, Bytestream header, QStri
|
||||||
|
|
||||||
OK(cr.write((char*)header.raw(), header.size()));
|
OK(cr.write((char*)header.raw(), header.size()));
|
||||||
OK(cr.write((char*)OutBts.raw(), OutBts.size()));
|
OK(cr.write((char*)OutBts.raw(), OutBts.size()));
|
||||||
|
|
||||||
|
awaitResult(cr, "printRequestFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::fixupPlaintext(QString filename, Bytestream header)
|
void PrinterWorker::fixupPlaintext(QString filename, Bytestream header)
|
||||||
{
|
{
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::printRequestFinished);
|
|
||||||
|
|
||||||
QFile inFile(filename);
|
QFile inFile(filename);
|
||||||
if(!inFile.open(QIODevice::ReadOnly))
|
if(!inFile.open(QIODevice::ReadOnly))
|
||||||
|
@ -266,6 +267,8 @@ void PrinterWorker::fixupPlaintext(QString filename, Bytestream header)
|
||||||
|
|
||||||
OK(cr.write((char*)header.raw(), header.size()));
|
OK(cr.write((char*)header.raw(), header.size()));
|
||||||
OK(cr.write(outData.data(), outData.length()));
|
OK(cr.write(outData.data(), outData.length()));
|
||||||
|
|
||||||
|
awaitResult(cr, "printRequestFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterWorker::convertPdf(QString filename, Bytestream header, PrintParameters Params)
|
void PrinterWorker::convertPdf(QString filename, Bytestream header, PrintParameters Params)
|
||||||
|
@ -273,7 +276,6 @@ void PrinterWorker::convertPdf(QString filename, Bytestream header, PrintParamet
|
||||||
emit busyMessage(tr("Printing"));
|
emit busyMessage(tr("Printing"));
|
||||||
|
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::printRequestFinished);
|
|
||||||
|
|
||||||
OK(cr.write((char*)header.raw(), header.size()));
|
OK(cr.write((char*)header.raw(), header.size()));
|
||||||
|
|
||||||
|
@ -298,6 +300,7 @@ void PrinterWorker::convertPdf(QString filename, Bytestream header, PrintParamet
|
||||||
throw ConvertFailedException(tr("Conversion failed"));
|
throw ConvertFailedException(tr("Conversion failed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
awaitResult(cr, "printRequestFinished");
|
||||||
qDebug() << "Finished";
|
qDebug() << "Finished";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,12 +442,13 @@ void PrinterWorker::convertImage(QString filename, Bytestream header, PrintParam
|
||||||
bmp_to_pwg(inBts, outBts, 1, Params, verbose);
|
bmp_to_pwg(inBts, outBts, 1, Params, verbose);
|
||||||
|
|
||||||
CurlRequester cr(_printer->httpUrl());
|
CurlRequester cr(_printer->httpUrl());
|
||||||
connect(&cr, &CurlRequester::done, _printer, &IppPrinter::printRequestFinished);
|
|
||||||
|
|
||||||
emit busyMessage(tr("Printing"));
|
emit busyMessage(tr("Printing"));
|
||||||
|
|
||||||
OK(cr.write((char*)header.raw(), header.size()));
|
OK(cr.write((char*)header.raw(), header.size()));
|
||||||
OK(cr.write((char*)(outBts.raw()), outBts.size()));
|
OK(cr.write((char*)(outBts.raw()), outBts.size()));
|
||||||
|
|
||||||
|
awaitResult(cr, "printRequestFinished");
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "posted";
|
qDebug() << "posted";
|
||||||
|
@ -650,3 +654,12 @@ void PrinterWorker::convertPlaintext(QString filename, Bytestream header, PrintP
|
||||||
qDebug() << "Finished";
|
qDebug() << "Finished";
|
||||||
qDebug() << "posted";
|
qDebug() << "posted";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrinterWorker::awaitResult(CurlRequester& cr, QString callback)
|
||||||
|
{
|
||||||
|
Bytestream resMsg;
|
||||||
|
CURLcode res = cr.await(&resMsg);
|
||||||
|
QMetaObject::invokeMethod(_printer, callback.toStdString().c_str(), Qt::QueuedConnection,
|
||||||
|
Q_ARG(CURLcode, res),
|
||||||
|
Q_ARG(Bytestream, resMsg));
|
||||||
|
}
|
||||||
|
|
|
@ -54,6 +54,8 @@ private:
|
||||||
void convertOfficeDocument(QString filename, Bytestream header, PrintParameters Params);
|
void convertOfficeDocument(QString filename, Bytestream header, PrintParameters Params);
|
||||||
void convertPlaintext(QString filename, Bytestream header, PrintParameters Params);
|
void convertPlaintext(QString filename, Bytestream header, PrintParameters Params);
|
||||||
|
|
||||||
|
void awaitResult(CurlRequester& cr, QString callback);
|
||||||
|
|
||||||
IppPrinter* _printer;
|
IppPrinter* _printer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue