summaryrefslogtreecommitdiffstats
path: root/src/stkagent.c
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-07-28 12:26:10 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-07-30 17:19:55 -0500
commit3714eb8acd8a38988e005b795f384b640980ff98 (patch)
tree0dab05393e1efe16d200a8228160b2d611881ca3 /src/stkagent.c
parent47b95122ccbea1b4288b5aca97e931cce0f839c3 (diff)
downloadofono-3714eb8acd8a38988e005b795f384b640980ff98.tar.bz2
stk: Handle the Select Item proactive command.
Diffstat (limited to 'src/stkagent.c')
-rw-r--r--src/stkagent.c63
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;
+}