@@ -69,11 +69,11 @@ CHIP_ERROR ChipDeviceScanner::Init(BluezAdapter1 * adapter, ChipDeviceScannerDel
69
69
VerifyOrDie (g_main_context_get_thread_default () != nullptr );
70
70
71
71
GAutoPtr<GError> err;
72
- self->mManager = g_dbus_object_manager_client_new_for_bus_sync (
72
+ self->mManager . reset ( g_dbus_object_manager_client_new_for_bus_sync (
73
73
G_BUS_TYPE_SYSTEM, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, BLUEZ_INTERFACE, " /" ,
74
74
bluez_object_manager_client_get_proxy_type, nullptr /* unused user data in the Proxy Type Func */ ,
75
- nullptr /* destroy notify */ , nullptr /* cancellable */ , &err.GetReceiver ());
76
- VerifyOrReturnError (self->mManager != nullptr , CHIP_ERROR_INTERNAL,
75
+ nullptr /* destroy notify */ , nullptr /* cancellable */ , &err.GetReceiver ())) ;
76
+ VerifyOrReturnError (self->mManager , CHIP_ERROR_INTERNAL,
77
77
ChipLogError (Ble, " Failed to get D-Bus object manager for device scanning: %s" , err->message ));
78
78
return CHIP_NO_ERROR;
79
79
},
@@ -95,8 +95,7 @@ void ChipDeviceScanner::Shutdown()
95
95
// released during a D-Bus signal being processed.
96
96
PlatformMgrImpl ().GLibMatterContextInvokeSync (
97
97
+[](ChipDeviceScanner * self) {
98
- if (self->mManager != nullptr )
99
- g_object_unref (self->mManager );
98
+ self->mManager .reset ();
100
99
self->mAdapter .reset ();
101
100
return CHIP_NO_ERROR;
102
101
},
@@ -112,7 +111,8 @@ CHIP_ERROR ChipDeviceScanner::StartScan(System::Clock::Timeout timeout)
112
111
VerifyOrReturnError (mTimerState == ScannerTimerState::TIMER_CANCELED, CHIP_ERROR_INCORRECT_STATE);
113
112
114
113
mCancellable .reset (g_cancellable_new ());
115
- CHIP_ERROR err = PlatformMgrImpl ().GLibMatterContextInvokeSync (MainLoopStartScan, this );
114
+ CHIP_ERROR err = PlatformMgrImpl ().GLibMatterContextInvokeSync (
115
+ +[](ChipDeviceScanner * self) { return self->StartScanImpl (); }, this );
116
116
if (err != CHIP_NO_ERROR)
117
117
{
118
118
ChipLogError (Ble, " Failed to initiate BLE scan start: %" CHIP_ERROR_FORMAT, err.Format ());
@@ -153,7 +153,8 @@ CHIP_ERROR ChipDeviceScanner::StopScan()
153
153
assertChipStackLockedByCurrentThread ();
154
154
VerifyOrReturnError (mScannerState == ChipDeviceScannerState::SCANNER_SCANNING, CHIP_NO_ERROR);
155
155
156
- CHIP_ERROR err = PlatformMgrImpl ().GLibMatterContextInvokeSync (MainLoopStopScan, this );
156
+ CHIP_ERROR err = PlatformMgrImpl ().GLibMatterContextInvokeSync (
157
+ +[](ChipDeviceScanner * self) { return self->StopScanImpl (); }, this );
157
158
if (err != CHIP_NO_ERROR)
158
159
{
159
160
ChipLogError (Ble, " Failed to initiate BLE scan stop: %" CHIP_ERROR_FORMAT, err.Format ());
@@ -178,59 +179,63 @@ CHIP_ERROR ChipDeviceScanner::StopScan()
178
179
return CHIP_NO_ERROR;
179
180
}
180
181
181
- CHIP_ERROR ChipDeviceScanner::MainLoopStopScan (ChipDeviceScanner * self )
182
+ CHIP_ERROR ChipDeviceScanner::StopScanImpl ( )
182
183
{
183
- GAutoPtr<GError> error;
184
184
185
185
// In case we are currently running a scan
186
- g_cancellable_cancel (self-> mCancellable .get ());
187
- self-> mCancellable .reset ();
186
+ g_cancellable_cancel (mCancellable .get ());
187
+ mCancellable .reset ();
188
188
189
- if (self-> mObjectAddedSignal )
189
+ if (mObjectAddedSignal )
190
190
{
191
- g_signal_handler_disconnect (self-> mManager , self-> mObjectAddedSignal );
192
- self-> mObjectAddedSignal = 0 ;
191
+ g_signal_handler_disconnect (mManager . get (), mObjectAddedSignal );
192
+ mObjectAddedSignal = 0 ;
193
193
}
194
194
195
- if (self-> mInterfaceChangedSignal )
195
+ if (mPropertiesChangedSignal )
196
196
{
197
- g_signal_handler_disconnect (self-> mManager , self-> mInterfaceChangedSignal );
198
- self-> mInterfaceChangedSignal = 0 ;
197
+ g_signal_handler_disconnect (mManager . get (), mPropertiesChangedSignal );
198
+ mPropertiesChangedSignal = 0 ;
199
199
}
200
200
201
- if (!bluez_adapter1_call_stop_discovery_sync (self->mAdapter .get (), nullptr /* not cancellable */ , &error.GetReceiver ()))
201
+ GAutoPtr<GError> error;
202
+ if (!bluez_adapter1_call_stop_discovery_sync (mAdapter .get (), nullptr /* not cancellable */ , &error.GetReceiver ()))
202
203
{
203
- ChipLogError (Ble, " Failed to stop discovery %s" , error->message );
204
- return CHIP_ERROR_INTERNAL;
204
+ // Do not report error if BlueZ service is not available on the bus (service unknown) or
205
+ // the requested BLE adapter is not available (unknown object). In both cases the scan is
206
+ // already stopped.
207
+ if (error->code != G_DBUS_ERROR_SERVICE_UNKNOWN && error->code != G_DBUS_ERROR_UNKNOWN_OBJECT)
208
+ {
209
+ ChipLogError (Ble, " Failed to stop discovery: %s" , error->message );
210
+ return CHIP_ERROR_INTERNAL;
211
+ }
205
212
}
206
213
207
214
return CHIP_NO_ERROR;
208
215
}
209
216
210
- void ChipDeviceScanner::SignalObjectAdded (GDBusObjectManager * manager , GDBusObject * object, ChipDeviceScanner * self )
217
+ void ChipDeviceScanner::SignalObjectAdded (GDBusObjectManager * aManager , GDBusObject * aObject )
211
218
{
212
- GAutoPtr<BluezDevice1> device (bluez_object_get_device1 (reinterpret_cast <BluezObject *>(object )));
213
- VerifyOrReturn (device. get () != nullptr );
219
+ GAutoPtr<BluezDevice1> device (bluez_object_get_device1 (reinterpret_cast <BluezObject *>(aObject )));
220
+ VerifyOrReturn (device);
214
221
215
- self-> ReportDevice (*device.get ());
222
+ ReportDevice (*device.get ());
216
223
}
217
224
218
- void ChipDeviceScanner::SignalInterfaceChanged (GDBusObjectManagerClient * manager , GDBusObjectProxy * object ,
219
- GDBusProxy * aInterface, GVariant * aChangedProperties,
220
- const gchar * const * aInvalidatedProps, ChipDeviceScanner * self )
225
+ void ChipDeviceScanner::SignalInterfacePropertiesChanged (GDBusObjectManagerClient * aManager , GDBusObjectProxy * aObject ,
226
+ GDBusProxy * aInterface, GVariant * aChangedProperties,
227
+ const char * const * aInvalidatedProps )
221
228
{
222
- GAutoPtr<BluezDevice1> device (bluez_object_get_device1 (reinterpret_cast <BluezObject *>(object )));
223
- VerifyOrReturn (device. get () != nullptr );
229
+ GAutoPtr<BluezDevice1> device (bluez_object_get_device1 (reinterpret_cast <BluezObject *>(aObject )));
230
+ VerifyOrReturn (device);
224
231
225
- self-> ReportDevice (*device.get ());
232
+ ReportDevice (*device.get ());
226
233
}
227
234
228
235
void ChipDeviceScanner::ReportDevice (BluezDevice1 & device)
229
236
{
230
- if (strcmp (bluez_device1_get_adapter (&device), g_dbus_proxy_get_object_path (G_DBUS_PROXY (mAdapter .get ()))) != 0 )
231
- {
232
- return ;
233
- }
237
+ VerifyOrReturn (strcmp (bluez_device1_get_adapter (&device),
238
+ g_dbus_proxy_get_object_path (reinterpret_cast <GDBusProxy *>(mAdapter .get ()))) == 0 );
234
239
235
240
chip::Ble::ChipBLEDeviceIdentificationInfo deviceInfo;
236
241
@@ -245,10 +250,8 @@ void ChipDeviceScanner::ReportDevice(BluezDevice1 & device)
245
250
246
251
void ChipDeviceScanner::RemoveDevice (BluezDevice1 & device)
247
252
{
248
- if (strcmp (bluez_device1_get_adapter (&device), g_dbus_proxy_get_object_path (G_DBUS_PROXY (mAdapter .get ()))) != 0 )
249
- {
250
- return ;
251
- }
253
+ VerifyOrReturn (strcmp (bluez_device1_get_adapter (&device),
254
+ g_dbus_proxy_get_object_path (reinterpret_cast <GDBusProxy *>(mAdapter .get ()))) == 0 );
252
255
253
256
chip::Ble::ChipBLEDeviceIdentificationInfo deviceInfo;
254
257
@@ -257,30 +260,39 @@ void ChipDeviceScanner::RemoveDevice(BluezDevice1 & device)
257
260
return ;
258
261
}
259
262
260
- const auto devicePath = g_dbus_proxy_get_object_path (G_DBUS_PROXY (&device));
261
263
GAutoPtr<GError> error;
262
-
264
+ const auto devicePath = g_dbus_proxy_get_object_path ( reinterpret_cast <GDBusProxy *>(&device));
263
265
if (!bluez_adapter1_call_remove_device_sync (mAdapter .get (), devicePath, nullptr , &error.GetReceiver ()))
264
266
{
265
267
ChipLogDetail (Ble, " Failed to remove device %s: %s" , StringOrNullMarker (devicePath), error->message );
266
268
}
267
269
}
268
270
269
- CHIP_ERROR ChipDeviceScanner::MainLoopStartScan (ChipDeviceScanner * self )
271
+ CHIP_ERROR ChipDeviceScanner::StartScanImpl ( )
270
272
{
271
273
GAutoPtr<GError> error;
272
274
273
- self->mObjectAddedSignal = g_signal_connect (self->mManager , " object-added" , G_CALLBACK (SignalObjectAdded), self);
274
- self->mInterfaceChangedSignal =
275
- g_signal_connect (self->mManager , " interface-proxy-properties-changed" , G_CALLBACK (SignalInterfaceChanged), self);
275
+ mObjectAddedSignal = g_signal_connect (mManager .get (), " object-added" ,
276
+ G_CALLBACK (+[](GDBusObjectManager * aMgr, GDBusObject * aObj, ChipDeviceScanner * self) {
277
+ return self->SignalObjectAdded (aMgr, aObj);
278
+ }),
279
+ this );
280
+
281
+ mPropertiesChangedSignal = g_signal_connect (
282
+ mManager .get (), " interface-proxy-properties-changed" ,
283
+ G_CALLBACK (+[](GDBusObjectManagerClient * aMgr, GDBusObjectProxy * aObj, GDBusProxy * aIface, GVariant * aChangedProps,
284
+ const char * const * aInvalidatedProps, ChipDeviceScanner * self) {
285
+ return self->SignalInterfacePropertiesChanged (aMgr, aObj, aIface, aChangedProps, aInvalidatedProps);
286
+ }),
287
+ this );
276
288
277
- ChipLogProgress (Ble, " BLE removing known devices. " );
278
- for (BluezObject & object : BluezObjectList (self-> mManager ))
289
+ ChipLogProgress (Ble, " BLE removing known devices" );
290
+ for (BluezObject & object : BluezObjectList (mManager . get () ))
279
291
{
280
292
GAutoPtr<BluezDevice1> device (bluez_object_get_device1 (&object));
281
- if (device. get () != nullptr )
293
+ if (device)
282
294
{
283
- self-> RemoveDevice (*device.get ());
295
+ RemoveDevice (*device.get ());
284
296
}
285
297
}
286
298
@@ -295,16 +307,15 @@ CHIP_ERROR ChipDeviceScanner::MainLoopStartScan(ChipDeviceScanner * self)
295
307
g_variant_builder_add (&filterBuilder, " {sv}" , " Transport" , g_variant_new_string (" le" ));
296
308
GVariant * filter = g_variant_builder_end (&filterBuilder);
297
309
298
- if (!bluez_adapter1_call_set_discovery_filter_sync (self->mAdapter .get (), filter, self->mCancellable .get (),
299
- &error.GetReceiver ()))
310
+ if (!bluez_adapter1_call_set_discovery_filter_sync (mAdapter .get (), filter, mCancellable .get (), &error.GetReceiver ()))
300
311
{
301
312
// Not critical: ignore if fails
302
313
ChipLogError (Ble, " Failed to set discovery filters: %s" , error->message );
303
314
error.reset ();
304
315
}
305
316
306
- ChipLogProgress (Ble, " BLE initiating scan. " );
307
- if (!bluez_adapter1_call_start_discovery_sync (self-> mAdapter .get (), self-> mCancellable .get (), &error.GetReceiver ()))
317
+ ChipLogProgress (Ble, " BLE initiating scan" );
318
+ if (!bluez_adapter1_call_start_discovery_sync (mAdapter .get (), mCancellable .get (), &error.GetReceiver ()))
308
319
{
309
320
ChipLogError (Ble, " Failed to start discovery: %s" , error->message );
310
321
return CHIP_ERROR_INTERNAL;
0 commit comments