diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index cbef1e9e..6365e890 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -164,6 +164,11 @@ struct _MMBroadbandModemQmiPrivate { /* Power Set Operating Mode Helper */ GTask *set_operating_mode_task; + + /* PDC Refresh notifications ID (3gpp Profile Manager) */ + gboolean profile_manager_unsolicited_events_enabled; + gboolean profile_manager_unsolicited_events_setup; + guint refresh_indication_id; }; /*****************************************************************************/ @@ -6592,6 +6597,197 @@ modem_3gpp_profile_manager_delete_profile (MMIfaceModem3gppProfileManager *self, } /*****************************************************************************/ +/* Register PDC Refresh events (3gppProfileManager interface) */ + +static void +pdc_refresh_received (QmiClientPdc *client, + QmiIndicationPdcRefreshOutput *output, + MMBroadbandModemQmi *self) +{ + mm_obj_dbg (self, "Profile refresh indication was received"); + mm_iface_modem_3gpp_profile_manager_updated (MM_IFACE_MODEM_3GPP_PROFILE_MANAGER (self)); +} + +static void +register_pdc_refresh_ready (QmiClientPdc *client, + GAsyncResult *res, + GTask *task) +{ + g_autoptr(QmiMessagePdcRegisterOutput) output = NULL; + MMBroadbandModemQmi *self; + gboolean enable; + GError *error = NULL; + + self = g_task_get_source_object (task); + enable = GPOINTER_TO_UINT (g_task_get_task_data (task)); + + output = qmi_client_pdc_register_finish (client, res, &error); + if (!output) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + if (!qmi_message_pdc_register_output_get_result (output, &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + self->priv->profile_manager_unsolicited_events_enabled = enable; + mm_obj_dbg (self, "%s for refresh events", enable ? "Registered" : "Unregistered"); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +common_enable_disable_unsolicited_events_3gpp_profile_manager (MMBroadbandModemQmi *self, + gboolean enable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(QmiMessagePdcRegisterInput) input = NULL; + GTask *task; + QmiClient *client = NULL; + + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDC, &client, + callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); + g_task_set_task_data (task, GUINT_TO_POINTER (enable), NULL); + + if (enable == self->priv->profile_manager_unsolicited_events_enabled) { + mm_obj_dbg (self, "profile manager unsolicited events already %s; skipping", + enable ? "enabled" : "disabled"); + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + input = qmi_message_pdc_register_input_new (); + qmi_message_pdc_register_input_set_enable_reporting (input, enable, NULL); + qmi_message_pdc_register_input_set_enable_refresh (input, enable, NULL); + qmi_client_pdc_register (QMI_CLIENT_PDC (client), + input, + 10, + NULL, + (GAsyncReadyCallback) register_pdc_refresh_ready, + task); +} + +static void +common_setup_cleanup_unsolicited_events_3gpp_profile_manager (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_PDC, &client, + callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); + + if (enable == self->priv->profile_manager_unsolicited_events_setup) { + mm_obj_dbg (self, "profile manager unsolicited events already %s; skipping", + enable ? "set up" : "cleaned up"); + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + self->priv->profile_manager_unsolicited_events_setup = enable; + + if (enable) { + g_assert (self->priv->refresh_indication_id == 0); + self->priv->refresh_indication_id = + g_signal_connect (client, + "refresh", + G_CALLBACK (pdc_refresh_received), + self); + } else { + g_assert (self->priv->refresh_indication_id != 0); + g_signal_handler_disconnect (client, self->priv->refresh_indication_id); + self->priv->refresh_indication_id = 0; + } + + mm_obj_dbg (self, "%s profile events handler", enable ? "Set up" : "Cleaned up"); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +/*****************************************************************************/ +/* Enable/Disable unsolicited events (3gppProfileManager interface) */ + +static gboolean +modem_3gpp_profile_manager_enable_disable_unsolicited_events_finish (MMIfaceModem3gppProfileManager *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +modem_3gpp_profile_manager_disable_unsolicited_events (MMIfaceModem3gppProfileManager *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_enable_disable_unsolicited_events_3gpp_profile_manager (MM_BROADBAND_MODEM_QMI (self), + FALSE, + callback, + user_data); +} + +static void +modem_3gpp_profile_manager_enable_unsolicited_events (MMIfaceModem3gppProfileManager *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_enable_disable_unsolicited_events_3gpp_profile_manager (MM_BROADBAND_MODEM_QMI (self), + TRUE, + callback, + user_data); +} + +static gboolean +modem_3gpp_profile_manager_setup_cleanup_unsolicited_events_finish (MMIfaceModem3gppProfileManager *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +modem_3gpp_profile_manager_cleanup_unsolicited_events (MMIfaceModem3gppProfileManager *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_setup_cleanup_unsolicited_events_3gpp_profile_manager (MM_BROADBAND_MODEM_QMI (self), + FALSE, + callback, + user_data); +} + +static void +modem_3gpp_profile_manager_setup_unsolicited_events (MMIfaceModem3gppProfileManager *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_setup_cleanup_unsolicited_events_3gpp_profile_manager (MM_BROADBAND_MODEM_QMI (self), + TRUE, + callback, + user_data); +} + +/*****************************************************************************/ /* Check support (Messaging interface) */ static gboolean @@ -12700,6 +12896,15 @@ iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManager *iface) iface->check_support = NULL; iface->check_support_finish = NULL; + iface->setup_unsolicited_events = modem_3gpp_profile_manager_setup_unsolicited_events; + iface->setup_unsolicited_events_finish = modem_3gpp_profile_manager_setup_cleanup_unsolicited_events_finish; + iface->cleanup_unsolicited_events = modem_3gpp_profile_manager_cleanup_unsolicited_events; + iface->cleanup_unsolicited_events_finish = modem_3gpp_profile_manager_setup_cleanup_unsolicited_events_finish; + iface->enable_unsolicited_events = modem_3gpp_profile_manager_enable_unsolicited_events; + iface->enable_unsolicited_events_finish = modem_3gpp_profile_manager_enable_disable_unsolicited_events_finish; + iface->disable_unsolicited_events = modem_3gpp_profile_manager_disable_unsolicited_events; + iface->disable_unsolicited_events_finish = modem_3gpp_profile_manager_enable_disable_unsolicited_events_finish; + /* Additional actions */ iface->get_profile = modem_3gpp_profile_manager_get_profile; iface->get_profile_finish = modem_3gpp_profile_manager_get_profile_finish; |