mirror of git://git.sysmocom.de/ofono
stk: Cancel pending DTMF tones if session is ended
The Send DTMF command is special in its use of DisplayAction method of STK agent. This allows the user to send a 'User Terminated Session' response to the SIM. If the user performs this action, then any pending DTMFs should also be canceled as soon as possible.
This commit is contained in:
parent
4c2d897614
commit
cdb98a70d0
38
src/stk.c
38
src/stk.c
|
@ -474,12 +474,34 @@ static void emit_menu_changed(struct ofono_stk *stk)
|
||||||
g_dbus_send_message(conn, signal);
|
g_dbus_send_message(conn, signal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cancel_pending_dtmf(struct ofono_stk *stk)
|
||||||
|
{
|
||||||
|
struct ofono_voicecall *vc = NULL;
|
||||||
|
struct ofono_atom *vc_atom;
|
||||||
|
|
||||||
|
vc_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(stk->atom),
|
||||||
|
OFONO_ATOM_TYPE_VOICECALL);
|
||||||
|
if (vc_atom)
|
||||||
|
vc = __ofono_atom_get_data(vc_atom);
|
||||||
|
|
||||||
|
if (vc) /* Should be always true here */
|
||||||
|
__ofono_voicecall_tone_cancel(vc, stk->dtmf_id);
|
||||||
|
}
|
||||||
|
|
||||||
static void user_termination_cb(enum stk_agent_result result, void *user_data)
|
static void user_termination_cb(enum stk_agent_result result, void *user_data)
|
||||||
{
|
{
|
||||||
struct ofono_stk *stk = user_data;
|
struct ofono_stk *stk = user_data;
|
||||||
|
|
||||||
if (result == STK_AGENT_RESULT_TERMINATE)
|
if (result != STK_AGENT_RESULT_TERMINATE)
|
||||||
send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED);
|
return;
|
||||||
|
|
||||||
|
switch (stk->pending_cmd->type) {
|
||||||
|
case STK_COMMAND_TYPE_SEND_DTMF:
|
||||||
|
cancel_pending_dtmf(stk);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stk_alpha_id_set(struct ofono_stk *stk,
|
static void stk_alpha_id_set(struct ofono_stk *stk,
|
||||||
|
@ -2265,17 +2287,7 @@ static gboolean handle_command_provide_local_info(const struct stk_command *cmd,
|
||||||
|
|
||||||
static void send_dtmf_cancel(struct ofono_stk *stk)
|
static void send_dtmf_cancel(struct ofono_stk *stk)
|
||||||
{
|
{
|
||||||
struct ofono_voicecall *vc = NULL;
|
cancel_pending_dtmf(stk);
|
||||||
struct ofono_atom *vc_atom;
|
|
||||||
|
|
||||||
vc_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(stk->atom),
|
|
||||||
OFONO_ATOM_TYPE_VOICECALL);
|
|
||||||
if (vc_atom)
|
|
||||||
vc = __ofono_atom_get_data(vc_atom);
|
|
||||||
|
|
||||||
if (vc) /* Should be always true here */
|
|
||||||
__ofono_voicecall_tone_cancel(vc, stk->dtmf_id);
|
|
||||||
|
|
||||||
stk_alpha_id_unset(stk);
|
stk_alpha_id_unset(stk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue