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:
committed by
Aleksander Morgado
parent
5014cf3976
commit
76916de313
@@ -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
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user