diff options
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 205 | ||||
-rw-r--r-- | src/mm-sim-mbim.c | 44 |
2 files changed, 168 insertions, 81 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 16263da7..cfc91982 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -1455,31 +1455,62 @@ pin_query_ready (MbimDevice *device, static gboolean wait_for_sim_ready (GTask *task); static void -unlock_required_subscriber_ready_state_ready (MbimDevice *device, +unlock_required_subscriber_ready_state_ready (MbimDevice *device, GAsyncResult *res, - GTask *task) + GTask *task) { LoadUnlockRequiredContext *ctx; - MMBroadbandModemMbim *self; - MbimMessage *response; - GError *error = NULL; - MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED; + MMBroadbandModemMbim *self; + g_autoptr(MbimMessage) response = NULL; + GError *error = NULL; + MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED; ctx = g_task_get_task_data (task); self = g_task_get_source_object (task); + /* reset to the default if any error happens */ + self->priv->last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED; + response = mbim_device_command_finish (device, res, &error); - if (response && - mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) && - mbim_message_subscriber_ready_status_response_parse ( - response, - &ready_state, - NULL, /* subscriber_id */ - NULL, /* sim_iccid */ - NULL, /* ready_info */ - NULL, /* telephone_numbers_count */ - NULL, /* telephone_numbers */ - &error)) { + if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse ( + response, + &ready_state, + NULL, /* flags */ + NULL, /* subscriber id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + NULL, /* telephone_numbers */ + &error)) + g_prefix_error (&error, "Failed processing MBIMEx v3.0 subscriber ready status response: "); + else + mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response"); + } else { + if (!mbim_message_subscriber_ready_status_response_parse ( + response, + &ready_state, + NULL, /* subscriber id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + NULL, /* telephone_numbers */ + &error)) + g_prefix_error (&error, "Failed processing subscriber ready status response: "); + else + mm_obj_dbg (self, "processed subscriber ready status response"); + } + + if (!error) { + /* Store last valid status loaded */ + self->priv->last_ready_state = ready_state; + switch (ready_state) { case MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED: case MBIM_SUBSCRIBER_READY_STATE_INITIALIZED: @@ -1502,13 +1533,11 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device, } } - self->priv->last_ready_state = ready_state; - /* Fatal errors are reported right away */ if (error) { g_task_return_error (task, error); g_object_unref (task); - goto out; + return; } /* Need to retry? */ @@ -1525,7 +1554,7 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device, g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_RETRY, "SIM not ready yet (retry)"); g_object_unref (task); - goto out; + return; } /* Initialized but locked? */ @@ -1542,14 +1571,10 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device, (GAsyncReadyCallback)pin_query_ready, task); mbim_message_unref (message); - goto out; + return; } g_assert_not_reached (); - -out: - if (response) - mbim_message_unref (response); } static gboolean @@ -1705,52 +1730,76 @@ modem_load_unlock_retries (MMIfaceModem *self, /* Own numbers loading */ static GStrv -modem_load_own_numbers_finish (MMIfaceModem *self, - GAsyncResult *res, - GError **error) +modem_load_own_numbers_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) { return g_task_propagate_pointer (G_TASK (res), error); } static void -own_numbers_subscriber_ready_state_ready (MbimDevice *device, +own_numbers_subscriber_ready_state_ready (MbimDevice *device, GAsyncResult *res, - GTask *task) + GTask *task) { - MbimMessage *response; - GError *error = NULL; - gchar **telephone_numbers; + MMBroadbandModemMbim *self; + g_autoptr(MbimMessage) response = NULL; + GError *error = NULL; + gchar **telephone_numbers; + + self = g_task_get_source_object (task); response = mbim_device_command_finish (device, res, &error); - if (response && - mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) && - mbim_message_subscriber_ready_status_response_parse ( - response, - NULL, /* ready_state */ - NULL, /* subscriber_id */ - NULL, /* sim_iccid */ - NULL, /* ready_info */ - NULL, /* telephone_numbers_count */ - &telephone_numbers, - &error)) { - g_task_return_pointer (task, telephone_numbers, (GDestroyNotify)g_strfreev); - } else + if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { g_task_return_error (task, error); + g_object_unref (task); + return; + } - g_object_unref (task); + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse ( + response, + NULL, /* ready_state */ + NULL, /* flags */ + NULL, /* subscriber id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + &telephone_numbers, + &error)) + g_prefix_error (&error, "Failed processing MBIMEx v3.0 subscriber ready status response: "); + else + mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response"); + } else { + if (!mbim_message_subscriber_ready_status_response_parse ( + response, + NULL, /* ready_state */ + NULL, /* subscriber id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + &telephone_numbers, + &error)) + g_prefix_error (&error, "Failed processing subscriber ready status response: "); + else + mm_obj_dbg (self, "processed subscriber ready status response"); + } - if (response) - mbim_message_unref (response); + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, telephone_numbers, (GDestroyNotify)g_strfreev); + g_object_unref (task); } static void -modem_load_own_numbers (MMIfaceModem *self, - GAsyncReadyCallback callback, - gpointer user_data) +modem_load_own_numbers (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) { - MbimDevice *device; - MbimMessage *message; - GTask *task; + MbimDevice *device; + GTask *task; + g_autoptr(MbimMessage) message = NULL; if (!peek_device (self, &device, callback, user_data)) return; @@ -1764,7 +1813,6 @@ modem_load_own_numbers (MMIfaceModem *self, NULL, (GAsyncReadyCallback)own_numbers_subscriber_ready_state_ready, task); - mbim_message_unref (message); } /*****************************************************************************/ @@ -3866,18 +3914,38 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self, MbimMessage *notification) { MbimSubscriberReadyState ready_state; - gchar **telephone_numbers; + g_auto(GStrv) telephone_numbers = NULL; + g_autoptr(GError) error = NULL; - if (!mbim_message_subscriber_ready_status_notification_parse ( - notification, - &ready_state, - NULL, /* subscriber_id */ - NULL, /* sim_iccid */ - NULL, /* ready_info */ - NULL, /* telephone_numbers_count */ - &telephone_numbers, - NULL)) { - return; + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_notification_parse ( + notification, + &ready_state, + NULL, /* flags */ + NULL, /* subscriber id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + &telephone_numbers, + &error)) { + mm_obj_warn (self, "Failed processing MBIMEx v3.0 subscriber ready status response: %s", error->message); + return; + } + mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response"); + } else { + if (!mbim_message_subscriber_ready_status_notification_parse ( + notification, + &ready_state, + NULL, /* subscriber_id */ + NULL, /* sim_iccid */ + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + &telephone_numbers, + &error)) { + mm_obj_warn (self, "Failed processing subscriber ready status notification: %s", error->message); + return; + } + mm_obj_dbg (self, "processed subscriber ready status notification"); } if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED) @@ -3893,7 +3961,6 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self, } self->priv->last_ready_state = ready_state; - g_strfreev (telephone_numbers); } typedef struct { diff --git a/src/mm-sim-mbim.c b/src/mm-sim-mbim.c index 68ead3fb..dd08c275 100644 --- a/src/mm-sim-mbim.c +++ b/src/mm-sim-mbim.c @@ -103,18 +103,38 @@ subscriber_ready_status_ready (MbimDevice *device, g_assert (!self->priv->iccid_error); response = mbim_device_command_finish (device, res, &self->priv->preload_error); - if (response && - mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error) && - mbim_message_subscriber_ready_status_response_parse ( - response, - NULL, /* ready_state */ - &self->priv->imsi, - &raw_iccid, - NULL, /* ready_info */ - NULL, /* telephone_numbers_count */ - NULL, /* telephone_numbers */ - &self->priv->preload_error)) { - self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error); + if (response && mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error)) { + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse ( + response, + NULL, /* ready_state */ + NULL, /* flags */ + &self->priv->imsi, + &raw_iccid, + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + NULL, /* telephone_numbers */ + &self->priv->preload_error)) + g_prefix_error (&self->priv->preload_error, "Failed processing MBIMEx v3.0 subscriber ready status response: "); + else + mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response"); + } else { + if (!mbim_message_subscriber_ready_status_response_parse ( + response, + NULL, /* ready_state */ + &self->priv->imsi, + &raw_iccid, + NULL, /* ready_info */ + NULL, /* telephone_numbers_count */ + NULL, /* telephone_numbers */ + &self->priv->preload_error)) + g_prefix_error (&self->priv->preload_error, "Failed processing subscriber ready status response: "); + else + mm_obj_dbg (self, "processed subscriber ready status response"); + } + + if (raw_iccid) + self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error); } /* At this point we just complete, as all the info and errors have already |