aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r--src/mm-broadband-modem.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 4b13fd09..5e026449 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -10500,6 +10500,65 @@ modem_cdma_register_in_network (MMIfaceModemCdma *_self,
}
/*****************************************************************************/
+/* Load currently active channels (CellBroadcast interface) */
+
+static GArray *
+modem_cell_broadcast_load_channels_finish (MMIfaceModemCellBroadcast *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void
+cscb_channels_format_check_ready (MMBroadbandModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ const gchar *response;
+ GError *error = NULL;
+ GArray *result;
+
+ response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
+ if (error) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ /* Parse reply */
+ result = mm_3gpp_parse_cscb_response (response, &error);
+ if (!result) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ g_task_return_pointer (task,
+ result,
+ (GDestroyNotify)g_array_unref);
+ g_object_unref (task);
+}
+
+static void
+modem_cell_broadcast_load_channels (MMIfaceModemCellBroadcast *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ /* Load configured channels */
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CSCB?",
+ 3,
+ TRUE,
+ (GAsyncReadyCallback)cscb_channels_format_check_ready,
+ task);
+}
+
+/*****************************************************************************/
static gboolean
modem_cell_broadcast_setup_cleanup_unsolicited_events_finish (MMIfaceModemCellBroadcast *self,
@@ -10603,6 +10662,66 @@ modem_cell_broadcast_create_cbm (MMIfaceModemCellBroadcast *self)
return mm_base_cbm_new (MM_BASE_MODEM (self));
}
+/***********************************************************************************/
+/* Get channels (CellBroadcast interface) */
+
+static gboolean
+modem_cell_broadcast_set_channels_finish (MMIfaceModemCellBroadcast *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+modem_cell_broadcast_set_channels_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+
+ if (!mm_base_modem_at_command_finish (self, res, &error))
+ g_task_return_error (task, error);
+ else
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+static void
+modem_cell_broadcast_set_channels (MMIfaceModemCellBroadcast *self,
+ GArray *channels,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ g_autoptr (GString) cmd = g_string_new ("+CSCB=0,\"");
+ guint i;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ for (i = 0; i < channels->len; i++) {
+ MMCellBroadcastChannels ch = g_array_index (channels, MMCellBroadcastChannels, i);
+
+ if (i > 0)
+ g_string_append_c (cmd, ',');
+
+ if (ch.start == ch.end)
+ g_string_append_printf (cmd, "%u", ch.start);
+ else
+ g_string_append_printf (cmd, "%u-%u", ch.start, ch.end);
+ }
+ g_string_append (cmd, "\",\"\"");
+
+ mm_obj_dbg (self, "Setting channels...");
+ mm_base_modem_at_command (
+ MM_BASE_MODEM (self),
+ cmd->str,
+ 3,
+ FALSE,
+ (GAsyncReadyCallback)modem_cell_broadcast_set_channels_ready,
+ task);
+}
+
/*********************************************************/
/* Check CellBroadcast support (CellBroadcast interface) */
@@ -14342,8 +14461,12 @@ iface_modem_cell_broadcast_init (MMIfaceModemCellBroadcastInterface *iface)
iface->check_support_finish = modem_cell_broadcast_check_support_finish;
iface->setup_unsolicited_events = modem_cell_broadcast_setup_unsolicited_events;
iface->setup_unsolicited_events_finish = modem_cell_broadcast_setup_cleanup_unsolicited_events_finish;
+ iface->load_channels = modem_cell_broadcast_load_channels;
+ iface->load_channels_finish = modem_cell_broadcast_load_channels_finish;
iface->cleanup_unsolicited_events = modem_cell_broadcast_cleanup_unsolicited_events;
iface->cleanup_unsolicited_events_finish = modem_cell_broadcast_setup_cleanup_unsolicited_events_finish;
+ iface->set_channels = modem_cell_broadcast_set_channels;
+ iface->set_channels_finish = modem_cell_broadcast_set_channels_finish;
iface->create_cbm = modem_cell_broadcast_create_cbm;
}