1 /*
2     Copyright 2012 Frederik Gladhorn <gladhorn@kde.org>
3 
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) version 3, or any
8     later version accepted by the membership of KDE e.V. (or its
9     successor approved by the membership of KDE e.V.), which shall
10     act as a proxy defined in Section 6 of version 3 of the license.
11 
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Lesser General Public License for more details.
16 
17     You should have received a copy of the GNU Lesser General Public
18     License along with this library.  If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef QACCESSIBILITYCLIENT_REGISTRY_P_H
22 #define QACCESSIBILITYCLIENT_REGISTRY_P_H
23 
24 #include <atspi/atspi-constants.h>
25 
26 #include <qobject.h>
27 #include <qmap.h>
28 #include <qdbuscontext.h>
29 #include <qdbusargument.h>
30 #include <qsignalmapper.h>
31 #include <qsharedpointer.h>
32 
33 #include "atspi/dbusconnection.h"
34 #include "qaccessibilityclient/registry.h"
35 #include "qaccessibilityclient/accessibleobject.h"
36 #include "qaccessibilityclient/accessibleobject_p.h"
37 #include "atspi/qt-atspi.h"
38 #include "cachestrategy_p.h"
39 
40 class QDBusPendingCallWatcher;
41 
42 namespace QAccessibleClient {
43 
44 class DBusConnection;
45 class AtSpiDBus;
46 
47 class RegistryPrivate :public QObject, public QDBusContext
48 {
49     Q_OBJECT
50 public:
51     RegistryPrivate(Registry *qq);
52 
53     void init();
54 
55     bool isEnabled() const;
56     void setEnabled(bool enable);
57     bool isScreenReaderEnabled() const;
58     void setScreenReaderEnabled(bool enable);
59 
60     QUrl url(const AccessibleObject &object) const;
61     AccessibleObject fromUrl(const QUrl &url) const;
62 
63     void subscribeEventListeners(const Registry::EventListeners & listeners);
64     Registry::EventListeners eventListeners() const;
65 
66     QString name(const AccessibleObject &object) const;
67     QString description(const AccessibleObject &object) const;
68     AccessibleObject::Role role(const AccessibleObject &object) const;
69     QString roleName(const AccessibleObject &object) const;
70     QString localizedRoleName(const AccessibleObject &object) const;
71     quint64 state(const AccessibleObject &object) const;
72     int layer(const AccessibleObject &object) const;
73     int mdiZOrder(const AccessibleObject &object) const;
74     double alpha(const AccessibleObject &object) const;
75     QRect boundingRect(const AccessibleObject &object) const;
76     QRect characterRect(const AccessibleObject &object, int offset) const;
77     AccessibleObject::Interfaces supportedInterfaces(const AccessibleObject &object) const;
78 
79     int caretOffset(const AccessibleObject &object) const;
80     int characterCount(const AccessibleObject &object) const;
81     QList< QPair<int,int> > textSelections(const AccessibleObject &object) const;
82     void setTextSelections(const AccessibleObject &object, const QList< QPair<int,int> > &selections);
83     QString text(const AccessibleObject &object, int startOffset = 0, int endOffset = -1) const;
84     QString textWithBoundary(const AccessibleObject &object, int offset, AccessibleObject::TextBoundary boundary, int *startOffset, int *endOffset) const;
85 
86     bool setText(const AccessibleObject &object, const QString &text);
87     bool insertText(const AccessibleObject &object, const QString &text, int position, int length = -1);
88     bool copyText(const AccessibleObject &object, int startPos, int endPos);
89     bool cutText(const AccessibleObject &object, int startPos, int endPos);
90     bool deleteText(const AccessibleObject &object, int startPos, int endPos);
91     bool pasteText(const AccessibleObject &object, int position);
92 
93     AccessibleObject application(const AccessibleObject &object) const;
94     QString appToolkitName(const AccessibleObject &object) const;
95     QString appVersion(const AccessibleObject &object) const;
96     int appId(const AccessibleObject &object) const;
97     QString appLocale(const AccessibleObject &object, uint lctype) const;
98     QString appBusAddress(const AccessibleObject &object) const;
99 
100     double minimumValue(const AccessibleObject &object) const;
101     double maximumValue(const AccessibleObject &object) const;
102     double minimumValueIncrement(const AccessibleObject &object) const;
103     double currentValue(const AccessibleObject &object) const;
104     bool setCurrentValue(const AccessibleObject &object, double value);
105 
106     QList<AccessibleObject> selection(const AccessibleObject &object) const;
107 
108     QString imageDescription(const AccessibleObject &object) const;
109     QString imageLocale(const AccessibleObject &object) const;
110     QRect imageRect(const AccessibleObject &object) const;
111 
112     QVector< QSharedPointer<QAction> > actions(const AccessibleObject &object);
113 
114     QList<AccessibleObject> topLevelAccessibles() const;
115     AccessibleObject parentAccessible(const AccessibleObject &object) const;
116 
117     int childCount(const AccessibleObject &object) const;
118     int indexInParent(const AccessibleObject &object) const;
119     AccessibleObject child(const AccessibleObject &object, int index) const;
120     QList<AccessibleObject> children(const AccessibleObject &object) const;
121 
122     static QString ACCESSIBLE_OBJECT_SCHEME_STRING;
123 
124 private Q_SLOTS:
125     AccessibleObject accessibleFromPath(const QString &service, const QString &path) const;
126     AccessibleObject accessibleFromReference(const QSpiObjectReference &reference) const;
127     AccessibleObject accessibleFromContext() const;
128 
129     void connectionFetched();
130     void slotSubscribeEventListenerFinished(QDBusPendingCallWatcher *call);
131     void a11yConnectionChanged(const QString &interface,const QVariantMap &changedProperties, const QStringList &invalidatedProperties);
132 
133     void slotPropertyChange(const QString &property, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
134     void slotWindowCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
135     void slotWindowDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
136     void slotWindowClose(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
137     void slotWindowReparent(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
138     void slotWindowMinimize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
139     void slotWindowMaximize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
140     void slotWindowRestore(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
141     void slotWindowActivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
142     void slotWindowDeactivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
143     void slotWindowDesktopCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
144     void slotWindowDesktopDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
145     void slotWindowRaise(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
146     void slotWindowLower(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
147     void slotWindowMove(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
148     void slotWindowResize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
149     void slotWindowShade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
150     void slotWindowUnshade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
151 
152     void slotStateChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
153     //void slotPropertyChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
154     //void slotBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
155     //void slotLinkSelected(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
156 
157     void slotChildrenChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
158     void slotVisibleDataChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
159     void slotSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
160     void slotModelChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
161 
162     void slotTextCaretMoved(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
163     void slotTextSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
164 
165     //void slotTextBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
166     void slotTextChanged(const QString &state, int start, int end, const QDBusVariant &text, const QAccessibleClient::QSpiObjectReference &reference);
167     //void slotTextAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
168     //void slotAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
169 
170     void actionTriggered(const QString &action);
171 
172 private:
173     QVariant getProperty ( const QString &service, const QString &path, const QString &interface, const QString &name ) const;
174     bool subscribeEvent(const QLatin1String &iface, const QLatin1String &signal);
175     static AccessibleObject::Role atspiRoleToRole(AtspiRole role);
176 
177     DBusConnection conn;
178     QSignalMapper m_actionMapper;
179     Registry *q;
180     Registry::EventListeners m_subscriptions;
181     Registry::EventListeners m_pendingSubscriptions;
182     QHash<QString, AccessibleObject::Interface> interfaceHash;
183     QSignalMapper m_eventMapper;
184     ObjectCache *m_cache;
185 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::Iterator AccessibleObjectsHashIterator;
186 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::ConstIterator AccessibleObjectsHashConstIterator;
187 //     QMap<QString, QSharedPointer<AccessibleObjectPrivate> > accessibleObjectsHash;
188     bool removeAccessibleObject(const QAccessibleClient::AccessibleObject &accessible);
189     bool removeAccessibleObject(const QAccessibleClient::QSpiObjectReference &reference);
190 
191     friend class Registry;
192     friend class AccessibleObject;
193     friend class AccessibleObjectPrivate;
194 };
195 
196 }
197 
198 #endif
199