File indexing completed on 2024-05-12 15:32:33

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