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> |
16 | static 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 | |
24 | static 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 | |
32 | static 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 | |
40 | static 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 | |
48 | static 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 | |
58 | static 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 | |
75 | DeclarativeManager::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 | |
97 | DeclarativeAdapter *DeclarativeManager::usableAdapter() const |
98 | { |
99 | return declarativeAdapterFromPtr(ptr: BluezQt::Manager::usableAdapter()); |
100 | } |
101 | |
102 | QQmlListProperty<DeclarativeAdapter> DeclarativeManager::declarativeAdapters() |
103 | { |
104 | return QQmlListProperty<DeclarativeAdapter>(this, nullptr, adaptersCountFunction, adaptersAtFunction); |
105 | } |
106 | |
107 | QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeDevices() |
108 | { |
109 | return QQmlListProperty<DeclarativeDevice>(this, nullptr, devicesCountFunction, devicesAtFunction); |
110 | } |
111 | |
112 | QQmlListProperty<DeclarativeDevice> DeclarativeManager::declarativeConnectedDevices() |
113 | { |
114 | return QQmlListProperty<DeclarativeDevice>(this, nullptr, connectedDevicesCountFunction, connectedDevicesAtFunction); |
115 | } |
116 | |
117 | DeclarativeAdapter *DeclarativeManager::declarativeAdapterFromPtr(BluezQt::AdapterPtr ptr) const |
118 | { |
119 | if (!ptr) { |
120 | return nullptr; |
121 | } |
122 | return m_adapters.value(key: ptr->ubi()); |
123 | } |
124 | |
125 | DeclarativeDevice *DeclarativeManager::declarativeDeviceFromPtr(BluezQt::DevicePtr ptr) const |
126 | { |
127 | if (!ptr) { |
128 | return nullptr; |
129 | } |
130 | return m_devices.value(key: ptr->ubi()); |
131 | } |
132 | |
133 | DeclarativeAdapter *DeclarativeManager::adapterForAddress(const QString &address) const |
134 | { |
135 | return declarativeAdapterFromPtr(ptr: BluezQt::Manager::adapterForAddress(address)); |
136 | } |
137 | |
138 | DeclarativeAdapter *DeclarativeManager::adapterForUbi(const QString &ubi) const |
139 | { |
140 | return declarativeAdapterFromPtr(ptr: BluezQt::Manager::adapterForUbi(ubi)); |
141 | } |
142 | |
143 | DeclarativeDevice *DeclarativeManager::deviceForAddress(const QString &address) const |
144 | { |
145 | return declarativeDeviceFromPtr(ptr: BluezQt::Manager::deviceForAddress(address)); |
146 | } |
147 | |
148 | DeclarativeDevice *DeclarativeManager::deviceForUbi(const QString &ubi) const |
149 | { |
150 | return declarativeDeviceFromPtr(ptr: BluezQt::Manager::deviceForUbi(ubi)); |
151 | } |
152 | |
153 | void 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 | |
163 | void 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 | |
172 | void 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 | |
181 | void 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 | |
196 | void 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 | |
210 | void DeclarativeManager::slotDeviceConnectedChanged() |
211 | { |
212 | Q_EMIT connectedDevicesChanged(devices: declarativeConnectedDevices()); |
213 | } |
214 | |
215 | void DeclarativeManager::slotUsableAdapterChanged(BluezQt::AdapterPtr adapter) |
216 | { |
217 | Q_EMIT usableAdapterChanged(adapter: declarativeAdapterFromPtr(ptr: adapter)); |
218 | } |
219 | |
220 | #include "moc_declarativemanager.cpp" |
221 | |