File indexing completed on 2024-05-05 13:58:47
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"