diff options
author | Carlo Lobrano <c.lobrano@gmail.com> | 2017-09-04 08:13:53 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-09-04 17:59:59 +0200 |
commit | 76916de31350b915c7cdd7d89fee08f03a97800f (patch) | |
tree | a79cc480014ff617ded70772bcea583661a57798 /src | |
parent | 5014cf39767a24109de945d99c6b9f4bb1b07274 (diff) |
telit-plugin: handle QSS unsolicited due to power state transitions
When transitioning between power-low and power-on modes, Telit modems
switch the SIM off/on, which leads to the emission of #QSS unsolicited not
related to actual SIM swaps.
To handle this #QSS unsolicited, this patch:
* disables reacting on #QSS unsolicited when modem_power_down is received
* implements modem_after_power_up that:
- checks whether the SIM has been changed, matching cached SIM
Identifier with the value in the current SIM. If SIM Identifier,
is different, sim hot swap ports detected is called.
- re-enables reacting on #QSS unsolicited
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-sim.c | 53 | ||||
-rw-r--r-- | src/mm-base-sim.h | 77 |
2 files changed, 95 insertions, 35 deletions
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index f3525e02..24d5b1c1 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -701,6 +701,59 @@ mm_base_sim_send_puk (MMBaseSim *self, } /*****************************************************************************/ +/* LOAD SIM IDENTIFIER */ + +gchar * +mm_base_sim_load_sim_identifier_finish (MMBaseSim *self, + GAsyncResult *res, + GError **error) +{ + GError *inner_error = NULL; + gchar *simid; + + if (g_async_result_is_tagged (res, mm_base_sim_load_sim_identifier) || + !MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier_finish) { + inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "not implemented"); + g_propagate_error (error, inner_error); + return NULL; + } + + simid = MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier_finish (self, res, &inner_error); + if (inner_error) { + g_propagate_error (error, inner_error); + return NULL; + } + + return simid; +} + +void +mm_base_sim_load_sim_identifier (MMBaseSim *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + if (!MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier && + !MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier_finish) { + g_task_report_new_error (self, + callback, + user_data, + mm_base_sim_load_sim_identifier, + MM_CORE_ERROR, + MM_CORE_ERROR_UNSUPPORTED, + "not implemented"); + return; + } + + MM_BASE_SIM_GET_CLASS (self)->load_sim_identifier ( + self, + (GAsyncReadyCallback)callback, + user_data); + + return; +} + +/*****************************************************************************/ /* SEND PIN (DBus call handling) */ typedef struct { diff --git a/src/mm-base-sim.h b/src/mm-base-sim.h index 19039942..5e141f30 100644 --- a/src/mm-base-sim.h +++ b/src/mm-base-sim.h @@ -129,40 +129,47 @@ struct _MMBaseSimClass { GType mm_base_sim_get_type (void); -void mm_base_sim_new (MMBaseModem *modem, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -MMBaseSim *mm_base_sim_new_finish (GAsyncResult *res, - GError **error); - -void mm_base_sim_initialize (MMBaseSim *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean mm_base_sim_initialize_finish (MMBaseSim *self, - GAsyncResult *result, - GError **error); - -void mm_base_sim_send_pin (MMBaseSim *self, - const gchar *pin, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean mm_base_sim_send_pin_finish (MMBaseSim *self, - GAsyncResult *res, - GError **error); - -void mm_base_sim_send_puk (MMBaseSim *self, - const gchar *puk, - const gchar *new_pin, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean mm_base_sim_send_puk_finish (MMBaseSim *self, - GAsyncResult *res, - GError **error); - -void mm_base_sim_export (MMBaseSim *self); - -const gchar *mm_base_sim_get_path (MMBaseSim *sim); +void mm_base_sim_new (MMBaseModem *modem, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +MMBaseSim *mm_base_sim_new_finish (GAsyncResult *res, + GError **error); + +void mm_base_sim_initialize (MMBaseSim *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_base_sim_initialize_finish (MMBaseSim *self, + GAsyncResult *result, + GError **error); + +void mm_base_sim_send_pin (MMBaseSim *self, + const gchar *pin, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_base_sim_send_pin_finish (MMBaseSim *self, + GAsyncResult *res, + GError **error); + +void mm_base_sim_send_puk (MMBaseSim *self, + const gchar *puk, + const gchar *new_pin, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_base_sim_send_puk_finish (MMBaseSim *self, + GAsyncResult *res, + GError **error); + +void mm_base_sim_export (MMBaseSim *self); + +const gchar *mm_base_sim_get_path (MMBaseSim *sim); + +void mm_base_sim_load_sim_identifier (MMBaseSim *self, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *mm_base_sim_load_sim_identifier_finish (MMBaseSim *self, + GAsyncResult *res, + GError **error); #endif /* MM_BASE_SIM_H */ |