1 /*
2     Copyright 2018 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 #include <QCoreApplication>
22 #include <QTextStream>
23 
24 #include "dumper.h"
25 
26 using namespace QAccessibleClient;
27 
28 QTextStream out(stdout);
29 
Dumper(QObject * parent)30 Dumper::Dumper(QObject *parent)
31     : QObject(parent)
32 {
33 }
34 
run(const QString & appname) const35 void Dumper::run(const QString &appname) const {
36     Registry r;
37     const auto apps = r.applications();
38     for (const AccessibleObject &app : apps) {
39         if (appname.isEmpty() || app.name().contains(appname)) {
40             printChild(app);
41         }
42     }
43 }
44 
printChild(const AccessibleObject & object,int indent) const45 void Dumper::printChild(const AccessibleObject &object, int indent) const
46 {
47     auto spaces = QStringLiteral("  ");
48     if (!object.isValid()) {
49         out << spaces.repeated(indent) << "INVALID CHILD" << endl;
50         return;
51     }
52 
53     auto name = object.name().isEmpty() ? QStringLiteral("[unnamed]") : object.name();
54     QString info = QString("%1 [%2 - %3] '%4'").arg(name, QString::number(object.role()), object.roleName(), object.description());
55     if (m_showStates) {
56         info += QString(" [%1]").arg(object.stateString());
57     }
58     out << spaces.repeated(indent) << info << endl;
59     int childCount = object.childCount();
60     for (int i = 0; i < childCount; ++i) {
61         AccessibleObject child = object.child(i);
62         // simple test if the parent is consistent
63         if (child.parent() != object) {
64             out << spaces.repeated(indent + 4) << "WARNING: inconsistent parent/child hierarchy";
65         }
66         if (child.indexInParent() != i) {
67             out << spaces.repeated(indent + 4) << QString::fromLatin1("WARNING: child index inconsistent: child claims to be child %1 parent thinks it is %2").arg(child.indexInParent(), i);
68         }
69         printChild(child, indent + 1);
70     }
71 }
72