bool hfp_gw_send_info(struct hfp_gw *hfp, const char *format, ...) { va_list ap; char *fmt; int len; if (!hfp || !format) return false; if (asprintf(&fmt, "\r\n%s\r\n", format) < 0) return false; va_start(ap, format); len = ringbuf_vprintf(hfp->write_buf, fmt, ap); va_end(ap); free(fmt); if (len < 0) return false; if (hfp->result_pending) return true; wakeup_writer(hfp); return true; }
int ringbuf_printf(struct ringbuf *ringbuf, const char *format, ...) { va_list ap; int len; va_start(ap, format); len = ringbuf_vprintf(ringbuf, format, ap); va_end(ap); return len; }
bool hfp_hf_send_command(struct hfp_hf *hfp, hfp_response_func_t resp_cb, void *user_data, const char *format, ...) { va_list ap; char *fmt; int len; struct cmd_response *cmd; if (!hfp || !format || !resp_cb) return false; if (asprintf(&fmt, "%s\r", format) < 0) return false; cmd = new0(struct cmd_response, 1); if (!cmd) { free(fmt); return false; } va_start(ap, format); len = ringbuf_vprintf(hfp->write_buf, fmt, ap); va_end(ap); free(fmt); if (len < 0) { free(cmd); return false; } cmd->resp_cb = resp_cb; cmd->user_data = user_data; if (!queue_push_tail(hfp->cmd_queue, cmd)) { ringbuf_drain(hfp->write_buf, len); free(cmd); return false; } hf_wakeup_writer(hfp); return true; }