diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2010-07-28 12:26:10 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-07-30 17:19:55 -0500 |
commit | 3714eb8acd8a38988e005b795f384b640980ff98 (patch) | |
tree | 0dab05393e1efe16d200a8228160b2d611881ca3 /src/stkagent.c | |
parent | 47b95122ccbea1b4288b5aca97e931cce0f839c3 (diff) | |
download | ofono-3714eb8acd8a38988e005b795f384b640980ff98.tar.bz2 |
stk: Handle the Select Item proactive command.
Diffstat (limited to 'src/stkagent.c')
-rw-r--r-- | src/stkagent.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/stkagent.c b/src/stkagent.c index 3f80ba1f..ce7ad185 100644 --- a/src/stkagent.c +++ b/src/stkagent.c @@ -52,6 +52,8 @@ struct stk_agent { ofono_bool_t is_default; GDestroyNotify destroy_notify; void *destroy_data; + + const struct stk_menu *request_selection_menu; }; #define OFONO_NAVIGATION_PREFIX OFONO_SERVICE ".Error" @@ -333,3 +335,64 @@ void append_menu_items_variant(DBusMessageIter *iter, dbus_message_iter_close_container(iter, &variant); } + +static void request_selection_cb(struct stk_agent *agent, + enum stk_agent_result result, + DBusMessage *reply) +{ + const struct stk_menu *menu = agent->request_selection_menu; + stk_agent_selection_cb cb = (stk_agent_selection_cb) agent->user_cb; + unsigned char selection, i; + + if (result != STK_AGENT_RESULT_OK) { + cb(result, 0, agent->user_data); + + return; + } + + if (dbus_message_get_args(reply, NULL, + DBUS_TYPE_BYTE, &selection, + DBUS_TYPE_INVALID) == FALSE) { + ofono_error("Can't parse the reply to RequestSelection()"); + + cb(STK_AGENT_RESULT_TERMINATE, 0, agent->user_data); + + return; + } + + for (i = 0; i < selection && menu->items[i].text; i++); + + if (i != selection) { + ofono_error("Invalid item selected"); + + cb(STK_AGENT_RESULT_TERMINATE, 0, agent->user_data); + + return; + } + + cb(result, menu->items[selection].item_id, agent->user_data); +} + +void stk_agent_request_selection(struct stk_agent *agent, + const struct stk_menu *menu, + stk_agent_selection_cb cb, + void *user_data, int timeout) +{ + dbus_int16_t default_item = menu->default_item; + DBusMessageIter iter; + + if (!stk_agent_request_start(agent, "RequestSelection", + request_selection_cb, + (stk_agent_generic_cb) cb, + user_data, timeout)) + return; + + dbus_message_iter_init_append(agent->msg, &iter); + + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &menu->title); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_BYTE, &menu->icon_id); + append_menu_items(&iter, menu->items); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT16, &default_item); + + agent->request_selection_menu = menu; +} |