Hi Jeevaka,
On 07/06/2011 05:06 AM, Jeevaka Badrappan 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;
This situation is quite funny, I'd almost rather crash here, but fair
enough.
+
+ 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;
Please insert a newline here
+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;
+ }
+
+ default:
+ break;
+ }
+}
+
void ofono_stk_proactive_session_end_notify(struct ofono_stk *stk)
{
+ if (stk->modem_handled_cmd == TRUE)
+ proactive_session_end_handled_cmd(stk);
+
Are we getting information on the terminal responses sent by the modem
for these? I'd rather handle this sort of stuff by parsing the terminal
response than relying on the session end notification. This might also
help alleviate the concerns Andrew has raised as well.
/* Wait until we receive the next command */
if (stk->immediate_response)
return;
@@ -2858,8 +2962,8 @@ void ofono_stk_proactive_command_handled_notify(struct ofono_stk
*stk,
break;
case STK_COMMAND_TYPE_SETUP_CALL:
- /* TODO */
- break;
+ handle_setup_call_confirmation_req(cmd, stk);
+ return;
case STK_COMMAND_TYPE_SEND_USSD:
stk_alpha_id_set(stk, cmd->send_ussd.alpha_id,
Regards,
-Denis