aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-iface-modem.c76
-rw-r--r--src/mm-iface-modem.h10
2 files changed, 86 insertions, 0 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 40a56c74..c7d92557 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -47,6 +47,82 @@ static GQuark restart_initialize_idle_quark;
/*****************************************************************************/
+gboolean
+mm_iface_modem_check_for_sim_swap_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+explicit_check_for_sim_swap_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+
+ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish (self, res, &error)) {
+ mm_obj_warn (self, "SIM swap check failed: %s", error->message);
+ g_task_return_error (task, error);
+ } else {
+ mm_obj_dbg (self, "SIM swap check completed");
+ g_task_return_boolean (task, TRUE);
+ }
+ g_object_unref (task);
+}
+
+void
+mm_iface_modem_check_for_sim_swap (MMIfaceModem *self,
+ guint slot_index,
+ const gchar *iccid,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ /* Slot index 0 is used when slot is not known, assumingly on a modem with just one SIM slot */
+ if (slot_index != 0) {
+ MmGdbusModem *skeleton;
+ guint primary_slot;
+
+ g_object_get (self,
+ MM_IFACE_MODEM_DBUS_SKELETON, &skeleton,
+ NULL);
+
+ g_assert (skeleton);
+
+ primary_slot = mm_gdbus_modem_get_primary_sim_slot (MM_GDBUS_MODEM (skeleton));
+ g_object_unref (skeleton);
+
+ /* Check that it's really the primary slot whose iccid has changed */
+ if (primary_slot && primary_slot != slot_index) {
+ mm_obj_dbg (self, "checking for SIM swap ignored: status changed in slot %u, but primary is %u", slot_index, primary_slot);
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ return;
+ }
+ }
+
+ if (MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap &&
+ MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish) {
+ mm_obj_dbg (self, "start checking for SIM swap in slot %u", slot_index);
+ MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap (
+ self,
+ iccid,
+ (GAsyncReadyCallback)explicit_check_for_sim_swap_ready,
+ task);
+ return;
+ }
+
+ g_task_return_boolean (task, FALSE);
+ g_object_unref (task);
+}
+
+/*****************************************************************************/
+
void
mm_iface_modem_bind_simple_status (MMIfaceModem *self,
MMSimpleStatus *status)
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index 10f22d1e..d12b261f 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -567,4 +567,14 @@ MMModemState mm_iface_modem_wait_for_final_state_finish (MMIfaceModem *self,
void mm_iface_modem_bind_simple_status (MMIfaceModem *self,
MMSimpleStatus *status);
+/* Check if the SIM or eSIM profile has changed */
+void mm_iface_modem_check_for_sim_swap (MMIfaceModem *self,
+ guint slot_index,
+ const gchar *iccid,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean mm_iface_modem_check_for_sim_swap_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error);
+
#endif /* MM_IFACE_MODEM_H */