From 80f7a388906f94f58bf765a32b9abbb16f967db2 Mon Sep 17 00:00:00 2001 From: John Layt Date: Sun, 29 Apr 2012 14:13:10 +0100 Subject: QtPrintSupport: Remove remaining LPR specific code CUPS is the only supported print system on UNIX, LPR/PS support has already been dropped but some LPR specific code still remains. * Move qt_getCupsPrinterPaperSizes from qprinterinfo_unix to QCUPSSupport * Remove qprinterinfo_unix as no longer used * Remove LPR related code from QPdfPrintEngine * Remove all QT_NO_LPR uses * Remove most QT_NO_CUPS uses, use QT_NO_PRINTER where necessary Some QT_NO_CUPS uses remain in QPdfPrintEngine, these will be removed in a following change implementing a CUPS plugin. Change-Id: I439b6fad9cf88c3d24aa48e49475f49ad310dbad Reviewed-by: Lars Knoll --- src/corelib/global/qconfig-large.h | 3 - src/corelib/global/qconfig-medium.h | 3 - src/corelib/global/qconfig-minimal.h | 3 - src/corelib/global/qconfig-nacl.h | 3 - src/corelib/global/qconfig-small.h | 3 - src/corelib/global/qfeatures.h | 4 +- src/corelib/global/qglobal.h | 1 - src/gui/painting/qpdf_p.h | 2 - .../genericunix/qgenericunixprintersupport.cpp | 6 - src/printsupport/dialogs/qpagesetupdialog_unix.cpp | 31 +- src/printsupport/dialogs/qprintdialog_unix.cpp | 88 +-- src/printsupport/kernel/kernel.pri | 9 +- src/printsupport/kernel/qcups.cpp | 87 ++- src/printsupport/kernel/qcups_p.h | 4 +- .../kernel/qplatformprintersupport_qpa.cpp | 10 - src/printsupport/kernel/qprintengine_pdf.cpp | 171 +--- src/printsupport/kernel/qprintengine_pdf_p.h | 3 + src/printsupport/kernel/qprinter.cpp | 11 +- src/printsupport/kernel/qprinterinfo_p.h | 4 - src/printsupport/kernel/qprinterinfo_unix.cpp | 858 --------------------- src/printsupport/kernel/qprinterinfo_unix_p.h | 130 ---- 21 files changed, 115 insertions(+), 1319 deletions(-) delete mode 100644 src/printsupport/kernel/qprinterinfo_unix.cpp delete mode 100644 src/printsupport/kernel/qprinterinfo_unix_p.h (limited to 'src') diff --git a/src/corelib/global/qconfig-large.h b/src/corelib/global/qconfig-large.h index a3d241f8e6..264ed273c4 100644 --- a/src/corelib/global/qconfig-large.h +++ b/src/corelib/global/qconfig-large.h @@ -132,9 +132,6 @@ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif -#ifndef QT_NO_CUPS -# define QT_NO_CUPS -#endif /* Qt for Embedded Linux */ #ifndef QT_NO_QWS_SOUNDSERVER diff --git a/src/corelib/global/qconfig-medium.h b/src/corelib/global/qconfig-medium.h index ba91303409..4b417f3a79 100644 --- a/src/corelib/global/qconfig-medium.h +++ b/src/corelib/global/qconfig-medium.h @@ -168,9 +168,6 @@ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif -#ifndef QT_NO_CUPS -# define QT_NO_CUPS -#endif /* Qt for Embedded Linux */ #ifndef QT_NO_QWSEMBEDWIDGET diff --git a/src/corelib/global/qconfig-minimal.h b/src/corelib/global/qconfig-minimal.h index 57aa26b381..5fa6c87aa1 100644 --- a/src/corelib/global/qconfig-minimal.h +++ b/src/corelib/global/qconfig-minimal.h @@ -304,9 +304,6 @@ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif -#ifndef QT_NO_CUPS -# define QT_NO_CUPS -#endif /* Qt for Embedded Linux */ #ifndef QT_NO_QWSEMBEDWIDGET diff --git a/src/corelib/global/qconfig-nacl.h b/src/corelib/global/qconfig-nacl.h index 7e48afaee3..083fc33bbc 100644 --- a/src/corelib/global/qconfig-nacl.h +++ b/src/corelib/global/qconfig-nacl.h @@ -230,9 +230,6 @@ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif -#ifndef QT_NO_CUPS -# define QT_NO_CUPS -#endif /* Qt for Embedded Linux */ #ifndef QT_NO_QWSEMBEDWIDGET diff --git a/src/corelib/global/qconfig-small.h b/src/corelib/global/qconfig-small.h index 0c0e6aa01a..f0b95fe45c 100644 --- a/src/corelib/global/qconfig-small.h +++ b/src/corelib/global/qconfig-small.h @@ -196,9 +196,6 @@ #ifndef QT_NO_PRINTER # define QT_NO_PRINTER #endif -#ifndef QT_NO_CUPS -# define QT_NO_CUPS -#endif /* Qt for Embedded Linux */ #ifndef QT_NO_QWS_SOUNDSERVER diff --git a/src/corelib/global/qfeatures.h b/src/corelib/global/qfeatures.h index 54c1be8bd3..d0774c55d6 100644 --- a/src/corelib/global/qfeatures.h +++ b/src/corelib/global/qfeatures.h @@ -512,8 +512,8 @@ #endif // Common UNIX Printing System -#if !defined(QT_NO_CUPS) && (defined(QT_NO_PRINTER) || defined(QT_NO_LIBRARY)) -#define QT_NO_CUPS +#if !defined(QT_NO_PRINTER) && defined(QT_NO_LIBRARY) && defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +#define QT_NO_PRINTER #endif // QErrorMessage diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index a8547a3ab8..061793caa7 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -451,7 +451,6 @@ class QDataStream; #if defined(Q_OS_VXWORKS) # define QT_NO_CRASHHANDLER // no popen # define QT_NO_PROCESS // no exec*, no fork -# define QT_NO_LPR # define QT_NO_SHAREDMEMORY // only POSIX, no SysV and in the end... # define QT_NO_SYSTEMSEMAPHORE // not needed at all in a flat address space #endif diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index b175b574bd..87f400c00a 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -283,8 +283,6 @@ public: QSizeF paperSize; qreal leftMargin, topMargin, rightMargin, bottomMargin; - QString cupsTempFile; - private: #ifdef USE_NATIVE_GRADIENTS int gradientBrush(const QBrush &b, const QMatrix &matrix, int *gStateObject); diff --git a/src/platformsupport/printersupport/genericunix/qgenericunixprintersupport.cpp b/src/platformsupport/printersupport/genericunix/qgenericunixprintersupport.cpp index 2fb9562545..f60bba2a07 100644 --- a/src/platformsupport/printersupport/genericunix/qgenericunixprintersupport.cpp +++ b/src/platformsupport/printersupport/genericunix/qgenericunixprintersupport.cpp @@ -48,23 +48,17 @@ QT_BEGIN_NAMESPACE QList QGenericUnixPrinterSupport::supportedPaperSizes(const QPrinterInfo &printerInfo) const { -#ifndef QT_NO_CUPS return QCUPSSupport::getCupsPrinterPaperSizes(QPlatformPrinterSupport::printerInfoCupsPrinterIndex(printerInfo)); -#else - return QList(); -#endif } QList QGenericUnixPrinterSupport::availablePrinters() { QList printers; -#ifndef QT_NO_CUPS foreach (const QCUPSSupport::Printer &p, QCUPSSupport::availableUnixPrinters()) { QPrinterInfo printer(QPlatformPrinterSupport::printerInfo(p.name, p.isDefault)); QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(&printer, p.cupsPrinterIndex); printers.append(printer); } -#endif return printers; } diff --git a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp index 90fb3ef542..a1e7d559db 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp @@ -53,11 +53,8 @@ #include #include -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -# include -# include -# include -#endif +#include +#include QT_BEGIN_NAMESPACE @@ -224,16 +221,12 @@ public: void init(); QPageSetupWidget *widget; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QCUPSSupport *cups; -#endif }; QPageSetupDialogPrivate::~QPageSetupDialogPrivate() { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) delete cups; -#endif } void QPageSetupDialogPrivate::init() @@ -242,14 +235,12 @@ void QPageSetupDialogPrivate::init() widget = new QPageSetupWidget(q); widget->setPrinter(printer); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (printer->outputFormat() == QPrinter::NativeFormat && QCUPSSupport::isAvailable()) { cups = new QCUPSSupport; widget->selectPrinter(cups); } else { cups = 0; } -#endif QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, @@ -353,9 +344,7 @@ void QPageSetupWidget::setupPrinter() const int ps = m_printer->pageSize(); if (val.type() == QVariant::Int) { ps = val.toInt(); - } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - else if (m_cups && QCUPSSupport::isAvailable() && m_cups->currentPPD()) { + } else if (m_cups && QCUPSSupport::isAvailable() && m_cups->currentPPD()) { QByteArray cupsPageSize = val.toByteArray(); QPrintEngine *engine = m_printer->printEngine(); engine->setProperty(PPK_CupsStringPageSize, QString::fromLatin1(cupsPageSize)); @@ -373,7 +362,7 @@ void QPageSetupWidget::setupPrinter() const break; } } -#endif + if (ps == QPrinter::Custom) m_printer->setPaperSize(sizeForOrientation(orientation, m_paperSize), QPrinter::Point); else @@ -390,7 +379,7 @@ void QPageSetupWidget::selectPrinter(QCUPSSupport *cups) { m_cups = cups; widget.paperSize->clear(); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (m_cups && QCUPSSupport::isAvailable()) { const ppd_option_t* pageSizes = m_cups->pageSizes(); const int numChoices = pageSizes ? pageSizes->num_choices : 0; @@ -426,7 +415,7 @@ void QPageSetupWidget::selectPrinter(QCUPSSupport *cups) m_bottomMargin = paper.bottom() - content.bottom(); } } -#endif + if (widget.paperSize->count() == 0) { populatePaperSizes(widget.paperSize); widget.paperSize->setCurrentIndex(widget.paperSize->findData( @@ -471,9 +460,7 @@ void QPageSetupWidget::_q_paperSizeChanged() bool custom = size == QPrinter::Custom; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) custom = custom ? !m_cups : custom; -#endif widget.paperWidth->setEnabled(custom); widget.paperHeight->setEnabled(custom); @@ -485,16 +472,14 @@ void QPageSetupWidget::_q_paperSizeChanged() m_pagePreview->setPaperSize(m_paperSize); } else { Q_ASSERT(m_printer); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (m_cups) { // combobox is filled with cups based data QByteArray cupsPageSize = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray(); m_paperSize = m_cups->paperRect(cupsPageSize).size(); if (orientation == QPrinter::Landscape) m_paperSize = QSizeF(m_paperSize.height(), m_paperSize.width()); // swap - } - else -#endif + } else { m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1); + } m_pagePreview->setPaperSize(m_paperSize); widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier); diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index f7689c1620..4ba04be9ec 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -60,15 +60,8 @@ #include "ui_qprintsettingsoutput.h" #include "ui_qprintwidget.h" -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -# include -# include -# include -#else -# include -#endif - -#include +#include +#include QT_BEGIN_NAMESPACE @@ -82,10 +75,8 @@ public: QPrintPropertiesDialog(QAbstractPrintDialog *parent = 0); ~QPrintPropertiesDialog(); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void setCups(QCUPSSupport *cups) { m_cups = cups; } void addItemToOptions(QOptionTreeItem *parent, QList& options, QList& markedOptions) const; -#endif void selectPrinter(); void selectPdfPsPrinter(const QPrinter *p); @@ -100,10 +91,8 @@ protected: private: Ui::QPrintPropertiesWidget widget; QDialogButtonBox *m_buttons; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QCUPSSupport *m_cups; QPPDOptionsModel *m_cupsOptionsModel; -#endif }; class QPrintDialogPrivate : public QAbstractPrintDialogPrivate @@ -118,9 +107,7 @@ public: /// copy printer properties to the widget void applyPrinterProperties(QPrinter *p); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void selectPrinter(QCUPSSupport *cups); -#endif void _q_chbPrintLastFirstToggled(bool); #ifndef QT_NO_MESSAGEBOX @@ -151,9 +138,7 @@ public: bool checkFields(); void setupPrinter(); void setOptionsPane(QPrintDialogPrivate *pane); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void setCupsProperties(); -#endif // slots void _q_printerChanged(int index); @@ -165,21 +150,17 @@ public: Ui::QPrintWidget widget; QAbstractPrintDialog * q; QPrinter *printer; - QList lprPrinters; void updateWidget(); private: QPrintDialogPrivate *optionsPane; bool filePrintersAdded; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QCUPSSupport* cups; int cupsPrinterCount; const cups_dest_t* cupsPrinters; const ppd_file_t* cupsPPD; -#endif }; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) class QOptionTreeItem { public: @@ -249,15 +230,10 @@ private slots: }; -#endif - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent) - : QDialog(parent) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - , m_cups(0), m_cupsOptionsModel(0) -#endif + : QDialog(parent), m_cups(0), m_cupsOptionsModel(0) { QVBoxLayout *lay = new QVBoxLayout(this); this->setLayout(lay); @@ -273,11 +249,7 @@ QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent) QPrintPropertiesDialog::~QPrintPropertiesDialog() { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) delete m_cupsOptionsModel; -#else - delete widget.cupsPropertiesPage; -#endif } void QPrintPropertiesDialog::applyPrinterProperties(QPrinter *p) @@ -289,7 +261,6 @@ void QPrintPropertiesDialog::setupPrinter() const { widget.pageSetup->setupPrinter(); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QPPDOptionsModel* model = static_cast(widget.treeView->model()); if (model) { QOptionTreeItem* rootItem = model->rootItem; @@ -299,12 +270,10 @@ void QPrintPropertiesDialog::setupPrinter() const addItemToOptions(rootItem, options, markedOptions); model->cups->saveOptions(options, markedOptions); } -#endif } void QPrintPropertiesDialog::selectPrinter() { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) widget.pageSetup->selectPrinter(m_cups); widget.treeView->setModel(0); if (m_cups && QCUPSSupport::isAvailable()) { @@ -329,9 +298,7 @@ void QPrintPropertiesDialog::selectPrinter() widget.tabs->setTabEnabled(1, false); } - } else -#endif - { + } else { widget.cupsPropertiesPage->setEnabled(false); widget.pageSetup->selectPrinter(0); } @@ -350,7 +317,6 @@ void QPrintPropertiesDialog::showEvent(QShowEvent* event) event->accept(); } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void QPrintPropertiesDialog::addItemToOptions(QOptionTreeItem *parent, QList& options, QList& markedOptions) const { for (int i = 0; i < parent->childItems.count(); ++i) { @@ -366,7 +332,6 @@ void QPrintPropertiesDialog::addItemToOptions(QOptionTreeItem *parent, QList &tabWidgets) } } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void QPrintDialogPrivate::selectPrinter(QCUPSSupport *cups) { options.duplex->setEnabled(cups && cups->ppdOption("Duplex")); } -#endif //////////////////////////////////////////////////////////////////////////////// @@ -630,10 +593,8 @@ void QPrintDialog::accept() /*! \internal */ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p) - : parent(p), propertiesDialog(0), printer(0), optionsPane(0), filePrintersAdded(false) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - , cups(0), cupsPrinterCount(0), cupsPrinters(0), cupsPPD(0) -#endif + : parent(p), propertiesDialog(0), printer(0), optionsPane(0), filePrintersAdded(false), + cups(0), cupsPrinterCount(0), cupsPrinters(0), cupsPPD(0) { q = 0; if (parent) @@ -642,7 +603,6 @@ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p) widget.setupUi(parent); int currentPrinterIndex = 0; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) cups = new QCUPSSupport; if (QCUPSSupport::isAvailable()) { cupsPPD = cups->currentPPD(); @@ -664,16 +624,7 @@ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p) widget.properties->setEnabled(true); } currentPrinterIndex = cups->currentPrinterIndex(); - } else { -#endif - currentPrinterIndex = qt_getLprPrinters(lprPrinters); - // populating printer combo - QList::const_iterator i = lprPrinters.constBegin(); - for(; i != lprPrinters.constEnd(); ++i) - widget.printers->addItem((*i).name); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) } -#endif #if !defined(QT_NO_FILESYSTEMMODEL) && !defined(QT_NO_COMPLETER) QFileSystemModel *fsm = new QFileSystemModel(widget.filename); @@ -725,9 +676,7 @@ void QUnixPrintWidgetPrivate::updateWidget() QUnixPrintWidgetPrivate::~QUnixPrintWidgetPrivate() { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) delete cups; -#endif } void QUnixPrintWidgetPrivate::_q_printerChanged(int index) @@ -751,16 +700,13 @@ void QUnixPrintWidgetPrivate::_q_printerChanged(int index) widget.lOutput->setEnabled(true); if (propertiesDialog) propertiesDialog->selectPdfPsPrinter(printer); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (optionsPane) optionsPane->selectPrinter(0); -#endif return; } } widget.location->setText(QString()); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (QCUPSSupport::isAvailable()) { cups->setCurrentPrinter(index); @@ -780,21 +726,7 @@ void QUnixPrintWidgetPrivate::_q_printerChanged(int index) propertiesDialog->selectPrinter(); if (optionsPane) optionsPane->selectPrinter(cups); - } else { - if (optionsPane) - optionsPane->selectPrinter(0); -#endif - if (lprPrinters.count() > 0) { - QString type = lprPrinters.at(index).name + QLatin1Char('@') + lprPrinters.at(index).host; - if (!lprPrinters.at(index).comment.isEmpty()) - type += QLatin1String(", ") + lprPrinters.at(index).comment; - widget.type->setText(type); - if (propertiesDialog) - propertiesDialog->selectPrinter(); - } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) } -#endif } void QUnixPrintWidgetPrivate::setOptionsPane(QPrintDialogPrivate *pane) @@ -908,9 +840,7 @@ void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked() } if (propertiesDialog->result() == QDialog::Rejected) { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) propertiesDialog->setCups(cups); -#endif propertiesDialog->applyPrinterProperties(q->printer()); if (q->isOptionEnabled(QPrintDialog::PrintToFile) @@ -922,7 +852,6 @@ void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked() propertiesDialog->exec(); } -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void QUnixPrintWidgetPrivate::setCupsProperties() { if (cups && QCUPSSupport::isAvailable() && cups->pageSizes()) { @@ -949,7 +878,6 @@ void QUnixPrintWidgetPrivate::setCupsProperties() } } } -#endif void QUnixPrintWidgetPrivate::setupPrinter() { @@ -972,10 +900,8 @@ void QUnixPrintWidgetPrivate::setupPrinter() if (propertiesDialog && propertiesDialog->result() == QDialog::Accepted) propertiesDialog->setupPrinter(); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (!propertiesDialog) setCupsProperties(); -#endif } @@ -1004,7 +930,6 @@ void QUnixPrintWidget::updatePrinter() } //////////////////////////////////////////////////////////////////////////////// -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QPPDOptionsModel::QPPDOptionsModel(QCUPSSupport *c, QObject *parent) : QAbstractItemModel(parent), rootItem(0), cups(c), ppd(c->currentPPD()) @@ -1244,7 +1169,6 @@ void QPPDOptionsEditor::cbChanged(int) */ } -#endif // !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) #endif // defined (Q_OS_UNIX) QT_END_NAMESPACE diff --git a/src/printsupport/kernel/kernel.pri b/src/printsupport/kernel/kernel.pri index 10d9f877a0..d3a48b8766 100644 --- a/src/printsupport/kernel/kernel.pri +++ b/src/printsupport/kernel/kernel.pri @@ -18,13 +18,6 @@ SOURCES += \ $$PWD/qplatformprintplugin.cpp \ $$PWD/qplatformprintersupport_qpa.cpp -unix:!mac { - HEADERS += \ - $$PWD/qprinterinfo_unix_p.h - SOURCES += \ - $$PWD/qprinterinfo_unix.cpp -} - win32 { HEADERS += \ $$PWD/qprintengine_win_p.h @@ -34,7 +27,7 @@ win32 { } mac|win32 { - DEFINES += QT_NO_CUPS QT_NO_LPR + DEFINES += QT_NO_CUPS } else { SOURCES += $$PWD/qcups.cpp HEADERS += $$PWD/qcups_p.h diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp index 1f8bed57ea..98aecd8299 100644 --- a/src/printsupport/kernel/qcups.cpp +++ b/src/printsupport/kernel/qcups.cpp @@ -40,9 +40,8 @@ ****************************************************************************/ #include #include "qcups_p.h" -#include "qprinterinfo_unix_p.h" -#ifndef QT_NO_CUPS +#ifndef QT_NO_PRINTER #ifndef QT_LINUXBASE // LSB merges everything into cups.h # include @@ -405,7 +404,6 @@ QList QCUPSSupport::availableUnixPrinters() { QList printers; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) if (QCUPSSupport::isAvailable()) { QCUPSSupport cups; int cupsPrinterCount = cups.availablePrintersCount(); @@ -421,26 +419,85 @@ QList QCUPSSupport::availableUnixPrinters() p.cupsPrinterIndex = i; printers.append(p); } - } else -#endif - { - QList lprPrinters; - int defprn = qt_getLprPrinters(lprPrinters); - // populating printer combo - foreach (const QPrinterDescription &description, lprPrinters) - printers.append(Printer(description.name)); - if (defprn >= 0 && defprn < printers.size()) - printers[defprn].isDefault = true; } return printers; } +// preserve names in ascending order for the binary search +static const struct NamedPaperSize { + const char *const name; + QPrinter::PaperSize size; +} named_sizes_map[QPrinter::NPageSize] = { + { "A0", QPrinter::A0 }, + { "A1", QPrinter::A1 }, + { "A2", QPrinter::A2 }, + { "A3", QPrinter::A3 }, + { "A4", QPrinter::A4 }, + { "A5", QPrinter::A5 }, + { "A6", QPrinter::A6 }, + { "A7", QPrinter::A7 }, + { "A8", QPrinter::A8 }, + { "A9", QPrinter::A9 }, + { "B0", QPrinter::B0 }, + { "B1", QPrinter::B1 }, + { "B10", QPrinter::B10 }, + { "B2", QPrinter::B2 }, + { "B4", QPrinter::B4 }, + { "B5", QPrinter::B5 }, + { "B6", QPrinter::B6 }, + { "B7", QPrinter::B7 }, + { "B8", QPrinter::B8 }, + { "B9", QPrinter::B9 }, + { "C5E", QPrinter::C5E }, + { "Comm10E", QPrinter::Comm10E }, + { "Custom", QPrinter::Custom }, + { "DLE", QPrinter::DLE }, + { "Executive", QPrinter::Executive }, + { "Folio", QPrinter::Folio }, + { "Ledger", QPrinter::Ledger }, + { "Legal", QPrinter::Legal }, + { "Letter", QPrinter::Letter }, + { "Tabloid", QPrinter::Tabloid } +}; + +inline bool operator<(const char *name, const NamedPaperSize &data) +{ return qstrcmp(name, data.name) < 0; } +inline bool operator<(const NamedPaperSize &data, const char *name) +{ return qstrcmp(data.name, name) < 0; } + +static inline QPrinter::PaperSize string2PaperSize(const char *name) +{ + const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); + if (r - named_sizes_map != QPrinter::NPageSize) + return r->size; + return QPrinter::Custom; +} + +static inline const char *paperSize2String(QPrinter::PaperSize size) +{ + for (int i = 0; i < QPrinter::NPageSize; ++i) { + if (size == named_sizes_map[i].size) + return named_sizes_map[i].name; + } + return 0; +} + QList QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex) { - return qt_getCupsPrinterPaperSizes(cupsPrinterIndex); + QList result; + if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) + return result; + // Find paper sizes from CUPS. + QCUPSSupport cups; + cups.setCurrentPrinter(cupsPrinterIndex); + if (const ppd_option_t* size = cups.pageSizes()) { + for (int j = 0; j < size->num_choices; ++j) + result.append(string2PaperSize(size->choices[j].choice)); + } + return result; } QT_END_NAMESPACE -#endif // QT_NO_CUPS +#endif // QT_NO_PRINTER diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h index cbf153f347..0e61975dfa 100644 --- a/src/printsupport/kernel/qcups_p.h +++ b/src/printsupport/kernel/qcups_p.h @@ -57,7 +57,7 @@ #include "QtCore/qpair.h" #include "QtPrintSupport/qprinter.h" -#ifndef QT_NO_CUPS +#ifndef QT_NO_PRINTER #include #include #include @@ -128,6 +128,6 @@ private: QT_END_NAMESPACE -#endif // QT_NO_CUPS +#endif // QT_NO_PRINTER #endif diff --git a/src/printsupport/kernel/qplatformprintersupport_qpa.cpp b/src/printsupport/kernel/qplatformprintersupport_qpa.cpp index 9c0c3f131c..2680e28f0c 100644 --- a/src/printsupport/kernel/qplatformprintersupport_qpa.cpp +++ b/src/printsupport/kernel/qplatformprintersupport_qpa.cpp @@ -116,22 +116,12 @@ bool QPlatformPrinterSupport::printerInfoIsDefault(const QPrinterInfo &p) int QPlatformPrinterSupport::printerInfoCupsPrinterIndex(const QPrinterInfo &p) { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) return p.isNull() ? -1 : p.d_func()->cupsPrinterIndex; -#else - Q_UNUSED(p) - return -1; -#endif } void QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index) { -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) p->d_func()->cupsPrinterIndex = index; -#else - Q_UNUSED(p) - Q_UNUSED(index) -#endif } /* 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 +#include "qprintengine_pdf_p.h" + +#ifndef QT_NO_PRINTER #include #include #include #include +#if !defined(QT_NO_CUPS) #include "private/qcups_p.h" +#endif #include "qprinterinfo.h" -#ifndef QT_NO_PRINTER #include #include -#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 ret = cups.tempFd(); @@ -410,119 +381,7 @@ bool QPdfPrintEnginePrivate::openPrintDevice() cupsTempFile = ret.second; outDevice = new QFile(); static_cast(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 lprhack; - QList 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(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(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 } diff --git a/src/printsupport/kernel/qprintengine_pdf_p.h b/src/printsupport/kernel/qprintengine_pdf_p.h index 52ade83b43..83f952a559 100644 --- a/src/printsupport/kernel/qprintengine_pdf_p.h +++ b/src/printsupport/kernel/qprintengine_pdf_p.h @@ -156,6 +156,9 @@ private: QSizeF customPaperSize; // in postscript points int fd; +#if !defined(QT_NO_CUPS) + QString cupsTempFile; +#endif // QT_NO_CUPS }; QT_END_NAMESPACE diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp index 4929b3308e..a0033aa52a 100644 --- a/src/printsupport/kernel/qprinter.cpp +++ b/src/printsupport/kernel/qprinter.cpp @@ -41,17 +41,18 @@ #include "qprinter_p.h" #include "qprinter.h" + +#ifndef QT_NO_PRINTER + #include "qprintengine.h" #include "qprinterinfo.h" #include "qlist.h" #include #include -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) #include "private/qcups_p.h" #endif -#ifndef QT_NO_PRINTER - #include #include #include @@ -236,7 +237,7 @@ void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey ke When printing directly to a printer on Windows or Mac OS X, QPrinter uses the built-in printer drivers. On X11, QPrinter uses the - \l{Common Unix Printing System (CUPS)} or the standard Unix \l lpr utility + \l{Common Unix Printing System (CUPS)} to send PDF output to the printer. As an alternative, the printProgram() function can be used to specify the command or utility to use instead of the system default. @@ -554,7 +555,7 @@ void QPrinterPrivate::init(QPrinter::PrinterMode mode) realPrintEngine = 0; realPaintEngine = 0; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#if !defined(QT_NO_CUPS) if (QCUPSSupport::cupsVersion() >= 10200 && QCUPSSupport().currentPPD()) { q_func()->setOutputFormat(QPrinter::PdfFormat); outputFormat = QPrinter::NativeFormat; diff --git a/src/printsupport/kernel/qprinterinfo_p.h b/src/printsupport/kernel/qprinterinfo_p.h index ee139762c4..c025de79c0 100644 --- a/src/printsupport/kernel/qprinterinfo_p.h +++ b/src/printsupport/kernel/qprinterinfo_p.h @@ -66,9 +66,7 @@ class QPrinterInfoPrivate public: QPrinterInfoPrivate(const QString& name = QString()) : name(name), isDefault(false) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) , cupsPrinterIndex(0) -#endif , hasPaperSizes(false) {} ~QPrinterInfoPrivate() @@ -79,9 +77,7 @@ public: QString name; bool isDefault; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) int cupsPrinterIndex; -#endif mutable bool hasPaperSizes; mutable QList paperSizes; }; diff --git a/src/printsupport/kernel/qprinterinfo_unix.cpp b/src/printsupport/kernel/qprinterinfo_unix.cpp deleted file mode 100644 index 05908dcf9e..0000000000 --- a/src/printsupport/kernel/qprinterinfo_unix.cpp +++ /dev/null @@ -1,858 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qprinterinfo.h" -#include "qprinterinfo_p.h" - -#include -#include -#include -#include -#include -#include - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -# include -# include -# include -#endif - -#include - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_PRINTER - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -// preserver names in ascending order for the binary search -static const struct NamedPaperSize { - const char *const name; - QPrinter::PaperSize size; -} named_sizes_map[QPrinter::NPageSize] = { - { "A0", QPrinter::A0 }, - { "A1", QPrinter::A1 }, - { "A2", QPrinter::A2 }, - { "A3", QPrinter::A3 }, - { "A4", QPrinter::A4 }, - { "A5", QPrinter::A5 }, - { "A6", QPrinter::A6 }, - { "A7", QPrinter::A7 }, - { "A8", QPrinter::A8 }, - { "A9", QPrinter::A9 }, - { "B0", QPrinter::B0 }, - { "B1", QPrinter::B1 }, - { "B10", QPrinter::B10 }, - { "B2", QPrinter::B2 }, - { "B4", QPrinter::B4 }, - { "B5", QPrinter::B5 }, - { "B6", QPrinter::B6 }, - { "B7", QPrinter::B7 }, - { "B8", QPrinter::B8 }, - { "B9", QPrinter::B9 }, - { "C5E", QPrinter::C5E }, - { "Comm10E", QPrinter::Comm10E }, - { "Custom", QPrinter::Custom }, - { "DLE", QPrinter::DLE }, - { "Executive", QPrinter::Executive }, - { "Folio", QPrinter::Folio }, - { "Ledger", QPrinter::Ledger }, - { "Legal", QPrinter::Legal }, - { "Letter", QPrinter::Letter }, - { "Tabloid", QPrinter::Tabloid } -}; - -inline bool operator<(const char *name, const NamedPaperSize &data) -{ return qstrcmp(name, data.name) < 0; } -inline bool operator<(const NamedPaperSize &data, const char *name) -{ return qstrcmp(data.name, name) < 0; } - -static inline QPrinter::PaperSize string2PaperSize(const char *name) -{ - const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); - if (r - named_sizes_map != QPrinter::NPageSize) - return r->size; - return QPrinter::Custom; -} - -static inline const char *paperSize2String(QPrinter::PaperSize size) -{ - for (int i = 0; i < QPrinter::NPageSize; ++i) { - if (size == named_sizes_map[i].size) - return named_sizes_map[i].name; - } - return 0; -} -#endif - -void qt_perhapsAddPrinter(QList *printers, const QString &name, - QString host, QString comment, - QStringList aliases) -{ - for (int i = 0; i < printers->size(); ++i) - if (printers->at(i).samePrinter(name)) - return; - - if (host.isEmpty()) - host = QCoreApplication::translate("QPrinter", "locally connected"); - printers->append(QPrinterDescription(name.simplified(), host.simplified(), comment.simplified(), aliases)); -} - -void qt_parsePrinterDesc(QString printerDesc, QList *printers) -{ - if (printerDesc.length() < 1) - return; - - printerDesc = printerDesc.simplified(); - int i = printerDesc.indexOf(QLatin1Char(':')); - QString printerName, printerComment, printerHost; - QStringList aliases; - - if (i >= 0) { - // have ':' want '|' - int j = printerDesc.indexOf(QLatin1Char('|')); - if (j > 0 && j < i) { - printerName = printerDesc.left(j); - aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); - // try extracting a comment from the aliases - printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") - .arg(aliases.join(QLatin1String(", "))); - } else { - printerName = printerDesc.left(i); - } - // look for lprng pseudo all printers entry - i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *="))); - if (i >= 0) - printerName = QString(); - // look for signs of this being a remote printer - i = printerDesc.indexOf(QRegExp(QLatin1String(": *rm *="))); - if (i >= 0) { - // point k at the end of remote host name - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':')) - j++; - - // and stuff that into the string - printerHost = printerDesc.mid(i, j - i); - } - } - if (printerName.length()) - qt_perhapsAddPrinter(printers, printerName, printerHost, printerComment, - aliases); -} - -int qt_parsePrintcap(QList *printers, const QString& fileName) -{ - QFile printcap(fileName); - if (!printcap.open(QIODevice::ReadOnly)) - return NotFound; - - char *line_ascii = new char[1025]; - line_ascii[1024] = '\0'; - - QString printerDesc; - bool atEnd = false; - - while (!atEnd) { - if (printcap.atEnd() || printcap.readLine(line_ascii, 1024) <= 0) - atEnd = true; - QString line = QString::fromLocal8Bit(line_ascii); - line = line.trimmed(); - if (line.length() >= 1 && line[int(line.length()) - 1] == QLatin1Char('\\')) - line.chop(1); - if (line[0] == QLatin1Char('#')) { - if (!atEnd) - continue; - } else if (line[0] == QLatin1Char('|') || line[0] == QLatin1Char(':') - || line.isEmpty()) { - printerDesc += line; - if (!atEnd) - continue; - } - - qt_parsePrinterDesc(printerDesc, printers); - - // add the first line of the new printer definition - printerDesc = line; - } - delete[] line_ascii; - return Success; -} - -/*! - \internal - - Checks $HOME/.printers for a line matching '_default ' (where - does not contain any white space). The first such match - results in being returned. - If no lines match then an empty string is returned. -*/ -QString qt_getDefaultFromHomePrinters() -{ - QFile file(QDir::homePath() + QLatin1String("/.printers")); - if (!file.open(QIODevice::ReadOnly)) - return QString(); - QString all(QLatin1String(file.readAll())); - QStringList words = all.split(QRegExp(QLatin1String("\\W+")), QString::SkipEmptyParts); - const int i = words.indexOf(QLatin1String("_default")); - if (i != -1 && i < words.size() - 1) - return words.at(i + 1); - return QString(); -} - -// solaris, not 2.6 -void qt_parseEtcLpPrinters(QList *printers) -{ - QDir lp(QLatin1String("/etc/lp/printers")); - QFileInfoList dirs = lp.entryInfoList(); - if (dirs.isEmpty()) - return; - - QString tmp; - for (int i = 0; i < dirs.size(); ++i) { - QFileInfo printer = dirs.at(i); - if (printer.isDir()) { - tmp.sprintf("/etc/lp/printers/%s/configuration", - QFile::encodeName(printer.fileName()).data()); - QFile configuration(tmp); - char *line = new char[1025]; - QString remote(QLatin1String("Remote:")); - QString contentType(QLatin1String("Content types:")); - QString printerHost; - bool canPrintPostscript = false; - if (configuration.open(QIODevice::ReadOnly)) { - while (!configuration.atEnd() && - configuration.readLine(line, 1024) > 0) { - if (QString::fromLatin1(line).startsWith(remote)) { - const char *p = line; - while (*p != ':') - p++; - p++; - while (isspace((uchar) *p)) - p++; - printerHost = QString::fromLocal8Bit(p); - printerHost = printerHost.simplified(); - } else if (QString::fromLatin1(line).startsWith(contentType)) { - char *p = line; - while (*p != ':') - p++; - p++; - char *e; - while (*p) { - while (isspace((uchar) *p)) - p++; - if (*p) { - char s; - e = p; - while (isalnum((uchar) *e)) - e++; - s = *e; - *e = '\0'; - if (!qstrcmp(p, "postscript") || - !qstrcmp(p, "any")) - canPrintPostscript = true; - *e = s; - if (s == ',') - e++; - p = e; - } - } - } - } - if (canPrintPostscript) - qt_perhapsAddPrinter(printers, printer.fileName(), - printerHost, QLatin1String("")); - } - delete[] line; - } - } -} - -// solaris 2.6 -char *qt_parsePrintersConf(QList *printers, bool *found) -{ - QFile pc(QLatin1String("/etc/printers.conf")); - if (!pc.open(QIODevice::ReadOnly)) { - if (found) - *found = false; - return 0; - } - if (found) - *found = true; - - char *line = new char[1025]; - line[1024] = '\0'; - - QString printerDesc; - int lineLength = 0; - - char *defaultPrinter = 0; - - while (!pc.atEnd() && - (lineLength=pc.readLine(line, 1024)) > 0) { - if (*line == '#') { - *line = '\0'; - lineLength = 0; - } - if (lineLength >= 2 && line[lineLength-2] == '\\') { - line[lineLength-2] = '\0'; - printerDesc += QString::fromLocal8Bit(line); - } else { - printerDesc += QString::fromLocal8Bit(line); - printerDesc = printerDesc.simplified(); - int i = printerDesc.indexOf(QLatin1Char(':')); - QString printerName, printerHost, printerComment; - QStringList aliases; - if (i >= 0) { - // have : want | - int j = printerDesc.indexOf(QLatin1Char('|')); - if (j >= i) - j = -1; - printerName = printerDesc.mid(0, j < 0 ? i : j); - if (printerName == QLatin1String("_default")) { - i = printerDesc.indexOf( - QRegExp(QLatin1String(": *use *="))); - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - // that's our default printer - defaultPrinter = - qstrdup(printerDesc.mid(i, j-i).toLatin1().data()); - printerName = QString(); - printerDesc = QString(); - } else if (printerName == QLatin1String("_all")) { - // skip it.. any other cases we want to skip? - printerName = QString(); - printerDesc = QString(); - } - - if (j > 0) { - // try extracting a comment from the aliases - aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); - printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") - .arg(aliases.join(QLatin1String(", "))); - } - // look for signs of this being a remote printer - i = printerDesc.indexOf( - QRegExp(QLatin1String(": *bsdaddr *="))); - if (i >= 0) { - // point k at the end of remote host name - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - // and stuff that into the string - printerHost = printerDesc.mid(i, j-i); - // maybe stick the remote printer name into the comment - if (printerDesc[j] == QLatin1Char(',')) { - i = ++j; - while (printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - if (printerName != printerDesc.mid(i, j-i)) { - printerComment = - QLatin1String("Remote name: "); - printerComment += printerDesc.mid(i, j-i); - } - } - } - } - if (printerComment == QLatin1String(":")) - printerComment = QString(); // for cups - if (printerName.length()) - qt_perhapsAddPrinter(printers, printerName, printerHost, - printerComment, aliases); - // chop away the line, for processing the next one - printerDesc = QString(); - } - } - delete[] line; - return defaultPrinter; -} - -#ifndef QT_NO_NIS - -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif - -int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, - char *val, int valLen, char *data) -{ - qt_parsePrinterDesc(QString::fromLatin1(val, valLen), (QList *)data); - return 0; -} - -#if defined(Q_C_CALLBACKS) -} -#endif - -int qt_retrieveNisPrinters(QList *printers) -{ -#ifndef QT_NO_LIBRARY - typedef int (*WildCast)(int, char *, int, char *, int, char *); - char printersConfByname[] = "printers.conf.byname"; - char *domain; - int err; - - QLibrary lib(QLatin1String("nsl")); - typedef int (*ypGetDefaultDomain)(char **); - ypGetDefaultDomain _ypGetDefaultDomain = (ypGetDefaultDomain)lib.resolve("yp_get_default_domain"); - typedef int (*ypAll)(const char *, const char *, const struct ypall_callback *); - ypAll _ypAll = (ypAll)lib.resolve("yp_all"); - - if (_ypGetDefaultDomain && _ypAll) { - err = _ypGetDefaultDomain(&domain); - if (err == 0) { - ypall_callback cb; - // wild cast to support K&R-style system headers - (WildCast &) cb.foreach = (WildCast) qt_pd_foreach; - cb.data = (char *) printers; - err = _ypAll(domain, printersConfByname, &cb); - } - if (!err) - return Success; - } -#endif //QT_NO_LIBRARY - return Unavail; -} - -#endif // QT_NO_NIS - -char *qt_parseNsswitchPrintersEntry(QList *printers, char *line) -{ -#define skipSpaces() \ - while (line[k] != '\0' && isspace((uchar) line[k])) \ - k++ - - char *defaultPrinter = 0; - bool stop = false; - int lastStatus = NotFound; - - int k = 8; - skipSpaces(); - if (line[k] != ':') - return 0; - k++; - - char *cp = strchr(line, '#'); - if (cp != 0) - *cp = '\0'; - - while (line[k] != '\0') { - if (isspace((uchar) line[k])) { - k++; - } else if (line[k] == '[') { - k++; - skipSpaces(); - while (line[k] != '\0') { - char status = tolower(line[k]); - char action = '?'; - - while (line[k] != '=' && line[k] != ']' && line[k] != '\0') - k++; - if (line[k] == '=') { - k++; - skipSpaces(); - action = tolower(line[k]); - while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != ']') - k++; - } else if (line[k] == ']') { - k++; - break; - } - skipSpaces(); - - if (lastStatus == status) - stop = (action == (char) Return); - } - } else { - if (stop) - break; - - QByteArray source; - while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != '[') { - source += line[k]; - k++; - } - - if (source == "user") { - lastStatus = qt_parsePrintcap(printers, - QDir::homePath() + QLatin1String("/.printers")); - } else if (source == "files") { - bool found; - defaultPrinter = qt_parsePrintersConf(printers, &found); - if (found) - lastStatus = Success; -#ifndef QT_NO_NIS - } else if (source == "nis") { - lastStatus = qt_retrieveNisPrinters(printers); -#endif - } else { - // nisplus, dns, etc., are not implemented yet - lastStatus = NotFound; - } - stop = (lastStatus == Success); - } - } - return defaultPrinter; -} - -char *qt_parseNsswitchConf(QList *printers) -{ - QFile nc(QLatin1String("/etc/nsswitch.conf")); - if (!nc.open(QIODevice::ReadOnly)) - return 0; - - char *defaultPrinter = 0; - - char *line = new char[1025]; - line[1024] = '\0'; - - while (!nc.atEnd() && - nc.readLine(line, 1024) > 0) { - if (qstrncmp(line, "printers", 8) == 0) { - defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); - delete[] line; - return defaultPrinter; - } - } - - strcpy(line, "printers: user files nis nisplus xfn"); - defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); - delete[] line; - return defaultPrinter; -} - -// HP-UX -void qt_parseEtcLpMember(QList *printers) -{ - QDir lp(QLatin1String("/etc/lp/member")); - if (!lp.exists()) - return; - QFileInfoList dirs = lp.entryInfoList(); - if (dirs.isEmpty()) - return; - - for (int i = 0; i < dirs.size(); ++i) { - QFileInfo printer = dirs.at(i); - // I haven't found any real documentation, so I'm guessing that - // since lpstat uses /etc/lp/member rather than one of the - // other directories, it's the one to use. I did not find a - // decent way to locate aliases and remote printers. - if (printer.isFile()) - qt_perhapsAddPrinter(printers, printer.fileName(), - QCoreApplication::translate("QPrinter", "unknown"), - QLatin1String("")); - } -} - -// IRIX 6.x -void qt_parseSpoolInterface(QList *printers) -{ - QDir lp(QLatin1String("/usr/spool/lp/interface")); - if (!lp.exists()) - return; - QFileInfoList files = lp.entryInfoList(); - if(files.isEmpty()) - return; - - for (int i = 0; i < files.size(); ++i) { - QFileInfo printer = files.at(i); - - if (!printer.isFile()) - continue; - - // parse out some information - QFile configFile(printer.filePath()); - if (!configFile.open(QIODevice::ReadOnly)) - continue; - - QByteArray line; - line.resize(1025); - QString namePrinter; - QString hostName; - QString hostPrinter; - QString printerType; - - QString nameKey(QLatin1String("NAME=")); - QString typeKey(QLatin1String("TYPE=")); - QString hostKey(QLatin1String("HOSTNAME=")); - QString hostPrinterKey(QLatin1String("HOSTPRINTER=")); - - while (!configFile.atEnd() && - (configFile.readLine(line.data(), 1024)) > 0) { - QString uline = QString::fromLocal8Bit(line); - if (uline.startsWith(typeKey) ) { - printerType = uline.mid(nameKey.length()); - printerType = printerType.simplified(); - } else if (uline.startsWith(hostKey)) { - hostName = uline.mid(hostKey.length()); - hostName = hostName.simplified(); - } else if (uline.startsWith(hostPrinterKey)) { - hostPrinter = uline.mid(hostPrinterKey.length()); - hostPrinter = hostPrinter.simplified(); - } else if (uline.startsWith(nameKey)) { - namePrinter = uline.mid(nameKey.length()); - namePrinter = namePrinter.simplified(); - } - } - configFile.close(); - - printerType = printerType.trimmed(); - if (printerType.indexOf(QLatin1String("postscript"), 0, Qt::CaseInsensitive) < 0) - continue; - - int ii = 0; - while ((ii = namePrinter.indexOf(QLatin1Char('"'), ii)) >= 0) - namePrinter.remove(ii, 1); - - if (hostName.isEmpty() || hostPrinter.isEmpty()) { - qt_perhapsAddPrinter(printers, printer.fileName(), - QLatin1String(""), namePrinter); - } else { - QString comment; - comment = namePrinter; - comment += QLatin1String(" ("); - comment += hostPrinter; - comment += QLatin1Char(')'); - qt_perhapsAddPrinter(printers, printer.fileName(), - hostName, comment); - } - } -} - - -// Every unix must have its own. It's a standard. Here is AIX. -void qt_parseQconfig(QList *printers) -{ - QFile qconfig(QLatin1String("/etc/qconfig")); - if (!qconfig.open(QIODevice::ReadOnly)) - return; - - QTextStream ts(&qconfig); - QString line; - - QString stanzaName; // either a queue or a device name - bool up = true; // queue up? default true, can be false - QString remoteHost; // null if local - QString deviceName; // null if remote - - QRegExp newStanza(QLatin1String("^[0-z\\-]*:$")); - - // our basic strategy here is to process each line, detecting new - // stanzas. each time we see a new stanza, we check if the - // previous stanza was a valid queue for a) a remote printer or b) - // a local printer. if it wasn't, we assume that what we see is - // the start of the first stanza, or that the previous stanza was - // a device stanza, or that there is some syntax error (we don't - // report those). - - do { - line = ts.readLine(); - bool indented = line[0].isSpace(); - line = line.simplified(); - - int i = line.indexOf(QLatin1Char('=')); - if (indented && i != -1) { // line in stanza - QString variable = line.left(i).simplified(); - QString value=line.mid(i+1, line.length()).simplified(); - if (variable == QLatin1String("device")) - deviceName = value; - else if (variable == QLatin1String("host")) - remoteHost = value; - else if (variable == QLatin1String("up")) - up = !(value.toLower() == QLatin1String("false")); - } else if (line[0] == QLatin1Char('*')) { // comment - // nothing to do - } else if (ts.atEnd() || // end of file, or beginning of new stanza - (!indented && line.contains(newStanza))) { - if (up && stanzaName.length() > 0 && stanzaName.length() < 21) { - if (remoteHost.length()) // remote printer - qt_perhapsAddPrinter(printers, stanzaName, remoteHost, - QString()); - else if (deviceName.length()) // local printer - qt_perhapsAddPrinter(printers, stanzaName, QString(), - QString()); - } - line.chop(1); - if (line.length() >= 1 && line.length() <= 20) - stanzaName = line; - up = true; - remoteHost.clear(); - deviceName.clear(); - } else { - // syntax error? ignore. - } - } while (!ts.atEnd()); -} - -Q_PRINTSUPPORT_EXPORT int qt_getLprPrinters(QList& printers) -{ - QByteArray etcLpDefault; - qt_parsePrintcap(&printers, QLatin1String("/etc/printcap")); - qt_parseEtcLpMember(&printers); - qt_parseSpoolInterface(&printers); - qt_parseQconfig(&printers); - - QFileInfo f; - f.setFile(QLatin1String("/etc/lp/printers")); - if (f.isDir()) { - qt_parseEtcLpPrinters(&printers); - QFile def(QLatin1String("/etc/lp/default")); - if (def.open(QIODevice::ReadOnly)) { - etcLpDefault.resize(1025); - if (def.readLine(etcLpDefault.data(), 1024) > 0) { - QRegExp rx(QLatin1String("^(\\S+)")); - if (rx.indexIn(QString::fromLatin1(etcLpDefault)) != -1) - etcLpDefault = rx.cap(1).toLatin1(); - } - } - } - - char *def = 0; - f.setFile(QLatin1String("/etc/nsswitch.conf")); - if (f.isFile()) { - def = qt_parseNsswitchConf(&printers); - } else { - f.setFile(QLatin1String("/etc/printers.conf")); - if (f.isFile()) - def = qt_parsePrintersConf(&printers); - } - - if (def) { - etcLpDefault = def; - delete [] def; - } - - QString homePrintersDefault = qt_getDefaultFromHomePrinters(); - - // all printers hopefully known. try to find a good default - QString dollarPrinter; - { - dollarPrinter = QString::fromLocal8Bit(qgetenv("PRINTER")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("LPDEST")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("NPRINTER")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("NGPRINTER")); - if (!dollarPrinter.isEmpty()) - qt_perhapsAddPrinter(&printers, dollarPrinter, - QCoreApplication::translate("QPrinter", "unknown"), - QLatin1String("")); - } - - QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)")); - QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)")); - - int quality = 0; - int best = 0; - for (int i = 0; i < printers.size(); ++i) { - QString name = printers.at(i).name; - QString comment = printers.at(i).comment; - if (quality < 5 && name == dollarPrinter) { - best = i; - quality = 5; - } else if (quality < 4 && !homePrintersDefault.isEmpty() && - name == homePrintersDefault) { - best = i; - quality = 4; - } else if (quality < 3 && !etcLpDefault.isEmpty() && - name == QLatin1String(etcLpDefault)) { - best = i; - quality = 3; - } else if (quality < 2 && - (name == QLatin1String("ps") || - ps.indexIn(comment) != -1)) { - best = i; - quality = 2; - } else if (quality < 1 && - (name == QLatin1String("lp") || - lp.indexIn(comment) > -1)) { - best = i; - quality = 1; - } - } - - return best; -} - -///////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex) -{ - QList result; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) - return result; - // Find paper sizes from CUPS. - QCUPSSupport cups; - cups.setCurrentPrinter(cupsPrinterIndex); - if (const ppd_option_t* size = cups.pageSizes()) { - for (int j = 0; j < size->num_choices; ++j) - result.append(string2PaperSize(size->choices[j].choice)); - } -#else - Q_UNUSED(cupsPrinterIndex) -#endif - return result; -} - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE diff --git a/src/printsupport/kernel/qprinterinfo_unix_p.h b/src/printsupport/kernel/qprinterinfo_unix_p.h deleted file mode 100644 index 8e6f3d31db..0000000000 --- a/src/printsupport/kernel/qprinterinfo_unix_p.h +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTERINFO_UNIX_P_H -#define QPRINTERINFO_UNIX_P_H - -#include -#include - -#ifndef QT_NO_NIS -# ifndef BOOL_DEFINED -# define BOOL_DEFINED -# endif - -# include -# include -# include -# include -#endif // QT_NO_NIS - -#ifdef Success -# undef Success -#endif - -#include - -QT_BEGIN_NAMESPACE - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QT_NO_PRINTER - -struct QPrinterDescription { - QPrinterDescription(const QString &n, const QString &h, const QString &c, const QStringList &a) - : name(n), host(h), comment(c), aliases(a) {} - QString name; - QString host; - QString comment; - QStringList aliases; - bool samePrinter(const QString& printer) const { - return name == printer || aliases.contains(printer); - } -}; - -enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' }; -enum { Continue = 'c', Return = 'r' }; - -void qt_perhapsAddPrinter(QList *printers, const QString &name, - QString host, QString comment, - QStringList aliases = QStringList()); -void qt_parsePrinterDesc(QString printerDesc, QList *printers); - -int qt_parsePrintcap(QList *printers, const QString& fileName); -QString qt_getDefaultFromHomePrinters(); -void qt_parseEtcLpPrinters(QList *printers); -char *qt_parsePrintersConf(QList *printers, bool *found = 0); - -#ifndef QT_NO_NIS -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif -int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, - char *val, int valLen, char *data); - -#if defined(Q_C_CALLBACKS) -} -#endif -int qt_retrieveNisPrinters(QList *printers); -#endif // QT_NO_NIS -char *qt_parseNsswitchPrintersEntry(QList *printers, char *line); -char *qt_parseNsswitchConf(QList *printers); -void qt_parseEtcLpMember(QList *printers); -void qt_parseSpoolInterface(QList *printers); -void qt_parseQconfig(QList *printers); -int qt_getLprPrinters(QList& printers); - -QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex); - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -#endif // QPRINTERINFO_UNIX_P_H -- cgit v1.2.3