File indexing completed on 2024-05-12 03:53:11

0001 /*
0002  * BluezQt - Asynchronous Bluez wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2014-2015 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 "declarativemanager.h"
0010 #include "adapter.h"
0011 #include "declarativeadapter.h"
0012 #include "declarativedevice.h"
0013 #include "device.h"
0014 #include "initmanagerjob.h"
0015 static qsizetype adaptersCountFunction(QQmlListProperty<DeclarativeAdapter> *property)
0016 {
0017     Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
0018     DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
0019 
0020     return manager->m_adapters.count();
0021 }
0022 
0023 static DeclarativeAdapter *adaptersAtFunction(QQmlListProperty<DeclarativeAdapter> *property, qsizetype index)
0024 {
0025     Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
0026     DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
0027 
0028     return manager->m_adapters.values().at(index);
0029 }
0030 
0031 static qsizetype devicesCountFunction(QQmlListProperty<DeclarativeDevice> *property)
0032 {
0033     Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
0034     DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
0035 
0036     return manager->m_devices.count();
0037 }
0038 
0039 static DeclarativeDevice *devicesAtFunction(QQmlListProperty<DeclarativeDevice> *property, qsizetype index)
0040 {
0041     Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
0042     DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
0043 
0044     return manager->m_devices.values().at(index);
0045 }
0046 
0047 DeclarativeManager::DeclarativeManager(QObject *parent)
0048     : BluezQt::Manager(parent)
0049 {
0050     BluezQt::InitManagerJob *job = init();
0051     job->start();
0052     connect(job, &BluezQt::InitManagerJob::result, this, &DeclarativeManager::initJobResult);
0053 
0054     connect(this, &BluezQt::Manager::adapterAdded, this, &DeclarativeManager::slotAdapterAdded);
0055     connect(this, &BluezQt::Manager::adapterRemoved, this, &DeclarativeManager::slotAdapterRemoved);
0056     connect(this, &BluezQt::Manager::usableAdapterChanged, this, &DeclarativeManager::slotUsableAdapterChanged);
0057     connect(this, &BluezQt::Manager::deviceAdded, this, &DeclarativeManager::slotDeviceAdded);
0058     connect(this, &BluezQt::Manager::deviceRemoved, this, &DeclarativeManager::slotDeviceRemoved);
0059 
0060     connect(this, &BluezQt::Manager::adapterChanged, this, [this](const BluezQt::AdapterPtr &adapter) {
0061         Q_EMIT adapterChanged(declarativeAdapterFromPtr(adapter));
0062     });
0063 
0064     connect(this, &BluezQt::Manager::deviceChanged, this, [this](const BluezQt::DevicePtr &device) {
0065         Q_EMIT deviceChanged(declarativeDeviceFromPtr(device));
0066     });
0067 }
0068 
0069 DeclarativeAdapter *DeclarativeManager::usableAdapter() const
0070 {
0071     return declarativeAdapterFromPtr(BluezQt::Manager::usableAdapter());
0072 }
0073 
0074 QQmlListProperty<DeclarativeAdapter> DeclarativeManager::declarativeAdapters()
0075 {
0076     return QQmlListProperty<DeclarativeAdapter>(this, nullptr, adaptersCountFunction, adaptersAtFunction);
0077 }
0078 
0079 QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeDevices()
0080 {
0081     return QQmlListProperty<DeclarativeDevice>(this, nullptr, devicesCountFunction, devicesAtFunction);
0082 }
0083 
0084 DeclarativeAdapter *DeclarativeManager::declarativeAdapterFromPtr(BluezQt::AdapterPtr ptr) const
0085 {
0086     if (!ptr) {
0087         return nullptr;
0088     }
0089     return m_adapters.value(ptr->ubi());
0090 }
0091 
0092 DeclarativeDevice *DeclarativeManager::declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const
0093 {
0094     if (!ptr) {
0095         return nullptr;
0096     }
0097     return m_devices.value(ptr->ubi());
0098 }
0099 
0100 DeclarativeAdapter *DeclarativeManager::adapterForAddress(const QString &address) const
0101 {
0102     return declarativeAdapterFromPtr(BluezQt::Manager::adapterForAddress(address));
0103 }
0104 
0105 DeclarativeAdapter *DeclarativeManager::adapterForUbi(const QString &ubi) const
0106 {
0107     return declarativeAdapterFromPtr(BluezQt::Manager::adapterForUbi(ubi));
0108 }
0109 
0110 DeclarativeDevice *DeclarativeManager::deviceForAddress(const QString &address) const
0111 {
0112     return declarativeDeviceFromPtr(BluezQt::Manager::deviceForAddress(address));
0113 }
0114 
0115 DeclarativeDevice *DeclarativeManager::deviceForUbi(const QString &ubi) const
0116 {
0117     return declarativeDeviceFromPtr(BluezQt::Manager::deviceForUbi(ubi));
0118 }
0119 
0120 void DeclarativeManager::initJobResult(BluezQt::InitManagerJob *job)
0121 {
0122     if (job->error()) {
0123         Q_EMIT initError(job->errorText());
0124         return;
0125     }
0126 
0127     Q_EMIT initFinished();
0128 }
0129 
0130 void DeclarativeManager::slotAdapterAdded(BluezQt::AdapterPtr adapter)
0131 {
0132     DeclarativeAdapter *dAdapter = new DeclarativeAdapter(adapter, this);
0133     m_adapters[adapter->ubi()] = dAdapter;
0134 
0135     Q_EMIT adapterAdded(dAdapter);
0136     Q_EMIT adaptersChanged(declarativeAdapters());
0137 }
0138 
0139 void DeclarativeManager::slotAdapterRemoved(BluezQt::AdapterPtr adapter)
0140 {
0141     DeclarativeAdapter *dAdapter = m_adapters.take(adapter->ubi());
0142     dAdapter->deleteLater();
0143 
0144     Q_EMIT adapterRemoved(dAdapter);
0145     Q_EMIT adaptersChanged(declarativeAdapters());
0146 }
0147 
0148 void DeclarativeManager::slotDeviceAdded(BluezQt::DevicePtr device)
0149 {
0150     DeclarativeAdapter *dAdapter = declarativeAdapterFromPtr(device->adapter());
0151     DeclarativeDevice *dDevice = new DeclarativeDevice(device, dAdapter);
0152     m_devices[device->ubi()] = dDevice;
0153     dAdapter->m_devices[device->ubi()] = dDevice;
0154 
0155     Q_EMIT deviceAdded(dDevice);
0156     Q_EMIT devicesChanged(declarativeDevices());
0157 }
0158 
0159 void DeclarativeManager::slotDeviceRemoved(BluezQt::DevicePtr device)
0160 {
0161     DeclarativeDevice *dDevice = m_devices.take(device->ubi());
0162     dDevice->adapter()->m_devices.take(device->ubi());
0163     dDevice->deleteLater();
0164 
0165     Q_EMIT deviceRemoved(dDevice);
0166     Q_EMIT devicesChanged(declarativeDevices());
0167 }
0168 
0169 void DeclarativeManager::slotUsableAdapterChanged(BluezQt::AdapterPtr adapter)
0170 {
0171     Q_EMIT usableAdapterChanged(declarativeAdapterFromPtr(adapter));
0172 }
0173 
0174 #include "moc_declarativemanager.cpp"