You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
6.8 KiB
C++
179 lines
6.8 KiB
C++
/*
|
|
* Copyright 2014-2018 Markus Prasser, Tobias Weiss
|
|
*
|
|
* This file is part of Labcontrol.
|
|
*
|
|
* Labcontrol is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Labcontrol is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Labcontrol. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef RECEIPTSPRINTER_H
|
|
#define RECEIPTSPRINTER_H
|
|
|
|
#include <QMessageBox>
|
|
#include <QProcess>
|
|
#include <QThread>
|
|
|
|
namespace lc {
|
|
|
|
class Settings;
|
|
|
|
//! A class for receipts creation.
|
|
/*!
|
|
This class is used to do the actual printing of the receipts in an own thread.
|
|
*/
|
|
class ReceiptsPrinter : public QThread
|
|
{
|
|
Q_OBJECT
|
|
|
|
void run() override
|
|
{
|
|
// Compile the TeX file to dvi
|
|
QStringList arguments;
|
|
arguments << "-interaction" << "batchmode" << QString{dateString + ".tex"};
|
|
|
|
QProcess *process = nullptr;
|
|
process = new QProcess{};
|
|
const QProcessEnvironment env{QProcessEnvironment::systemEnvironment()};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->start(latexCmd, arguments);
|
|
if (!process->waitForFinished(processTimeOut)) {
|
|
QMessageBox message_box{QMessageBox::Warning, "dvi creation failed",
|
|
"The creation of the receipts dvi timed out"
|
|
" after 30 seconds. Automatic receipts creation will not work.",
|
|
QMessageBox::Ok};
|
|
message_box.exec();
|
|
delete process;
|
|
process = nullptr;
|
|
return;
|
|
}
|
|
delete process;
|
|
process = nullptr;
|
|
|
|
// Convert the dvi file to postscript
|
|
arguments = QStringList{};
|
|
arguments << "-q*" << "-o" << QString{dateString + ".ps"} << QString{dateString + ".dvi"};
|
|
|
|
process = new QProcess{};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->start(dvipsCmd, arguments);
|
|
if (!process->waitForFinished(processTimeOut)) {
|
|
emit ErrorOccurred(new QString{"The conversion of the receipts dvi to postscript timed out after 30 seconds. Automatic receipts creation will not work."},
|
|
new QString{"dvi to postscript conversion failed"});
|
|
delete process;
|
|
process = nullptr;
|
|
return;
|
|
}
|
|
delete process;
|
|
process = nullptr;
|
|
|
|
// Print the postscript file
|
|
if (!lprCmd.isEmpty()) {
|
|
arguments = QStringList{};
|
|
arguments << QString{workpath + "/" + dateString + ".ps"};
|
|
|
|
process = new QProcess{};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->start(lprCmd, arguments);
|
|
if ( !process->waitForFinished( processTimeOut ) ) {
|
|
emit ErrorOccurred(new QString{"The receipts postscript file was successfully created but could not be printed."},
|
|
new QString{"Printing failed"});
|
|
}
|
|
delete process;
|
|
process = nullptr;
|
|
}
|
|
|
|
// Convert the postscript file to pdf
|
|
if (!ps2pdfCmd.isEmpty()) {
|
|
arguments = QStringList{};
|
|
arguments << QString{workpath + "/" + dateString + ".ps"} << QString{workpath + "/" + dateString + ".pdf"};
|
|
|
|
process = new QProcess{};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->start(ps2pdfCmd, arguments);
|
|
if (!process->waitForFinished(processTimeOut)) {
|
|
emit ErrorOccurred(new QString{"The receipts were successfully printed but the creation of the PDF file failed."},
|
|
new QString{"PDF creation failed"});
|
|
}
|
|
delete process;
|
|
process = nullptr;
|
|
|
|
// Show the postscript file if the conversion succeeded
|
|
if (!postscriptViewer.isEmpty()) {
|
|
arguments = QStringList{};
|
|
arguments << QString{workpath + "/" + dateString + ".ps"};
|
|
|
|
process = new QProcess{};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->startDetached(postscriptViewer, arguments);
|
|
delete process;
|
|
process = nullptr;
|
|
}
|
|
}
|
|
|
|
// Clean up the zTree working path
|
|
if (!rmCmd.isEmpty()) {
|
|
arguments = QStringList{};
|
|
arguments << QString{workpath + "/" + dateString + ".aux"}
|
|
<< QString{workpath + "/" + dateString + ".dvi"}
|
|
<< QString{workpath + "/" + dateString + ".log"}
|
|
<< QString{workpath + "/" + dateString + ".tex"};
|
|
|
|
process = new QProcess{};
|
|
process->setProcessEnvironment(env);
|
|
process->setWorkingDirectory(workpath);
|
|
process->start( rmCmd, arguments);
|
|
if (!process->waitForFinished(processTimeOut)) {
|
|
emit ErrorOccurred(new
|
|
QString("The cleanup of the temporary files for receipts creation timed out. Some spare files may be left in your zTree working directory."),
|
|
new QString("Cleanup failed"));
|
|
}
|
|
delete process;
|
|
process = nullptr;
|
|
}
|
|
|
|
emit PrintingFinished();
|
|
}
|
|
public:
|
|
explicit ReceiptsPrinter(const QString &argDateString,
|
|
const Settings *const argSettings,
|
|
const QString &argWorkpath,
|
|
QObject *argParent = nullptr);
|
|
|
|
signals:
|
|
void ErrorOccurred(QString *error_message, QString *heading);
|
|
void PrintingFinished();
|
|
|
|
private:
|
|
const QString dateString; //! The date string contained in the file paths
|
|
const QString dvipsCmd;
|
|
const QString latexCmd;
|
|
const QString lprCmd;
|
|
const QString postscriptViewer;
|
|
const int processTimeOut =
|
|
15000; //! The maximum time which will be granted to a started process
|
|
const QString ps2pdfCmd;
|
|
const QString rmCmd;
|
|
const QString vncViewer;
|
|
const QString workpath; //!< The path were zTree was ordered to store all its data
|
|
};
|
|
|
|
} // namespace lc
|
|
|
|
#endif // RECEIPTSPRINTER_H
|