diff options
Diffstat (limited to 'src/dbus/qdbusconnection_p.h')
-rw-r--r-- | src/dbus/qdbusconnection_p.h | 112 |
1 files changed, 28 insertions, 84 deletions
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index b8a1b7bbfd..53e6874818 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -1,42 +1,6 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtDBus module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// 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 // // W A R N I N G @@ -151,9 +115,11 @@ public: { typedef QList<ObjectTreeNode> DataList; - inline ObjectTreeNode() : obj(nullptr), flags(0) { } + inline ObjectTreeNode() : obj(nullptr) { } inline ObjectTreeNode(const QString &n) // intentionally implicit - : name(n), obj(nullptr), flags(0) { } + : name(n), obj(nullptr) + { + } inline bool operator<(const QString &other) const { return name < other; } inline bool operator<(QStringView other) const @@ -167,12 +133,11 @@ public: QObject *obj; QDBusVirtualObject *treeNode; }; - int flags; + QDBusConnection::RegisterOptions flags; DataList children; }; -public: // typedefs typedef QMultiHash<qintptr, Watcher> WatcherHash; typedef QHash<int, DBusTimeout *> TimeoutHash; @@ -193,9 +158,8 @@ public: }; typedef QHash<QString, WatchedServiceData> WatchedServicesHash; -public: // public methods are entry points from other objects - explicit QDBusConnectionPrivate(QObject *parent = nullptr); + QDBusConnectionPrivate(); ~QDBusConnectionPrivate(); void createBusService(); @@ -213,7 +177,7 @@ public: QObject *obj, const char *member); bool send(const QDBusMessage &message); - QDBusMessage sendWithReply(const QDBusMessage &message, int mode, int timeout = -1); + QDBusMessage sendWithReply(const QDBusMessage &message, QDBus::CallMode mode, int timeout = -1); QDBusMessage sendWithReplyLocal(const QDBusMessage &message); QDBusPendingCallPrivate *sendWithReplyAsync(const QDBusMessage &message, QObject *receiver, const char *returnMethod, const char *errorMethod,int timeout = -1); @@ -248,6 +212,8 @@ public: void postEventToThread(int action, QObject *target, QEvent *event); + void enableDispatchDelayed(QObject *context); + private: void checkThread(); bool handleError(const QDBusErrorInternal &error); @@ -259,12 +225,13 @@ private: void activateSignal(const SignalHook& hook, const QDBusMessage &msg); void activateObject(ObjectTreeNode &node, const QDBusMessage &msg, int pathStartPos); bool activateInternalFilters(const ObjectTreeNode &node, const QDBusMessage &msg); - bool activateCall(QObject *object, int flags, const QDBusMessage &msg); + bool activateCall(QObject *object, QDBusConnection::RegisterOptions flags, + const QDBusMessage &msg); void sendInternal(QDBusPendingCallPrivate *pcall, void *msg, int timeout); void sendError(const QDBusMessage &msg, QDBusError::ErrorType code); - void deliverCall(QObject *object, int flags, const QDBusMessage &msg, - const QList<QMetaType> &metaTypes, int slotIdx); + void deliverCall(QObject *object, const QDBusMessage &msg, const QList<QMetaType> &metaTypes, + int slotIdx); SignalHookHash::Iterator removeSignalHookNoLock(SignalHookHash::Iterator it); void collectAllObjects(ObjectTreeNode &node, QSet<QObject *> &set); @@ -275,10 +242,14 @@ private: void watchForDBusDisconnection(); - void _q_newConnection(QDBusConnectionPrivate *newConnection); - void handleAuthentication(); + bool addSignalHook(const QString &key, const SignalHook &hook); + bool removeSignalHook(const QString &key, const SignalHook &hook); + + bool addSignalHookImpl(const QString &key, const SignalHook &hook); + bool removeSignalHookImpl(const QString &key, const SignalHook &hook); + protected: void timerEvent(QTimerEvent *e) override; @@ -290,8 +261,6 @@ public slots: void socketWrite(qintptr); void objectDestroyed(QObject *o); void relaySignal(QObject *obj, const QMetaObject *, int signalId, const QVariantList &args); - bool addSignalHook(const QString &key, const SignalHook &hook); - bool removeSignalHook(const QString &key, const SignalHook &hook); private slots: void serviceOwnerChangedNoLock(const QString &name, const QString &oldOwner, const QString &newOwner); @@ -303,11 +272,8 @@ signals: void dispatchStatusChanged(); void spyHooksFinished(const QDBusMessage &msg); void messageNeedsSending(QDBusPendingCallPrivate *pcall, void *msg, int timeout = -1); - bool signalNeedsConnecting(const QString &key, const QDBusConnectionPrivate::SignalHook &hook); - bool signalNeedsDisconnecting(const QString &key, const QDBusConnectionPrivate::SignalHook &hook); void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); void callWithCallbackFailed(const QDBusError &error, const QDBusMessage &message); - void newServerConnection(QDBusConnectionPrivate *newConnection); public: QAtomicInt ref; @@ -350,16 +316,14 @@ public: bool dispatchEnabled; // protected by the dispatch lock, not the main lock bool isAuthenticated; -public: // static methods - static int findSlot(QObject *obj, const QByteArray &normalizedName, QList<QMetaType> ¶ms); + static int findSlot(QObject *obj, const QByteArray &normalizedName, QList<QMetaType> ¶ms, + QString &errorMsg); static bool prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key, - const QString &service, - const QString &path, const QString &interface, const QString &name, - const ArgMatchRules &argMatch, - QObject *receiver, const char *signal, int minMIdx, - bool buildSignature); - static DBusHandlerResult messageFilter(DBusConnection *, DBusMessage *, void *); + const QString &service, const QString &path, const QString &interface, + const QString &name, const ArgMatchRules &argMatch, QObject *receiver, + const char *signal, int minMIdx, bool buildSignature, + QString &errorMsg); static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object, int idx, const QList<QMetaType> &metaTypes, const QDBusMessage &msg); @@ -392,26 +356,6 @@ extern QDBusMessage qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNod extern QDBusMessage qDBusPropertyGetAll(const QDBusConnectionPrivate::ObjectTreeNode &node, const QDBusMessage &msg); -// can be replaced with a lambda in Qt 5.7 -class QDBusConnectionDispatchEnabler : public QObject -{ - Q_OBJECT - QDBusConnectionPrivate *con; -public: - QDBusConnectionDispatchEnabler(QDBusConnectionPrivate *con) : con(con) {} - -public slots: - void execute() - { - // This call cannot race with something disabling dispatch only because dispatch is - // never re-disabled from Qt code on an in-use connection once it has been enabled. - QMetaObject::invokeMethod(con, "setDispatchEnabled", Qt::QueuedConnection, Q_ARG(bool, true)); - if (!con->ref.deref()) - con->deleteLater(); - deleteLater(); - } -}; - #endif // QT_BOOTSTRAPPED QT_END_NAMESPACE |