105
105
} else if (!strncmp(pattern, "hci", 3) && strlen(pattern) >= 4) {
106
106
dev_id = atoi(pattern + 3);
107
107
adapter = manager_find_adapter_by_id(dev_id);
109
adapter = manager_find_adapter_by_address(pattern);
110
str2ba(pattern, &bdaddr);
111
adapter = manager_find_adapter(&bdaddr);
112
115
return btd_error_no_such_adapter(msg);
179
182
for (i = 0, list = adapters; list; list = list->next) {
180
183
struct btd_adapter *adapter = list->data;
182
if (!adapter_is_ready(adapter))
185
185
array[i] = (char *) adapter_get_path(adapter);
231
231
for (i = 0, list = adapters; list; list = list->next) {
232
232
struct btd_adapter *adapter = list->data;
234
if (!adapter_is_ready(adapter))
237
234
array[i] = (char *) adapter_get_path(adapter);
245
static void manager_set_default_adapter(int id)
247
struct btd_adapter *adapter;
250
default_adapter_id = id;
252
adapter = manager_find_adapter_by_id(id);
256
path = adapter_get_path(adapter);
258
g_dbus_emit_signal(connection, "/",
260
"DefaultAdapterChanged",
261
DBUS_TYPE_OBJECT_PATH, &path,
248
265
static void manager_remove_adapter(struct btd_adapter *adapter)
250
267
uint16_t dev_id = adapter_get_dev_id(adapter);
288
305
return dev_id == id ? 0 : -1;
291
static gint adapter_path_cmp(gconstpointer a, gconstpointer b)
293
struct btd_adapter *adapter = (struct btd_adapter *) a;
294
const char *path = b;
295
const gchar *adapter_path = adapter_get_path(adapter);
297
return strcmp(adapter_path, path);
300
308
static gint adapter_cmp(gconstpointer a, gconstpointer b)
302
310
struct btd_adapter *adapter = (struct btd_adapter *) a;
308
316
return bacmp(&src, bdaddr);
311
static gint adapter_address_cmp(gconstpointer a, gconstpointer b)
313
struct btd_adapter *adapter = (struct btd_adapter *) a;
314
const char *address = b;
318
adapter_get_address(adapter, &bdaddr);
319
ba2str(&bdaddr, addr);
321
return strcasecmp(addr, address);
324
319
struct btd_adapter *manager_find_adapter(const bdaddr_t *sba)
332
327
return match->data;
335
struct btd_adapter *manager_find_adapter_by_address(const char *address)
339
match = g_slist_find_custom(adapters, address, adapter_address_cmp);
346
struct btd_adapter *manager_find_adapter_by_path(const char *path)
350
match = g_slist_find_custom(adapters, path, adapter_path_cmp);
357
330
struct btd_adapter *manager_find_adapter_by_id(int id)
366
339
return match->data;
342
void manager_foreach_adapter(adapter_cb func, gpointer user_data)
344
g_slist_foreach(adapters, (GFunc) func, user_data);
369
347
GSList *manager_get_adapters(void)
383
361
btd_stop_exit_timer();
386
int manager_register_adapter(int id, gboolean devup)
364
struct btd_adapter *btd_manager_register_adapter(int id)
388
366
struct btd_adapter *adapter;
390
369
adapter = manager_find_adapter_by_id(id);
392
371
error("Unable to register adapter: hci%d already exist", id);
396
adapter = adapter_create(connection, id, devup);
375
adapter = adapter_create(connection, id);
400
379
adapters = g_slist_append(adapters, adapter);
381
if (!adapter_init(adapter)) {
382
btd_adapter_unref(adapter);
386
path = adapter_get_path(adapter);
387
g_dbus_emit_signal(connection, "/",
388
MANAGER_INTERFACE, "AdapterAdded",
389
DBUS_TYPE_OBJECT_PATH, &path,
392
manager_update_adapters();
394
btd_stop_exit_timer();
396
if (default_adapter_id < 0)
397
manager_set_default_adapter(id);
399
DBG("Adapter %s registered", path);
401
return btd_adapter_ref(adapter);
405
int manager_unregister_adapter(int id)
404
int btd_manager_unregister_adapter(int id)
407
406
struct btd_adapter *adapter;
408
407
const gchar *path;
423
int manager_start_adapter(int id)
425
struct btd_adapter *adapter;
428
adapter = manager_find_adapter_by_id(id);
430
error("Getting device data failed: hci%d", id);
434
ret = adapter_start(adapter);
438
if (default_adapter_id < 0)
439
manager_set_default_adapter(id);
444
int manager_stop_adapter(int id)
446
struct btd_adapter *adapter;
448
adapter = manager_find_adapter_by_id(id);
450
error("Getting device data failed: hci%d", id);
454
return adapter_stop(adapter);
457
int manager_get_default_adapter()
459
return default_adapter_id;
462
void manager_set_default_adapter(int id)
464
struct btd_adapter *adapter;
467
default_adapter_id = id;
469
adapter = manager_find_adapter_by_id(id);
473
path = adapter_get_path(adapter);
475
g_dbus_emit_signal(connection, "/",
477
"DefaultAdapterChanged",
478
DBUS_TYPE_OBJECT_PATH, &path,
482
void btd_manager_set_offline(gboolean offline)
486
for (l = adapters; l != NULL; l = g_slist_next(l)) {
487
struct btd_adapter *adapter = l->data;
490
btd_adapter_switch_offline(adapter);
492
btd_adapter_restore_powered(adapter);
496
422
void btd_manager_set_did(uint16_t vendor, uint16_t product, uint16_t version)