diff --git a/doc/stk-api.txt b/doc/stk-api.txt index b9ca5929..79daee6a 100644 --- a/doc/stk-api.txt +++ b/doc/stk-api.txt @@ -116,6 +116,7 @@ Methods byte RequestSelection(string title, byte icon_id, cleared prior to the display of this text. Possible Errors: [service].Error.SimToolkit.GoBack + [service].Error.SimToolkit.Busy Implementation notes: diff --git a/src/stk.c b/src/stk.c index a4abb7d3..7b39f7e1 100644 --- a/src/stk.c +++ b/src/stk.c @@ -1203,6 +1203,9 @@ static void display_text_cb(enum stk_agent_result result, void *user_data) { struct ofono_stk *stk = user_data; gboolean confirm; + struct stk_response rsp; + static unsigned char screen_busy_result[] = { 0x01 }; + static struct ofono_error error = { .type = OFONO_ERROR_TYPE_FAILURE }; stk->respond_on_exit = FALSE; @@ -1250,6 +1253,15 @@ static void display_text_cb(enum stk_agent_result result, void *user_data) STK_RESULT_TYPE_NO_RESPONSE : STK_RESULT_TYPE_SUCCESS); break; + case STK_AGENT_RESULT_BUSY: + memset(&rsp, 0, sizeof(rsp)); + rsp.result.type = STK_RESULT_TYPE_TERMINAL_BUSY; + rsp.result.additional_len = sizeof(screen_busy_result); + rsp.result.additional = screen_busy_result; + if (stk_respond(stk, &rsp, stk_command_cb)) + stk_command_cb(&error, stk); + break; + case STK_AGENT_RESULT_TERMINATE: default: send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED); @@ -1366,6 +1378,7 @@ static void request_confirmation_cb(enum stk_agent_result result, break; case STK_AGENT_RESULT_TERMINATE: + default: send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED); break; } @@ -1408,6 +1421,7 @@ static void request_key_cb(enum stk_agent_result result, char *string, break; case STK_AGENT_RESULT_TERMINATE: + default: send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED); break; } @@ -1505,6 +1519,7 @@ static void request_string_cb(enum stk_agent_result result, char *string, break; case STK_AGENT_RESULT_TERMINATE: + default: send_simple_response(stk, STK_RESULT_TYPE_USER_TERMINATED); break; } diff --git a/src/stkagent.c b/src/stkagent.c index 83150400..e1a6f483 100644 --- a/src/stkagent.c +++ b/src/stkagent.c @@ -41,6 +41,7 @@ enum allowed_error { ALLOWED_ERROR_GO_BACK = 0x1, ALLOWED_ERROR_TERMINATE = 0x2, + ALLOWED_ERROR_BUSY = 0x4, }; struct stk_agent { @@ -62,6 +63,7 @@ struct stk_agent { #define ERROR_PREFIX OFONO_SERVICE ".Error" #define GOBACK_ERROR ERROR_PREFIX ".GoBack" #define TERMINATE_ERROR ERROR_PREFIX ".EndSession" +#define BUSY_ERROR ERROR_PREFIX ".Busy" static void stk_agent_send_noreply(struct stk_agent *agent, const char *method) { @@ -194,6 +196,12 @@ static int check_error(struct stk_agent *agent, DBusMessage *reply, goto out; } + if ((allowed_errors & ALLOWED_ERROR_BUSY) && + g_str_equal(err.name, BUSY_ERROR)) { + *out_result = STK_AGENT_RESULT_BUSY; + goto out; + } + result = -EINVAL; out: @@ -376,8 +384,8 @@ static void display_text_cb(DBusPendingCall *call, void *data) gboolean remove_agent; if (check_error(agent, reply, - ALLOWED_ERROR_GO_BACK | ALLOWED_ERROR_TERMINATE, - &result) == -EINVAL) { + ALLOWED_ERROR_GO_BACK | ALLOWED_ERROR_TERMINATE | + ALLOWED_ERROR_BUSY, &result) == -EINVAL) { remove_agent = TRUE; goto error; } diff --git a/src/stkagent.h b/src/stkagent.h index c8e1886a..517bcfe0 100644 --- a/src/stkagent.h +++ b/src/stkagent.h @@ -26,6 +26,7 @@ enum stk_agent_result { STK_AGENT_RESULT_BACK, STK_AGENT_RESULT_TERMINATE, STK_AGENT_RESULT_TIMEOUT, + STK_AGENT_RESULT_BUSY, }; struct stk_menu_item {