aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem.c61
-rw-r--r--src/mm-iface-modem-cell-broadcast.c39
-rw-r--r--src/mm-iface-modem-cell-broadcast.h9
3 files changed, 109 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index ffabec2e..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,
@@ -14402,6 +14461,8 @@ 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;
diff --git a/src/mm-iface-modem-cell-broadcast.c b/src/mm-iface-modem-cell-broadcast.c
index a4ab41e3..f543d8f9 100644
--- a/src/mm-iface-modem-cell-broadcast.c
+++ b/src/mm-iface-modem-cell-broadcast.c
@@ -527,6 +527,7 @@ typedef enum {
ENABLING_STEP_FIRST,
ENABLING_STEP_SETUP_UNSOLICITED_EVENTS,
ENABLING_STEP_ENABLE_UNSOLICITED_EVENTS,
+ ENABLING_STEP_GET_CHANNELS,
ENABLING_STEP_LAST
} EnablingStep;
@@ -593,6 +594,31 @@ enable_unsolicited_events_ready (MMIfaceModemCellBroadcast *self,
}
static void
+load_channels_ready (MMIfaceModemCellBroadcast *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ EnablingContext *ctx;
+ g_autoptr (GError) error = NULL;
+ g_autoptr (GArray) channels = NULL;
+
+ ctx = g_task_get_task_data (task);
+ channels = MM_IFACE_MODEM_CELL_BROADCAST_GET_IFACE (self)->load_channels_finish (self, res, &error);
+ if (channels) {
+ mm_gdbus_modem_cell_broadcast_set_channels (
+ ctx->skeleton,
+ mm_common_cell_broadcast_channels_garray_to_variant (channels));
+ } else {
+ /* Not critical! */
+ mm_obj_warn (self, "Couldn't load current channel list: %s", error->message);
+ }
+
+ /* Go on with next step */
+ ctx->step++;
+ interface_enabling_step (task);
+}
+
+static void
interface_enabling_step (GTask *task)
{
MMIfaceModemCellBroadcast *self;
@@ -654,6 +680,19 @@ interface_enabling_step (GTask *task)
ctx->step++;
/* fall through */
+ case ENABLING_STEP_GET_CHANNELS:
+ /* Read current channel list */
+ if (MM_IFACE_MODEM_CELL_BROADCAST_GET_IFACE (self)->load_channels &&
+ MM_IFACE_MODEM_CELL_BROADCAST_GET_IFACE (self)->load_channels_finish) {
+ MM_IFACE_MODEM_CELL_BROADCAST_GET_IFACE (self)->load_channels (
+ self,
+ (GAsyncReadyCallback)load_channels_ready,
+ task);
+ return;
+ }
+ ctx->step++;
+ /* fall through */
+
case ENABLING_STEP_LAST:
/* We are done without errors! */
g_task_return_boolean (task, TRUE);
diff --git a/src/mm-iface-modem-cell-broadcast.h b/src/mm-iface-modem-cell-broadcast.h
index 34cd1b47..32170b7b 100644
--- a/src/mm-iface-modem-cell-broadcast.h
+++ b/src/mm-iface-modem-cell-broadcast.h
@@ -74,6 +74,15 @@ struct _MMIfaceModemCellBroadcastInterface {
GAsyncResult *res,
GError **error);
+ /* Asynchronous loading of channel list */
+ GArray * (*load_channels_finish) (MMIfaceModemCellBroadcast *self,
+ GAsyncResult *res,
+ GError **error);
+
+ void (*load_channels) (MMIfaceModemCellBroadcast *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
/* Create Cbm objects */
MMBaseCbm * (* create_cbm) (MMIfaceModemCellBroadcast *self);