From db4afbef7d1e2405a3b8f007e9009f509b4a3eac Mon Sep 17 00:00:00 2001 From: John Layt Date: Mon, 25 Nov 2013 20:36:58 +0100 Subject: QPrinterInfo - Fix isNull() by fixing constructors The QPrinterInfo copy and QPrinter constructors and the assignment operator were not taking the shared_null into account, and so any use of them resulted in a new null QPrinterInfo different to shared_null, which lead to isNull() always returning true in anything other than the simplest use case. While fixing this also make the shared_null a Q_GLOBAL_STATIC. Task-number: QTBUG-21087 Change-Id: I0beb24088208e9ed58d21ca26b0c8d00b02e5b8f Reviewed-by: Gunnar Sletta --- src/printsupport/kernel/qprinterinfo.cpp | 29 ++++++++++++++++++++++------- src/printsupport/kernel/qprinterinfo_p.h | 13 ------------- 2 files changed, 22 insertions(+), 20 deletions(-) (limited to 'src/printsupport') diff --git a/src/printsupport/kernel/qprinterinfo.cpp b/src/printsupport/kernel/qprinterinfo.cpp index f863b23e34..e02617fe93 100644 --- a/src/printsupport/kernel/qprinterinfo.cpp +++ b/src/printsupport/kernel/qprinterinfo.cpp @@ -35,8 +35,17 @@ QT_BEGIN_NAMESPACE -QPrinterInfoPrivate QPrinterInfoPrivate::shared_null; +Q_GLOBAL_STATIC(QPrinterInfoPrivate, shared_null); +class QPrinterInfoPrivateDeleter +{ +public: + static inline void cleanup(QPrinterInfoPrivate *d) + { + if (d != shared_null) + delete d; + } +}; /*! \class QPrinterInfo @@ -83,7 +92,7 @@ QPrinterInfoPrivate QPrinterInfoPrivate::shared_null; \sa isNull() */ QPrinterInfo::QPrinterInfo() - : d_ptr(&QPrinterInfoPrivate::shared_null) + : d_ptr(shared_null) { } @@ -91,7 +100,7 @@ QPrinterInfo::QPrinterInfo() Constructs a copy of \a other. */ QPrinterInfo::QPrinterInfo(const QPrinterInfo &other) - : d_ptr(new QPrinterInfoPrivate(*other.d_ptr)) + : d_ptr((other.d_ptr.data() == shared_null) ? shared_null : new QPrinterInfoPrivate(*other.d_ptr)) { } @@ -99,12 +108,15 @@ QPrinterInfo::QPrinterInfo(const QPrinterInfo &other) Constructs a QPrinterInfo object from \a printer. */ QPrinterInfo::QPrinterInfo(const QPrinter &printer) - : d_ptr(&QPrinterInfoPrivate::shared_null) + : d_ptr(shared_null) { QPlatformPrinterSupport *ps = QPlatformPrinterSupportPlugin::get(); if (ps) { QPrinterInfo pi = ps->printerInfo(printer.printerName()); - d_ptr.reset(new QPrinterInfoPrivate(*pi.d_ptr)); + if (pi.d_ptr.data() == shared_null) + d_ptr.reset(shared_null); + else + d_ptr.reset(new QPrinterInfoPrivate(*pi.d_ptr)); } } @@ -130,7 +142,10 @@ QPrinterInfo::~QPrinterInfo() QPrinterInfo &QPrinterInfo::operator=(const QPrinterInfo &other) { Q_ASSERT(d_ptr); - d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr)); + if (other.d_ptr.data() == shared_null) + d_ptr.reset(shared_null); + else + d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr)); return *this; } @@ -191,7 +206,7 @@ QString QPrinterInfo::makeAndModel() const bool QPrinterInfo::isNull() const { Q_D(const QPrinterInfo); - return d == &QPrinterInfoPrivate::shared_null; + return d == shared_null || d->name.isEmpty(); } /*! diff --git a/src/printsupport/kernel/qprinterinfo_p.h b/src/printsupport/kernel/qprinterinfo_p.h index d4bb08f1f5..6ae64b5653 100644 --- a/src/printsupport/kernel/qprinterinfo_p.h +++ b/src/printsupport/kernel/qprinterinfo_p.h @@ -72,8 +72,6 @@ public: ~QPrinterInfoPrivate() {} - static QPrinterInfoPrivate shared_null; - QString name; QString description; QString location; @@ -87,17 +85,6 @@ public: mutable QList > paperNames; }; - -class QPrinterInfoPrivateDeleter -{ -public: - static inline void cleanup(QPrinterInfoPrivate *d) - { - if (d != &QPrinterInfoPrivate::shared_null) - delete d; - } -}; - QT_END_NAMESPACE #endif // QT_NO_PRINTER -- cgit v1.2.3