summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/stk-api.txt1
-rw-r--r--src/stk.c15
-rw-r--r--src/stkagent.c12
-rw-r--r--src/stkagent.h1
4 files changed, 27 insertions, 2 deletions
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 {