File indexing completed on 2023-11-26 08:03:14

0001 /*
0002     SPDX-FileCopyrightText: 2012 Frederik Gladhorn <gladhorn@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 
0008 #include "dbusconnection.h"
0009 
0010 #include <QDBusMessage>
0011 #include <QDBusPendingReply>
0012 #include <QDebug>
0013 
0014 using namespace QAccessibleClient;
0015 
0016 DBusConnection::DBusConnection()
0017     : QObject()
0018     , m_connection(QDBusConnection::sessionBus())
0019     , m_status(Disconnected)
0020     , m_initWatcher(nullptr)
0021 {
0022     init();
0023 }
0024 
0025 void DBusConnection::init()
0026 {
0027     QDBusConnection c = QDBusConnection::sessionBus();
0028     if (!c.isConnected()) {
0029         qWarning("Could not connect to DBus session bus.");
0030         return;
0031     }
0032 
0033     QDBusMessage m = QDBusMessage::createMethodCall(QStringLiteral("org.a11y.Bus"),
0034                                                     QStringLiteral("/org/a11y/bus"),
0035                                                     QStringLiteral("org.a11y.Bus"), QStringLiteral("GetAddress"));
0036 
0037     QDBusPendingCall async = c.asyncCall(m);
0038     m_initWatcher = new QDBusPendingCallWatcher(async, this);
0039     connect(m_initWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(initFinished()));
0040 }
0041 
0042 void DBusConnection::initFinished()
0043 {
0044     if (!m_initWatcher)
0045         return;
0046     m_status = ConnectionError;
0047     QDBusPendingReply<QString> reply = *m_initWatcher;
0048     if (reply.isError() || reply.value().isEmpty()) {
0049         qWarning() << "Accessibility DBus not found. Falling back to session bus.";
0050     } else {
0051         QString busAddress = reply.value();
0052         qDebug() << "Got Accessibility DBus address:" << busAddress;
0053         QDBusConnection c = QDBusConnection::connectToBus(busAddress, QStringLiteral("a11y"));
0054         if (c.isConnected()) {
0055             qDebug() << "Connected to Accessibility DBus at address=" << busAddress;
0056             m_connection = c;
0057             m_status = Connected;
0058         } else {
0059             qWarning() << "Found Accessibility DBus address=" << busAddress << "but cannot connect. Falling back to session bus.";
0060         }
0061     }
0062     m_initWatcher->deleteLater();
0063     m_initWatcher = nullptr;
0064     Q_EMIT connectionFetched();
0065 }
0066 
0067 bool DBusConnection::isFetchingConnection() const
0068 {
0069     return m_initWatcher;
0070 }
0071 
0072 QDBusConnection DBusConnection::connection() const
0073 {
0074     if (m_initWatcher) {
0075         m_initWatcher->waitForFinished();
0076         const_cast<DBusConnection*>(this)->initFinished();
0077     }
0078     return m_connection;
0079 }
0080 
0081 DBusConnection::Status DBusConnection::status() const
0082 {
0083     return m_status;
0084 }
0085 
0086 #include "moc_dbusconnection.cpp"