diff options
Diffstat (limited to 'src/printsupport/kernel/qprintengine_pdf.cpp')
-rw-r--r-- | src/printsupport/kernel/qprintengine_pdf.cpp | 171 |
1 files changed, 15 insertions, 156 deletions
diff --git a/src/printsupport/kernel/qprintengine_pdf.cpp b/src/printsupport/kernel/qprintengine_pdf.cpp index 9c2e209b9c..a1690aadb3 100644 --- a/src/printsupport/kernel/qprintengine_pdf.cpp +++ b/src/printsupport/kernel/qprintengine_pdf.cpp @@ -39,20 +39,22 @@ ** ****************************************************************************/ -#include <QtPrintSupport/qprintengine.h> +#include "qprintengine_pdf_p.h" + +#ifndef QT_NO_PRINTER #include <qiodevice.h> #include <qfile.h> #include <qdebug.h> #include <qbuffer.h> +#if !defined(QT_NO_CUPS) #include "private/qcups_p.h" +#endif #include "qprinterinfo.h" -#ifndef QT_NO_PRINTER #include <limits.h> #include <math.h> -#include "qprintengine_pdf_p.h" #ifdef Q_OS_UNIX #include "private/qcore_unix_p.h" // overrides QT_OPEN @@ -96,7 +98,7 @@ QPdfPrintEngine::QPdfPrintEngine(QPrinter::PrinterMode m) : QPdfEngine(*new QPdfPrintEnginePrivate(m)) { Q_D(QPdfPrintEngine); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) if (QCUPSSupport::isAvailable()) { QCUPSSupport cups; const cups_dest_t* printers = cups.availablePrinters(); @@ -109,17 +111,8 @@ QPdfPrintEngine::QPdfPrintEngine(QPrinter::PrinterMode m) } } - } else -#endif - { - d->printerName = QString::fromLocal8Bit(qgetenv("PRINTER")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("LPDEST")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("NPRINTER")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("NGPRINTER")); } +#endif // QT_NO_CUPS state = QPrinter::Idle; } @@ -278,19 +271,19 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const ret = d->copies; break; case PPK_SupportsMultipleCopies: -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) if (QCUPSSupport::isAvailable()) ret = true; else -#endif +#endif // QT_NO_CUPS ret = false; break; case PPK_NumberOfCopies: -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) if (QCUPSSupport::isAvailable()) ret = 1; else -#endif +#endif // QT_NO_CUPS ret = d->copies; break; case PPK_Orientation: @@ -365,28 +358,6 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const } -#ifndef QT_NO_LPR -static void closeAllOpenFds() -{ - // hack time... getting the maximum number of open - // files, if possible. if not we assume it's the - // larger of 256 and the fd we got - int i; -#if defined(_SC_OPEN_MAX) - i = (int)sysconf(_SC_OPEN_MAX); -#elif defined(_POSIX_OPEN_MAX) - i = (int)_POSIX_OPEN_MAX; -#elif defined(OPEN_MAX) - i = (int)OPEN_MAX; -#else - i = 256; -#endif - // leave stdin/out/err untouched - while(--i > 2) - QT_CLOSE(i); -} -#endif - bool QPdfPrintEnginePrivate::openPrintDevice() { if (outDevice) @@ -399,7 +370,7 @@ bool QPdfPrintEnginePrivate::openPrintDevice() return false; } outDevice = file; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) } else if (QCUPSSupport::isAvailable()) { QCUPSSupport cups; QPair<int, QString> ret = cups.tempFd(); @@ -410,119 +381,7 @@ bool QPdfPrintEnginePrivate::openPrintDevice() cupsTempFile = ret.second; outDevice = new QFile(); static_cast<QFile *>(outDevice)->open(ret.first, QIODevice::WriteOnly); -#endif -#ifndef QT_NO_LPR - } else { - QString pr; - if (!printerName.isEmpty()) - pr = printerName; - int fds[2]; - if (qt_safe_pipe(fds) != 0) { - qWarning("QPdfPrinter: Could not open pipe to print"); - return false; - } - - pid_t pid = fork(); - if (pid == 0) { // child process - // if possible, exit quickly, so the actual lp/lpr - // becomes a child of init, and ::waitpid() is - // guaranteed not to wait. - if (fork() > 0) { - closeAllOpenFds(); - - // try to replace this process with "true" - this prevents - // global destructors from being called (that could possibly - // do wrong things to the parent process) - (void)execlp("true", "true", (char *)0); - (void)execl("/bin/true", "true", (char *)0); - (void)execl("/usr/bin/true", "true", (char *)0); - ::_exit(0); - } - qt_safe_dup2(fds[0], 0, 0); - - closeAllOpenFds(); - - if (!printProgram.isEmpty()) { - if (!selectionOption.isEmpty()) - pr.prepend(selectionOption); - else - pr.prepend(QLatin1String("-P")); - (void)execlp(printProgram.toLocal8Bit().data(), printProgram.toLocal8Bit().data(), - pr.toLocal8Bit().data(), (char *)0); - } else { - // if no print program has been specified, be smart - // about the option string too. - QList<QByteArray> lprhack; - QList<QByteArray> lphack; - QByteArray media; - if (!pr.isEmpty() || !selectionOption.isEmpty()) { - if (!selectionOption.isEmpty()) { - QStringList list = selectionOption.split(QLatin1Char(' ')); - for (int i = 0; i < list.size(); ++i) - lprhack.append(list.at(i).toLocal8Bit()); - lphack = lprhack; - } else { - lprhack.append("-P"); - lphack.append("-d"); - } - lprhack.append(pr.toLocal8Bit()); - lphack.append(pr.toLocal8Bit()); - } - lphack.append("-s"); - - char ** lpargs = new char *[lphack.size()+6]; - char lp[] = "lp"; - lpargs[0] = lp; - int i; - for (i = 0; i < lphack.size(); ++i) - lpargs[i+1] = (char *)lphack.at(i).constData(); -#ifndef Q_OS_OSF - if (QPdf::paperSizeToString(printerPaperSize)) { - char dash_o[] = "-o"; - lpargs[++i] = dash_o; - lpargs[++i] = const_cast<char *>(QPdf::paperSizeToString(printerPaperSize)); - lpargs[++i] = dash_o; - media = "media="; - media += QPdf::paperSizeToString(printerPaperSize); - lpargs[++i] = media.data(); - } -#endif - lpargs[++i] = 0; - char **lprargs = new char *[lprhack.size()+2]; - char lpr[] = "lpr"; - lprargs[0] = lpr; - for (int i = 0; i < lprhack.size(); ++i) - lprargs[i+1] = (char *)lprhack[i].constData(); - lprargs[lprhack.size() + 1] = 0; - (void)execvp("lp", lpargs); - (void)execvp("lpr", lprargs); - (void)execv("/bin/lp", lpargs); - (void)execv("/bin/lpr", lprargs); - (void)execv("/usr/bin/lp", lpargs); - (void)execv("/usr/bin/lpr", lprargs); - - delete []lpargs; - delete []lprargs; - } - // if we couldn't exec anything, close the fd, - // wait for a second so the parent process (the - // child of the GUI process) has exited. then - // exit. - QT_CLOSE(0); - (void)::sleep(1); - ::_exit(0); - } - // parent process - QT_CLOSE(fds[0]); - fd = fds[1]; - (void)qt_safe_waitpid(pid, 0, 0); - - if (fd < 0) - return false; - - outDevice = new QFile(); - static_cast<QFile *>(outDevice)->open(fd, QIODevice::WriteOnly); -#endif +#endif // QT_NO_CUPS } return true; @@ -543,7 +402,7 @@ void QPdfPrintEnginePrivate::closePrintDevice() outDevice = 0; } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) if (!cupsTempFile.isEmpty()) { QString tempFile = cupsTempFile; cupsTempFile.clear(); @@ -620,7 +479,7 @@ void QPdfPrintEnginePrivate::closePrintDevice() QFile::remove(tempFile); } -#endif +#endif // QT_NO_CUPS } |