aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem-mbim.c205
-rw-r--r--src/mm-sim-mbim.c44
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