static void bt_health_register_app(const void *buf, uint16_t len) { const struct hal_cmd_health_reg_app *cmd = buf; struct hal_rsp_health_reg_app rsp; struct health_app *app; uint16_t off; uint16_t app_name_len, provider_len, srv_name_len, srv_descr_len; char *app_name, *provider = NULL, *srv_name = NULL, *srv_descr = NULL; DBG(""); if (len != sizeof(*cmd) + cmd->len || cmd->app_name_off > cmd->provider_name_off || cmd->provider_name_off > cmd->service_name_off || cmd->service_name_off > cmd->service_descr_off || cmd->service_descr_off > cmd->len) { error("health: Invalid register app command, terminating"); raise(SIGTERM); return; } app_name = (char *) cmd->data; app_name_len = cmd->provider_name_off - cmd->app_name_off; off = app_name_len; provider_len = cmd->service_name_off - off; if (provider_len > 0) provider = (char *) cmd->data + off; off += provider_len; srv_name_len = cmd->service_descr_off - off; if (srv_name_len > 0) srv_name = (char *) cmd->data + off; off += srv_name_len; srv_descr_len = cmd->len - off; if (srv_descr_len > 0) srv_descr = (char *) cmd->data + off; app = create_health_app(app_name, provider, srv_name, srv_descr, cmd->num_of_mdep); if (!app) goto fail; if (!queue_push_tail(apps, app)) goto fail; rsp.app_id = app->id; ipc_send_rsp_full(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_REG_APP, sizeof(rsp), &rsp, -1); return; fail: free_health_app(app); ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP, HAL_STATUS_FAILED); }
static void bt_pan_get_role(const void *buf, uint16_t len) { struct hal_rsp_pan_get_role rsp; DBG(""); rsp.local_role = local_role; ipc_send_rsp_full(hal_ipc, HAL_SERVICE_ID_PAN, HAL_OP_PAN_GET_ROLE, sizeof(rsp), &rsp, -1); }
static void bt_stream_open(const void *buf, uint16_t len) { const struct audio_cmd_open_stream *cmd = buf; struct audio_rsp_open_stream *rsp; struct a2dp_setup *setup; int fd; uint16_t omtu; DBG(""); if (cmd->id) setup = find_setup(cmd->id); else setup = setups ? setups->data : NULL; if (!setup) { error("Unable to find stream for endpoint %u", cmd->id); ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM, AUDIO_STATUS_FAILED); return; } if (!avdtp_stream_get_transport(setup->stream, &fd, NULL, &omtu, NULL)) { error("avdtp_stream_get_transport: failed"); ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM, AUDIO_STATUS_FAILED); return; } len = sizeof(struct audio_rsp_open_stream) + sizeof(struct audio_preset) + setup->preset->len; rsp = g_malloc0(len); rsp->id = setup->endpoint->id; rsp->mtu = omtu; rsp->preset->len = setup->preset->len; memcpy(rsp->preset->data, setup->preset->data, setup->preset->len); ipc_send_rsp_full(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM, len, rsp, fd); g_free(rsp); }
static void bt_audio_open(const void *buf, uint16_t len) { const struct audio_cmd_open *cmd = buf; struct audio_rsp_open rsp; GSList *presets; DBG(""); audio_retrying = false; if (cmd->presets == 0) { error("No audio presets found"); goto failed; } presets = parse_presets(cmd->preset, cmd->presets, len - sizeof(*cmd)); if (!presets) { error("No audio presets found"); goto failed; } rsp.id = register_endpoint(cmd->uuid, cmd->codec, presets); if (rsp.id == 0) { g_slist_free_full(presets, preset_free); error("Unable to register endpoint"); goto failed; } g_slist_free(presets); ipc_send_rsp_full(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN, sizeof(rsp), &rsp, -1); return; failed: ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN, AUDIO_STATUS_FAILED); }