static void bt_health_unregister_app(const void *buf, uint16_t len) { const struct hal_cmd_health_unreg_app *cmd = buf; struct health_app *app; DBG(""); app = queue_remove_if(apps, match_app_by_id, INT_TO_PTR(cmd->app_id)); if (!app) { ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_UNREG_APP, HAL_STATUS_INVALID); return; } send_app_reg_notify(app, HAL_HEALTH_APP_DEREG_SUCCESS); if (record_id > 0) { bt_adapter_remove_record(record_id); record_id = 0; } free_health_app(app); ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_UNREG_APP, HAL_STATUS_SUCCESS); }
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 struct health_app *create_health_app(const char *app_name, const char *provider, const char *srv_name, const char *srv_descr, uint8_t mdeps) { struct health_app *app; static unsigned int app_id = 1; DBG(""); app = new0(struct health_app, 1); if (!app) return NULL; app->id = app_id++; app->num_of_mdep = mdeps; app->app_name = strdup(app_name); if (provider) { app->provider_name = strdup(provider); if (!app->provider_name) goto fail; } if (srv_name) { app->service_name = strdup(srv_name); if (!app->service_name) goto fail; } if (srv_descr) { app->service_descr = strdup(srv_descr); if (!app->service_descr) goto fail; } app->mdeps = queue_new(); if (!app->mdeps) goto fail; app->devices = queue_new(); if (!app->devices) goto fail; return app; fail: free_health_app(app); return NULL; }
static void bt_health_mdep_cfg_data(const void *buf, uint16_t len) { const struct hal_cmd_health_mdep *cmd = buf; struct health_app *app; struct mdep_cfg *mdep = NULL; uint8_t status; DBG(""); app = queue_find(apps, match_app_by_id, INT_TO_PTR(cmd->app_id)); if (!app) { status = HAL_STATUS_INVALID; goto fail; } mdep = new0(struct mdep_cfg, 1); mdep->role = cmd->role; mdep->data_type = cmd->data_type; mdep->channel_type = android2channel_type(cmd->channel_type); mdep->id = queue_length(app->mdeps) + 1; if (cmd->descr_len > 0) { mdep->descr = malloc0(cmd->descr_len); memcpy(mdep->descr, cmd->descr, cmd->descr_len); } queue_push_tail(app->mdeps, mdep); if (app->num_of_mdep != queue_length(app->mdeps)) goto send_rsp; /* add sdp record from app configuration data */ /* * TODO: Check what to be done if mupltple applications are trying to * register with different role and different configurations. * 1) Does device supports SOURCE and SINK at the same time ? * 2) Does it require different SDP records or one record with * multile MDEP configurations ? */ if (update_sdp_record(app) < 0) { error("health: HDP SDP record preparation failed"); status = HAL_STATUS_FAILED; goto fail; } send_app_reg_notify(app, HAL_HEALTH_APP_REG_SUCCESS); send_rsp: ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP, HAL_STATUS_SUCCESS); return; fail: if (status != HAL_STATUS_SUCCESS) { free_mdep_cfg(mdep); queue_remove(apps, app); free_health_app(app); } ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HEALTH, HAL_OP_HEALTH_MDEP, status); }