1/*
2 * BluezQt - Asynchronous Bluez wrapper library
3 *
4 * SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
5 *
6 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8
9#include "declarativemanager.h"
10#include "adapter.h"
11#include "declarativeadapter.h"
12#include "declarativedevice.h"
13#include "device.h"
14#include "initmanagerjob.h"
15#include <algorithm>
16static qsizetype adaptersCountFunction(QQmlListProperty<DeclarativeAdapter> *property)
17{
18 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
19 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
20
21 return manager->m_adapters.count();
22}
23
24static DeclarativeAdapter *adaptersAtFunction(QQmlListProperty<DeclarativeAdapter> *property, qsizetype index)
25{
26 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
27 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
28
29 return manager->m_adapters.values().at(i: index);
30}
31
32static qsizetype devicesCountFunction(QQmlListProperty<DeclarativeDevice> *property)
33{
34 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
35 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
36
37 return manager->m_devices.count();
38}
39
40static DeclarativeDevice *devicesAtFunction(QQmlListProperty<DeclarativeDevice> *property, qsizetype index)
41{
42 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
43 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
44
45 return manager->m_devices.values().at(i: index);
46}
47
48static qsizetype connectedDevicesCountFunction(QQmlListProperty<DeclarativeDevice> *property)
49{
50 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
51 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
52
53 return std::ranges::count_if(manager->m_devices.values(), [](DeclarativeDevice *device) {
54 return device->isConnected();
55 });
56}
57
58static DeclarativeDevice *connectedDevicesAtFunction(QQmlListProperty<DeclarativeDevice> *property, qsizetype index)
59{
60 Q_ASSERT(qobject_cast<DeclarativeManager *>(property->object));
61 DeclarativeManager *manager = static_cast<DeclarativeManager *>(property->object);
62
63 int i = 0;
64 for (const auto device : manager->m_devices) {
65 if (device->isConnected()) {
66 if (index == i) {
67 return device;
68 }
69 i++;
70 }
71 }
72 return nullptr;
73}
74
75DeclarativeManager::DeclarativeManager(QObject *parent)
76 : BluezQt::Manager(parent)
77{
78 BluezQt::InitManagerJob *job = init();
79 job->start();
80 connect(sender: job, signal: &BluezQt::InitManagerJob::result, context: this, slot: &DeclarativeManager::initJobResult);
81
82 connect(sender: this, signal: &BluezQt::Manager::adapterAdded, context: this, slot: &DeclarativeManager::slotAdapterAdded);
83 connect(sender: this, signal: &BluezQt::Manager::adapterRemoved, context: this, slot: &DeclarativeManager::slotAdapterRemoved);
84 connect(sender: this, signal: &BluezQt::Manager::usableAdapterChanged, context: this, slot: &DeclarativeManager::slotUsableAdapterChanged);
85 connect(sender: this, signal: &BluezQt::Manager::deviceAdded, context: this, slot: &DeclarativeManager::slotDeviceAdded);
86 connect(sender: this, signal: &BluezQt::Manager::deviceRemoved, context: this, slot: &DeclarativeManager::slotDeviceRemoved);
87
88 connect(sender: this, signal: &BluezQt::Manager::adapterChanged, context: this, slot: [this](const BluezQt::AdapterPtr &adapter) {
89 Q_EMIT adapterChanged(adapter: declarativeAdapterFromPtr(ptr: adapter));
90 });
91
92 connect(sender: this, signal: &BluezQt::Manager::deviceChanged, context: this, slot: [this](const BluezQt::DevicePtr &device) {
93 Q_EMIT deviceChanged(device: declarativeDeviceFromPtr(ptr: device));
94 });
95}
96
97DeclarativeAdapter *DeclarativeManager::usableAdapter() const
98{
99 return declarativeAdapterFromPtr(ptr: BluezQt::Manager::usableAdapter());
100}
101
102QQmlListProperty<DeclarativeAdapter> DeclarativeManager::declarativeAdapters()
103{
104 return QQmlListProperty<DeclarativeAdapter>(this, nullptr, adaptersCountFunction, adaptersAtFunction);
105}
106
107QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeDevices()
108{
109 return QQmlListProperty<DeclarativeDevice>(this, nullptr, devicesCountFunction, devicesAtFunction);
110}
111
112QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeConnectedDevices()
113{
114 return QQmlListProperty<DeclarativeDevice>(this, nullptr, connectedDevicesCountFunction, connectedDevicesAtFunction);
115}
116
117DeclarativeAdapter *DeclarativeManager::declarativeAdapterFromPtr(BluezQt::AdapterPtr ptr) const
118{
119 if (!ptr) {
120 return nullptr;
121 }
122 return m_adapters.value(key: ptr->ubi());
123}
124
125DeclarativeDevice *DeclarativeManager::declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const
126{
127 if (!ptr) {
128 return nullptr;
129 }
130 return m_devices.value(key: ptr->ubi());
131}
132
133DeclarativeAdapter *DeclarativeManager::adapterForAddress(const QString &address) const
134{
135 return declarativeAdapterFromPtr(ptr: BluezQt::Manager::adapterForAddress(address));
136}
137
138DeclarativeAdapter *DeclarativeManager::adapterForUbi(const QString &ubi) const
139{
140 return declarativeAdapterFromPtr(ptr: BluezQt::Manager::adapterForUbi(ubi));
141}
142
143DeclarativeDevice *DeclarativeManager::deviceForAddress(const QString &address) const
144{
145 return declarativeDeviceFromPtr(ptr: BluezQt::Manager::deviceForAddress(address));
146}
147
148DeclarativeDevice *DeclarativeManager::deviceForUbi(const QString &ubi) const
149{
150 return declarativeDeviceFromPtr(ptr: BluezQt::Manager::deviceForUbi(ubi));
151}
152
153void DeclarativeManager::initJobResult(BluezQt::InitManagerJob *job)
154{
155 if (job->error()) {
156 Q_EMIT initError(errorText: job->errorText());
157 return;
158 }
159
160 Q_EMIT initFinished();
161}
162
163void DeclarativeManager::slotAdapterAdded(BluezQt::AdapterPtr adapter)
164{
165 DeclarativeAdapter *dAdapter = new DeclarativeAdapter(adapter, this);
166 m_adapters[adapter->ubi()] = dAdapter;
167
168 Q_EMIT adapterAdded(adapter: dAdapter);
169 Q_EMIT adaptersChanged(adapters: declarativeAdapters());
170}
171
172void DeclarativeManager::slotAdapterRemoved(BluezQt::AdapterPtr adapter)
173{
174 DeclarativeAdapter *dAdapter = m_adapters.take(key: adapter->ubi());
175 dAdapter->deleteLater();
176
177 Q_EMIT adapterRemoved(adapter: dAdapter);
178 Q_EMIT adaptersChanged(adapters: declarativeAdapters());
179}
180
181void DeclarativeManager::slotDeviceAdded(BluezQt::DevicePtr device)
182{
183 DeclarativeAdapter *dAdapter = declarativeAdapterFromPtr(ptr: device->adapter());
184 DeclarativeDevice *dDevice = new DeclarativeDevice(device, dAdapter);
185 m_devices[device->ubi()] = dDevice;
186 dAdapter->m_devices[device->ubi()] = dDevice;
187
188 Q_EMIT deviceAdded(device: dDevice);
189 Q_EMIT devicesChanged(devices: declarativeDevices());
190 connect(sender: device.get(), signal: &BluezQt::Device::connectedChanged, context: this, slot: &DeclarativeManager::slotDeviceConnectedChanged);
191 if (device->isConnected()) {
192 Q_EMIT connectedDevicesChanged(devices: declarativeConnectedDevices());
193 }
194}
195
196void DeclarativeManager::slotDeviceRemoved(BluezQt::DevicePtr device)
197{
198 DeclarativeDevice *dDevice = m_devices.take(key: device->ubi());
199 dDevice->adapter()->m_devices.take(key: device->ubi());
200 dDevice->deleteLater();
201
202 Q_EMIT deviceRemoved(device: dDevice);
203 Q_EMIT devicesChanged(devices: declarativeDevices());
204 disconnect(sender: device.get(), signal: &BluezQt::Device::connectedChanged, receiver: this, slot: &DeclarativeManager::slotDeviceConnectedChanged);
205 if (device->isConnected()) {
206 Q_EMIT connectedDevicesChanged(devices: declarativeConnectedDevices());
207 }
208}
209
210void DeclarativeManager::slotDeviceConnectedChanged()
211{
212 Q_EMIT connectedDevicesChanged(devices: declarativeConnectedDevices());
213}
214
215void DeclarativeManager::slotUsableAdapterChanged(BluezQt::AdapterPtr adapter)
216{
217 Q_EMIT usableAdapterChanged(adapter: declarativeAdapterFromPtr(ptr: adapter));
218}
219
220#include "moc_declarativemanager.cpp"
221

source code of bluez-qt/src/imports/declarativemanager.cpp