summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-07-28 12:26:08 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-07-30 17:19:55 -0500
commit5faa3951c2af362a134f781322f49950ae9510c5 (patch)
tree33620524acd832865122cda61b401b1d96a04b89
parent9654c69d7d2dff9a12b50a8b9c11d02798f2e5c0 (diff)
downloadofono-5faa3951c2af362a134f781322f49950ae9510c5.tar.bz2
stk: Utilities to deal with menus.
-rw-r--r--src/stk.c67
-rw-r--r--src/stkagent.c36
-rw-r--r--src/stkagent.h18
3 files changed, 121 insertions, 0 deletions
diff --git a/src/stk.c b/src/stk.c
index 4d895b5d..f192c4da 100644
--- a/src/stk.c
+++ b/src/stk.c
@@ -224,6 +224,73 @@ static void stk_command_cb(const struct ofono_error *error, void *data)
DBG("TERMINAL RESPONSE to a command reported no errors");
}
+static struct stk_menu *stk_menu_create(const char *title,
+ const struct stk_text_attribute *title_attr, GSList *items,
+ const struct stk_item_text_attribute_list *item_attrs,
+ int default_id, gboolean soft_key, gboolean has_help)
+{
+ struct stk_menu *ret = g_new(struct stk_menu, 1);
+ GSList *l;
+ int i;
+
+ ret->title = g_strdup(title ? title : "");
+ ret->icon_id = 0;
+ ret->items = g_new0(struct stk_menu_item, g_slist_length(items) + 1);
+ ret->default_item = -1;
+ ret->soft_key = soft_key;
+ ret->has_help = has_help;
+
+ for (l = items, i = 0; l; l = l->next, i++) {
+ struct stk_item *item = l->data;
+
+ ret->items[i].text = g_strdup(item->text);
+ ret->items[i].item_id = item->id;
+
+ if (item->id == default_id)
+ ret->default_item = i;
+ }
+
+ return ret;
+}
+
+static struct stk_menu *stk_menu_create_from_set_up_menu(
+ const struct stk_command *cmd)
+{
+ gboolean soft_key = (cmd->qualifier & (1 << 0)) != 0;
+ gboolean has_help = (cmd->qualifier & (1 << 7)) != 0;
+
+ return stk_menu_create(cmd->setup_menu.alpha_id,
+ &cmd->setup_menu.text_attr,
+ cmd->setup_menu.items,
+ &cmd->setup_menu.item_text_attr_list,
+ 0, soft_key, has_help);
+}
+
+static struct stk_menu *stk_menu_create_from_select_item(
+ const struct stk_command *cmd)
+{
+ gboolean soft_key = (cmd->qualifier & (1 << 2)) != 0;
+ gboolean has_help = (cmd->qualifier & (1 << 7)) != 0;
+
+ return stk_menu_create(cmd->select_item.alpha_id,
+ &cmd->select_item.text_attr,
+ cmd->select_item.items,
+ &cmd->select_item.item_text_attr_list,
+ cmd->select_item.item_id, soft_key, has_help);
+}
+
+static void stk_menu_free(struct stk_menu *menu)
+{
+ struct stk_menu_item *i;
+
+ for (i = menu->items; i->text; i++)
+ g_free(i->text);
+
+ g_free(menu->items);
+ g_free(menu->title);
+ g_free(menu);
+}
+
static void stk_alpha_id_set(struct ofono_stk *stk, const char *text)
{
/* TODO */
diff --git a/src/stkagent.c b/src/stkagent.c
index d49fec39..3f80ba1f 100644
--- a/src/stkagent.c
+++ b/src/stkagent.c
@@ -297,3 +297,39 @@ struct stk_agent *stk_agent_new(const char *path, const char *sender,
return agent;
}
+
+static void append_menu_items(DBusMessageIter *iter,
+ const struct stk_menu_item *item)
+{
+ DBusMessageIter array, entry;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ "(sy)", &array);
+
+ for (; item->text; item++) {
+ dbus_message_iter_open_container(&array, DBUS_TYPE_STRUCT,
+ NULL, &entry);
+
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
+ &item->text);
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_BYTE,
+ &item->icon_id);
+
+ dbus_message_iter_close_container(&array, &entry);
+ }
+
+ dbus_message_iter_close_container(iter, &array);
+}
+
+void append_menu_items_variant(DBusMessageIter *iter,
+ const struct stk_menu_item *items)
+{
+ DBusMessageIter variant;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
+ "a(sy)", &variant);
+
+ append_menu_items(&variant, items);
+
+ dbus_message_iter_close_container(iter, &variant);
+}
diff --git a/src/stkagent.h b/src/stkagent.h
index bcb0f152..5561fa4e 100644
--- a/src/stkagent.h
+++ b/src/stkagent.h
@@ -19,6 +19,21 @@
*
*/
+struct stk_menu_item {
+ char *text;
+ uint8_t icon_id;
+ uint8_t item_id;
+};
+
+struct stk_menu {
+ char *title;
+ uint8_t icon_id;
+ struct stk_menu_item *items;
+ int default_item;
+ gboolean soft_key;
+ gboolean has_help;
+};
+
enum stk_agent_result {
STK_AGENT_RESULT_OK,
STK_AGENT_RESULT_BACK,
@@ -45,3 +60,6 @@ void stk_agent_set_destroy_watch(struct stk_agent *agent, GDestroyNotify notify,
void *user_data);
void stk_agent_request_cancel(struct stk_agent *agent);
+
+void append_menu_items_variant(DBusMessageIter *iter,
+ const struct stk_menu_item *items);