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
This commit is contained in:
Carlo Lobrano
2017-09-04 17:59:59 +02:00
committed by Aleksander Morgado
parent 5014cf3976
commit 76916de313
3 changed files with 267 additions and 34 deletions
+53
View File
@@ -700,6 +700,59 @@ mm_base_sim_send_puk (MMBaseSim *self,
task);
}
/*****************************************************************************/
/* 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) */
+37 -30
View File
@@ -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_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_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_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_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);
void mm_base_sim_export (MMBaseSim *self);
const gchar *mm_base_sim_get_path (MMBaseSim *sim);
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 */