File indexing completed on 2025-01-19 12:42:13
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"