diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-11 15:37:12 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-17 15:19:39 +0200 |
commit | abd22dacfb332c9568d432c4008763e6e8432041 (patch) | |
tree | d14741ab78375cfb206aa70806b0377d1d49b8f3 | |
parent | b8904b3b5285e3a35e9ec0845f8bbca45568cb34 (diff) |
broadband-modem-mbim: don't cache remaining attempts, just requery
There are many more places where we reload remaining attempts, not just after
querying initial lock status. So re-query to get the most up to date info.
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 119 |
1 files changed, 64 insertions, 55 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 49b326b2..4c7778ad 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -45,10 +45,6 @@ struct _MMBroadbandModemMbimPrivate { guint caps_max_sessions; gchar *caps_device_id; gchar *caps_firmware_info; - - /* Queried and cached lock info */ - MMModemLock current_lock; - guint current_lock_retries; }; /*****************************************************************************/ @@ -362,20 +358,6 @@ modem_load_supported_modes (MMIfaceModem *self, /*****************************************************************************/ /* Unlock required loading (Modem interface) */ -typedef struct { - MMBroadbandModemMbim *self; - GSimpleAsyncResult *result; -} LoadUnlockRequiredContext; - -static void -load_unlock_required_context_complete_and_free (LoadUnlockRequiredContext *ctx) -{ - g_simple_async_result_complete (ctx->result); - g_object_unref (ctx->result); - g_object_unref (ctx->self); - g_slice_free (LoadUnlockRequiredContext, ctx); -} - static MMModemLock modem_load_unlock_required_finish (MMIfaceModem *self, GAsyncResult *res, @@ -390,13 +372,12 @@ modem_load_unlock_required_finish (MMIfaceModem *self, static void pin_query_ready (MbimDevice *device, GAsyncResult *res, - LoadUnlockRequiredContext *ctx) + GSimpleAsyncResult *simple) { MbimMessage *response; GError *error = NULL; MbimPinType pin_type; MbimPinState pin_state; - guint32 remaining_attempts; response = mbim_device_command_finish (device, res, &error); if (response && @@ -404,27 +385,24 @@ pin_query_ready (MbimDevice *device, response, &pin_type, &pin_state, - &remaining_attempts, + NULL, &error)) { MMModemLock unlock_required; - /* Gather and store the results we want */ - ctx->self->priv->current_lock = pin_type; - ctx->self->priv->current_lock_retries = remaining_attempts; - if (pin_state == MBIM_PIN_STATE_UNLOCKED) unlock_required = MM_MODEM_LOCK_NONE; else - unlock_required = ctx->self->priv->current_lock; - g_simple_async_result_set_op_res_gpointer (ctx->result, + unlock_required = mm_modem_lock_from_mbim_pin_type (pin_type); + g_simple_async_result_set_op_res_gpointer (simple, GUINT_TO_POINTER (unlock_required), NULL); } else - g_simple_async_result_take_error (ctx->result, error); + g_simple_async_result_take_error (simple, error); if (response) mbim_message_unref (response); - load_unlock_required_context_complete_and_free (ctx); + g_simple_async_result_complete (simple); + g_object_unref (simple); } static void @@ -432,19 +410,17 @@ modem_load_unlock_required (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data) { - LoadUnlockRequiredContext *ctx; + GSimpleAsyncResult *result; MbimDevice *device; MbimMessage *message; if (!peek_device (self, &device, callback, user_data)) return; - ctx = g_slice_new (LoadUnlockRequiredContext); - ctx->self = g_object_ref (self); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - modem_load_unlock_required); + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + modem_load_unlock_required); mm_dbg ("loading unlock required..."); message = (mbim_message_basic_connect_pin_query_request_new (NULL)); @@ -453,7 +429,7 @@ modem_load_unlock_required (MMIfaceModem *self, 10, NULL, (GAsyncReadyCallback)pin_query_ready, - ctx); + result); mbim_message_unref (message); } @@ -465,21 +441,44 @@ modem_load_unlock_retries_finish (MMIfaceModem *self, GAsyncResult *res, GError **error) { - MMUnlockRetries *retries; - - if (MM_BROADBAND_MODEM_MBIM (self)->priv->current_lock == MM_MODEM_LOCK_UNKNOWN) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Current lock is unknown"); + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) return NULL; - } - retries = mm_unlock_retries_new (); - mm_unlock_retries_set (retries, - MM_BROADBAND_MODEM_MBIM (self)->priv->current_lock, - MM_BROADBAND_MODEM_MBIM (self)->priv->current_lock_retries); - return retries; + return MM_UNLOCK_RETRIES (g_object_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)))); +} + +static void +pin_query_unlock_retries_ready (MbimDevice *device, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + MbimMessage *response; + GError *error = NULL; + MbimPinType pin_type; + guint32 remaining_attempts; + + response = mbim_device_command_finish (device, res, &error); + if (response && + mbim_message_basic_connect_pin_query_response_parse ( + response, + &pin_type, + NULL, + &remaining_attempts, + &error)) { + MMUnlockRetries *retries; + + retries = mm_unlock_retries_new (); + mm_unlock_retries_set (retries, + mm_modem_lock_from_mbim_pin_type (pin_type), + remaining_attempts); + g_simple_async_result_set_op_res_gpointer (simple, retries, g_object_unref); + } else + g_simple_async_result_take_error (simple, error); + + if (response) + mbim_message_unref (response); + g_simple_async_result_complete (simple); + g_object_unref (simple); } static void @@ -488,14 +487,26 @@ modem_load_unlock_retries (MMIfaceModem *self, gpointer user_data) { GSimpleAsyncResult *result; + MbimDevice *device; + MbimMessage *message; + + if (!peek_device (self, &device, callback, user_data)) + return; - /* Just complete */ result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, modem_load_unlock_retries); - g_simple_async_result_complete_in_idle (result); - g_object_unref (result); + + mm_dbg ("loading unlock retries..."); + message = (mbim_message_basic_connect_pin_query_request_new (NULL)); + mbim_device_command (device, + message, + 10, + NULL, + (GAsyncReadyCallback)pin_query_unlock_retries_ready, + result); + mbim_message_unref (message); } /*****************************************************************************/ @@ -848,8 +859,6 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), MM_TYPE_BROADBAND_MODEM_MBIM, MMBroadbandModemMbimPrivate); - - self->priv->current_lock = MM_MODEM_LOCK_UNKNOWN; } static void |