src/gui/painting/qprinterinfo_unix.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
--- a/src/gui/painting/qprinterinfo_unix.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/painting/qprinterinfo_unix.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -75,7 +75,9 @@
     QString                     m_name;
     bool                        m_isNull;
     bool                        m_default;
-    QList<QPrinter::PaperSize>  m_paperSizes;
+    mutable bool                m_mustGetPaperSizes;
+    mutable QList<QPrinter::PaperSize> m_paperSizes;
+    int                         m_cupsPrinterIndex;
 
     QPrinterInfo*               q_ptr;
 };
@@ -421,6 +423,7 @@
 
 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;
@@ -444,6 +447,7 @@
         if (!err)
             return Success;
     }
+#endif //QT_NO_LIBRARY
     return Unavail;
 }
 
@@ -836,16 +840,7 @@
             list.append(QPrinterInfo(printerName));
             if (cupsPrinters[i].is_default)
                 list[i].d_ptr->m_default = true;
-            // Find paper sizes.
-            cups.setCurrentPrinter(i);
-            const ppd_option_t* sizes = cups.pageSizes();
-            if (sizes) {
-                for (int j = 0; j < sizes->num_choices; ++j) {
-                    list[i].d_ptr->m_paperSizes.append(
-                            QPrinterInfoPrivate::string2PaperSize(
-                            QLatin1String(sizes->choices[j].choice)));
-                }
-            }
+            list[i].d_ptr->m_cupsPrinterIndex = i;
         }
     } else {
 #endif
@@ -907,16 +902,7 @@
             if (printerName == printer.printerName()) {
                 if (cupsPrinters[i].is_default)
                     d->m_default = true;
-                // Find paper sizes.
-                cups.setCurrentPrinter(i);
-                const ppd_option_t* sizes = cups.pageSizes();
-                if (sizes) {
-                    for (int j = 0; j < sizes->num_choices; ++j) {
-                        d->m_paperSizes.append(
-                                QPrinterInfoPrivate::string2PaperSize(
-                                QLatin1String(sizes->choices[j].choice)));
-                    }
-                }
+                d->m_cupsPrinterIndex = i;
                 return;
             }
         }
@@ -981,6 +967,26 @@
 QList< QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
 {
     const Q_D(QPrinterInfo);
+    if (d->m_mustGetPaperSizes) {
+        d->m_mustGetPaperSizes = false;
+
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+        QCUPSSupport cups;
+        if (QCUPSSupport::isAvailable()) {
+            // Find paper sizes from CUPS.
+            cups.setCurrentPrinter(d->m_cupsPrinterIndex);
+            const ppd_option_t* sizes = cups.pageSizes();
+            if (sizes) {
+                for (int j = 0; j < sizes->num_choices; ++j) {
+                    d->m_paperSizes.append(
+                        QPrinterInfoPrivate::string2PaperSize(
+                            QLatin1String(sizes->choices[j].choice)));
+                }
+            }
+        }
+#endif
+
+    }
     return d->m_paperSizes;
 }
 
@@ -991,6 +997,8 @@
 {
     m_isNull = true;
     m_default = false;
+    m_mustGetPaperSizes = true;
+    m_cupsPrinterIndex = 0;
     q_ptr = 0;
 }
 
@@ -999,6 +1007,8 @@
     m_name = name;
     m_isNull = false;
     m_default = false;
+    m_mustGetPaperSizes = true;
+    m_cupsPrinterIndex = 0;
     q_ptr = 0;
 }