diff options
83 files changed, 369 insertions, 121 deletions
diff --git a/src/corelib/doc/src/cpp20-overview.qdoc b/src/corelib/doc/src/cpp20-overview.qdoc index ed48e10f94a..1231394c161 100644 --- a/src/corelib/doc/src/cpp20-overview.qdoc +++ b/src/corelib/doc/src/cpp20-overview.qdoc @@ -12,6 +12,16 @@ This page gives a brief overview of C++20 features available in Qt. + \section1 WebEngine and Module-Specific Requirements + + While Qt 6 only requires a C++17-compatible compiler in general, + the \l{Qt WebEngine} module requires a C++20-compatible compiler + due to its dependencies (such as Chromium). + + If you are building Qt WebEngine, ensure that your compiler fully supports C++20. + + See \l{qtwebengine-platform-notes.html}{Qt WebEngine Platform Notes} for detailed requirements. + \section1 Support for \c{std::chrono} Various classes related to date and time have support for \l diff --git a/src/corelib/itemmodels/qrangemodel.cpp b/src/corelib/itemmodels/qrangemodel.cpp index 51043eb0e24..8ced35a4ae0 100644 --- a/src/corelib/itemmodels/qrangemodel.cpp +++ b/src/corelib/itemmodels/qrangemodel.cpp @@ -5,8 +5,48 @@ #include "qrangemodel.h" #include <QtCore/qsize.h> +#include <QtCore/private/qabstractitemmodel_p.h> + QT_BEGIN_NAMESPACE +class QRangeModelPrivate : QAbstractItemModelPrivate +{ + Q_DECLARE_PUBLIC(QRangeModel) + + struct Deleter { void operator()(QRangeModelImplBase *that) { that->destroy(); } }; + +public: + explicit QRangeModelPrivate(std::unique_ptr<QRangeModelImplBase, Deleter> impl) + : impl(std::move(impl)) + {} + + template <typename Ret, typename ...Args> + Ret call(QRangeModelImplBase::ConstOp op, const Args &...args) const + { + Ret ret = {}; + const auto tuple = std::tie(args...); + impl->callConst_fn(op, impl.get(), &ret, &tuple); + return ret; + } + + template <typename Ret, typename ...Args> + Ret call(QRangeModelImplBase::Op op, const Args &...args) + { + Ret ret = {}; + const auto tuple = std::tie(args...); + impl->call_fn(op, impl.get(), &ret, &tuple); + return ret; + } + +private: + std::unique_ptr<QRangeModelImplBase, Deleter> impl; +}; + +QRangeModel::QRangeModel(QRangeModelImplBase *impl, QObject *parent) + : QAbstractItemModel(*new QRangeModelPrivate({impl, {}}), parent) +{ +} + /*! \class QRangeModel \inmodule QtCore @@ -503,7 +543,8 @@ QRangeModel::~QRangeModel() = default; */ QModelIndex QRangeModel::index(int row, int column, const QModelIndex &parent) const { - return impl->callConst<QModelIndex>(QRangeModelImplBase::Index, row, column, parent); + Q_D(const QRangeModel); + return d->call<QModelIndex>(QRangeModelImplBase::Index, row, column, parent); } /*! @@ -520,7 +561,8 @@ QModelIndex QRangeModel::index(int row, int column, const QModelIndex &parent) c */ QModelIndex QRangeModel::parent(const QModelIndex &child) const { - return impl->callConst<QModelIndex>(QRangeModelImplBase::Parent, child); + Q_D(const QRangeModel); + return d->call<QModelIndex>(QRangeModelImplBase::Parent, child); } /*! @@ -536,7 +578,8 @@ QModelIndex QRangeModel::parent(const QModelIndex &child) const */ QModelIndex QRangeModel::sibling(int row, int column, const QModelIndex &index) const { - return impl->callConst<QModelIndex>(QRangeModelImplBase::Sibling, row, column, index); + Q_D(const QRangeModel); + return d->call<QModelIndex>(QRangeModelImplBase::Sibling, row, column, index); } /*! @@ -554,7 +597,8 @@ QModelIndex QRangeModel::sibling(int row, int column, const QModelIndex &index) */ int QRangeModel::rowCount(const QModelIndex &parent) const { - return impl->callConst<int>(QRangeModelImplBase::RowCount, parent); + Q_D(const QRangeModel); + return d->call<int>(QRangeModelImplBase::RowCount, parent); } /*! @@ -572,7 +616,8 @@ int QRangeModel::rowCount(const QModelIndex &parent) const */ int QRangeModel::columnCount(const QModelIndex &parent) const { - return impl->callConst<int>(QRangeModelImplBase::ColumnCount, parent); + Q_D(const QRangeModel); + return d->call<int>(QRangeModelImplBase::ColumnCount, parent); } /*! @@ -589,7 +634,8 @@ int QRangeModel::columnCount(const QModelIndex &parent) const */ Qt::ItemFlags QRangeModel::flags(const QModelIndex &index) const { - return impl->callConst<Qt::ItemFlags>(QRangeModelImplBase::Flags, index); + Q_D(const QRangeModel); + return d->call<Qt::ItemFlags>(QRangeModelImplBase::Flags, index); } /*! @@ -606,8 +652,8 @@ Qt::ItemFlags QRangeModel::flags(const QModelIndex &index) const */ QVariant QRangeModel::headerData(int section, Qt::Orientation orientation, int role) const { - return impl->callConst<QVariant>(QRangeModelImplBase::HeaderData, - section, orientation, role); + Q_D(const QRangeModel); + return d->call<QVariant>(QRangeModelImplBase::HeaderData, section, orientation, role); } /*! @@ -629,7 +675,8 @@ QVariant QRangeModel::headerData(int section, Qt::Orientation orientation, int r */ QVariant QRangeModel::data(const QModelIndex &index, int role) const { - return impl->callConst<QVariant>(QRangeModelImplBase::Data, index, role); + Q_D(const QRangeModel); + return d->call<QVariant>(QRangeModelImplBase::Data, index, role); } /*! @@ -654,7 +701,8 @@ QVariant QRangeModel::data(const QModelIndex &index, int role) const */ bool QRangeModel::setData(const QModelIndex &index, const QVariant &data, int role) { - return impl->call<bool>(QRangeModelImplBase::SetData, index, data, role); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::SetData, index, data, role); } /*! @@ -677,7 +725,8 @@ bool QRangeModel::setData(const QModelIndex &index, const QVariant &data, int ro */ QMap<int, QVariant> QRangeModel::itemData(const QModelIndex &index) const { - return impl->callConst<QMap<int, QVariant>>(QRangeModelImplBase::ItemData, index); + Q_D(const QRangeModel); + return d->call<QMap<int, QVariant>>(QRangeModelImplBase::ItemData, index); } /*! @@ -708,7 +757,8 @@ QMap<int, QVariant> QRangeModel::itemData(const QModelIndex &index) const */ bool QRangeModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &data) { - return impl->call<bool>(QRangeModelImplBase::SetItemData, index, data); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::SetItemData, index, data); } /*! @@ -721,7 +771,8 @@ bool QRangeModel::setItemData(const QModelIndex &index, const QMap<int, QVariant */ bool QRangeModel::clearItemData(const QModelIndex &index) { - return impl->call<bool>(QRangeModelImplBase::ClearItemData, index); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::ClearItemData, index); } /* @@ -746,7 +797,8 @@ bool QRangeModel::clearItemData(const QModelIndex &index) */ bool QRangeModel::insertColumns(int column, int count, const QModelIndex &parent) { - return impl->call<bool>(QRangeModelImplBase::InsertColumns, column, count, parent); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::InsertColumns, column, count, parent); } /*! @@ -760,7 +812,8 @@ bool QRangeModel::insertColumns(int column, int count, const QModelIndex &parent */ bool QRangeModel::removeColumns(int column, int count, const QModelIndex &parent) { - return impl->call<bool>(QRangeModelImplBase::RemoveColumns, column, count, parent); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::RemoveColumns, column, count, parent); } /*! @@ -775,9 +828,10 @@ bool QRangeModel::removeColumns(int column, int count, const QModelIndex &parent bool QRangeModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationColumn) { - return impl->call<bool>(QRangeModelImplBase::MoveColumns, - sourceParent, sourceColumn, count, - destinationParent, destinationColumn); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::MoveColumns, + sourceParent, sourceColumn, count, + destinationParent, destinationColumn); } /* @@ -804,7 +858,8 @@ bool QRangeModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, */ bool QRangeModel::insertRows(int row, int count, const QModelIndex &parent) { - return impl->call<bool>(QRangeModelImplBase::InsertRows, row, count, parent); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::InsertRows, row, count, parent); } /*! @@ -817,7 +872,8 @@ bool QRangeModel::insertRows(int row, int count, const QModelIndex &parent) */ bool QRangeModel::removeRows(int row, int count, const QModelIndex &parent) { - return impl->call<bool>(QRangeModelImplBase::RemoveRows, row, count, parent); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::RemoveRows, row, count, parent); } /*! @@ -832,9 +888,10 @@ bool QRangeModel::removeRows(int row, int count, const QModelIndex &parent) bool QRangeModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationRow) { - return impl->call<bool>(QRangeModelImplBase::MoveRows, - sourceParent, sourceRow, count, - destinationParent, destinationRow); + Q_D(QRangeModel); + return d->call<bool>(QRangeModelImplBase::MoveRows, + sourceParent, sourceRow, count, + destinationParent, destinationRow); } /*! diff --git a/src/corelib/itemmodels/qrangemodel.h b/src/corelib/itemmodels/qrangemodel.h index 328966f26fd..0d9add5def3 100644 --- a/src/corelib/itemmodels/qrangemodel.h +++ b/src/corelib/itemmodels/qrangemodel.h @@ -9,6 +9,8 @@ QT_BEGIN_NAMESPACE +class QRangeModelPrivate; + class Q_CORE_EXPORT QRangeModel : public QAbstractItemModel { Q_OBJECT @@ -103,10 +105,10 @@ protected: private: Q_DISABLE_COPY_MOVE(QRangeModel) + Q_DECLARE_PRIVATE(QRangeModel) + explicit QRangeModel(QRangeModelImplBase *impl, QObject *parent); friend class QRangeModelImplBase; - struct Deleter { void operator()(QRangeModelImplBase *that) { that->destroy(); } }; - std::unique_ptr<QRangeModelImplBase, Deleter> impl; }; // implementation of forwarders @@ -193,21 +195,21 @@ const QAbstractItemModel &QRangeModelImplBase::itemModel() const template <typename Range, QRangeModelDetails::if_table_range<Range>> QRangeModel::QRangeModel(Range &&range, QObject *parent) - : QAbstractItemModel(parent) - , impl(new QGenericTableItemModelImpl<Range>(std::forward<Range>(range), this)) + : QRangeModel(new QGenericTableItemModelImpl<Range>(std::forward<Range>(range), this), parent) {} template <typename Range, QRangeModelDetails::if_tree_range<Range>> QRangeModel::QRangeModel(Range &&range, QObject *parent) - : QRangeModel(std::forward<Range>(range), - QRangeModelDetails::DefaultTreeProtocol<Range>{}, parent) + : QRangeModel(std::forward<Range>(range), QRangeModelDetails::DefaultTreeProtocol<Range>{}, + parent) {} template <typename Range, typename Protocol, QRangeModelDetails::if_tree_range<Range, Protocol>> QRangeModel::QRangeModel(Range &&range, Protocol &&protocol, QObject *parent) - : QAbstractItemModel(parent) - , impl(new QGenericTreeItemModelImpl<Range, Protocol>(std::forward<Range>(range), - std::forward<Protocol>(protocol), this)) + : QRangeModel(new QGenericTreeItemModelImpl<Range, Protocol>(std::forward<Range>(range), + std::forward<Protocol>(protocol), + this), + parent) {} QT_END_NAMESPACE diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h index 38378fdcc64..34c9ba235a6 100644 --- a/src/corelib/itemmodels/qrangemodel_impl.h +++ b/src/corelib/itemmodels/qrangemodel_impl.h @@ -604,7 +604,7 @@ public: void destroy() { - call<bool>(Destroy); + call_fn(Destroy, this, nullptr, nullptr); } private: @@ -615,6 +615,7 @@ private: using CallConstFN = decltype(callConst); using CallTupleFN = decltype(call); + friend class QRangeModelPrivate; CallConstFN *callConst_fn; CallTupleFN *call_fn; QRangeModel *m_rangeModel; @@ -647,25 +648,6 @@ protected: inline void endMoveRows(); inline QAbstractItemModel &itemModel(); inline const QAbstractItemModel &itemModel() const; - -public: - template <typename Ret, typename ...Args> - Ret callConst(ConstOp op, const Args &...args) const - { - Ret ret = {}; - const auto tuple = std::tie(args...); - callConst_fn(op, this, &ret, &tuple); - return ret; - } - - template <typename Ret, typename ...Args> - Ret call(Op op, const Args &...args) - { - Ret ret = {}; - const auto tuple = std::tie(args...); - call_fn(op, this, &ret, &tuple); - return ret; - } }; template <typename Structure, typename Range, @@ -1357,7 +1339,7 @@ public: bool removeRows(int row, int count, const QModelIndex &parent = {}) { - if constexpr (Structure::canRemoveRows()) { + if constexpr (canRemoveRows()) { const int prevRowCount = that().rowCount(parent); if (row < 0 || row + count > prevRowCount) return false; @@ -1476,10 +1458,15 @@ protected: // row elements. return false; } else { - return Structure::canInsertRows(); + return Structure::canInsertRowsImpl(); } } + static constexpr bool canRemoveRows() + { + return Structure::canRemoveRowsImpl(); + } + template <typename F> bool writeAt(const QModelIndex &index, F&& writer) { @@ -1805,7 +1792,7 @@ protected: return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } - static constexpr bool canInsertRows() + static constexpr bool canInsertRowsImpl() { // We must not insert rows if we cannot adjust the parents of the // children of the following rows. We don't have to do that if the @@ -1814,7 +1801,7 @@ protected: && Base::dynamicRows() && range_features::has_insert; } - static constexpr bool canRemoveRows() + static constexpr bool canRemoveRowsImpl() { // We must not remove rows if we cannot adjust the parents of the // children of the following rows. We don't have to do that if the @@ -2090,12 +2077,12 @@ protected: return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemNeverHasChildren; } - static constexpr bool canInsertRows() + static constexpr bool canInsertRowsImpl() { return Base::dynamicRows() && range_features::has_insert; } - static constexpr bool canRemoveRows() + static constexpr bool canRemoveRowsImpl() { return Base::dynamicRows() && range_features::has_erase; } diff --git a/src/corelib/platform/windows/qcomobject_p.h b/src/corelib/platform/windows/qcomobject_p.h index bbf7796445d..bd6f81d1c28 100644 --- a/src/corelib/platform/windows/qcomobject_p.h +++ b/src/corelib/platform/windows/qcomobject_p.h @@ -80,18 +80,21 @@ public: return tryQueryInterface<TFirstInterface, TAdditionalInterfaces...>(riid, ppvObject); } - // clang-format off STDMETHODIMP_(ULONG) AddRef() override { - return ++m_referenceCount; + return m_referenceCount.fetch_add(1, std::memory_order_relaxed) + 1; } - // clang-format on STDMETHODIMP_(ULONG) Release() override { - const LONG referenceCount = --m_referenceCount; - if (referenceCount == 0) + const LONG referenceCount = m_referenceCount.fetch_sub(1, std::memory_order_release) - 1; + if (referenceCount == 0) { + // This acquire fence synchronizes with the release operation in other threads. + // It ensures that all memory writes made to this object by other threads + // are visible to this thread before we proceed to delete it. + std::atomic_thread_fence(std::memory_order_acquire); delete this; + } return referenceCount; } @@ -103,6 +106,9 @@ protected: // Derived class should make its destructor private to force this behavior. virtual ~QComObject() = default; + // allow derived classes to access the reference count + std::atomic<LONG> m_referenceCount = 1; + private: template <typename TInterface, typename... TRest> HRESULT tryQueryInterface(REFIID riid, void **ppvObject) @@ -121,8 +127,6 @@ private: return E_NOINTERFACE; } - - std::atomic<LONG> m_referenceCount = 1; }; QT_END_NAMESPACE diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp index e4dc98af98b..8226be3d219 100644 --- a/src/corelib/serialization/qtextstream.cpp +++ b/src/corelib/serialization/qtextstream.cpp @@ -833,29 +833,28 @@ QTextStreamPrivate::PaddingResult QTextStreamPrivate::padding(qsizetype len) con /*! \internal */ -void QTextStreamPrivate::putString(const QChar *data, qsizetype len, bool number) +void QTextStreamPrivate::putString(QStringView data, bool number) { - if (Q_UNLIKELY(params.fieldWidth > len)) { + if (Q_UNLIKELY(params.fieldWidth > data.size())) { // handle padding: - const PaddingResult pad = padding(len); + const PaddingResult pad = padding(data.size()); if (params.fieldAlignment == QTextStream::AlignAccountingStyle && number) { - const QChar sign = len > 0 ? data[0] : QChar(); + const QChar sign = data.size() > 0 ? data.front() : QChar(); if (sign == locale.negativeSign() || sign == locale.positiveSign()) { // write the sign before the padding, then skip it later write(sign); - ++data; - --len; + data = data.sliced(1); } } writePadding(pad.left); - write(data, len); + write(data); writePadding(pad.right); } else { - write(data, len); + write(data); } } diff --git a/src/corelib/serialization/qtextstream_p.h b/src/corelib/serialization/qtextstream_p.h index bf3ce7b2ef7..6d6bfcd8365 100644 --- a/src/corelib/serialization/qtextstream_p.h +++ b/src/corelib/serialization/qtextstream_p.h @@ -149,11 +149,9 @@ public: void write(const QChar *data, qsizetype len); void write(QLatin1StringView data); void writePadding(qsizetype len); - inline void putString(QStringView string, bool number = false) - { - putString(string.constData(), string.size(), number); - } - void putString(const QChar *data, qsizetype len, bool number = false); + void putString(QStringView string, bool number = false); + void putString(const QChar *data, qsizetype len, bool number = false) + { putString(QStringView{data, len}, number); } void putString(QLatin1StringView data, bool number = false); void putString(QUtf8StringView data, bool number = false); inline void putChar(QChar ch); diff --git a/src/dbus/dbus_minimal_p.h b/src/dbus/dbus_minimal_p.h index 36e7fab55d9..a87c07defcb 100644 --- a/src/dbus/dbus_minimal_p.h +++ b/src/dbus/dbus_minimal_p.h @@ -2,6 +2,7 @@ // Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: AFL-2.1 OR GPL-2.0-or-later +// Qt-Security score:significant reason:default #ifndef DBUS_MINIMAL_P_H #define DBUS_MINIMAL_P_H diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h index 78b7e049ef3..a3e3b202c12 100644 --- a/src/dbus/qdbus_symbols_p.h +++ b/src/dbus/qdbus_symbols_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index df83cc6f462..b9c87797846 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusabstractadaptor.h" #include "qdbusabstractadaptor_p.h" diff --git a/src/dbus/qdbusabstractadaptor.h b/src/dbus/qdbusabstractadaptor.h index f143056b43a..649dc4622d0 100644 --- a/src/dbus/qdbusabstractadaptor.h +++ b/src/dbus/qdbusabstractadaptor.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSABSTRACTADAPTOR_H #define QDBUSABSTRACTADAPTOR_H diff --git a/src/dbus/qdbusabstractadaptor_p.h b/src/dbus/qdbusabstractadaptor_p.h index c047af18211..51dc727b2fb 100644 --- a/src/dbus/qdbusabstractadaptor_p.h +++ b/src/dbus/qdbusabstractadaptor_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index 0c6dbf1b3b7..4e46fc8f743 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusabstractinterface.h" #include "qdbusabstractinterface_p.h" diff --git a/src/dbus/qdbusabstractinterface.h b/src/dbus/qdbusabstractinterface.h index 8d36fb37281..2bdbdc419db 100644 --- a/src/dbus/qdbusabstractinterface.h +++ b/src/dbus/qdbusabstractinterface.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSABSTRACTINTERFACE_H #define QDBUSABSTRACTINTERFACE_H diff --git a/src/dbus/qdbusabstractinterface_p.h b/src/dbus/qdbusabstractinterface_p.h index 1bd5e96f2d4..aca8ed23253 100644 --- a/src/dbus/qdbusabstractinterface_p.h +++ b/src/dbus/qdbusabstractinterface_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusargument.h b/src/dbus/qdbusargument.h index f04cbc1ed43..b79f675a9e4 100644 --- a/src/dbus/qdbusargument.h +++ b/src/dbus/qdbusargument.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSARGUMENT_H #define QDBUSARGUMENT_H @@ -119,6 +120,27 @@ protected: QDBusArgument(QDBusArgumentPrivate *d); friend class QDBusArgumentPrivate; mutable QDBusArgumentPrivate *d; + +private: + template <typename... T> + friend QDBusArgument &operator<<(QDBusArgument &argument, const std::tuple<T...> &tuple) + { + static_assert(sizeof...(T) != 0, "D-Bus doesn't allow empty structs"); + argument.beginStructure(); + std::apply([&argument](const auto &...elements) { (argument << ... << elements); }, tuple); + argument.endStructure(); + return argument; + } + + template <typename... T> + friend const QDBusArgument &operator>>(const QDBusArgument &argument, std::tuple<T...> &tuple) + { + static_assert(sizeof...(T) != 0, "D-Bus doesn't allow empty structs"); + argument.beginStructure(); + std::apply([&argument](auto &...elements) { (argument >> ... >> elements); }, tuple); + argument.endStructure(); + return argument; + } }; Q_DECLARE_SHARED(QDBusArgument) @@ -323,26 +345,6 @@ inline const QDBusArgument &operator>>(const QDBusArgument &arg, std::pair<T1, T return arg; } -template <typename... T> -QDBusArgument &operator<<(QDBusArgument &argument, const std::tuple<T...> &tuple) -{ - static_assert(sizeof...(T) != 0, "D-Bus doesn't allow empty structs"); - argument.beginStructure(); - std::apply([&argument](const auto &...elements) { (argument << ... << elements); }, tuple); - argument.endStructure(); - return argument; -} - -template <typename... T> -const QDBusArgument &operator>>(const QDBusArgument &argument, std::tuple<T...> &tuple) -{ - static_assert(sizeof...(T) != 0, "D-Bus doesn't allow empty structs"); - argument.beginStructure(); - std::apply([&argument](auto &...elements) { (argument >> ... >> elements); }, tuple); - argument.endStructure(); - return argument; -} - QT_END_NAMESPACE #endif // QT_NO_DBUS diff --git a/src/dbus/qdbusargument_p.h b/src/dbus/qdbusargument_p.h index d9a73827424..3d007ea2c7c 100644 --- a/src/dbus/qdbusargument_p.h +++ b/src/dbus/qdbusargument_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSARGUMENT_P_H #define QDBUSARGUMENT_P_H diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp index 08cec30afa3..aa2ba432fa5 100644 --- a/src/dbus/qdbusconnection.cpp +++ b/src/dbus/qdbusconnection.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusconnection.h" #include "qdbusconnection_p.h" diff --git a/src/dbus/qdbusconnection.h b/src/dbus/qdbusconnection.h index be8acdc4ea5..45d3850faed 100644 --- a/src/dbus/qdbusconnection.h +++ b/src/dbus/qdbusconnection.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSCONNECTION_H #define QDBUSCONNECTION_H diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 5cb175c1cdc..b553cd62a03 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusconnectioninterface.cpp b/src/dbus/qdbusconnectioninterface.cpp index f7dbbb01563..36636b355b0 100644 --- a/src/dbus/qdbusconnectioninterface.cpp +++ b/src/dbus/qdbusconnectioninterface.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusconnectioninterface.h" diff --git a/src/dbus/qdbusconnectioninterface.h b/src/dbus/qdbusconnectioninterface.h index e728539a385..60742ea4043 100644 --- a/src/dbus/qdbusconnectioninterface.h +++ b/src/dbus/qdbusconnectioninterface.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSCONNECTIONINTERFACE_H #define QDBUSCONNECTIONINTERFACE_H diff --git a/src/dbus/qdbusconnectionmanager.cpp b/src/dbus/qdbusconnectionmanager.cpp index 73f11d82280..ef96231e1cc 100644 --- a/src/dbus/qdbusconnectionmanager.cpp +++ b/src/dbus/qdbusconnectionmanager.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusconnectionmanager_p.h" @@ -32,8 +33,8 @@ QDBusConnectionPrivate *QDBusConnectionManager::busConnection(QDBusConnection::B return nullptr; // we'll start in suspended delivery mode if we're in the main thread - // (the event loop will resume delivery) - bool suspendedDelivery = QThread::isMainThread(); + // (the event loop will resume delivery) and QCoreApplication already exists + bool suspendedDelivery = QThread::isMainThread() && qApp; const auto locker = qt_scoped_lock(defaultBusMutex); if (defaultBuses[type]) diff --git a/src/dbus/qdbusconnectionmanager_p.h b/src/dbus/qdbusconnectionmanager_p.h index 644c3c8fb1c..1ef048e5d72 100644 --- a/src/dbus/qdbusconnectionmanager_p.h +++ b/src/dbus/qdbusconnectionmanager_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbuscontext.cpp b/src/dbus/qdbuscontext.cpp index b8cb1dc8b10..f788b398186 100644 --- a/src/dbus/qdbuscontext.cpp +++ b/src/dbus/qdbuscontext.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusmessage.h" #include "qdbusconnection.h" diff --git a/src/dbus/qdbuscontext.h b/src/dbus/qdbuscontext.h index 02620449e18..47ced171171 100644 --- a/src/dbus/qdbuscontext.h +++ b/src/dbus/qdbuscontext.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSCONTEXT_H #define QDBUSCONTEXT_H diff --git a/src/dbus/qdbuscontext_p.h b/src/dbus/qdbuscontext_p.h index 1a544b8e44e..edd7aa068f0 100644 --- a/src/dbus/qdbuscontext_p.h +++ b/src/dbus/qdbuscontext_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbuserror.cpp b/src/dbus/qdbuserror.cpp index 0a5ba30d3a3..c168d8d471c 100644 --- a/src/dbus/qdbuserror.cpp +++ b/src/dbus/qdbuserror.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbuserror.h" diff --git a/src/dbus/qdbuserror.h b/src/dbus/qdbuserror.h index 292f967acbe..dcb0c6666a0 100644 --- a/src/dbus/qdbuserror.h +++ b/src/dbus/qdbuserror.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSERROR_H #define QDBUSERROR_H diff --git a/src/dbus/qdbusextratypes.cpp b/src/dbus/qdbusextratypes.cpp index 042014ceab0..c27c1cbd5db 100644 --- a/src/dbus/qdbusextratypes.cpp +++ b/src/dbus/qdbusextratypes.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusextratypes.h" #include "qdbusutil_p.h" diff --git a/src/dbus/qdbusextratypes.h b/src/dbus/qdbusextratypes.h index 3b44bfc2175..3bfd38486a2 100644 --- a/src/dbus/qdbusextratypes.h +++ b/src/dbus/qdbusextratypes.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSEXTRATYPES_H #define QDBUSEXTRATYPES_H diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 4c9736dea6d..bfd3a092d39 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusintegrator_p.h" diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h index ac9adf02100..f6486d87256 100644 --- a/src/dbus/qdbusintegrator_p.h +++ b/src/dbus/qdbusintegrator_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusinterface.cpp b/src/dbus/qdbusinterface.cpp index d4da36b35c4..7481229dccf 100644 --- a/src/dbus/qdbusinterface.cpp +++ b/src/dbus/qdbusinterface.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusinterface.h" #include "qdbusinterface_p.h" diff --git a/src/dbus/qdbusinterface.h b/src/dbus/qdbusinterface.h index fc02463ac72..bff0336fd82 100644 --- a/src/dbus/qdbusinterface.h +++ b/src/dbus/qdbusinterface.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSINTERFACE_H #define QDBUSINTERFACE_H diff --git a/src/dbus/qdbusinterface_p.h b/src/dbus/qdbusinterface_p.h index caf24e589d4..63b7196527f 100644 --- a/src/dbus/qdbusinterface_p.h +++ b/src/dbus/qdbusinterface_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbusinternalfilters.cpp b/src/dbus/qdbusinternalfilters.cpp index 721564ed3cd..a46bc8e6c87 100644 --- a/src/dbus/qdbusinternalfilters.cpp +++ b/src/dbus/qdbusinternalfilters.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusconnection_p.h" diff --git a/src/dbus/qdbusintrospection.cpp b/src/dbus/qdbusintrospection.cpp index 04b5ab77519..4f6c40743a5 100644 --- a/src/dbus/qdbusintrospection.cpp +++ b/src/dbus/qdbusintrospection.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusintrospection_p.h" #include "qdbusxmlparser_p.h" diff --git a/src/dbus/qdbusintrospection_p.h b/src/dbus/qdbusintrospection_p.h index 766cdffb621..3eccef8b7b0 100644 --- a/src/dbus/qdbusintrospection_p.h +++ b/src/dbus/qdbusintrospection_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSINTROSPECTION_P_H #define QDBUSINTROSPECTION_P_H diff --git a/src/dbus/qdbusmessage.cpp b/src/dbus/qdbusmessage.cpp index b10266ac8b7..f0a056e3127 100644 --- a/src/dbus/qdbusmessage.cpp +++ b/src/dbus/qdbusmessage.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusmessage.h" #include "qdbusmessage_p.h" diff --git a/src/dbus/qdbusmessage.h b/src/dbus/qdbusmessage.h index 608b9779d22..5b631c2b847 100644 --- a/src/dbus/qdbusmessage.h +++ b/src/dbus/qdbusmessage.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSMESSAGE_H #define QDBUSMESSAGE_H diff --git a/src/dbus/qdbusmessage_p.h b/src/dbus/qdbusmessage_p.h index 88ba78025e7..07cdeda4034 100644 --- a/src/dbus/qdbusmessage_p.h +++ b/src/dbus/qdbusmessage_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSMESSAGE_P_H #define QDBUSMESSAGE_P_H diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index c3590dc51cd..149392f9c3c 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusmetaobject_p.h" diff --git a/src/dbus/qdbusmetaobject_p.h b/src/dbus/qdbusmetaobject_p.h index 97d16d99d0e..473765a175c 100644 --- a/src/dbus/qdbusmetaobject_p.h +++ b/src/dbus/qdbusmetaobject_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSMETAOBJECT_P_H #define QDBUSMETAOBJECT_P_H diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp index 3ae7589480e..5a862528026 100644 --- a/src/dbus/qdbusmetatype.cpp +++ b/src/dbus/qdbusmetatype.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qdbusmetatype.h" #include "qdbusmetatype_p.h" diff --git a/src/dbus/qdbusmetatype.h b/src/dbus/qdbusmetatype.h index 3304a69e1ef..66b6b1b0456 100644 --- a/src/dbus/qdbusmetatype.h +++ b/src/dbus/qdbusmetatype.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSMETATYPE_H #define QDBUSMETATYPE_H diff --git a/src/dbus/qdbusmetatype_p.h b/src/dbus/qdbusmetatype_p.h index 86a59f587dd..b72c0c431e5 100644 --- a/src/dbus/qdbusmetatype_p.h +++ b/src/dbus/qdbusmetatype_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSMETATYPE_P_H #define QDBUSMETATYPE_P_H diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 635258c86d2..bf18b00d1cc 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include <string.h> diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index cd222c9ffa5..c0b382ca114 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbuspendingcall.h" #include "qdbuspendingcall_p.h" @@ -228,7 +229,7 @@ void QDBusPendingCallPrivate::waitForFinishedWithGui() /*! \fn QDBusPendingCall::QDBusPendingCall(QDBusPendingCall &&other) - \since 6.11 + \since 6.10 Moves \a other into this object. diff --git a/src/dbus/qdbuspendingcall.h b/src/dbus/qdbuspendingcall.h index 0db6667e5ec..1907fab78b9 100644 --- a/src/dbus/qdbuspendingcall.h +++ b/src/dbus/qdbuspendingcall.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSPENDINGCALL_H #define QDBUSPENDINGCALL_H diff --git a/src/dbus/qdbuspendingcall_p.h b/src/dbus/qdbuspendingcall_p.h index 2795cc3ecf8..407537c9bb0 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/dbus/qdbuspendingreply.cpp b/src/dbus/qdbuspendingreply.cpp index 7bb23aa3e36..b0fb2d75af5 100644 --- a/src/dbus/qdbuspendingreply.cpp +++ b/src/dbus/qdbuspendingreply.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbuspendingreply.h" #include "qdbuspendingcall_p.h" diff --git a/src/dbus/qdbuspendingreply.h b/src/dbus/qdbuspendingreply.h index 72e1bbdc313..7b76bcd1b7c 100644 --- a/src/dbus/qdbuspendingreply.h +++ b/src/dbus/qdbuspendingreply.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSPENDINGREPLY_H #define QDBUSPENDINGREPLY_H diff --git a/src/dbus/qdbusreply.cpp b/src/dbus/qdbusreply.cpp index 5b26250b10d..a90e7354ed2 100644 --- a/src/dbus/qdbusreply.cpp +++ b/src/dbus/qdbusreply.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusreply.h" #include "qdbusmetatype.h" diff --git a/src/dbus/qdbusreply.h b/src/dbus/qdbusreply.h index df488208c85..5dfb63f3b4b 100644 --- a/src/dbus/qdbusreply.h +++ b/src/dbus/qdbusreply.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSREPLY_H #define QDBUSREPLY_H diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp index e9131a14c4b..9e1063424a5 100644 --- a/src/dbus/qdbusserver.cpp +++ b/src/dbus/qdbusserver.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusserver.h" #include "qdbusconnection_p.h" diff --git a/src/dbus/qdbusserver.h b/src/dbus/qdbusserver.h index 34985cc0554..04b7930d412 100644 --- a/src/dbus/qdbusserver.h +++ b/src/dbus/qdbusserver.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSSERVER_H #define QDBUSSERVER_H diff --git a/src/dbus/qdbusservicewatcher.cpp b/src/dbus/qdbusservicewatcher.cpp index bf94f54f564..6b9675c19ec 100644 --- a/src/dbus/qdbusservicewatcher.cpp +++ b/src/dbus/qdbusservicewatcher.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusservicewatcher.h" #include "qdbusconnection.h" diff --git a/src/dbus/qdbusservicewatcher.h b/src/dbus/qdbusservicewatcher.h index 71c63084b18..d07ae0fe5d2 100644 --- a/src/dbus/qdbusservicewatcher.h +++ b/src/dbus/qdbusservicewatcher.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSSERVICEWATCHER_H #define QDBUSSERVICEWATCHER_H diff --git a/src/dbus/qdbusthreaddebug_p.h b/src/dbus/qdbusthreaddebug_p.h index bcbd1efb494..70fbf762d19 100644 --- a/src/dbus/qdbusthreaddebug_p.h +++ b/src/dbus/qdbusthreaddebug_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSTHREADDEBUG_P_H #define QDBUSTHREADDEBUG_P_H diff --git a/src/dbus/qdbusunixfiledescriptor.cpp b/src/dbus/qdbusunixfiledescriptor.cpp index 365f6cbc76c..bc38d142b95 100644 --- a/src/dbus/qdbusunixfiledescriptor.cpp +++ b/src/dbus/qdbusunixfiledescriptor.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusunixfiledescriptor.h" diff --git a/src/dbus/qdbusunixfiledescriptor.h b/src/dbus/qdbusunixfiledescriptor.h index cbcd8b53a95..c946ec1761b 100644 --- a/src/dbus/qdbusunixfiledescriptor.h +++ b/src/dbus/qdbusunixfiledescriptor.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSUNIXFILEDESCRIPTOR_H diff --git a/src/dbus/qdbusutil.cpp b/src/dbus/qdbusutil.cpp index 84ce5ed78dc..9c1c7e8edf3 100644 --- a/src/dbus/qdbusutil.cpp +++ b/src/dbus/qdbusutil.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qdbusutil_p.h" diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h index 3db93849682..580a2b92c96 100644 --- a/src/dbus/qdbusutil_p.h +++ b/src/dbus/qdbusutil_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser // // W A R N I N G diff --git a/src/dbus/qdbusvirtualobject.cpp b/src/dbus/qdbusvirtualobject.cpp index 2e5df125d25..878152ad32d 100644 --- a/src/dbus/qdbusvirtualobject.cpp +++ b/src/dbus/qdbusvirtualobject.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qdbusvirtualobject.h" diff --git a/src/dbus/qdbusvirtualobject.h b/src/dbus/qdbusvirtualobject.h index 573d731d201..451b0040069 100644 --- a/src/dbus/qdbusvirtualobject.h +++ b/src/dbus/qdbusvirtualobject.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSVIRTUALOBJECT_H #define QDBUSVIRTUALOBJECT_H diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index 412ac180951..69d27a49f9f 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include <QtCore/qmetaobject.h> #include <QtCore/qstringlist.h> diff --git a/src/dbus/qdbusxmlparser.cpp b/src/dbus/qdbusxmlparser.cpp index c2e8df8be7e..b3e1b6b78b6 100644 --- a/src/dbus/qdbusxmlparser.cpp +++ b/src/dbus/qdbusxmlparser.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qdbusxmlparser_p.h" #include "qdbusutil_p.h" diff --git a/src/dbus/qdbusxmlparser_p.h b/src/dbus/qdbusxmlparser_p.h index 0476ba36281..6cee2da76cc 100644 --- a/src/dbus/qdbusxmlparser_p.h +++ b/src/dbus/qdbusxmlparser_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QDBUSXMLPARSER_P_H #define QDBUSXMLPARSER_P_H diff --git a/src/dbus/qtdbusglobal.h b/src/dbus/qtdbusglobal.h index 9724c066f6a..07cfa16a258 100644 --- a/src/dbus/qtdbusglobal.h +++ b/src/dbus/qtdbusglobal.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTDBUSGLOBAL_H #define QTDBUSGLOBAL_H diff --git a/src/dbus/qtdbusglobal_p.h b/src/dbus/qtdbusglobal_p.h index 9d315de75c8..6e748c20ae3 100644 --- a/src/dbus/qtdbusglobal_p.h +++ b/src/dbus/qtdbusglobal_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTDBUSGLOBAL_P_H #define QTDBUSGLOBAL_P_H diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp index 1703fa5b0fe..1e0f9295110 100644 --- a/src/gui/math3d/qmatrix4x4.cpp +++ b/src/gui/math3d/qmatrix4x4.cpp @@ -4,6 +4,8 @@ #include "qmatrix4x4.h" #include <QtCore/qmath.h> #include <QtCore/qvariant.h> + +#include <QtGui/qquaternion.h> #include <QtGui/qtransform.h> #include <cmath> diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h index 80ba62ca36f..2ba274d4517 100644 --- a/src/gui/math3d/qmatrix4x4.h +++ b/src/gui/math3d/qmatrix4x4.h @@ -7,7 +7,6 @@ #include <QtGui/qtguiglobal.h> #include <QtGui/qvector3d.h> #include <QtGui/qvector4d.h> -#include <QtGui/qquaternion.h> #include <QtGui/qgenericmatrix.h> #include <QtCore/qrect.h> @@ -15,6 +14,9 @@ class tst_QMatrixNxN; QT_BEGIN_NAMESPACE +#ifndef QT_NO_QUATERNION +class QQuaternion; +#endif #ifndef QT_NO_MATRIX4X4 diff --git a/src/network/access/qhttp2connection.cpp b/src/network/access/qhttp2connection.cpp index 6f8a318dae0..9b339a19a24 100644 --- a/src/network/access/qhttp2connection.cpp +++ b/src/network/access/qhttp2connection.cpp @@ -663,8 +663,10 @@ void QHttp2Stream::handleDATA(const Frame &inboundFrame) { QHttp2Connection *connection = getConnection(); - qCDebug(qHttp2ConnectionLog, "[%p] stream %u, received DATA frame with payload of %u bytes", - connection, m_streamID, inboundFrame.payloadSize()); + qCDebug(qHttp2ConnectionLog, + "[%p] stream %u, received DATA frame with payload of %u bytes, closing stream? %s", + connection, m_streamID, inboundFrame.payloadSize(), + inboundFrame.flags().testFlag(Http2::FrameFlag::END_STREAM) ? "yes" : "no"); // RFC 9113, 6.1: If a DATA frame is received whose stream is not in the "open" or "half-closed // (local)" state, the recipient MUST respond with a stream error (Section 5.4.2) of type @@ -1426,7 +1428,8 @@ void QHttp2Connection::handleHEADERS() Q_ASSERT(inboundFrame.type() == FrameType::HEADERS); const auto streamID = inboundFrame.streamID(); - qCDebug(qHttp2ConnectionLog, "[%p] Received HEADERS frame on stream %d", this, streamID); + qCDebug(qHttp2ConnectionLog, "[%p] Received HEADERS frame on stream %d, end stream? %s", this, + streamID, inboundFrame.flags().testFlag(Http2::FrameFlag::END_STREAM) ? "yes" : "no"); // RFC 9113, 6.2: If a HEADERS frame is received whose Stream Identifier field is 0x00, the // recipient MUST respond with a connection error. @@ -1849,6 +1852,10 @@ void QHttp2Connection::handleWINDOW_UPDATE() void QHttp2Connection::handleCONTINUATION() { Q_ASSERT(inboundFrame.type() == FrameType::CONTINUATION); + auto streamID = inboundFrame.streamID(); + qCDebug(qHttp2ConnectionLog, + "[%p] Received CONTINUATION frame on stream %d, end stream? %s", this, streamID, + inboundFrame.flags().testFlag(Http2::FrameFlag::END_STREAM) ? "yes" : "no"); if (continuedFrames.empty()) return connectionError(PROTOCOL_ERROR, "CONTINUATION without a preceding HEADERS or PUSH_PROMISE"); diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index 62269a21de1..84101b69e9f 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -2151,9 +2151,6 @@ void QWindows11Style::polish(QWidget* widget) widget->setWindowFlag(Qt::NoDropShadowWindowHint); widget->setAttribute(Qt::WA_RightToLeft, layoutDirection); widget->setAttribute(Qt::WA_WState_Created, wasCreated); - auto pal = widget->palette(); - pal.setColor(widget->backgroundRole(), Qt::transparent); - widget->setPalette(pal); if (!isScrollBar) { bool inGraphicsView = widget->graphicsProxyWidget() != nullptr; if (!inGraphicsView && comboBoxContainer && comboBoxContainer->parentWidget()) diff --git a/src/testlib/3rdparty/catch2/qt_attribution.json b/src/testlib/3rdparty/catch2/qt_attribution.json index 1e4f2c5297c..ad231efd426 100644 --- a/src/testlib/3rdparty/catch2/qt_attribution.json +++ b/src/testlib/3rdparty/catch2/qt_attribution.json @@ -5,6 +5,7 @@ "QDocModule": "qttestlib", "QtUsage": "Used for testing of the Qt Test module.", "Comment": { + "OldBranch": "Stick to its v2.x branch; no suitable file in v3", "UpstreamFile": "single_include/catch2/catch.hpp", "Generator": "scripts/generateSingleHeader.py", "General": "no relevant CPE found" diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 170c38d57c1..820a7b4bdb5 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -7,7 +7,6 @@ #include <qfile.h> #include <qdatetime.h> #include <qdir.h> -#include <qset.h> #include <qstandardpaths.h> #include <qstring.h> #include <qtemporarydir.h> @@ -15,6 +14,7 @@ #include <QtTest/private/qtesthelpers_p.h> +#include <QtCore/private/qduplicatetracker_p.h> #include <QtCore/qscopeguard.h> #if defined(Q_OS_WIN) @@ -551,9 +551,9 @@ void tst_QTemporaryFile::openOnRootDrives() void tst_QTemporaryFile::stressTest() { - const int iterations = 1000; + constexpr int iterations = 1000; - QSet<QString> names; + QDuplicateTracker<QString, iterations> names; const auto remover = qScopeGuard([&] { for (const QString &s : std::as_const(names)) @@ -564,8 +564,7 @@ void tst_QTemporaryFile::stressTest() QTemporaryFile file; file.setAutoRemove(false); QVERIFY2(file.open(), qPrintable(file.errorString())); - QVERIFY(!names.contains(file.fileName())); - names.insert(file.fileName()); + QVERIFY(!names.hasSeen(file.fileName())); } } diff --git a/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp index 0254cbd1360..e41a4760e6a 100644 --- a/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp +++ b/tests/auto/corelib/serialization/qtextstream/tst_qtextstream.cpp @@ -23,6 +23,8 @@ #include "../../../network-settings.h" #include <QtTest/private/qemulationdetector_p.h> +using namespace Qt::StringLiterals; + QT_BEGIN_NAMESPACE template<> struct QMetaTypeId<QIODevice::OpenModeFlag> { enum { Defined = 1 }; static inline int qt_metatype_id() { return QMetaType::Int; } }; @@ -1379,12 +1381,12 @@ void tst_QTextStream::pos2() // ------------------------------------------------------------------------------ void tst_QTextStream::pos3LargeFile() { + // NOTE: The unusual spacing is to ensure non-1-character whitespace. + constexpr auto lineString = " 0 1 2\t3 4\t \t5 6 7 8 9 \n"_L1; { QFile file(testFileName); QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text)); QTextStream out( &file ); - // NOTE: The unusual spacing is to ensure non-1-character whitespace. - QString lineString = " 0 1 2\t3 4\t \t5 6 7 8 9 \n"; // Approximately 5kb text file (more is too slow (QTBUG-138435)) const int NbLines = (5 * 1024) / lineString.size() + 1; for (int line = 0; line < NbLines; ++line) @@ -1395,8 +1397,15 @@ void tst_QTextStream::pos3LargeFile() QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); QTextStream in( &file ); constexpr int testValues[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + qint64 expectedLineEnd = 0; +#ifdef Q_OS_WIN // CRLF platform + constexpr int crlfAdjustment = 1; +#else + constexpr int crlfAdjustment = 0; +#endif + const auto expectedLineLength = lineString.size() + crlfAdjustment; + QCOMPARE(in.pos(), 0); while (true) { - in.pos(); for (size_t i = 0; i < std::size(testValues); ++i) { int value = -42; if (!(in >> value)) { @@ -1407,6 +1416,9 @@ void tst_QTextStream::pos3LargeFile() } QCOMPARE(value, testValues[i]); } + expectedLineEnd += expectedLineLength; + // Final space and newline are not consumed until next read. + QCOMPARE(in.pos(), expectedLineEnd - 2 - crlfAdjustment); } } diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index bfc6074689b..50e17728cf3 100644 --- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp @@ -78,6 +78,9 @@ private slots: void negativeZero_data(); void negativeZero(); + void signsNeverCompareEqualToNullCharacter_data() { testNames_data(); } + void signsNeverCompareEqualToNullCharacter(); + void dayOfWeek(); void dayOfWeek_data(); void formatDate(); @@ -2114,6 +2117,19 @@ void tst_QLocale::negativeZero() QCOMPARE(locale.toString(std::copysign(0.0, -1.0)), expect); } +void tst_QLocale::signsNeverCompareEqualToNullCharacter() // otherwise QTextStream has a problem +{ + QFETCH(QLocale::Language, language); + QFETCH(const QLocale::Territory, country); + + if (language == QLocale::AnyLanguage && country == QLocale::AnyTerritory) + language = QLocale::C; + + const QLocale loc(language, country); + QCOMPARE_NE(loc.negativeSign(), QChar()); + QCOMPARE_NE(loc.positiveSign(), QChar()); +} + void tst_QLocale::dayOfWeek_data() { QTest::addColumn<QDate>("date"); diff --git a/tests/auto/dbus/qdbusconnection/CMakeLists.txt b/tests/auto/dbus/qdbusconnection/CMakeLists.txt index 56ae21f2911..cbbe76a7dc7 100644 --- a/tests/auto/dbus/qdbusconnection/CMakeLists.txt +++ b/tests/auto/dbus/qdbusconnection/CMakeLists.txt @@ -19,3 +19,15 @@ qt_internal_add_test(tst_qdbusconnection TESTDATA tst_qdbusconnection.conf ) + +qt_internal_add_executable(qdbusdelayeddeliveryreenablehelper + OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/" + SOURCES + qdbusdelayeddeliveryreenablehelper.cpp + LIBRARIES + Qt::DBus +) + +add_dependencies(tst_qdbusconnection + qdbusdelayeddeliveryreenablehelper +) diff --git a/tests/auto/dbus/qdbusconnection/qdbusdelayeddeliveryreenablehelper.cpp b/tests/auto/dbus/qdbusconnection/qdbusdelayeddeliveryreenablehelper.cpp new file mode 100644 index 00000000000..cd916d5b639 --- /dev/null +++ b/tests/auto/dbus/qdbusconnection/qdbusdelayeddeliveryreenablehelper.cpp @@ -0,0 +1,56 @@ +// Copyright (C) 2025 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtCore/QTimer> +#include <QtCore/QCoreApplication> +#include <QtDBus/QDBusConnection> +#include <QtDBus/QDBusMessage> + +#include <stdio.h> + +using namespace Qt::StringLiterals; +using namespace std::chrono_literals; + +static QString myInterface() +{ + return u"local.qdbusdelayeddeliveryreenablehelper"_s; +} + +static void makeSynchronousCall(QDBusConnection &conn) +{ + QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/", + "org.freedesktop.DBus.Peer", "Ping"); + conn.call(msg); +} + +static void emitSignal(QDBusConnection &conn) +{ + QDBusMessage msg = QDBusMessage::createSignal("/", myInterface(), "quit"); + conn.send(msg); +} + +int main(int argc, char **argv) +{ + // Open a connection to the bus *before* QCoreApplication exists; + // this will put the connection in delayed delivery mode + QDBusConnection session = QDBusConnection::sessionBus(); + if (!session.isConnected()) { + fprintf(stderr, "Session bus did not connect!"); + return 1; + } + makeSynchronousCall(session); + + QCoreApplication app(argc, argv); + QTimer::singleShot(15s, qApp, [] { + fprintf(stderr, "Did not receive signal.\n"); + qApp->exit(1); + }); + + // connect a remote, wildcard signal to qApp->quit() + session.connect(QString(), QString(), myInterface(), "quit", &app, SLOT(quit())); + + // send ourselves the signal to quit, via D-Bus + emitSignal(session); + + return app.exec(); +} diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp index ab750dff330..fe9214c5513 100644 --- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp +++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp @@ -13,11 +13,6 @@ #include <QDBusInterface> #include <QDBusConnectionInterface> -#ifdef Q_OS_UNIX -# include <sys/types.h> -# include <signal.h> -#endif - void MyObject::method(const QDBusMessage &msg) { path = msg.path(); @@ -1473,6 +1468,31 @@ void tst_QDBusConnection::parentClassSignal() QTRY_COMPARE(recv.signalsReceived, 2); } +// see also tst_qdbusconnection_delayed +void tst_QDBusConnection::delayedDeliveryReenabledAfterUsedInMainThread() +{ +#if !QT_CONFIG(process) + QSKIP("Test requires QProcess"); +#elif defined(HAS_HOOKSETUPFUNCTION) + QSKIP("No difference to run by tst_QDBusConnection"); +#else +# if defined(Q_OS_WIN) +# define EXE ".exe" +# else +# define EXE "" +# endif + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + + QProcess process; + process.start(QFINDTESTDATA("qdbusdelayeddeliveryreenablehelper" EXE)); + QVERIFY2(process.waitForFinished(25000), qPrintable(process.errorString())); + QCOMPARE(process.readAllStandardError(), QString()); + QCOMPARE(process.exitCode(), 0); +# undef EXE +#endif +} + QString MyObject::path; QString MyObjectWithoutInterface::path; QString MyObjectWithoutInterface::interface; diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h index 4137859414c..dc37e3157b4 100644 --- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h +++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h @@ -126,6 +126,8 @@ private slots: void parentClassSignal(); + void delayedDeliveryReenabledAfterUsedInMainThread(); + public: QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; } bool callMethod(const QDBusConnection &conn, const QString &path); |