File indexing completed on 2024-04-21 05:25:19

0001 /*
0002     SPDX-FileCopyrightText: 2022 Aditya Mehra <aix.m@outlook.com>
0003     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #include "devicesmodel.h"
0007 #include <QDBusConnection>
0008 #include <QDBusConnectionInterface>
0009 #include <QDBusInterface>
0010 #include <QDBusMessage>
0011 #include <QDBusArgument>
0012 #include <QDebug>
0013 
0014 DevicesModel::DevicesModel(QObject *parent)
0015     : QAbstractListModel(parent)
0016 {
0017     m_roleNames[DeviceTypeRole] = "deviceType";
0018     m_roleNames[DeviceNameRole] = "deviceName";
0019     m_roleNames[DeviceUniqueIdentifierRole] = "deviceUniqueIdentifier";
0020     m_roleNames[DeviceIconNameRole] = "deviceIconName";
0021 
0022     ControllerManagerDBusInterface *iface = new ControllerManagerDBusInterface("org.kde.plasma.remotecontrollers", "/ControllerManager", "org.kde.plasma.remotecontrollers.ControllerManager", QDBusConnection::sessionBus(), this);
0023     if(iface->isValid()) {
0024         connect(iface, &ControllerManagerDBusInterface::deviceConnected, this, &DevicesModel::deviceConnected);
0025         connect(iface, &ControllerManagerDBusInterface::deviceDisconnected, this, &DevicesModel::deviceDisconnected);
0026     }
0027 
0028     load();
0029 }
0030 
0031 DevicesModel::~DevicesModel()
0032 {
0033 }
0034 
0035 QHash<int, QByteArray> DevicesModel::roleNames() const
0036 {
0037     return m_roleNames;
0038 }
0039 
0040 int DevicesModel::count() const
0041 {
0042     return m_devices.count();
0043 }
0044 
0045 int DevicesModel::rowCount(const QModelIndex &) const
0046 {
0047     return m_devices.size();
0048 }
0049 
0050 QVariant DevicesModel::data(const QModelIndex &index, int role) const
0051 {
0052     if (index.row() >= m_devices.size())
0053         return QVariant();
0054 
0055     auto device = m_devices[index.row()];
0056     switch (role) {
0057     case DeviceTypeRole:
0058         return device["deviceType"];
0059     case DeviceNameRole:
0060         return device["deviceName"];
0061     case DeviceUniqueIdentifierRole:
0062         return device["deviceUniqueIdentifier"];
0063     case DeviceIconNameRole:
0064         return device["deviceIconName"];
0065     default:
0066         return QVariant();
0067     }
0068 
0069     return QVariant();
0070 }
0071 
0072 QVariantMap DevicesModel::get(int index) const
0073 {
0074     if (index >= m_devices.size())
0075         return QVariantMap();
0076 
0077     auto device = m_devices[index];
0078     QVariantMap map;
0079     map["deviceType"] = device["deviceType"];
0080     map["deviceName"] = device["deviceName"];
0081     map["deviceUniqueIdentifier"] = device["deviceUniqueIdentifier"];
0082     map["deviceIconName"] = device["deviceIconName"];
0083     return map;
0084 }
0085 
0086 QModelIndex DevicesModel::indexOf(const QString &uniqueIdentifier) const
0087 {
0088     for (int i = 0; i < m_devices.size(); ++i) {
0089         if (m_devices[i]["deviceUniqueIdentifier"] == uniqueIdentifier) {
0090             return index(i);
0091         }
0092     }
0093     return QModelIndex();
0094 }
0095 
0096 void DevicesModel::load()
0097 {
0098     beginResetModel();
0099     m_devices.clear();
0100 
0101     QStringList devices = connectedDevices();
0102 
0103     QVariantMap device;
0104     for (const QString &uniqueIdentifier : devices) {
0105         device["deviceName"] = deviceName(uniqueIdentifier);
0106         device["deviceType"] = deviceType(uniqueIdentifier);
0107         device["deviceUniqueIdentifier"] = uniqueIdentifier;
0108         device["deviceIconName"] = deviceIconName(uniqueIdentifier);
0109         m_devices.append(device);
0110     }
0111 
0112     endResetModel();
0113 }
0114 
0115 void DevicesModel::deviceConnected(const QString &uniqueIdentifier)
0116 {
0117     QVariantMap device;
0118     device["deviceName"] = deviceName(uniqueIdentifier);
0119     device["deviceType"] = deviceType(uniqueIdentifier);
0120     device["deviceUniqueIdentifier"] = uniqueIdentifier;
0121     device["deviceIconName"] = deviceIconName(uniqueIdentifier);
0122     beginInsertRows(QModelIndex(), m_devices.size(), m_devices.size());
0123     m_devices.append(device);
0124     endInsertRows();
0125 }
0126 
0127 void DevicesModel::deviceDisconnected(const QString &uniqueIdentifier)
0128 {
0129     for (int i = 0; i < m_devices.size(); ++i) {
0130         if (m_devices[i]["deviceUniqueIdentifier"] == uniqueIdentifier) {
0131             beginRemoveRows(QModelIndex(), i, i);
0132             m_devices.removeAt(i);
0133             endRemoveRows();
0134             break;
0135         }
0136     }
0137 }
0138 
0139 QStringList DevicesModel::connectedDevices()
0140 {
0141     QDBusMessage message = QDBusMessage::createMethodCall("org.kde.plasma.remotecontrollers", "/ControllerManager", "org.kde.plasma.remotecontrollers.ControllerManager", "connectedDevices");
0142     QDBusMessage reply = QDBusConnection::sessionBus().call(message);
0143     if (reply.type() == QDBusMessage::ErrorMessage) {
0144         return QStringList();
0145     }
0146     return reply.arguments().at(0).toStringList();
0147 }
0148 
0149 QString DevicesModel::deviceName(const QString &uniqueIdentifier)
0150 {
0151     QDBusMessage message = QDBusMessage::createMethodCall("org.kde.plasma.remotecontrollers", "/ControllerManager", "org.kde.plasma.remotecontrollers.ControllerManager", "deviceName");
0152     message << uniqueIdentifier;
0153     QDBusMessage reply = QDBusConnection::sessionBus().call(message);
0154     if (reply.type() == QDBusMessage::ErrorMessage) {
0155         return QString();
0156     }
0157     return reply.arguments().at(0).toString();
0158 }
0159 
0160 int DevicesModel::deviceType(const QString &uniqueIdentifier)
0161 {
0162     QDBusMessage message = QDBusMessage::createMethodCall("org.kde.plasma.remotecontrollers", "/ControllerManager", "org.kde.plasma.remotecontrollers.ControllerManager", "deviceType");
0163     message << uniqueIdentifier;
0164     QDBusMessage reply = QDBusConnection::sessionBus().call(message);
0165     if (reply.type() == QDBusMessage::ErrorMessage) {
0166         return -1;
0167     }
0168     QVariant variant = reply.arguments().at(0);
0169     return variant.value<int>();
0170 }
0171 
0172 QString DevicesModel::deviceIconName(const QString &uniqueIdentifier)
0173 {
0174     QDBusMessage message = QDBusMessage::createMethodCall("org.kde.plasma.remotecontrollers", "/ControllerManager", "org.kde.plasma.remotecontrollers.ControllerManager", "deviceIconName");
0175     message << uniqueIdentifier;
0176     QDBusMessage reply = QDBusConnection::sessionBus().call(message);
0177     if (reply.type() == QDBusMessage::ErrorMessage) {
0178         return QString();
0179     }
0180     QVariant variant = reply.arguments().at(0);
0181     return variant.value<QString>();
0182 }
0183 
0184 #include "moc_devicesmodel.cpp"