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"