diff options
-rw-r--r-- | src/stkagent.c | 94 | ||||
-rw-r--r-- | src/stkagent.h | 13 |
2 files changed, 107 insertions, 0 deletions
diff --git a/src/stkagent.c b/src/stkagent.c index bba29f45..5cf83e48 100644 --- a/src/stkagent.c +++ b/src/stkagent.c @@ -862,3 +862,97 @@ int stk_agent_confirm_call(struct stk_agent *agent, const char *text, return 0; } + +static void play_tone_cb(DBusPendingCall *call, void *data) +{ + struct stk_agent *agent = data; + stk_agent_tone_cb cb = agent->user_cb; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + enum stk_agent_result result; + gboolean remove_agent; + + if (check_error(agent, reply, + ALLOWED_ERROR_TERMINATE, &result) == -EINVAL) { + remove_agent = TRUE; + goto error; + } + + if (dbus_message_get_args(reply, NULL, DBUS_TYPE_INVALID) == FALSE) { + ofono_error("Can't parse the reply to PlayTone()"); + remove_agent = TRUE; + goto error; + } + + cb(result, agent->user_data); + goto done; + + CALLBACK_END(); +} + +int stk_agent_play_tone(struct stk_agent *agent, const char *text, + const struct stk_icon_id *icon, ofono_bool_t vibrate, + const char *tone, stk_agent_tone_cb cb, void *user_data, + ofono_destroy_func destroy, int timeout) +{ + DBusConnection *conn = ofono_dbus_get_connection(); + + agent->msg = dbus_message_new_method_call(agent->bus, agent->path, + OFONO_SIM_APP_INTERFACE, + "PlayTone"); + if (agent->msg == NULL) + return -ENOMEM; + + dbus_message_append_args(agent->msg, + DBUS_TYPE_STRING, &tone, + DBUS_TYPE_STRING, &text, + DBUS_TYPE_BYTE, &icon->id, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(conn, agent->msg, &agent->call, + timeout) == FALSE || + agent->call == NULL) + return -EIO; + + agent->user_cb = cb; + agent->user_data = user_data; + agent->user_destroy = destroy; + + dbus_pending_call_set_notify(agent->call, play_tone_cb, + agent, NULL); + + return 0; +} + +int stk_agent_loop_tone(struct stk_agent *agent, const char *text, + const struct stk_icon_id *icon, ofono_bool_t vibrate, + const char *tone, stk_agent_tone_cb cb, void *user_data, + ofono_destroy_func destroy, int timeout) +{ + DBusConnection *conn = ofono_dbus_get_connection(); + + agent->msg = dbus_message_new_method_call(agent->bus, agent->path, + OFONO_SIM_APP_INTERFACE, + "LoopTone"); + if (agent->msg == NULL) + return -ENOMEM; + + dbus_message_append_args(agent->msg, + DBUS_TYPE_STRING, &tone, + DBUS_TYPE_STRING, &text, + DBUS_TYPE_BYTE, &icon->id, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(conn, agent->msg, &agent->call, + timeout) == FALSE || + agent->call == NULL) + return -EIO; + + agent->user_cb = cb; + agent->user_data = user_data; + agent->user_destroy = destroy; + + dbus_pending_call_set_notify(agent->call, play_tone_cb, + agent, NULL); + + return 0; +} diff --git a/src/stkagent.h b/src/stkagent.h index 97c4ecaa..c8e1886a 100644 --- a/src/stkagent.h +++ b/src/stkagent.h @@ -56,6 +56,9 @@ typedef void (*stk_agent_confirmation_cb)(enum stk_agent_result result, typedef void (*stk_agent_string_cb)(enum stk_agent_result result, char *string, void *user_data); +typedef void (*stk_agent_tone_cb)(enum stk_agent_result result, + void *user_data); + struct stk_agent *stk_agent_new(const char *path, const char *sender, ofono_bool_t remove_on_terminate); @@ -121,5 +124,15 @@ int stk_agent_confirm_call(struct stk_agent *agent, const char *text, stk_agent_confirmation_cb cb, void *user_data, ofono_destroy_func destroy, int timeout); +int stk_agent_play_tone(struct stk_agent *agent, const char *text, + const struct stk_icon_id *icon, ofono_bool_t vibrate, + const char *tone, stk_agent_tone_cb cb, void *user_data, + ofono_destroy_func destroy, int timeout); + +int stk_agent_loop_tone(struct stk_agent *agent, const char *text, + const struct stk_icon_id *icon, ofono_bool_t vibrate, + const char *tone, stk_agent_tone_cb cb, void *user_data, + ofono_destroy_func destroy, int timeout); + void append_menu_items_variant(DBusMessageIter *iter, const struct stk_menu_item *items); |