File indexing completed on 2024-05-12 05:12:43

0001 /*
0002     SPDX-FileCopyrightText: 2010 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "agentconfigmodel.h"
0008 
0009 #include "akonadiconsole_debug.h"
0010 #include <QDBusInterface>
0011 #include <QMetaMethod>
0012 
0013 AgentConfigModel::AgentConfigModel(QObject *parent)
0014     : QAbstractTableModel(parent)
0015 {
0016 }
0017 
0018 AgentConfigModel::~AgentConfigModel()
0019 {
0020     delete m_interface;
0021 }
0022 
0023 void AgentConfigModel::setAgentInstance(const Akonadi::AgentInstance &instance)
0024 {
0025     beginResetModel();
0026     m_settings.clear();
0027 
0028     m_interface = new QDBusInterface(QStringLiteral("org.freedesktop.Akonadi.Agent.%1").arg(instance.identifier()), QStringLiteral("/Settings"));
0029     if (!m_interface->isValid()) {
0030         qCritical() << "Unable to obtain KConfigXT D-Bus interface of agent" << instance.identifier();
0031         delete m_interface;
0032         return;
0033     }
0034     endResetModel();
0035     reload();
0036 }
0037 
0038 void AgentConfigModel::reload()
0039 {
0040     beginResetModel();
0041     m_settings.clear();
0042     for (int i = 0; i < m_interface->metaObject()->methodCount(); ++i) {
0043         const QMetaMethod method = m_interface->metaObject()->method(i);
0044         if (QByteArray(method.typeName()).isEmpty()) { // returns void
0045             continue;
0046         }
0047         const QByteArray signature(method.methodSignature());
0048         if (signature.isEmpty()) {
0049             continue;
0050         }
0051         if (signature.startsWith("set") || !signature.contains("()")) { // setter or takes parameters // krazy:exclude=strings
0052             continue;
0053         }
0054         if (signature.startsWith("Introspect")) { // D-Bus stuff // krazy:exclude=strings
0055             continue;
0056         }
0057         const QString methodName = QString::fromLatin1(signature.left(signature.indexOf('(')));
0058         const QDBusMessage reply = m_interface->call(methodName);
0059         if (reply.arguments().count() != 1) {
0060             qCCritical(AKONADICONSOLE_LOG) << "call to method" << signature << "failed: " << reply.arguments() << reply.errorMessage();
0061             continue;
0062         }
0063         const QString settingName = methodName.at(0).toUpper() + methodName.mid(1);
0064         m_settings.append(qMakePair(settingName, reply.arguments().at(0)));
0065     }
0066     endResetModel();
0067 }
0068 
0069 int AgentConfigModel::columnCount(const QModelIndex &parent) const
0070 {
0071     Q_UNUSED(parent)
0072     return 3;
0073 }
0074 
0075 int AgentConfigModel::rowCount(const QModelIndex &parent) const
0076 {
0077     Q_UNUSED(parent)
0078     return m_settings.size();
0079 }
0080 
0081 QVariant AgentConfigModel::data(const QModelIndex &index, int role) const
0082 {
0083     if (index.row() < 0 || index.row() >= m_settings.size()) {
0084         return {};
0085     }
0086     QPair<QString, QVariant> setting = m_settings.at(index.row());
0087     if (role == Qt::DisplayRole || role == Qt::EditRole) {
0088         if (index.column() == 0) {
0089             return setting.first;
0090         } else if (index.column() == 1) {
0091             if (setting.second.metaType().id() == QMetaType::QStringList) {
0092                 return setting.second.toStringList().join(QStringLiteral(", "));
0093             } else {
0094                 return setting.second;
0095             }
0096         } else if (index.column() == 2) {
0097             return QLatin1StringView(setting.second.typeName());
0098         }
0099     }
0100     return {};
0101 }
0102 
0103 bool AgentConfigModel::setData(const QModelIndex &index, const QVariant &value, int role)
0104 {
0105     if (index.column() == 1 && role == Qt::EditRole && index.row() >= 0 && index.row() < m_settings.size()) {
0106         const QPair<QString, QVariant> setting = m_settings.at(index.row());
0107         if (setting.second != value) {
0108             m_interface->call(QStringLiteral("set%1").arg(setting.first), value);
0109             reload();
0110         }
0111     }
0112     return QAbstractItemModel::setData(index, value, role);
0113 }
0114 
0115 QVariant AgentConfigModel::headerData(int section, Qt::Orientation orientation, int role) const
0116 {
0117     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
0118         if (section == 0) {
0119             return QStringLiteral("Setting");
0120         } else if (section == 1) {
0121             return QStringLiteral("Value");
0122         } else if (section == 2) {
0123             return QStringLiteral("Type");
0124         }
0125     }
0126     return QAbstractItemModel::headerData(section, orientation, role);
0127 }
0128 
0129 Qt::ItemFlags AgentConfigModel::flags(const QModelIndex &index) const
0130 {
0131     if (index.column() == 1) {
0132         return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
0133     }
0134     return QAbstractItemModel::flags(index);
0135 }
0136 
0137 void AgentConfigModel::writeConfig()
0138 {
0139     m_interface->call(QStringLiteral("save"));
0140 }
0141 
0142 #include "moc_agentconfigmodel.cpp"