diff options
author | Dylan Van Assche <me@dylanvanassche.be> | 2021-01-30 21:57:50 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-01 16:18:33 +0000 |
commit | 8bc90b713159fe8a2415f272bbe9224ab3fd68e9 (patch) | |
tree | 22423e76dd848b5ca9178f0dba342cc1eafd449d | |
parent | 438ff54d0308427dd629e2dbb43b12dc7295873b (diff) |
broadband-modem-qmi: Enable AT URCs and QMI indications
Enable both AT URCs and QMI indications for messaging events.
This allows to receive text messages during suspend
on the PinePhone with a Quectel EG25 modem.
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 233 |
1 files changed, 137 insertions, 96 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 317533ed..3a45213f 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -117,7 +117,7 @@ struct _MMBroadbandModemQmiPrivate { GTask *activation_task; /* Messaging helpers */ - gboolean messaging_fallback_at; + gboolean messaging_fallback_at_only; gboolean messaging_unsolicited_events_enabled; gboolean messaging_unsolicited_events_setup; guint messaging_event_report_indication_id; @@ -5332,9 +5332,9 @@ parent_messaging_check_support_ready (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - self->priv->messaging_fallback_at = iface_modem_messaging_parent->check_support_finish (_self, res, NULL); + self->priv->messaging_fallback_at_only = iface_modem_messaging_parent->check_support_finish (_self, res, NULL); - g_task_return_boolean (task, self->priv->messaging_fallback_at); + g_task_return_boolean (task, self->priv->messaging_fallback_at_only); g_object_unref (task); } @@ -5379,8 +5379,8 @@ messaging_load_supported_storages_finish (MMIfaceModemMessaging *_self, MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); MMSmsStorage supported; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->load_supported_storages_finish (_self, res, mem1, mem2, mem3, error); } @@ -5407,8 +5407,8 @@ messaging_load_supported_storages (MMIfaceModemMessaging *_self, MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); GTask *task; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { iface_modem_messaging_parent->load_supported_storages (_self, callback, user_data); return; } @@ -5428,8 +5428,8 @@ modem_messaging_setup_sms_format_finish (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->setup_sms_format_finish (_self, res, error); } @@ -5444,8 +5444,8 @@ modem_messaging_setup_sms_format (MMIfaceModemMessaging *_self, MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); GTask *task; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->setup_sms_format (_self, callback, user_data); } @@ -5465,8 +5465,8 @@ messaging_set_default_storage_finish (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->set_default_storage_finish (_self, res, error); } @@ -5509,8 +5509,8 @@ messaging_set_default_storage (MMIfaceModemMessaging *_self, GArray *routes_array; QmiMessageWmsSetRoutesInputRouteListElement route; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { iface_modem_messaging_parent->set_default_storage (_self, storage, callback, user_data); return; } @@ -5594,8 +5594,8 @@ load_initial_sms_parts_finish (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->load_initial_sms_parts_finish (_self, res, error); } @@ -5973,8 +5973,8 @@ load_initial_sms_parts (MMIfaceModemMessaging *_self, GTask *task; QmiClient *client = NULL; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->load_initial_sms_parts (_self, storage, callback, user_data); } @@ -5995,7 +5995,7 @@ load_initial_sms_parts (MMIfaceModemMessaging *_self, } /*****************************************************************************/ -/* Setup/Cleanup unsolicited event handlers (Messaging interface) */ +/* Common setup/cleanup unsolicited event handlers (Messaging interface) */ typedef struct { MMIfaceModemMessaging *self; @@ -6108,57 +6108,23 @@ messaging_event_report_indication_cb (QmiClientNas *client, } static gboolean -messaging_cleanup_unsolicited_events_finish (MMIfaceModemMessaging *_self, - GAsyncResult *res, - GError **error) -{ - MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { - return iface_modem_messaging_parent->cleanup_unsolicited_events_finish (_self, res, error); - } - - return g_task_propagate_boolean (G_TASK (res), error); -} - -static gboolean -messaging_setup_unsolicited_events_finish (MMIfaceModemMessaging *_self, - GAsyncResult *res, - GError **error) +common_setup_cleanup_messaging_unsolicited_events (MMBroadbandModemQmi *self, + gboolean enable, + GError **error) { - MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { - return iface_modem_messaging_parent->setup_unsolicited_events_finish (_self, res, error); - } - - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -common_setup_cleanup_messaging_unsolicited_events (MMBroadbandModemQmi *self, - gboolean enable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; QmiClient *client = NULL; - if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), - QMI_SERVICE_WMS, &client, - callback, user_data)) - return; - - task = g_task_new (self, NULL, callback, user_data); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, + MM_PORT_QMI_FLAG_DEFAULT, + error); + if (!client) + return FALSE; if (enable == self->priv->messaging_unsolicited_events_setup) { mm_obj_dbg (self, "messaging unsolicited events already %s; skipping", enable ? "setup" : "cleanup"); - g_task_return_boolean (task, TRUE); - g_object_unref (task); - return; + return TRUE; } /* Store new state */ @@ -6178,44 +6144,119 @@ common_setup_cleanup_messaging_unsolicited_events (MMBroadbandModemQmi *self, self->priv->messaging_event_report_indication_id = 0; } - g_task_return_boolean (task, TRUE); - g_object_unref (task); + return TRUE; +} + +/*****************************************************************************/ +/* Cleanup unsolicited event handlers (Messaging interface) */ + +static gboolean +messaging_cleanup_unsolicited_events_finish (MMIfaceModemMessaging *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); } static void -messaging_cleanup_unsolicited_events (MMIfaceModemMessaging *_self, - GAsyncReadyCallback callback, - gpointer user_data) +parent_messaging_cleanup_unsolicited_events_ready (MMIfaceModemMessaging *_self, + GAsyncResult *res, + GTask *task) { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); + GError *error = NULL; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { - return iface_modem_messaging_parent->cleanup_unsolicited_events (_self, callback, user_data); + if (!iface_modem_messaging_parent->cleanup_unsolicited_events_finish (_self, res, &error)) { + if (self->priv->messaging_fallback_at_only) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + mm_obj_dbg (self, "cleaning up parent messaging unsolicited events failed: %s", error->message); + g_clear_error (&error); } - common_setup_cleanup_messaging_unsolicited_events (MM_BROADBAND_MODEM_QMI (self), - FALSE, - callback, - user_data); + /* handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + /* Disable QMI indications */ + if (!common_setup_cleanup_messaging_unsolicited_events (self, FALSE, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); } static void -messaging_setup_unsolicited_events (MMIfaceModemMessaging *_self, - GAsyncReadyCallback callback, - gpointer user_data) +messaging_cleanup_unsolicited_events (MMIfaceModemMessaging *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Disable AT URCs parent and chain QMI indications disabling */ + iface_modem_messaging_parent->cleanup_unsolicited_events ( + self, + (GAsyncReadyCallback)parent_messaging_cleanup_unsolicited_events_ready, + g_task_new (self, NULL, callback, user_data)); +} + +/*****************************************************************************/ +/* Setup unsolicited event handlers (Messaging interface) */ + +static gboolean +messaging_setup_unsolicited_events_finish (MMIfaceModemMessaging *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +parent_messaging_setup_unsolicited_events_ready (MMIfaceModemMessaging *_self, + GAsyncResult *res, + GTask *task) { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); + GError *error = NULL; - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { - return iface_modem_messaging_parent->setup_unsolicited_events (_self, callback, user_data); + if (!iface_modem_messaging_parent->setup_unsolicited_events_finish (_self, res, &error)) { + if (self->priv->messaging_fallback_at_only) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + mm_obj_dbg (self, "setting up parent messaging unsolicited events failed: %s", error->message); + g_clear_error (&error); } - common_setup_cleanup_messaging_unsolicited_events (MM_BROADBAND_MODEM_QMI (self), - TRUE, - callback, - user_data); + /* handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + /* Enable QMI indications */ + if (!common_setup_cleanup_messaging_unsolicited_events (self, TRUE, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +messaging_setup_unsolicited_events (MMIfaceModemMessaging *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + /* Enable AT URCs parent and chain QMI indication enabling */ + iface_modem_messaging_parent->setup_unsolicited_events ( + self, + (GAsyncReadyCallback)parent_messaging_setup_unsolicited_events_ready, + g_task_new (self, NULL, callback, user_data)); } /*****************************************************************************/ @@ -6232,8 +6273,8 @@ messaging_disable_unsolicited_events_finish (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at && iface_modem_messaging_parent->disable_unsolicited_events_finish) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only && iface_modem_messaging_parent->disable_unsolicited_events_finish) { return iface_modem_messaging_parent->disable_unsolicited_events_finish (_self, res, error); } @@ -6247,8 +6288,8 @@ messaging_enable_unsolicited_events_finish (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->enable_unsolicited_events_finish (_self, res, error); } @@ -6340,8 +6381,8 @@ messaging_disable_unsolicited_events (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { /* Generic implementation doesn't actually have a method to disable * unsolicited messaging events */ if (!iface_modem_messaging_parent->disable_unsolicited_events) { @@ -6369,8 +6410,8 @@ messaging_enable_unsolicited_events (MMIfaceModemMessaging *_self, { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->enable_unsolicited_events (_self, callback, user_data); } @@ -6388,8 +6429,8 @@ messaging_create_sms (MMIfaceModemMessaging *_self) { MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); - /* Handle fallback */ - if (self->priv->messaging_fallback_at) { + /* Handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { return iface_modem_messaging_parent->create_sms (_self); } |