Hi Jeevaka, On 6 July 2011 12:06, Jeevaka Badrappan <[email protected]> wrote: > --- > src/stk.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 106 insertions(+), 2 deletions(-) > > diff --git a/src/stk.c b/src/stk.c > index 9575f0e..26faa11 100644 > --- a/src/stk.c > +++ b/src/stk.c > @@ -77,6 +77,8 @@ struct ofono_stk { > struct timeval get_inkey_start_ts; > int dtmf_id; > > + gboolean modem_handled_cmd; > + > __ofono_sms_sim_download_cb_t sms_pp_cb; > void *sms_pp_userdata; > }; > @@ -1785,6 +1787,44 @@ static void confirm_call_cb(enum stk_agent_result > result, gboolean confirm, > stk_command_cb(&error, stk); > } > > +static void confirm_handled_call_cb(enum stk_agent_result result, > + gboolean confirm, void *user_data) > +{ > + struct ofono_stk *stk = user_data; > + const struct stk_command_setup_call *sc = > + &stk->pending_cmd->setup_call; > + struct ofono_voicecall *vc = NULL; > + struct ofono_atom *vc_atom; > + > + if (stk->driver->user_confirmation == NULL) > + goto out; > + > + if (result != STK_AGENT_RESULT_OK) { > + stk->driver->user_confirmation(stk, FALSE); > + goto out; > + } > + > + stk->driver->user_confirmation(stk, confirm); > + > + 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 == NULL) > + goto out; > + > + __ofono_voicecall_set_alpha_and_icon_id(vc, sc->alpha_id_call_setup, > + sc->icon_id_call_setup.id); > + > + stk->modem_handled_cmd = TRUE; > + > + return; > +out: > + stk_command_free(stk->pending_cmd); > + stk->pending_cmd = NULL; > +} > + > static gboolean handle_command_set_up_call(const struct stk_command *cmd, > struct stk_response *rsp, > struct ofono_stk *stk) > @@ -2601,6 +2641,40 @@ static gboolean handle_command_launch_browser(const > struct stk_command *cmd, > return FALSE; > } > > +static void handle_setup_call_confirmation_req(struct stk_command *cmd, > + struct ofono_stk *stk) > +{ > + const struct stk_command_setup_call *sc = &cmd->setup_call; > + int err; > + char *alpha_id = dbus_apply_text_attributes( > + sc->alpha_id_usr_cfm ? > + sc->alpha_id_usr_cfm : "", > + &sc->text_attr_usr_cfm); > + if (alpha_id == NULL) > + goto out; > + > + err = stk_agent_confirm_call(stk->current_agent, alpha_id, > + &sc->icon_id_usr_cfm, > + confirm_handled_call_cb, > + stk, NULL, > + stk->timeout * 1000); > + g_free(alpha_id); > + > + if (err < 0) > + goto out; > + > + stk->pending_cmd = cmd; > + stk->cancel_cmd = stk_request_cancel; > + > + return; > + > +out: > + if (stk->driver->user_confirmation) > + stk->driver->user_confirmation(stk, FALSE); > + > + stk_command_free(cmd); > +} > + > static void stk_proactive_command_cancel(struct ofono_stk *stk) > { > if (stk->immediate_response) > @@ -2615,8 +2689,38 @@ static void stk_proactive_command_cancel(struct > ofono_stk *stk) > } > } > > +static void proactive_session_end_handled_cmd(struct ofono_stk *stk) > +{ > + stk->modem_handled_cmd = FALSE; > + > + switch(stk->pending_cmd->type) { > + case STK_COMMAND_TYPE_SETUP_CALL: > + { > + 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 != NULL) > + __ofono_voicecall_clear_alpha_and_icon_id(vc); > + > + break;
This part seems fragile. A new command may arrive and the alpha id and icon id won't be cleared. Additionally modem_handled_cmd is not reset when the pending_cmd is cancelled so it may affect a future command. Maybe voicecall.c should automatically clear the alpha & icon id after the first new call? Best regards _______________________________________________ ofono mailing list [email protected] http://lists.ofono.org/listinfo/ofono
