diff options
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r-- | src/mm-broadband-modem.c | 123 |
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; } |