As per the ETSI TS 102 223 specification 8.12.2, it is
mandatory to provide additional information for the
general result "ME currently unable to process command".
---
 src/stk.c |   45 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/src/stk.c b/src/stk.c
index bec46ea..a00190d 100644
--- a/src/stk.c
+++ b/src/stk.c
@@ -99,6 +99,11 @@ struct extern_req {
 static void envelope_queue_run(struct ofono_stk *stk);
 static void timers_update(struct ofono_stk *stk);
 
+#define ADD_ERROR_RESULT(result, error, addn_info)             \
+               result.type = error;                            \
+               result.additional_len = sizeof(addn_info);      \
+               result.additional = addn_info;                  \
+
 static int stk_respond(struct ofono_stk *stk, struct stk_response *rsp,
                        ofono_stk_generic_cb_t cb)
 {
@@ -857,7 +862,10 @@ static gboolean handle_command_send_sms(const struct 
stk_command *cmd,
        msg_list.next = NULL;
 
        if (__ofono_sms_txq_submit(sms, &msg_list, 0, &uuid, NULL, NULL) < 0) {
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               unsigned char no_cause_result[] = { 0x00 };
+
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -1183,9 +1191,12 @@ static gboolean handle_command_select_item(const struct 
stk_command *cmd,
                                        request_selection_cb, stk,
                                        request_selection_destroy,
                                        stk->timeout * 1000) < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                request_selection_destroy(stk);
 
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -1301,7 +1312,10 @@ static gboolean handle_command_display_text(const struct 
stk_command *cmd,
 
        /* We most likely got an out of memory error, tell SIM to retry */
        if (err < 0) {
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               unsigned char no_cause_result[] = { 0x00 };
+
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -1475,11 +1489,14 @@ static gboolean handle_command_get_inkey(const struct 
stk_command *cmd,
        g_free(text);
 
        if (err < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                /*
                 * We most likely got an out of memory error, tell SIM
                 * to retry
                 */
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -1564,11 +1581,14 @@ static gboolean handle_command_get_input(const struct 
stk_command *cmd,
        g_free(text);
 
        if (err < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                /*
                 * We most likely got an out of memory error, tell SIM
                 * to retry
                 */
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -1772,11 +1792,14 @@ static gboolean handle_command_set_up_call(const struct 
stk_command *cmd,
        g_free(alpha_id);
 
        if (err < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                /*
                 * We most likely got an out of memory error, tell SIM
                 * to retry
                 */
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -2193,11 +2216,14 @@ static gboolean handle_command_send_dtmf(const struct 
stk_command *cmd,
        }
 
        if (err < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                /*
                 * We most likely got an out of memory error, tell SIM
                 * to retry
                 */
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
@@ -2329,11 +2355,14 @@ static gboolean handle_command_play_tone(const struct 
stk_command *cmd,
        g_free(text);
 
        if (err < 0) {
+               unsigned char no_cause_result[] = { 0x00 };
+
                /*
                 * We most likely got an out of memory error, tell SIM
                 * to retry
                 */
-               rsp->result.type = STK_RESULT_TYPE_TERMINAL_BUSY;
+               ADD_ERROR_RESULT(rsp->result, STK_RESULT_TYPE_TERMINAL_BUSY,
+                                       no_cause_result);
                return TRUE;
        }
 
-- 
1.7.0.4

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to