mirror of git://git.sysmocom.de/ofono
stk: move number conversion to a utility function
The dialing number provided by the Setup Call proactive command may contain pause and DTMF characters.
This commit is contained in:
parent
bddfb9bfc5
commit
23cdb46419
58
src/stk.c
58
src/stk.c
|
@ -104,6 +104,27 @@ static void timers_update(struct ofono_stk *stk);
|
||||||
result.additional_len = sizeof(addn_info); \
|
result.additional_len = sizeof(addn_info); \
|
||||||
result.additional = addn_info; \
|
result.additional = addn_info; \
|
||||||
|
|
||||||
|
static gboolean convert_to_phone_number_format(const char *input_str,
|
||||||
|
char *output_str)
|
||||||
|
{
|
||||||
|
char *digit;
|
||||||
|
char *digit_from = "01234567890abcABC";
|
||||||
|
char *digit_to = "01234567890*#p*#p";
|
||||||
|
int pos;
|
||||||
|
|
||||||
|
for (pos = 0; input_str[pos] != '\0'; pos++) {
|
||||||
|
digit = strchr(digit_from, input_str[pos]);
|
||||||
|
if (digit == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
output_str[pos] = digit_to[digit - digit_from];
|
||||||
|
}
|
||||||
|
|
||||||
|
output_str[pos] = '\0';
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static int stk_respond(struct ofono_stk *stk, struct stk_response *rsp,
|
static int stk_respond(struct ofono_stk *stk, struct stk_response *rsp,
|
||||||
ofono_stk_generic_cb_t cb)
|
ofono_stk_generic_cb_t cb)
|
||||||
{
|
{
|
||||||
|
@ -1715,6 +1736,8 @@ static void confirm_call_cb(enum stk_agent_result result, gboolean confirm,
|
||||||
char *alpha_id = NULL;
|
char *alpha_id = NULL;
|
||||||
struct ofono_voicecall *vc;
|
struct ofono_voicecall *vc;
|
||||||
struct stk_response rsp;
|
struct stk_response rsp;
|
||||||
|
char number[256];
|
||||||
|
char *pause_chr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
@ -1752,7 +1775,20 @@ static void confirm_call_cb(enum stk_agent_result result, gboolean confirm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = __ofono_voicecall_dial(vc, sc->addr.number, sc->addr.ton_npi,
|
/* Convert the setup call number to phone number format */
|
||||||
|
if (convert_to_phone_number_format(sc->addr.number, number) == FALSE) {
|
||||||
|
send_simple_response(stk, STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove the DTMF string from the phone number */
|
||||||
|
pause_chr = strchr(number, 'p');
|
||||||
|
|
||||||
|
if (pause_chr)
|
||||||
|
number[pause_chr - number] = '\0';
|
||||||
|
|
||||||
|
/* TODO: send the DTMF after call is connected */
|
||||||
|
err = __ofono_voicecall_dial(vc, number, sc->addr.ton_npi,
|
||||||
alpha_id, sc->icon_id_call_setup.id,
|
alpha_id, sc->icon_id_call_setup.id,
|
||||||
qualifier >> 1, call_setup_connected,
|
qualifier >> 1, call_setup_connected,
|
||||||
stk);
|
stk);
|
||||||
|
@ -2353,10 +2389,8 @@ static gboolean handle_command_send_dtmf(const struct stk_command *cmd,
|
||||||
{
|
{
|
||||||
static unsigned char not_in_speech_call_result[] = { 0x07 };
|
static unsigned char not_in_speech_call_result[] = { 0x07 };
|
||||||
struct ofono_voicecall *vc = NULL;
|
struct ofono_voicecall *vc = NULL;
|
||||||
char dtmf[256], *digit;
|
char dtmf[256];
|
||||||
char *dtmf_from = "01234567890abcABC";
|
int err;
|
||||||
char *dtmf_to = "01234567890*#p*#p";
|
|
||||||
int err, pos;
|
|
||||||
|
|
||||||
vc = __ofono_atom_find(OFONO_ATOM_TYPE_VOICECALL,
|
vc = __ofono_atom_find(OFONO_ATOM_TYPE_VOICECALL,
|
||||||
__ofono_atom_get_modem(stk->atom));
|
__ofono_atom_get_modem(stk->atom));
|
||||||
|
@ -2366,18 +2400,12 @@ static gboolean handle_command_send_dtmf(const struct stk_command *cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert the DTMF string to phone number format */
|
/* Convert the DTMF string to phone number format */
|
||||||
for (pos = 0; cmd->send_dtmf.dtmf[pos] != '\0'; pos++) {
|
if (convert_to_phone_number_format(cmd->send_dtmf.dtmf, dtmf) ==
|
||||||
digit = strchr(dtmf_from, cmd->send_dtmf.dtmf[pos]);
|
FALSE) {
|
||||||
if (digit == NULL) {
|
rsp->result.type = STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD;
|
||||||
rsp->result.type = STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD;
|
return TRUE;
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
dtmf[pos] = dtmf_to[digit - dtmf_from];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dtmf[pos] = '\0';
|
|
||||||
|
|
||||||
err = __ofono_voicecall_tone_send(vc, dtmf, dtmf_sent_cb, stk);
|
err = __ofono_voicecall_tone_send(vc, dtmf, dtmf_sent_cb, stk);
|
||||||
|
|
||||||
if (err == -ENOSYS) {
|
if (err == -ENOSYS) {
|
||||||
|
|
Loading…
Reference in New Issue