bool bt_pan_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode) { sdp_record_t *nap_rec, *panu_rec; int err; DBG(""); bacpy(&adapter_addr, addr); nap_rec = nap_record(); if (bt_adapter_add_record(nap_rec, SVC_HINT_NETWORKING) < 0) { sdp_record_free(nap_rec); error("Failed to allocate PAN-NAP sdp record"); return false; } panu_rec = panu_record(); if (bt_adapter_add_record(panu_rec, SVC_HINT_NETWORKING) < 0) { sdp_record_free(nap_rec); sdp_record_free(panu_rec); error("Failed to allocate PAN-PANU sdp record"); return false; } err = bnep_init(); if (err < 0) { error("Failed to init BNEP"); bt_adapter_remove_record(nap_rec->handle); bt_adapter_remove_record(panu_rec->handle); return false; } err = register_nap_server(); if (err < 0) { error("Failed to register NAP server"); bt_adapter_remove_record(nap_rec->handle); bt_adapter_remove_record(panu_rec->handle); bnep_cleanup(); return false; } nap_rec_id = nap_rec->handle; panu_rec_id = panu_rec->handle; hal_ipc = ipc; ipc_register(hal_ipc, HAL_SERVICE_ID_PAN, cmd_handlers, G_N_ELEMENTS(cmd_handlers)); return true; }
bool bt_a2dp_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode) { GError *err = NULL; sdp_record_t *rec; DBG(""); bacpy(&adapter_addr, addr); server = bt_io_listen(connect_cb, NULL, NULL, NULL, &err, BT_IO_OPT_SOURCE_BDADDR, &adapter_addr, BT_IO_OPT_PSM, AVDTP_PSM, BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, BT_IO_OPT_MASTER, true, BT_IO_OPT_INVALID); if (!server) { error("Failed to listen on AVDTP channel: %s", err->message); g_error_free(err); return false; } rec = a2dp_record(); if (!rec) { error("Failed to allocate A2DP record"); goto fail; } if (bt_adapter_add_record(rec, SVC_HINT_CAPTURING) < 0) { error("Failed to register A2DP record"); sdp_record_free(rec); goto fail; } record_id = rec->handle; hal_ipc = ipc; ipc_register(hal_ipc, HAL_SERVICE_ID_A2DP, cmd_handlers, G_N_ELEMENTS(cmd_handlers)); if (bt_audio_register(audio_disconnected)) return true; fail: g_io_channel_shutdown(server, TRUE, NULL); g_io_channel_unref(server); server = NULL; return false; }
static int update_sdp_record(struct health_app *app) { sdp_record_t *rec; uint8_t role; DBG(""); if (record_id > 0) { bt_adapter_remove_record(record_id); record_id = 0; } rec = sdp_record_alloc(); if (!rec) return -1; role = HAL_HEALTH_MDEP_ROLE_SOURCE; if (queue_find(app->mdeps, match_mdep_by_role, INT_TO_PTR(role))) set_sdp_services_uuid(rec, role); role = HAL_HEALTH_MDEP_ROLE_SINK; if (queue_find(app->mdeps, match_mdep_by_role, INT_TO_PTR(role))) set_sdp_services_uuid(rec, role); sdp_set_info_attr(rec, app->service_name, app->provider_name, app->service_descr); if (register_service_protocols(rec, app) < 0) goto fail; if (register_service_profiles(rec) < 0) goto fail; if (register_service_additional_protocols(rec, app) < 0) goto fail; if (register_service_sup_features(rec, app) < 0) goto fail; if (register_data_exchange_spec(rec) < 0) goto fail; if (register_mcap_features(rec) < 0) goto fail; if (sdp_set_record_state(rec, record_state++) < 0) goto fail; if (bt_adapter_add_record(rec, SVC_HINT_HEALTH) < 0) { error("health: Failed to register HEALTH record"); goto fail; } record_id = rec->handle; return 0; fail: sdp_record_free(rec); return -1; }