From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 02/13] stk: Handle the Send DTMF proactive command.
Date: Thu, 14 Oct 2010 03:55:18 -0500 [thread overview]
Message-ID: <4CB6C576.2070800@gmail.com> (raw)
In-Reply-To: <1286978056-16600-2-git-send-email-andrew.zaborowski@intel.com>
[-- Attachment #1: Type: text/plain, Size: 9061 bytes --]
Hi Andrew,
On 10/13/2010 08:54 AM, Andrzej Zaborowski wrote:
> In this version 'p' is used as the pause character in DTMF strings as
> it seems in more widespread use than comma. ISImodem already
> understands 'p'. atmodem support comes in the next patch.
> ---
I cannibalized this patch a little bit, see comments below:
> @@ -70,7 +70,7 @@ struct ofono_stk {
> gboolean respond_on_exit;
> ofono_bool_t immediate_response;
> guint remove_agent_source;
> - struct sms_submit_req *sms_submit_req;
> + struct extern_req *extern_req;
> char *idle_mode_text;
> struct timeval get_inkey_start_ts;
> };
This chunk was applied
> @@ -83,7 +83,7 @@ struct envelope_op {
> const unsigned char *data, int length);
> };
>
> -struct sms_submit_req {
> +struct extern_req {
> struct ofono_stk *stk;
> gboolean cancelled;
> };
This chunk was applied
> @@ -435,8 +435,12 @@ static void default_agent_notify(gpointer user_data)
> {
> struct ofono_stk *stk = user_data;
>
> - if (stk->current_agent == stk->default_agent && stk->respond_on_exit)
> + if (stk->current_agent == stk->default_agent && stk->respond_on_exit) {
> + if (stk->pending_cmd)
> + stk->cancel_cmd(stk);
> +
> send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED);
> + }
>
> stk->default_agent = NULL;
> stk->current_agent = stk->session_agent;
> @@ -450,6 +454,9 @@ static void session_agent_notify(gpointer user_data)
> DBG("Session Agent removed");
>
> if (stk->current_agent == stk->session_agent && stk->respond_on_exit) {
> + if (stk->pending_cmd)
> + stk->cancel_cmd(stk);
> +
> DBG("Sending Terminate response for session agent");
> send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED);
> }
Can you explain a bit more what these two chunks are doing?
> @@ -660,7 +667,7 @@ static gboolean handle_command_more_time(const struct stk_command *cmd,
>
> static void send_sms_cancel(struct ofono_stk *stk)
> {
> - stk->sms_submit_req->cancelled = TRUE;
> + stk->extern_req->cancelled = TRUE;
>
> if (!stk->pending_cmd->send_sms.alpha_id ||
> !stk->pending_cmd->send_sms.alpha_id[0])
This chunk has been applied
> @@ -671,7 +678,7 @@ static void send_sms_cancel(struct ofono_stk *stk)
>
> static void send_sms_submit_cb(gboolean ok, void *data)
> {
> - struct sms_submit_req *req = data;
> + struct extern_req *req = data;
> struct ofono_stk *stk = req->stk;
> struct ofono_error failure = { .type = OFONO_ERROR_TYPE_FAILURE };
> struct stk_response rsp;
This chunk has been applied
> @@ -697,6 +704,12 @@ static void send_sms_submit_cb(gboolean ok, void *data)
> stk_command_cb(&failure, stk);
> }
>
> +static void extern_req_start(struct ofono_stk *stk)
> +{
> + stk->extern_req = g_new0(struct extern_req, 1);
> + stk->extern_req->stk = stk;
> +}
> +
> static gboolean handle_command_send_sms(const struct stk_command *cmd,
> struct stk_response *rsp,
> struct ofono_stk *stk)
This chunk has been applied
> @@ -715,15 +728,14 @@ static gboolean handle_command_send_sms(const struct stk_command *cmd,
>
> sms = __ofono_atom_get_data(sms_atom);
>
> - stk->sms_submit_req = g_new0(struct sms_submit_req, 1);
> - stk->sms_submit_req->stk = stk;
> + extern_req_start(stk);
>
> msg_list.data = (void *) &cmd->send_sms.gsm_sms;
> msg_list.next = NULL;
>
> if (__ofono_sms_txq_submit(sms, &msg_list, 0, NULL, send_sms_submit_cb,
> - stk->sms_submit_req, g_free) < 0) {
> - g_free(stk->sms_submit_req);
> + stk->extern_req, g_free) < 0) {
> + g_free(stk->extern_req);
> rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
> return TRUE;
> }
This chunk has been applied
> @@ -1824,6 +1836,148 @@ static gboolean handle_command_refresh(const struct stk_command *cmd,
> return TRUE;
> }
>
> +static void send_dtmf_cancel(struct ofono_stk *stk)
> +{
> + stk->respond_on_exit = FALSE;
> + stk->extern_req->cancelled = TRUE;
> +
> + if (stk->pending_cmd->send_dtmf.alpha_id &&
> + stk->pending_cmd->send_dtmf.alpha_id[0])
> + stk_alpha_id_unset(stk);
> +}
> +
> +static void dtmf_sent_cb(const struct ofono_error *error, void *user_data)
> +{
> + struct extern_req *req = user_data;
> + struct ofono_stk *stk = req->stk;
> + gboolean cancelled = req->cancelled;
> +
> + g_free(req);
> +
> + if (cancelled) {
> + DBG("Received a DTMF Sent callback after the "
> + "proactive command was cancelled");
> + return;
> + }
> +
> + stk->respond_on_exit = FALSE;
> +
> + if (stk->pending_cmd->send_dtmf.alpha_id &&
> + stk->pending_cmd->send_dtmf.alpha_id[0])
> + stk_alpha_id_unset(stk);
> +
> + if (error->type == OFONO_ERROR_TYPE_FAILURE &&
> + error->error == ENOENT) {
I don't see how this if can be triggered from reviewing the previous
patch. Should the error be -ENOENT?
> + struct stk_response rsp;
> + static unsigned char not_in_speech_call_result[] = { 0x07 };
> + static struct ofono_error failure =
> + { .type = OFONO_ERROR_TYPE_FAILURE };
> +
> + memset(&rsp, 0, sizeof(rsp));
> +
> + rsp.result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
> + rsp.result.additional_len = sizeof(not_in_speech_call_result);
> + rsp.result.additional = not_in_speech_call_result;
> +
> + if (stk_respond(stk, &rsp, stk_command_cb))
> + stk_command_cb(&failure, stk);
> +
> + return;
> + }
> +
> + if (error->type == OFONO_ERROR_TYPE_FAILURE &&
> + error->error == ENOENT) {
And now we're repeating the if condition above? Have you tested this part?
> + send_simple_response(stk, STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD);
> + return;
> + }
> +
> + if (error->type == OFONO_ERROR_TYPE_NO_ERROR)
> + send_simple_response(stk, STK_RESULT_TYPE_SUCCESS);
> + else
> + send_simple_response(stk, STK_RESULT_TYPE_NOT_CAPABLE);
> +}
> +
> +static gboolean handle_command_send_dtmf(const struct stk_command *cmd,
> + struct stk_response *rsp,
> + struct ofono_stk *stk)
> +{
> + static unsigned char not_in_speech_call_result[] = { 0x07 };
> + struct ofono_voicecall *vc = NULL;
> + struct ofono_atom *vc_atom;
> + char dtmf[256], *digit;
> + char *dtmf_from = "01234567890abcABC";
> + char *dtmf_to = "01234567890*#p*#p";
> + int err, pos;
> +
> + 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) {
> + rsp->result.type = STK_RESULT_TYPE_NOT_CAPABLE;
> + return TRUE;
> + }
> +
> + /* Convert the DTMF string to phone number format */
> + for (pos = 0; cmd->send_dtmf.dtmf[pos] != 0; pos++) {
> + digit = strchr(dtmf_from, cmd->send_dtmf.dtmf[pos]);
> + if (!digit) {
> + rsp->result.type = STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD;
> + return TRUE;
> + }
> +
> + dtmf[pos] = dtmf_to[digit - dtmf_from];
> + }
> + dtmf[pos] = 0;
> +
> + extern_req_start(stk);
I'm not sure that modeling this after the Send SMS implementation is a
good idea. Send SMS uses the SMS submit queue, which does not support
cancellation. Wouldn't the Setup Call implementation be a better
template? E.g. a voicecall_send_tone and voicecall_send_tone_cancel?
> +
> + err = __ofono_voicecall_send_tone(vc, dtmf,
> + dtmf_sent_cb, stk->extern_req);
> + if (err < 0)
> + g_free(stk->extern_req);
> +
> + if (err == -EBUSY) {
> + rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
> + return TRUE;
> + }
> +
> + if (err == -ENOSYS) {
> + rsp->result.type = STK_RESULT_TYPE_NOT_CAPABLE;
> + return TRUE;
> + }
> +
> + if (err == -ENOENT) {
> + rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
> + rsp->result.additional_len = sizeof(not_in_speech_call_result);
> + rsp->result.additional = not_in_speech_call_result;
> + return TRUE;
> + }
> +
> + if (err < 0) {
> + /*
> + * We most likely got an out of memory error, tell SIM
> + * to retry
> + */
> + rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
> + return TRUE;
> + }
> +
> + if (cmd->send_dtmf.alpha_id && cmd->send_dtmf.alpha_id[0])
> + stk_alpha_id_set(stk, cmd->send_dtmf.alpha_id);
> +
> + /*
> + * Note that we don't strictly require an agent to be connected,
> + * but to comply with 6.4.24 we need to send a End Session when
> + * the user decides so.
> + */
> + stk->respond_on_exit = TRUE;
> + stk->cancel_cmd = send_dtmf_cancel;
> +
> + return FALSE;
> +}
> +
> static void stk_proactive_command_cancel(struct ofono_stk *stk)
> {
> if (stk->immediate_response)
> @@ -1996,6 +2150,11 @@ void ofono_stk_proactive_command_notify(struct ofono_stk *stk,
> &rsp, stk);
> break;
>
> + case STK_COMMAND_TYPE_SEND_DTMF:
> + respond = handle_command_send_dtmf(stk->pending_cmd,
> + &rsp, stk);
> + break;
> +
> default:
> rsp.result.type = STK_RESULT_TYPE_COMMAND_NOT_UNDERSTOOD;
> break;
Regards,
-Denis
next prev parent reply other threads:[~2010-10-14 8:55 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-13 13:54 [PATCH 01/13] voicecall: __ofono_voicecall_send_tone internal api Andrzej Zaborowski
2010-10-13 13:54 ` [PATCH 02/13] stk: Handle the Send DTMF proactive command Andrzej Zaborowski
2010-10-14 8:55 ` Denis Kenzior [this message]
2010-10-13 13:54 ` [PATCH 03/13] atmodem: Handle pauses in DTMF string Andrzej Zaborowski
2010-10-13 13:54 ` [PATCH 04/13] doc: Update property name to match code Andrzej Zaborowski
2010-10-14 5:56 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 05/13] doc: Add STK properties relevant for icons Andrzej Zaborowski
2010-10-14 8:08 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 06/13] stk: Pass icon IDs in stk agent request parameters Andrzej Zaborowski
2010-10-14 8:09 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 07/13] stk: Add icon ID information in stk_menu Andrzej Zaborowski
2010-10-14 8:09 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 08/13] stk: IdleModeIcon and MainMenuIcon properties Andrzej Zaborowski
2010-10-14 8:10 ` Denis Kenzior
2010-10-14 8:31 ` list-modems patch Alexander A Khryukin
2010-10-14 8:45 ` Marcel Holtmann
2010-10-14 9:17 ` Alexander A Khryukin
2010-10-14 9:34 ` Alexander A Khryukin
2010-10-14 10:13 ` Marcel Holtmann
2010-10-14 10:36 ` Alexander A Khryukin
2010-10-15 6:17 ` Marcel Holtmann
2010-10-13 13:54 ` [PATCH 09/13] stk: Simplify and add icon to alphaId api Andrzej Zaborowski
2010-10-14 8:56 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 10/13] stk: Apply STK text attributes as html Andrzej Zaborowski
2010-10-14 8:57 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 11/13] stkagent: Add PlayTone and LoopTone requests Andrzej Zaborowski
2010-10-14 9:02 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 12/13] stk: Handle the Play Tone proactive command Andrzej Zaborowski
2010-10-14 9:11 ` Denis Kenzior
2010-10-13 13:54 ` [PATCH 13/13] [RfC] API for STK driver to signal executed commands Andrzej Zaborowski
2010-10-14 9:17 ` Denis Kenzior
2010-10-14 8:47 ` [PATCH 01/13] voicecall: __ofono_voicecall_send_tone internal api Denis Kenzior
2010-10-19 14:10 ` Andrzej Zaborowski
2010-10-19 14:58 ` Denis Kenzior
2010-10-19 15:34 ` Andrzej Zaborowski
2010-10-19 15:59 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CB6C576.2070800@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.