diff options
author | Aleksander Morgado <aleksandermj@google.com> | 2022-08-03 14:48:15 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-08-19 15:53:43 +0000 |
commit | f61061044be0644a9f19be3b138b5bd58b234059 (patch) | |
tree | 7cdf90d24161375547362d350689eff62008b6ec | |
parent | 210020c7d21fb0eebb81d70d6c47377aac80a3ba (diff) |
base-sim: add steps to load GID1 and GID2 during init
-rw-r--r-- | src/mm-base-sim.c | 70 | ||||
-rw-r--r-- | src/mm-base-sim.h | 16 |
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, |