Skip to content

Commit b951b42

Browse files
committed
fix(DBus): faster dbus methods by keeping reference to proxy instance
1 parent f6d9d2b commit b951b42

File tree

23 files changed

+541
-559
lines changed

23 files changed

+541
-559
lines changed

extensions/core/src/bluetooth/bluez/adapter.rs

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ enum Signal {
2929
pub struct BluetoothAdapter {
3030
base: Base<Resource>,
3131
rx: Receiver<Signal>,
32-
conn: Option<zbus::blocking::Connection>,
32+
proxy: Option<Adapter1ProxyBlocking<'static>>,
3333

3434
#[allow(dead_code)]
3535
#[var(get = get_dbus_path)]
@@ -125,11 +125,22 @@ impl BluetoothAdapter {
125125
// Create a connection to DBus
126126
let conn = get_dbus_system_blocking().ok();
127127

128+
// Return a proxy instance to the adapter
129+
let proxy = if let Some(conn) = conn.as_ref() {
130+
let path: String = path.clone().into();
131+
Adapter1ProxyBlocking::builder(conn)
132+
.path(path)
133+
.ok()
134+
.and_then(|builder| builder.build().ok())
135+
} else {
136+
None
137+
};
138+
128139
// Accept a base of type Base<Resource> and directly forward it.
129140
Self {
130141
base,
131142
rx,
132-
conn,
143+
proxy,
133144
dbus_path: path,
134145
address: Default::default(),
135146
address_type: Default::default(),
@@ -153,19 +164,6 @@ impl BluetoothAdapter {
153164
})
154165
}
155166

156-
/// Return a proxy instance to the adapter
157-
fn get_proxy(&self) -> Option<Adapter1ProxyBlocking> {
158-
if let Some(conn) = self.conn.as_ref() {
159-
let path: String = self.dbus_path.clone().into();
160-
Adapter1ProxyBlocking::builder(conn)
161-
.path(path)
162-
.ok()
163-
.and_then(|builder| builder.build().ok())
164-
} else {
165-
None
166-
}
167-
}
168-
169167
/// Get or create a [BluetoothAdapter] with the given DBus path. If an instance
170168
/// already exists with the given path, then it will be loaded from the resource
171169
/// cache.
@@ -199,31 +197,31 @@ impl BluetoothAdapter {
199197

200198
#[func]
201199
pub fn get_address(&self) -> GString {
202-
let Some(proxy) = self.get_proxy() else {
200+
let Some(proxy) = self.proxy.as_ref() else {
203201
return Default::default();
204202
};
205203
proxy.address().unwrap_or_default().into()
206204
}
207205

208206
#[func]
209207
pub fn get_address_type(&self) -> GString {
210-
let Some(proxy) = self.get_proxy() else {
208+
let Some(proxy) = self.proxy.as_ref() else {
211209
return Default::default();
212210
};
213211
proxy.address_type().unwrap_or_default().into()
214212
}
215213

216214
#[func]
217215
pub fn get_alias(&self) -> GString {
218-
let Some(proxy) = self.get_proxy() else {
216+
let Some(proxy) = self.proxy.as_ref() else {
219217
return Default::default();
220218
};
221219
proxy.alias().unwrap_or_default().into()
222220
}
223221

224222
#[func]
225223
pub fn set_alias(&self, value: GString) {
226-
let Some(proxy) = self.get_proxy() else {
224+
let Some(proxy) = self.proxy.as_ref() else {
227225
return Default::default();
228226
};
229227
proxy
@@ -233,55 +231,55 @@ impl BluetoothAdapter {
233231

234232
#[func]
235233
pub fn get_class(&self) -> u32 {
236-
let Some(proxy) = self.get_proxy() else {
234+
let Some(proxy) = self.proxy.as_ref() else {
237235
return Default::default();
238236
};
239237
proxy.class().unwrap_or_default()
240238
}
241239

242240
#[func]
243241
pub fn get_discoverable(&self) -> bool {
244-
let Some(proxy) = self.get_proxy() else {
242+
let Some(proxy) = self.proxy.as_ref() else {
245243
return Default::default();
246244
};
247245
proxy.discoverable().unwrap_or_default()
248246
}
249247

250248
#[func]
251249
pub fn set_discoverable(&self, value: bool) {
252-
let Some(proxy) = self.get_proxy() else {
250+
let Some(proxy) = self.proxy.as_ref() else {
253251
return Default::default();
254252
};
255253
proxy.set_discoverable(value).unwrap_or_default()
256254
}
257255

258256
#[func]
259257
pub fn get_discoverable_timeout(&self) -> u32 {
260-
let Some(proxy) = self.get_proxy() else {
258+
let Some(proxy) = self.proxy.as_ref() else {
261259
return Default::default();
262260
};
263261
proxy.discoverable_timeout().unwrap_or_default()
264262
}
265263

266264
#[func]
267265
pub fn set_discoverable_timeout(&self, value: u32) {
268-
let Some(proxy) = self.get_proxy() else {
266+
let Some(proxy) = self.proxy.as_ref() else {
269267
return Default::default();
270268
};
271269
proxy.set_discoverable_timeout(value).unwrap_or_default()
272270
}
273271

274272
#[func]
275273
pub fn get_discovering(&self) -> bool {
276-
let Some(proxy) = self.get_proxy() else {
274+
let Some(proxy) = self.proxy.as_ref() else {
277275
return Default::default();
278276
};
279277
proxy.discovering().unwrap_or_default()
280278
}
281279

282280
#[func]
283281
pub fn get_experimental_features(&self) -> PackedStringArray {
284-
let Some(proxy) = self.get_proxy() else {
282+
let Some(proxy) = self.proxy.as_ref() else {
285283
return Default::default();
286284
};
287285
let values: Vec<GString> = proxy
@@ -295,87 +293,87 @@ impl BluetoothAdapter {
295293

296294
#[func]
297295
pub fn get_manufacturer(&self) -> u16 {
298-
let Some(proxy) = self.get_proxy() else {
296+
let Some(proxy) = self.proxy.as_ref() else {
299297
return Default::default();
300298
};
301299
proxy.manufacturer().unwrap_or_default()
302300
}
303301

304302
#[func]
305303
pub fn get_modalias(&self) -> GString {
306-
let Some(proxy) = self.get_proxy() else {
304+
let Some(proxy) = self.proxy.as_ref() else {
307305
return Default::default();
308306
};
309307
proxy.modalias().unwrap_or_default().into()
310308
}
311309

312310
#[func]
313311
pub fn get_name(&self) -> GString {
314-
let Some(proxy) = self.get_proxy() else {
312+
let Some(proxy) = self.proxy.as_ref() else {
315313
return Default::default();
316314
};
317315
proxy.name().unwrap_or_default().into()
318316
}
319317

320318
#[func]
321319
pub fn get_pairable(&self) -> bool {
322-
let Some(proxy) = self.get_proxy() else {
320+
let Some(proxy) = self.proxy.as_ref() else {
323321
return Default::default();
324322
};
325323
proxy.pairable().unwrap_or_default()
326324
}
327325

328326
#[func]
329327
pub fn set_pairable(&self, value: bool) {
330-
let Some(proxy) = self.get_proxy() else {
328+
let Some(proxy) = self.proxy.as_ref() else {
331329
return Default::default();
332330
};
333331
proxy.set_pairable(value).unwrap_or_default()
334332
}
335333

336334
#[func]
337335
pub fn get_pairable_timeout(&self) -> u32 {
338-
let Some(proxy) = self.get_proxy() else {
336+
let Some(proxy) = self.proxy.as_ref() else {
339337
return Default::default();
340338
};
341339
proxy.pairable_timeout().unwrap_or_default()
342340
}
343341

344342
#[func]
345343
pub fn set_pairable_timeout(&self, value: u32) {
346-
let Some(proxy) = self.get_proxy() else {
344+
let Some(proxy) = self.proxy.as_ref() else {
347345
return Default::default();
348346
};
349347
proxy.set_pairable_timeout(value).unwrap_or_default()
350348
}
351349

352350
#[func]
353351
pub fn get_power_state(&self) -> GString {
354-
let Some(proxy) = self.get_proxy() else {
352+
let Some(proxy) = self.proxy.as_ref() else {
355353
return Default::default();
356354
};
357355
proxy.power_state().unwrap_or_default().into()
358356
}
359357

360358
#[func]
361359
pub fn get_powered(&self) -> bool {
362-
let Some(proxy) = self.get_proxy() else {
360+
let Some(proxy) = self.proxy.as_ref() else {
363361
return Default::default();
364362
};
365363
proxy.powered().unwrap_or_default()
366364
}
367365

368366
#[func]
369367
pub fn set_powered(&self, value: bool) {
370-
let Some(proxy) = self.get_proxy() else {
368+
let Some(proxy) = self.proxy.as_ref() else {
371369
return Default::default();
372370
};
373371
proxy.set_powered(value).unwrap_or_default()
374372
}
375373

376374
#[func]
377375
pub fn get_roles(&self) -> PackedStringArray {
378-
let Some(proxy) = self.get_proxy() else {
376+
let Some(proxy) = self.proxy.as_ref() else {
379377
return Default::default();
380378
};
381379
let values: Vec<GString> = proxy
@@ -389,7 +387,7 @@ impl BluetoothAdapter {
389387

390388
#[func]
391389
pub fn get_uuids(&self) -> PackedStringArray {
392-
let Some(proxy) = self.get_proxy() else {
390+
let Some(proxy) = self.proxy.as_ref() else {
393391
return Default::default();
394392
};
395393
let values: Vec<GString> = proxy
@@ -403,15 +401,15 @@ impl BluetoothAdapter {
403401

404402
#[func]
405403
pub fn get_version(&self) -> u8 {
406-
let Some(proxy) = self.get_proxy() else {
404+
let Some(proxy) = self.proxy.as_ref() else {
407405
return Default::default();
408406
};
409407
proxy.version().unwrap_or_default()
410408
}
411409

412410
#[func]
413411
pub fn get_discovery_filters(&self) -> PackedStringArray {
414-
let Some(proxy) = self.get_proxy() else {
412+
let Some(proxy) = self.proxy.as_ref() else {
415413
return Default::default();
416414
};
417415
let filters: Vec<GString> = proxy
@@ -425,7 +423,7 @@ impl BluetoothAdapter {
425423

426424
#[func]
427425
pub fn remove_device(&self, device: Gd<BluetoothDevice>) {
428-
let Some(proxy) = self.get_proxy() else {
426+
let Some(proxy) = self.proxy.as_ref() else {
429427
return;
430428
};
431429
let path = device.bind().get_dbus_path().to_string();
@@ -435,15 +433,15 @@ impl BluetoothAdapter {
435433

436434
#[func]
437435
pub fn start_discovery(&self) {
438-
let Some(proxy) = self.get_proxy() else {
436+
let Some(proxy) = self.proxy.as_ref() else {
439437
return;
440438
};
441439
proxy.start_discovery().unwrap_or_default()
442440
}
443441

444442
#[func]
445443
pub fn stop_discovery(&self) {
446-
let Some(proxy) = self.get_proxy() else {
444+
let Some(proxy) = self.proxy.as_ref() else {
447445
return;
448446
};
449447
proxy.stop_discovery().unwrap_or_default()

0 commit comments

Comments
 (0)