Revert "QtPrintSupport: Remove remaining LPR specific code"
This doesn't compile with a typical cross-compilation setup, which
generally won't include cups headers. The commit should have been
rejected, but wasn't, due to a bug in the Qt Project CI.
Since it now causes all other modules depending on qtbase to fail their
CI, it must be reverted to minimize disruption while the commit can be
amended and/or the test toolchain updated to include cups headers.
This reverts commit 80f7a38890
.
Change-Id: I315ae275b37de358a74af28ab7bd691c9849acba
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
Reviewed-by: Toby Tomkins <toby.tomkins@nokia.com>
This commit is contained in:
parent
80f7a38890
commit
de11b9f5a7
@ -132,6 +132,9 @@
|
||||
#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
|
||||
|
@ -168,6 +168,9 @@
|
||||
#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
|
||||
|
@ -304,6 +304,9 @@
|
||||
#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
|
||||
|
@ -230,6 +230,9 @@
|
||||
#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
|
||||
|
@ -196,6 +196,9 @@
|
||||
#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
|
||||
|
@ -512,8 +512,8 @@
|
||||
#endif
|
||||
|
||||
// Common UNIX Printing System
|
||||
#if !defined(QT_NO_PRINTER) && defined(QT_NO_LIBRARY) && defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
|
||||
#define QT_NO_PRINTER
|
||||
#if !defined(QT_NO_CUPS) && (defined(QT_NO_PRINTER) || defined(QT_NO_LIBRARY))
|
||||
#define QT_NO_CUPS
|
||||
#endif
|
||||
|
||||
// QErrorMessage
|
||||
|
@ -451,6 +451,7 @@ 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
|
||||
|
@ -283,6 +283,8 @@ 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);
|
||||
|
@ -48,17 +48,23 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
QList<QPrinter::PaperSize> QGenericUnixPrinterSupport::supportedPaperSizes(const QPrinterInfo &printerInfo) const
|
||||
{
|
||||
#ifndef QT_NO_CUPS
|
||||
return QCUPSSupport::getCupsPrinterPaperSizes(QPlatformPrinterSupport::printerInfoCupsPrinterIndex(printerInfo));
|
||||
#else
|
||||
return QList<QPrinter::PaperSize>();
|
||||
#endif
|
||||
}
|
||||
|
||||
QList<QPrinterInfo> QGenericUnixPrinterSupport::availablePrinters()
|
||||
{
|
||||
QList<QPrinterInfo> 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;
|
||||
}
|
||||
|
||||
|
@ -53,8 +53,11 @@
|
||||
#include <private/qabstractpagesetupdialog_p.h>
|
||||
#include <private/qprinter_p.h>
|
||||
|
||||
#include <private/qcups_p.h>
|
||||
#include <private/qprintengine_pdf_p.h>
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
# include <private/qcups_p.h>
|
||||
# include <cups/cups.h>
|
||||
# include <private/qprintengine_pdf_p.h>
|
||||
#endif
|
||||
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@ -221,12 +224,16 @@ 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()
|
||||
@ -235,12 +242,14 @@ 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,
|
||||
@ -344,7 +353,9 @@ void QPageSetupWidget::setupPrinter() const
|
||||
int ps = m_printer->pageSize();
|
||||
if (val.type() == QVariant::Int) {
|
||||
ps = val.toInt();
|
||||
} else if (m_cups && QCUPSSupport::isAvailable() && m_cups->currentPPD()) {
|
||||
}
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
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));
|
||||
@ -362,7 +373,7 @@ void QPageSetupWidget::setupPrinter() const
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
if (ps == QPrinter::Custom)
|
||||
m_printer->setPaperSize(sizeForOrientation(orientation, m_paperSize), QPrinter::Point);
|
||||
else
|
||||
@ -379,7 +390,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;
|
||||
@ -415,7 +426,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(
|
||||
@ -460,7 +471,9 @@ 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);
|
||||
@ -472,14 +485,16 @@ 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 {
|
||||
m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1);
|
||||
|
||||
m_pagePreview->setPaperSize(m_paperSize);
|
||||
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
|
||||
|
@ -60,8 +60,15 @@
|
||||
#include "ui_qprintsettingsoutput.h"
|
||||
#include "ui_qprintwidget.h"
|
||||
|
||||
#include <private/qcups_p.h>
|
||||
#include <private/qprintengine_pdf_p.h>
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
# include <private/qcups_p.h>
|
||||
# include <cups/cups.h>
|
||||
# include <private/qprintengine_pdf_p.h>
|
||||
#else
|
||||
# include <QtCore/qlibrary.h>
|
||||
#endif
|
||||
|
||||
#include <private/qprinterinfo_unix_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
@ -75,8 +82,10 @@ 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<const ppd_option_t*>& options, QList<const char*>& markedOptions) const;
|
||||
#endif
|
||||
|
||||
void selectPrinter();
|
||||
void selectPdfPsPrinter(const QPrinter *p);
|
||||
@ -91,8 +100,10 @@ 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
|
||||
@ -107,7 +118,9 @@ 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
|
||||
@ -138,7 +151,9 @@ 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);
|
||||
@ -150,17 +165,21 @@ public:
|
||||
Ui::QPrintWidget widget;
|
||||
QAbstractPrintDialog * q;
|
||||
QPrinter *printer;
|
||||
QList<QPrinterDescription> 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:
|
||||
@ -230,10 +249,15 @@ private slots:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent)
|
||||
: QDialog(parent), m_cups(0), m_cupsOptionsModel(0)
|
||||
: QDialog(parent)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
, m_cups(0), m_cupsOptionsModel(0)
|
||||
#endif
|
||||
{
|
||||
QVBoxLayout *lay = new QVBoxLayout(this);
|
||||
this->setLayout(lay);
|
||||
@ -249,7 +273,11 @@ 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)
|
||||
@ -261,6 +289,7 @@ void QPrintPropertiesDialog::setupPrinter() const
|
||||
{
|
||||
widget.pageSetup->setupPrinter();
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
QPPDOptionsModel* model = static_cast<QPPDOptionsModel*>(widget.treeView->model());
|
||||
if (model) {
|
||||
QOptionTreeItem* rootItem = model->rootItem;
|
||||
@ -270,10 +299,12 @@ 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()) {
|
||||
@ -298,7 +329,9 @@ void QPrintPropertiesDialog::selectPrinter()
|
||||
widget.tabs->setTabEnabled(1, false);
|
||||
}
|
||||
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
widget.cupsPropertiesPage->setEnabled(false);
|
||||
widget.pageSetup->selectPrinter(0);
|
||||
}
|
||||
@ -317,6 +350,7 @@ void QPrintPropertiesDialog::showEvent(QShowEvent* event)
|
||||
event->accept();
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
void QPrintPropertiesDialog::addItemToOptions(QOptionTreeItem *parent, QList<const ppd_option_t*>& options, QList<const char*>& markedOptions) const
|
||||
{
|
||||
for (int i = 0; i < parent->childItems.count(); ++i) {
|
||||
@ -332,6 +366,7 @@ void QPrintPropertiesDialog::addItemToOptions(QOptionTreeItem *parent, QList<con
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
QPrintDialogPrivate::QPrintDialogPrivate()
|
||||
: top(0), bottom(0), buttons(0), collapseButton(0)
|
||||
@ -538,10 +573,12 @@ void QPrintDialogPrivate::setTabs(const QList<QWidget*> &tabWidgets)
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
void QPrintDialogPrivate::selectPrinter(QCUPSSupport *cups)
|
||||
{
|
||||
options.duplex->setEnabled(cups && cups->ppdOption("Duplex"));
|
||||
}
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -593,8 +630,10 @@ void QPrintDialog::accept()
|
||||
/*! \internal
|
||||
*/
|
||||
QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p)
|
||||
: parent(p), propertiesDialog(0), printer(0), optionsPane(0), filePrintersAdded(false),
|
||||
cups(0), cupsPrinterCount(0), cupsPrinters(0), cupsPPD(0)
|
||||
: 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
|
||||
{
|
||||
q = 0;
|
||||
if (parent)
|
||||
@ -603,6 +642,7 @@ 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();
|
||||
@ -624,7 +664,16 @@ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p)
|
||||
widget.properties->setEnabled(true);
|
||||
}
|
||||
currentPrinterIndex = cups->currentPrinterIndex();
|
||||
} else {
|
||||
#endif
|
||||
currentPrinterIndex = qt_getLprPrinters(lprPrinters);
|
||||
// populating printer combo
|
||||
QList<QPrinterDescription>::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);
|
||||
@ -676,7 +725,9 @@ void QUnixPrintWidgetPrivate::updateWidget()
|
||||
|
||||
QUnixPrintWidgetPrivate::~QUnixPrintWidgetPrivate()
|
||||
{
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
delete cups;
|
||||
#endif
|
||||
}
|
||||
|
||||
void QUnixPrintWidgetPrivate::_q_printerChanged(int index)
|
||||
@ -700,13 +751,16 @@ 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);
|
||||
|
||||
@ -726,7 +780,21 @@ 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)
|
||||
@ -840,7 +908,9 @@ 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)
|
||||
@ -852,6 +922,7 @@ void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked()
|
||||
propertiesDialog->exec();
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
void QUnixPrintWidgetPrivate::setCupsProperties()
|
||||
{
|
||||
if (cups && QCUPSSupport::isAvailable() && cups->pageSizes()) {
|
||||
@ -878,6 +949,7 @@ void QUnixPrintWidgetPrivate::setCupsProperties()
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void QUnixPrintWidgetPrivate::setupPrinter()
|
||||
{
|
||||
@ -900,8 +972,10 @@ void QUnixPrintWidgetPrivate::setupPrinter()
|
||||
|
||||
if (propertiesDialog && propertiesDialog->result() == QDialog::Accepted)
|
||||
propertiesDialog->setupPrinter();
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (!propertiesDialog)
|
||||
setCupsProperties();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -930,6 +1004,7 @@ 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())
|
||||
@ -1169,6 +1244,7 @@ void QPPDOptionsEditor::cbChanged(int)
|
||||
*/
|
||||
}
|
||||
|
||||
#endif // !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
#endif // defined (Q_OS_UNIX)
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -18,6 +18,13 @@ 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
|
||||
@ -27,7 +34,7 @@ win32 {
|
||||
}
|
||||
|
||||
mac|win32 {
|
||||
DEFINES += QT_NO_CUPS
|
||||
DEFINES += QT_NO_CUPS QT_NO_LPR
|
||||
} else {
|
||||
SOURCES += $$PWD/qcups.cpp
|
||||
HEADERS += $$PWD/qcups_p.h
|
||||
|
@ -40,8 +40,9 @@
|
||||
****************************************************************************/
|
||||
#include <qdebug.h>
|
||||
#include "qcups_p.h"
|
||||
#include "qprinterinfo_unix_p.h"
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
#ifndef QT_NO_CUPS
|
||||
|
||||
#ifndef QT_LINUXBASE // LSB merges everything into cups.h
|
||||
# include <cups/language.h>
|
||||
@ -404,6 +405,7 @@ QList<QCUPSSupport::Printer> QCUPSSupport::availableUnixPrinters()
|
||||
{
|
||||
QList<Printer> printers;
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (QCUPSSupport::isAvailable()) {
|
||||
QCUPSSupport cups;
|
||||
int cupsPrinterCount = cups.availablePrintersCount();
|
||||
@ -419,85 +421,26 @@ QList<QCUPSSupport::Printer> QCUPSSupport::availableUnixPrinters()
|
||||
p.cupsPrinterIndex = i;
|
||||
printers.append(p);
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
QList<QPrinterDescription> 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<QPrinter::PaperSize> QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex)
|
||||
{
|
||||
QList<QPrinter::PaperSize> 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;
|
||||
return qt_getCupsPrinterPaperSizes(cupsPrinterIndex);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_PRINTER
|
||||
#endif // QT_NO_CUPS
|
||||
|
@ -57,7 +57,7 @@
|
||||
#include "QtCore/qpair.h"
|
||||
#include "QtPrintSupport/qprinter.h"
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
#ifndef QT_NO_CUPS
|
||||
#include <QtCore/qlibrary.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/ppd.h>
|
||||
@ -128,6 +128,6 @@ private:
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_PRINTER
|
||||
#endif // QT_NO_CUPS
|
||||
|
||||
#endif
|
||||
|
@ -116,12 +116,22 @@ 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
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -39,22 +39,20 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qprintengine_pdf_p.h"
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
#include <QtPrintSupport/qprintengine.h>
|
||||
|
||||
#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
|
||||
@ -98,7 +96,7 @@ QPdfPrintEngine::QPdfPrintEngine(QPrinter::PrinterMode m)
|
||||
: QPdfEngine(*new QPdfPrintEnginePrivate(m))
|
||||
{
|
||||
Q_D(QPdfPrintEngine);
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (QCUPSSupport::isAvailable()) {
|
||||
QCUPSSupport cups;
|
||||
const cups_dest_t* printers = cups.availablePrinters();
|
||||
@ -111,8 +109,17 @@ 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;
|
||||
}
|
||||
@ -271,19 +278,19 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const
|
||||
ret = d->copies;
|
||||
break;
|
||||
case PPK_SupportsMultipleCopies:
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (QCUPSSupport::isAvailable())
|
||||
ret = true;
|
||||
else
|
||||
#endif // QT_NO_CUPS
|
||||
#endif
|
||||
ret = false;
|
||||
break;
|
||||
case PPK_NumberOfCopies:
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (QCUPSSupport::isAvailable())
|
||||
ret = 1;
|
||||
else
|
||||
#endif // QT_NO_CUPS
|
||||
#endif
|
||||
ret = d->copies;
|
||||
break;
|
||||
case PPK_Orientation:
|
||||
@ -358,6 +365,28 @@ 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)
|
||||
@ -370,7 +399,7 @@ bool QPdfPrintEnginePrivate::openPrintDevice()
|
||||
return false;
|
||||
}
|
||||
outDevice = file;
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
} else if (QCUPSSupport::isAvailable()) {
|
||||
QCUPSSupport cups;
|
||||
QPair<int, QString> ret = cups.tempFd();
|
||||
@ -381,7 +410,119 @@ bool QPdfPrintEnginePrivate::openPrintDevice()
|
||||
cupsTempFile = ret.second;
|
||||
outDevice = new QFile();
|
||||
static_cast<QFile *>(outDevice)->open(ret.first, QIODevice::WriteOnly);
|
||||
#endif // QT_NO_CUPS
|
||||
#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
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -402,7 +543,7 @@ void QPdfPrintEnginePrivate::closePrintDevice()
|
||||
outDevice = 0;
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (!cupsTempFile.isEmpty()) {
|
||||
QString tempFile = cupsTempFile;
|
||||
cupsTempFile.clear();
|
||||
@ -479,7 +620,7 @@ void QPdfPrintEnginePrivate::closePrintDevice()
|
||||
|
||||
QFile::remove(tempFile);
|
||||
}
|
||||
#endif // QT_NO_CUPS
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -156,9 +156,6 @@ private:
|
||||
QSizeF customPaperSize; // in postscript points
|
||||
|
||||
int fd;
|
||||
#if !defined(QT_NO_CUPS)
|
||||
QString cupsTempFile;
|
||||
#endif // QT_NO_CUPS
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -41,18 +41,17 @@
|
||||
|
||||
#include "qprinter_p.h"
|
||||
#include "qprinter.h"
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
|
||||
#include "qprintengine.h"
|
||||
#include "qprinterinfo.h"
|
||||
#include "qlist.h"
|
||||
#include <qcoreapplication.h>
|
||||
#include <qfileinfo.h>
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
#include "private/qcups_p.h"
|
||||
#endif
|
||||
|
||||
#ifndef QT_NO_PRINTER
|
||||
|
||||
#include <qpa/qplatformprintplugin.h>
|
||||
#include <qpa/qplatformprintersupport.h>
|
||||
#include <private/qpagedpaintdevice_p.h>
|
||||
@ -237,7 +236,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)}
|
||||
\l{Common Unix Printing System (CUPS)} or the standard Unix \l lpr utility
|
||||
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.
|
||||
@ -555,7 +554,7 @@ void QPrinterPrivate::init(QPrinter::PrinterMode mode)
|
||||
realPrintEngine = 0;
|
||||
realPaintEngine = 0;
|
||||
|
||||
#if !defined(QT_NO_CUPS)
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
if (QCUPSSupport::cupsVersion() >= 10200 && QCUPSSupport().currentPPD()) {
|
||||
q_func()->setOutputFormat(QPrinter::PdfFormat);
|
||||
outputFormat = QPrinter::NativeFormat;
|
||||
|
@ -66,7 +66,9 @@ 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()
|
||||
@ -77,7 +79,9 @@ public:
|
||||
QString name;
|
||||
bool isDefault;
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
int cupsPrinterIndex;
|
||||
#endif
|
||||
mutable bool hasPaperSizes;
|
||||
mutable QList<QPrinter::PaperSize> paperSizes;
|
||||
};
|
||||
|
858
src/printsupport/kernel/qprinterinfo_unix.cpp
Normal file
858
src/printsupport/kernel/qprinterinfo_unix.cpp
Normal file
@ -0,0 +1,858 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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 <qfile.h>
|
||||
#include <qfileinfo.h>
|
||||
#include <qdir.h>
|
||||
#include <qlibrary.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qcoreapplication.h>
|
||||
|
||||
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
|
||||
# include <private/qcups_p.h>
|
||||
# include <cups/cups.h>
|
||||
# include <private/qpdf_p.h>
|
||||
#endif
|
||||
|
||||
#include <private/qprinterinfo_unix_p.h>
|
||||
|
||||
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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *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 <name>' (where
|
||||
<name> does not contain any white space). The first such match
|
||||
results in <name> 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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *)data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(Q_C_CALLBACKS)
|
||||
}
|
||||
#endif
|
||||
|
||||
int qt_retrieveNisPrinters(QList<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription> *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<QPrinterDescription>& 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<QPrinter::PaperSize> qt_getCupsPrinterPaperSizes(int cupsPrinterIndex)
|
||||
{
|
||||
QList<QPrinter::PaperSize> 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
|
130
src/printsupport/kernel/qprinterinfo_unix_p.h
Normal file
130
src/printsupport/kernel/qprinterinfo_unix_p.h
Normal file
@ -0,0 +1,130 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** 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 <QtPrintSupport/qprinter.h>
|
||||
#include <QtCore/qstringlist.h>
|
||||
|
||||
#ifndef QT_NO_NIS
|
||||
# ifndef BOOL_DEFINED
|
||||
# define BOOL_DEFINED
|
||||
# endif
|
||||
|
||||
# include <sys/types.h>
|
||||
# include <rpc/rpc.h>
|
||||
# include <rpcsvc/ypclnt.h>
|
||||
# include <rpcsvc/yp_prot.h>
|
||||
#endif // QT_NO_NIS
|
||||
|
||||
#ifdef Success
|
||||
# undef Success
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
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<QPrinterDescription> *printers, const QString &name,
|
||||
QString host, QString comment,
|
||||
QStringList aliases = QStringList());
|
||||
void qt_parsePrinterDesc(QString printerDesc, QList<QPrinterDescription> *printers);
|
||||
|
||||
int qt_parsePrintcap(QList<QPrinterDescription> *printers, const QString& fileName);
|
||||
QString qt_getDefaultFromHomePrinters();
|
||||
void qt_parseEtcLpPrinters(QList<QPrinterDescription> *printers);
|
||||
char *qt_parsePrintersConf(QList<QPrinterDescription> *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<QPrinterDescription> *printers);
|
||||
#endif // QT_NO_NIS
|
||||
char *qt_parseNsswitchPrintersEntry(QList<QPrinterDescription> *printers, char *line);
|
||||
char *qt_parseNsswitchConf(QList<QPrinterDescription> *printers);
|
||||
void qt_parseEtcLpMember(QList<QPrinterDescription> *printers);
|
||||
void qt_parseSpoolInterface(QList<QPrinterDescription> *printers);
|
||||
void qt_parseQconfig(QList<QPrinterDescription> *printers);
|
||||
int qt_getLprPrinters(QList<QPrinterDescription>& printers);
|
||||
|
||||
QList<QPrinter::PaperSize> qt_getCupsPrinterPaperSizes(int cupsPrinterIndex);
|
||||
|
||||
#endif // QT_NO_PRINTER
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QPRINTERINFO_UNIX_P_H
|
@ -246,9 +246,6 @@ void tst_QPrinterInfo::testForDefaultPrinter()
|
||||
|
||||
void tst_QPrinterInfo::testForPrinters()
|
||||
{
|
||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
|
||||
QSKIP("Test doesn't work on Unix, plugin not yet enabled");
|
||||
# endif
|
||||
#if defined(Q_OS_UNIX) || defined(Q_OS_WIN32)
|
||||
# ifdef Q_OS_WIN32
|
||||
if (QHostInfo::localHostName() == "fantomet" || QHostInfo::localHostName() == "bobo") {
|
||||
|
@ -1392,6 +1392,8 @@ void Configure::applySpecSpecifics()
|
||||
dictionary[ "QT_QWS_DEPTH" ] = "4 8 16 24 32";
|
||||
dictionary[ "QT_SXE" ] = "no";
|
||||
dictionary[ "QT_INOTIFY" ] = "no";
|
||||
dictionary[ "QT_LPR" ] = "no";
|
||||
dictionary[ "QT_CUPS" ] = "no";
|
||||
dictionary[ "QT_GLIB" ] = "no";
|
||||
dictionary[ "QT_ICONV" ] = "no";
|
||||
|
||||
@ -2849,12 +2851,18 @@ void Configure::generateConfigfiles()
|
||||
tmpStream<<"#define QT_QWS_DEPTH_"+depth<<endl;
|
||||
}
|
||||
|
||||
if (dictionary[ "QT_CUPS" ] == "no")
|
||||
tmpStream<<"#define QT_NO_CUPS"<<endl;
|
||||
|
||||
if (dictionary[ "QT_ICONV" ] == "no")
|
||||
tmpStream<<"#define QT_NO_ICONV"<<endl;
|
||||
|
||||
if (dictionary[ "QT_GLIB" ] == "no")
|
||||
tmpStream<<"#define QT_NO_GLIB"<<endl;
|
||||
|
||||
if (dictionary[ "QT_LPR" ] == "no")
|
||||
tmpStream<<"#define QT_NO_LPR"<<endl;
|
||||
|
||||
if (dictionary[ "QT_INOTIFY" ] == "no")
|
||||
tmpStream<<"#define QT_NO_INOTIFY"<<endl;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user