diff options
author | Guido Günther <agx@sigxcpu.org> | 2025-02-22 17:20:59 +0100 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-03-28 20:53:52 +0000 |
commit | b83df955fa80b5ee167f8dde4dcb879e06758d9d (patch) | |
tree | 197bf51823385abdca44be5effad237247c9838d | |
parent | 2878833f5c83fe112f579865a6d318ce8413f452 (diff) |
modem: Load current channels on startup
Signed-off-by: Guido Günther <agx@sigxcpu.org>
-rw-r--r-- | src/mm-broadband-modem.c | 61 | ||||
-rw-r--r-- | src/mm-iface-modem-cell-broadcast.c | 39 | ||||
-rw-r--r-- | src/mm-iface-modem-cell-broadcast.h | 9 |
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); |