File indexing completed on 2024-04-14 14:55:17

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 #ifndef QACCESSIBILITYCLIENT_REGISTRY_P_H
0008 #define QACCESSIBILITYCLIENT_REGISTRY_P_H
0009 
0010 #include <atspi/atspi-constants.h>
0011 
0012 #include <QObject>
0013 #include <QMap>
0014 #include <QDBusContext>
0015 #include <QSignalMapper>
0016 #include <QSharedPointer>
0017 
0018 #include "atspi/dbusconnection.h"
0019 #include "qaccessibilityclient/registry.h"
0020 #include "qaccessibilityclient/accessibleobject.h"
0021 #include "qaccessibilityclient/accessibleobject_p.h"
0022 #include "atspi/qt-atspi.h"
0023 #include "cachestrategy_p.h"
0024 
0025 class QDBusPendingCallWatcher;
0026 
0027 namespace QAccessibleClient {
0028 
0029 class DBusConnection;
0030 
0031 class RegistryPrivate :public QObject, public QDBusContext
0032 {
0033     Q_OBJECT
0034 public:
0035     RegistryPrivate(Registry *qq);
0036     ~RegistryPrivate() override;
0037 
0038     void init();
0039 
0040     bool isEnabled() const;
0041     void setEnabled(bool enable);
0042     bool isScreenReaderEnabled() const;
0043     void setScreenReaderEnabled(bool enable);
0044 
0045     QUrl url(const AccessibleObject &object) const;
0046     AccessibleObject fromUrl(const QUrl &url) const;
0047 
0048     void subscribeEventListeners(const Registry::EventListeners & listeners);
0049     Registry::EventListeners eventListeners() const;
0050 
0051     QString accessibleId(const AccessibleObject &object) const;
0052     QString name(const AccessibleObject &object) const;
0053     QString description(const AccessibleObject &object) const;
0054     AccessibleObject::Role role(const AccessibleObject &object) const;
0055     QString roleName(const AccessibleObject &object) const;
0056     QString localizedRoleName(const AccessibleObject &object) const;
0057     quint64 state(const AccessibleObject &object) const;
0058     int layer(const AccessibleObject &object) const;
0059     int mdiZOrder(const AccessibleObject &object) const;
0060     double alpha(const AccessibleObject &object) const;
0061     QRect boundingRect(const AccessibleObject &object) const;
0062     QRect characterRect(const AccessibleObject &object, int offset) const;
0063     AccessibleObject::Interfaces supportedInterfaces(const AccessibleObject &object) const;
0064 
0065     int caretOffset(const AccessibleObject &object) const;
0066     int characterCount(const AccessibleObject &object) const;
0067     QList< QPair<int,int> > textSelections(const AccessibleObject &object) const;
0068     void setTextSelections(const AccessibleObject &object, const QList< QPair<int,int> > &selections);
0069     QString text(const AccessibleObject &object, int startOffset = 0, int endOffset = -1) const;
0070     QString textWithBoundary(const AccessibleObject &object, int offset, AccessibleObject::TextBoundary boundary, int *startOffset, int *endOffset) const;
0071 
0072     bool setText(const AccessibleObject &object, const QString &text);
0073     bool insertText(const AccessibleObject &object, const QString &text, int position, int length = -1);
0074     bool copyText(const AccessibleObject &object, int startPos, int endPos);
0075     bool cutText(const AccessibleObject &object, int startPos, int endPos);
0076     bool deleteText(const AccessibleObject &object, int startPos, int endPos);
0077     bool pasteText(const AccessibleObject &object, int position);
0078 
0079     AccessibleObject application(const AccessibleObject &object) const;
0080     QString appToolkitName(const AccessibleObject &object) const;
0081     QString appVersion(const AccessibleObject &object) const;
0082     int appId(const AccessibleObject &object) const;
0083     QString appLocale(const AccessibleObject &object, uint lctype) const;
0084     QString appBusAddress(const AccessibleObject &object) const;
0085 
0086     double minimumValue(const AccessibleObject &object) const;
0087     double maximumValue(const AccessibleObject &object) const;
0088     double minimumValueIncrement(const AccessibleObject &object) const;
0089     double currentValue(const AccessibleObject &object) const;
0090     bool setCurrentValue(const AccessibleObject &object, double value);
0091 
0092     QList<AccessibleObject> selection(const AccessibleObject &object) const;
0093 
0094     QString imageDescription(const AccessibleObject &object) const;
0095     QString imageLocale(const AccessibleObject &object) const;
0096     QRect imageRect(const AccessibleObject &object) const;
0097 
0098     QVector< QSharedPointer<QAction> > actions(const AccessibleObject &object);
0099 
0100     QList<AccessibleObject> topLevelAccessibles() const;
0101     AccessibleObject parentAccessible(const AccessibleObject &object) const;
0102 
0103     int childCount(const AccessibleObject &object) const;
0104     int indexInParent(const AccessibleObject &object) const;
0105     AccessibleObject child(const AccessibleObject &object, int index) const;
0106     QList<AccessibleObject> children(const AccessibleObject &object) const;
0107 
0108     static QString ACCESSIBLE_OBJECT_SCHEME_STRING;
0109 
0110 private Q_SLOTS:
0111     AccessibleObject accessibleFromPath(const QString &service, const QString &path) const;
0112     AccessibleObject accessibleFromReference(const QSpiObjectReference &reference) const;
0113     AccessibleObject accessibleFromContext() const;
0114 
0115     void connectionFetched();
0116     void slotSubscribeEventListenerFinished(QDBusPendingCallWatcher *call);
0117     void a11yConnectionChanged(const QString &interface,const QVariantMap &changedProperties, const QStringList &invalidatedProperties);
0118 
0119     void slotPropertyChange(const QString &property, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0120     void slotWindowCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0121     void slotWindowDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0122     void slotWindowClose(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0123     void slotWindowReparent(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0124     void slotWindowMinimize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0125     void slotWindowMaximize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0126     void slotWindowRestore(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0127     void slotWindowActivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0128     void slotWindowDeactivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0129     void slotWindowDesktopCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0130     void slotWindowDesktopDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0131     void slotWindowRaise(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0132     void slotWindowLower(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0133     void slotWindowMove(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0134     void slotWindowResize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0135     void slotWindowShade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0136     void slotWindowUnshade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0137 
0138     void slotStateChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0139     //void slotPropertyChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0140     //void slotBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0141     //void slotLinkSelected(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0142 
0143     void slotChildrenChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0144     void slotVisibleDataChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0145     void slotSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0146     void slotModelChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0147 
0148     void slotTextCaretMoved(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0149     void slotTextSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0150 
0151     //void slotTextBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0152     void slotTextChanged(const QString &state, int start, int end, const QDBusVariant &text, const QAccessibleClient::QSpiObjectReference &reference);
0153     //void slotTextAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0154     //void slotAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0155 
0156     void actionTriggered(const QString &action);
0157 
0158 private:
0159     QVariant getProperty ( const QString &service, const QString &path, const QString &interface, const QString &name ) const;
0160     static AccessibleObject::Role atspiRoleToRole(AtspiRole role);
0161 
0162     DBusConnection conn;
0163     QSignalMapper m_actionMapper;
0164     Registry *const q;
0165     Registry::EventListeners m_subscriptions;
0166     Registry::EventListeners m_pendingSubscriptions;
0167     QHash<QString, AccessibleObject::Interface> interfaceHash;
0168     QSignalMapper m_eventMapper;
0169     ObjectCache *m_cache = nullptr;
0170 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::Iterator AccessibleObjectsHashIterator;
0171 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::ConstIterator AccessibleObjectsHashConstIterator;
0172 //     QMap<QString, QSharedPointer<AccessibleObjectPrivate> > accessibleObjectsHash;
0173     bool removeAccessibleObject(const QAccessibleClient::AccessibleObject &accessible);
0174     bool removeAccessibleObject(const QAccessibleClient::QSpiObjectReference &reference);
0175 
0176     friend class Registry;
0177     friend class AccessibleObject;
0178     friend class AccessibleObjectPrivate;
0179 };
0180 
0181 }
0182 
0183 #endif