Add classes to be documented.
[qt-at-spi:qt-at-spi.git] / src / dbusconnection.cpp
1 /*
2  * D-Bus AT-SPI, Qt Adaptor
3  *
4  * Copyright 2011 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "dbusconnection.h"
22
23 #include <QtDBus/QDBusMessage>
24 #include <QtCore/QDebug>
25
26 #include <QX11Info>
27 #include <X11/Xlib.h>
28 #include <X11/Xatom.h>
29
30 /*!
31     \class DBusConnection
32
33     \brief DBusConnection
34
35     DBusConnection
36 */
37
38 DBusConnection::DBusConnection()
39     : dbusConnection(connectDBus())
40 {}
41
42 QDBusConnection DBusConnection::connectDBus()
43 {
44     QString address = getAccessibilityBusAddress();
45
46     if (!address.isEmpty()) {
47         QDBusConnection c = QDBusConnection::connectToBus(address, "a11y");
48         if (c.isConnected()) {
49             qDebug() << "Connected to accessibility bus at: " << address;
50             return c;
51         }
52         qWarning("Found Accessibility DBus address but cannot connect. Falling back to session bus.");
53     } else {
54         qWarning("Accessibility DBus not found. Falling back to session bus.");
55     }
56
57     QDBusConnection c = QDBusConnection::sessionBus();
58     if (!c.isConnected()) {
59         qWarning("Could not connect to DBus.");
60     }
61     return QDBusConnection::sessionBus();
62 }
63
64 QString DBusConnection::getAccessibilityBusAddress() const
65 {
66     QString address = getAccessibilityBusAddressDBus();
67     if (address.isEmpty()) {
68         address = getAccessibilityBusAddressXAtom();
69     }
70     return address;
71 }
72
73 QString DBusConnection::getAccessibilityBusAddressDBus() const
74 {
75     QDBusConnection c = QDBusConnection::sessionBus();
76
77     QDBusMessage m = QDBusMessage::createMethodCall("org.a11y.Bus",
78                                                     "/org/a11y/bus",
79                                                     "org.a11y.Bus", "GetAddress");
80     QDBusMessage reply = c.call(m);
81     if (reply.type() == QDBusMessage::ErrorMessage) {
82         qWarning() << "Qt at-spi: error getting the accessibility dbus address: " << reply.errorMessage();
83         return QString();
84     }
85
86     QString busAddress = reply.arguments().at(0).toString();
87     qDebug() << "Got bus address: " << busAddress;
88     return busAddress;
89 }
90
91 QString DBusConnection::getAccessibilityBusAddressXAtom() const
92 {
93     Display* bridge_display = QX11Info::display();
94
95     Atom actualType;
96     int actualFormat;
97     char *propData = 0;
98     unsigned long nItems;
99     unsigned long leftOver;
100     Atom AT_SPI_BUS = XInternAtom (bridge_display, "AT_SPI_BUS", False);
101     XGetWindowProperty (bridge_display,
102                         XDefaultRootWindow (bridge_display),
103                         AT_SPI_BUS, 0L,
104                         (long) BUFSIZ, False,
105                         (Atom) 31, &actualType, &actualFormat,
106                         &nItems, &leftOver,
107                         (unsigned char **) (void *) &propData);
108
109     QString busAddress = QString::fromLocal8Bit(propData);
110
111     XFree(propData);
112     return busAddress;
113 }
114
115 QDBusConnection DBusConnection::connection() const
116 {
117     return dbusConnection;
118 }