File indexing completed on 2024-04-28 03:52:01

0001 /*
0002  * BluezQt - Asynchronous Bluez wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "devicesmodel.h"
0010 #include "adapter.h"
0011 #include "device.h"
0012 #include "manager.h"
0013 
0014 namespace BluezQt
0015 {
0016 class DevicesModelPrivate : public QObject
0017 {
0018 public:
0019     explicit DevicesModelPrivate(DevicesModel *qq);
0020 
0021     void init();
0022 
0023     void deviceAdded(DevicePtr device);
0024     void deviceRemoved(DevicePtr device);
0025     void deviceChanged(DevicePtr device);
0026     void adapterChanged(AdapterPtr adapter);
0027 
0028     DevicesModel *q;
0029     Manager *m_manager;
0030     QList<DevicePtr> m_devices;
0031 };
0032 
0033 DevicesModelPrivate::DevicesModelPrivate(DevicesModel *qq)
0034     : QObject(qq)
0035     , q(qq)
0036     , m_manager(nullptr)
0037 {
0038 }
0039 
0040 void DevicesModelPrivate::init()
0041 {
0042     m_devices = m_manager->devices();
0043 
0044     connect(m_manager, &Manager::deviceAdded, this, &DevicesModelPrivate::deviceAdded);
0045     connect(m_manager, &Manager::deviceRemoved, this, &DevicesModelPrivate::deviceRemoved);
0046     connect(m_manager, &Manager::deviceChanged, this, &DevicesModelPrivate::deviceChanged);
0047     connect(m_manager, &Manager::adapterChanged, this, &DevicesModelPrivate::adapterChanged);
0048 }
0049 
0050 void DevicesModelPrivate::deviceAdded(DevicePtr device)
0051 {
0052     q->beginInsertRows(QModelIndex(), m_devices.size(), m_devices.size());
0053     m_devices.append(device);
0054     q->endInsertRows();
0055 }
0056 
0057 void DevicesModelPrivate::deviceRemoved(DevicePtr device)
0058 {
0059     int offset = m_devices.indexOf(device);
0060     Q_ASSERT(offset >= 0);
0061 
0062     q->beginRemoveRows(QModelIndex(), offset, offset);
0063     m_devices.removeAt(offset);
0064     q->endRemoveRows();
0065 }
0066 
0067 void DevicesModelPrivate::deviceChanged(DevicePtr device)
0068 {
0069     int offset = m_devices.indexOf(device);
0070     Q_ASSERT(offset >= 0);
0071 
0072     QModelIndex idx = q->createIndex(offset, 0);
0073     Q_EMIT q->dataChanged(idx, idx);
0074 }
0075 
0076 void DevicesModelPrivate::adapterChanged(AdapterPtr adapter)
0077 {
0078     const auto devices = adapter->devices();
0079     for (const DevicePtr &device : devices) {
0080         deviceChanged(device);
0081     }
0082 }
0083 
0084 DevicesModel::DevicesModel(Manager *manager, QObject *parent)
0085     : QAbstractListModel(parent)
0086     , d(new DevicesModelPrivate(this))
0087 {
0088     d->m_manager = manager;
0089     d->init();
0090 }
0091 
0092 DevicesModel::~DevicesModel() = default;
0093 
0094 QHash<int, QByteArray> DevicesModel::roleNames() const
0095 {
0096     QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
0097 
0098     roles[UbiRole] = QByteArrayLiteral("Ubi");
0099     roles[AddressRole] = QByteArrayLiteral("Address");
0100     roles[NameRole] = QByteArrayLiteral("Name");
0101     roles[FriendlyNameRole] = QByteArrayLiteral("FriendlyName");
0102     roles[RemoteNameRole] = QByteArrayLiteral("RemoteName");
0103     roles[ClassRole] = QByteArrayLiteral("Class");
0104     roles[TypeRole] = QByteArrayLiteral("Type");
0105     roles[AppearanceRole] = QByteArrayLiteral("Appearance");
0106     roles[IconRole] = QByteArrayLiteral("Icon");
0107     roles[PairedRole] = QByteArrayLiteral("Paired");
0108     roles[TrustedRole] = QByteArrayLiteral("Trusted");
0109     roles[BlockedRole] = QByteArrayLiteral("Blocked");
0110     roles[LegacyPairingRole] = QByteArrayLiteral("LegacyPairing");
0111     roles[RssiRole] = QByteArrayLiteral("Rssi");
0112     roles[ConnectedRole] = QByteArrayLiteral("Connected");
0113     roles[UuidsRole] = QByteArrayLiteral("Uuids");
0114     roles[ModaliasRole] = QByteArrayLiteral("Modalias");
0115     roles[AdapterNameRole] = QByteArrayLiteral("AdapterName");
0116     roles[AdapterAddressRole] = QByteArrayLiteral("AdapterAddress");
0117     roles[AdapterPoweredRole] = QByteArrayLiteral("AdapterPowered");
0118     roles[AdapterDiscoverableRole] = QByteArrayLiteral("AdapterDiscoverable");
0119     roles[AdapterPairableRole] = QByteArrayLiteral("AdapterPairable");
0120     roles[AdapterDiscoveringRole] = QByteArrayLiteral("AdapterDiscovering");
0121     roles[AdapterUuidsRole] = QByteArrayLiteral("AdapterUuids");
0122 
0123     return roles;
0124 }
0125 
0126 int DevicesModel::rowCount(const QModelIndex &parent) const
0127 {
0128     if (parent.isValid()) {
0129         return 0;
0130     }
0131     return d->m_devices.size();
0132 }
0133 
0134 QVariant DevicesModel::data(const QModelIndex &index, int role) const
0135 {
0136     DevicePtr dev = device(index);
0137     if (!dev) {
0138         return QVariant();
0139     }
0140 
0141     switch (role) {
0142     case Qt::DisplayRole:
0143         return dev->name();
0144     case UbiRole:
0145         return dev->ubi();
0146     case AddressRole:
0147         return dev->address();
0148     case NameRole:
0149         return dev->name();
0150     case FriendlyNameRole:
0151         return dev->friendlyName();
0152     case RemoteNameRole:
0153         return dev->remoteName();
0154     case ClassRole:
0155         return dev->deviceClass();
0156     case TypeRole:
0157         return dev->type();
0158     case AppearanceRole:
0159         return dev->appearance();
0160     case IconRole:
0161         return dev->icon();
0162     case PairedRole:
0163         return dev->isPaired();
0164     case TrustedRole:
0165         return dev->isTrusted();
0166     case BlockedRole:
0167         return dev->isBlocked();
0168     case LegacyPairingRole:
0169         return dev->hasLegacyPairing();
0170     case RssiRole:
0171         return dev->rssi();
0172     case ConnectedRole:
0173         return dev->isConnected();
0174     case UuidsRole:
0175         return dev->uuids();
0176     case ModaliasRole:
0177         return dev->modalias();
0178     case AdapterNameRole:
0179         return dev->adapter()->name();
0180     case AdapterAddressRole:
0181         return dev->adapter()->address();
0182     case AdapterPoweredRole:
0183         return dev->adapter()->isPowered();
0184     case AdapterDiscoverableRole:
0185         return dev->adapter()->isDiscoverable();
0186     case AdapterPairableRole:
0187         return dev->adapter()->isPairable();
0188     case AdapterDiscoveringRole:
0189         return dev->adapter()->isDiscovering();
0190     case AdapterUuidsRole:
0191         return dev->adapter()->uuids();
0192     default:
0193         return QVariant();
0194     }
0195 }
0196 
0197 QModelIndex DevicesModel::index(int row, int column, const QModelIndex &parent) const
0198 {
0199     if (!hasIndex(row, column, parent)) {
0200         return QModelIndex();
0201     }
0202     return createIndex(row, 0);
0203 }
0204 
0205 DevicePtr DevicesModel::device(const QModelIndex &index) const
0206 {
0207     if (!index.isValid()) {
0208         return DevicePtr();
0209     }
0210     return d->m_devices.at(index.row());
0211 }
0212 
0213 } // namespace BluezQt
0214 
0215 #include "moc_devicesmodel.cpp"