aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-base-sim.c70
-rw-r--r--src/mm-base-sim.h16
2 files changed, 86 insertions, 0 deletions
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c
index 71852339..d1f70e37 100644
--- a/src/mm-base-sim.c
+++ b/src/mm-base-sim.c
@@ -2333,6 +2333,8 @@ typedef enum {
INITIALIZATION_STEP_OPERATOR_NAME,
INITIALIZATION_STEP_EMERGENCY_NUMBERS,
INITIALIZATION_STEP_PREFERRED_NETWORKS,
+ INITIALIZATION_STEP_GID1,
+ INITIALIZATION_STEP_GID2,
INITIALIZATION_STEP_EID,
INITIALIZATION_STEP_REMOVABILITY,
INITIALIZATION_STEP_LAST
@@ -2420,8 +2422,38 @@ initable_init_finish (GAsyncInitable *initable,
interface_initialization_step (task); \
}
+#define BYTEARRAY_REPLY_READY_FN(NAME,DISPLAY) \
+ static void \
+ init_load_##NAME##_ready (MMBaseSim *self, \
+ GAsyncResult *res, \
+ GTask *task) \
+ { \
+ InitAsyncContext *ctx; \
+ g_autoptr(GError) error = NULL; \
+ g_autoptr(GByteArray) bytearray = NULL; \
+ \
+ bytearray = MM_BASE_SIM_GET_CLASS (self)->load_##NAME##_finish (self, res, &error); \
+ mm_gdbus_sim_set_##NAME (MM_GDBUS_SIM (self), \
+ (bytearray ? \
+ g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, \
+ bytearray->data, \
+ bytearray->len, \
+ sizeof (guint8)) : \
+ NULL)); \
+ \
+ if (error) \
+ mm_obj_warn (self, "couldn't load %s: %s", DISPLAY, error->message); \
+ \
+ /* Go on to next step */ \
+ ctx = g_task_get_task_data (task); \
+ ctx->step++; \
+ interface_initialization_step (task); \
+ }
+
UINT_REPLY_READY_FN (removability, "removability")
STR_REPLY_READY_FN (eid, "EID")
+BYTEARRAY_REPLY_READY_FN (gid2, "GID2")
+BYTEARRAY_REPLY_READY_FN (gid1, "GID1")
static void
init_load_preferred_networks_ready (MMBaseSim *self,
@@ -2702,6 +2734,42 @@ interface_initialization_step (GTask *task)
ctx->step++;
/* Fall through */
+ case INITIALIZATION_STEP_GID1:
+ /* Don't load GID1 if the SIM is known to be an eSIM without profiles;
+ * otherwise (if physical SIM, or if eSIM with profile, or if
+ * SIM type unknown) try to load it. */
+ if (IS_ESIM_WITHOUT_PROFILES (self))
+ mm_obj_dbg (self, "not loading GID1 in eSIM without profiles");
+ else if (mm_gdbus_sim_get_gid1 (MM_GDBUS_SIM (self)) == NULL &&
+ MM_BASE_SIM_GET_CLASS (self)->load_gid1 &&
+ MM_BASE_SIM_GET_CLASS (self)->load_gid1_finish) {
+ MM_BASE_SIM_GET_CLASS (self)->load_gid1 (
+ self,
+ (GAsyncReadyCallback)init_load_gid1_ready,
+ task);
+ return;
+ }
+ ctx->step++;
+ /* Fall through */
+
+ case INITIALIZATION_STEP_GID2:
+ /* Don't load GID2 if the SIM is known to be an eSIM without profiles;
+ * otherwise (if physical SIM, or if eSIM with profile, or if
+ * SIM type unknown) try to load it. */
+ if (IS_ESIM_WITHOUT_PROFILES (self))
+ mm_obj_dbg (self, "not loading GID2 in eSIM without profiles");
+ else if (mm_gdbus_sim_get_gid1 (MM_GDBUS_SIM (self)) == NULL &&
+ MM_BASE_SIM_GET_CLASS (self)->load_gid1 &&
+ MM_BASE_SIM_GET_CLASS (self)->load_gid1_finish) {
+ MM_BASE_SIM_GET_CLASS (self)->load_gid2 (
+ self,
+ (GAsyncReadyCallback)init_load_gid2_ready,
+ task);
+ return;
+ }
+ ctx->step++;
+ /* Fall through */
+
case INITIALIZATION_STEP_EID:
/* Don't load EID if the SIM is known to be a physical SIM; otherwise
* (if eSIM with or without profiles) try to load it. */
@@ -2782,6 +2850,8 @@ initable_init_async (GAsyncInitable *initable,
mm_gdbus_sim_set_eid (MM_GDBUS_SIM (initable), NULL);
mm_gdbus_sim_set_operator_identifier (MM_GDBUS_SIM (initable), NULL);
mm_gdbus_sim_set_operator_name (MM_GDBUS_SIM (initable), NULL);
+ mm_gdbus_sim_set_gid1 (MM_GDBUS_SIM (initable), NULL);
+ mm_gdbus_sim_set_gid2 (MM_GDBUS_SIM (initable), NULL);
common_init_async (initable, cancellable, callback, user_data);
}
diff --git a/src/mm-base-sim.h b/src/mm-base-sim.h
index 6be520fd..60901c0d 100644
--- a/src/mm-base-sim.h
+++ b/src/mm-base-sim.h
@@ -116,6 +116,22 @@ struct _MMBaseSimClass {
GAsyncResult *res,
GError **error);
+ /* Load GID1 (async) */
+ void (* load_gid1) (MMBaseSim *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ GByteArray * (* load_gid1_finish) (MMBaseSim *self,
+ GAsyncResult *res,
+ GError **error);
+
+ /* Load GID2 (async) */
+ void (* load_gid2) (MMBaseSim *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ GByteArray * (* load_gid2_finish) (MMBaseSim *self,
+ GAsyncResult *res,
+ GError **error);
+
/* Load sim type (async) */
void (* load_sim_type) (MMBaseSim *self,
GAsyncReadyCallback callback,