diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 94adcca..a6f9645 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
uint8_t battchg;
struct queue *calls;
+ char *dialing_number;
};
struct cmd_handler {
queue_destroy(hfp->calls, remove_call_cb);
hfp->calls = NULL;
+ if (hfp->dialing_number) {
+ free(hfp->dialing_number);
+ hfp->dialing_number = NULL;
+ }
+
if (!hfp->in_disconnect) {
free(hfp);
return;
call = new0(struct hf_call, 1);
call->id = id;
call->status = status;
- call->line_id = number;
+ if (number)
+ call->line_id = strdup(number);
call->hfp = hfp;
queue_push_tail(hfp->calls, call);
DBG(hfp, "hf: No new call index available");
return;
}
- call_new(hfp, id, status, NULL);
+ call_new(hfp, id, status, hfp->dialing_number);
+ if (hfp->dialing_number) {
+ free(hfp->dialing_number);
+ hfp->dialing_number = NULL;
+ }
break;
}
}
return call->line_id;
}
+bool hfp_hf_dial(struct hfp_hf *hfp, const char *number,
+ hfp_response_func_t resp_cb,
+ void *user_data)
+{
+ const char *c;
+ int count = 0;
+
+ if (!hfp)
+ return false;
+
+ DBG(hfp, "");
+
+ if (number == NULL || strlen(number) == 0)
+ return hfp_hf_send_command(hfp, resp_cb, user_data,
+ "AT+BLDN");
+
+ if (number[0] == '>') {
+ for (c = number + 1; *c != '\0'; c++) {
+ if (!(*c >= '0' && *c <= '9'))
+ return false;
+ count++;
+ }
+ if (count < 1 || count > 10)
+ return false;
+ } else {
+ for (c = number; *c != '\0'; c++) {
+ if (!(*c >= '0' && *c <= '9') &&
+ !(*c >= 'A' && *c <= 'D') &&
+ *c != '#' && *c != '*' &&
+ *c != '+' && *c != ',')
+ return false;
+ count++;
+ }
+ if (count < 1 || count > 80)
+ return false;
+ }
+
+ if (hfp->dialing_number)
+ free(hfp->dialing_number);
+ hfp->dialing_number = strdup(number);
+
+ return hfp_hf_send_command(hfp, resp_cb, user_data, "ATD%s;", number);
+}
+
bool hfp_hf_call_answer(struct hfp_hf *hfp, uint id,
hfp_response_func_t resp_cb,
void *user_data)
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 4b171ad..21214ee 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
const char *hfp_hf_call_get_number(struct hfp_hf *hfp, uint id);
+bool hfp_hf_dial(struct hfp_hf *hfp, const char *number,
+ hfp_response_func_t resp_cb,
+ void *user_data);
bool hfp_hf_call_answer(struct hfp_hf *hfp, uint id,
hfp_response_func_t resp_cb,
void *user_data);