summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/stk.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/stk.c b/src/stk.c
index a57342a2..81d3755d 100644
--- a/src/stk.c
+++ b/src/stk.c
@@ -50,6 +50,7 @@ struct ofono_stk {
GQueue *envelope_q;
struct sms_submit_req *sms_submit_req;
+ char *idle_mode_text;
};
struct envelope_op {
@@ -219,6 +220,45 @@ static void stk_alpha_id_unset(struct ofono_stk *stk)
/* TODO */
}
+static DBusMessage *stk_get_properties(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ofono_stk *stk = data;
+ DBusMessage *reply;
+ DBusMessageIter iter;
+ DBusMessageIter dict;
+ const char *idle_mode_text = stk->idle_mode_text ?: "";
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return NULL;
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ OFONO_PROPERTIES_ARRAY_SIGNATURE,
+ &dict);
+
+ ofono_dbus_dict_append(&dict, "IdleModeText",
+ DBUS_TYPE_STRING, &idle_mode_text);
+
+ dbus_message_iter_close_container(&iter, &dict);
+
+ return reply;
+}
+
+static GDBusMethodTable stk_methods[] = {
+ { "GetProperties", "", "a{sv}",stk_get_properties },
+
+ { }
+};
+
+static GDBusSignalTable stk_signals[] = {
+ { "PropertyChanged", "sv" },
+
+ { }
+};
+
static gboolean handle_command_more_time(const struct stk_command *cmd,
struct stk_response *rsp,
struct ofono_stk *stk)
@@ -310,6 +350,34 @@ static gboolean handle_command_send_sms(const struct stk_command *cmd,
return FALSE;
}
+static gboolean handle_command_set_idle_text(const struct stk_command *cmd,
+ struct stk_response *rsp,
+ struct ofono_stk *stk)
+{
+ const char *idle_mode_text;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(stk->atom);
+
+ if (stk->idle_mode_text) {
+ g_free(stk->idle_mode_text);
+ stk->idle_mode_text = NULL;
+ }
+
+ if (!cmd->setup_idle_mode_text.text)
+ goto out;
+
+ stk->idle_mode_text = g_strdup(cmd->setup_idle_mode_text.text);
+
+out:
+ idle_mode_text = stk->idle_mode_text ?: "";
+ ofono_dbus_signal_property_changed(conn, path, OFONO_STK_INTERFACE,
+ "IdleModeText",
+ DBUS_TYPE_STRING,
+ &idle_mode_text);
+
+ return TRUE;
+}
+
static void stk_proactive_command_cancel(struct ofono_stk *stk)
{
if (!stk->pending_cmd)
@@ -388,6 +456,10 @@ void ofono_stk_proactive_command_notify(struct ofono_stk *stk,
respond = handle_command_send_sms(stk->pending_cmd,
&rsp, stk);
break;
+ case STK_COMMAND_TYPE_SETUP_IDLE_MODE_TEXT:
+ respond = handle_command_set_idle_text(stk->pending_cmd,
+ &rsp, stk);
+ break;
}
if (respond)
@@ -438,14 +510,25 @@ void ofono_stk_driver_unregister(const struct ofono_stk_driver *d)
static void stk_unregister(struct ofono_atom *atom)
{
struct ofono_stk *stk = __ofono_atom_get_data(atom);
+ DBusConnection *conn = ofono_dbus_get_connection();
+ struct ofono_modem *modem = __ofono_atom_get_modem(atom);
+ const char *path = __ofono_atom_get_path(atom);
if (stk->pending_cmd) {
stk_command_free(stk->pending_cmd);
stk->pending_cmd = NULL;
}
+ if (stk->idle_mode_text) {
+ g_free(stk->idle_mode_text);
+ stk->idle_mode_text = NULL;
+ }
+
g_queue_foreach(stk->envelope_q, (GFunc) g_free, NULL);
g_queue_free(stk->envelope_q);
+
+ ofono_modem_remove_interface(modem, OFONO_STK_INTERFACE);
+ g_dbus_unregister_interface(conn, path, OFONO_STK_INTERFACE);
}
static void stk_remove(struct ofono_atom *atom)
@@ -500,6 +583,21 @@ struct ofono_stk *ofono_stk_create(struct ofono_modem *modem,
void ofono_stk_register(struct ofono_stk *stk)
{
+ DBusConnection *conn = ofono_dbus_get_connection();
+ struct ofono_modem *modem = __ofono_atom_get_modem(stk->atom);
+ const char *path = __ofono_atom_get_path(stk->atom);
+
+ if (!g_dbus_register_interface(conn, path, OFONO_STK_INTERFACE,
+ stk_methods, stk_signals, NULL,
+ stk, NULL)) {
+ ofono_error("Could not create %s interface",
+ OFONO_STK_INTERFACE);
+
+ return;
+ }
+
+ ofono_modem_add_interface(modem, OFONO_STK_INTERFACE);
+
__ofono_atom_register(stk->atom, stk_unregister);
stk->envelope_q = g_queue_new();