stk: simplify respond_on_exit flag handling

respond_on_exit flag is set by commands which are dispatched to the
agent, so that if the agent exits prematurely, a 'User Terminated
Session' response is sent to the SIM.

There were a couple of corner cases not quite handled correctly:

- During Set Up Call, if the user confirmation phase succeeded and the
  call was dispatched to voicecall atom successfully, and the agent
  exited at this point, then no terminal response would be sent until
  the call succeeded / failed.  Now the agent termination results in an
  'User Terminated Session' response being sent immediately, but the
  call setup proceeding.
This commit is contained in:
Philippe Nunes 2011-05-20 18:26:14 +02:00 committed by Denis Kenzior
parent 9909fe981d
commit 4c2d897614
1 changed files with 2 additions and 25 deletions

View File

@ -128,6 +128,7 @@ static int stk_respond(struct ofono_stk *stk, struct stk_response *rsp,
stk_command_free(stk->pending_cmd);
stk->pending_cmd = NULL;
stk->cancel_cmd = NULL;
stk->respond_on_exit = FALSE;
stk->driver->terminal_response(stk, tlv_len, tlv, cb, stk);
@ -477,10 +478,8 @@ static void user_termination_cb(enum stk_agent_result result, void *user_data)
{
struct ofono_stk *stk = user_data;
if (result == STK_AGENT_RESULT_TERMINATE) {
stk->respond_on_exit = FALSE;
if (result == STK_AGENT_RESULT_TERMINATE)
send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED);
}
}
static void stk_alpha_id_set(struct ofono_stk *stk,
@ -598,7 +597,6 @@ static void default_agent_notify(gpointer user_data)
stk->default_agent = NULL;
stk->current_agent = stk->session_agent;
stk->respond_on_exit = FALSE;
}
static void session_agent_notify(gpointer user_data)
@ -617,7 +615,6 @@ static void session_agent_notify(gpointer user_data)
stk->session_agent = NULL;
stk->current_agent = stk->default_agent;
stk->respond_on_exit = FALSE;
if (stk->remove_agent_source) {
g_source_remove(stk->remove_agent_source);
@ -1159,8 +1156,6 @@ static void request_selection_cb(enum stk_agent_result result, uint8_t id,
{
struct ofono_stk *stk = user_data;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_OK:
{
@ -1243,8 +1238,6 @@ static void display_text_cb(enum stk_agent_result result, void *user_data)
static unsigned char screen_busy_result[] = { 0x01 };
static struct ofono_error error = { .type = OFONO_ERROR_TYPE_FAILURE };
stk->respond_on_exit = FALSE;
/*
* There are four possible paths for DisplayText with immediate
* response flag set:
@ -1386,8 +1379,6 @@ static void request_confirmation_cb(enum stk_agent_result result,
struct stk_command_get_inkey *cmd = &stk->pending_cmd->get_inkey;
struct stk_response rsp;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_OK:
memset(&rsp, 0, sizeof(rsp));
@ -1442,8 +1433,6 @@ static void request_key_cb(enum stk_agent_result result, char *string,
struct stk_command_get_inkey *cmd = &stk->pending_cmd->get_inkey;
struct stk_response rsp;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_OK:
memset(&rsp, 0, sizeof(rsp));
@ -1560,8 +1549,6 @@ static void request_string_cb(enum stk_agent_result result, char *string,
gboolean packed = (qualifier & (1 << 3)) != 0;
struct stk_response rsp;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_OK:
memset(&rsp, 0, sizeof(rsp));
@ -1699,8 +1686,6 @@ static void confirm_call_cb(enum stk_agent_result result, gboolean confirm,
struct stk_response rsp;
int err;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_TIMEOUT:
confirm = FALSE;
@ -2283,8 +2268,6 @@ static void send_dtmf_cancel(struct ofono_stk *stk)
struct ofono_voicecall *vc = NULL;
struct ofono_atom *vc_atom;
stk->respond_on_exit = FALSE;
vc_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(stk->atom),
OFONO_ATOM_TYPE_VOICECALL);
if (vc_atom)
@ -2300,8 +2283,6 @@ static void dtmf_sent_cb(int error, void *user_data)
{
struct ofono_stk *stk = user_data;
stk->respond_on_exit = FALSE;
stk_alpha_id_unset(stk);
if (error == ENOENT) {
@ -2413,8 +2394,6 @@ static void play_tone_cb(enum stk_agent_result result, void *user_data)
{
struct ofono_stk *stk = user_data;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_OK:
case STK_AGENT_RESULT_TIMEOUT:
@ -2547,8 +2526,6 @@ static void confirm_launch_browser_cb(enum stk_agent_result result,
struct ofono_error failure = { .type = OFONO_ERROR_TYPE_FAILURE };
struct stk_response rsp;
stk->respond_on_exit = FALSE;
switch (result) {
case STK_AGENT_RESULT_TIMEOUT:
confirm = FALSE;