iface-modem: let different SIM object creation implementations
We let objects implementing the Modem interface to provide their own SIM creation method. This allows plugins to subclass MMSim themselves.
This commit is contained in:
@@ -2426,22 +2426,25 @@ sim_new_ready (GAsyncInitable *initable,
|
||||
MMSim *sim;
|
||||
GError *error = NULL;
|
||||
|
||||
sim = mm_sim_new_finish (initable, res, &error);
|
||||
sim = MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->create_sim_finish (ctx->self, res, &error);
|
||||
if (!sim) {
|
||||
/* FATAL */
|
||||
mm_warn ("couldn't create SIM: '%s'",
|
||||
error ? error->message : "Unknown error");
|
||||
g_clear_error (&error);
|
||||
} else {
|
||||
g_object_bind_property (sim, MM_SIM_PATH,
|
||||
ctx->skeleton, "sim",
|
||||
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
|
||||
|
||||
g_object_set (ctx->self,
|
||||
MM_IFACE_MODEM_SIM, sim,
|
||||
NULL);
|
||||
g_object_unref (sim);
|
||||
g_simple_async_result_take_error (ctx->result, error);
|
||||
initialization_context_complete_and_free (ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_bind_property (sim, MM_SIM_PATH,
|
||||
ctx->skeleton, "sim",
|
||||
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
|
||||
|
||||
g_object_set (ctx->self,
|
||||
MM_IFACE_MODEM_SIM, sim,
|
||||
NULL);
|
||||
g_object_unref (sim);
|
||||
|
||||
/* Go on to next step */
|
||||
ctx->step++;
|
||||
interface_initialization_step (ctx);
|
||||
@@ -2685,30 +2688,34 @@ interface_initialization_step (InitializationContext *ctx)
|
||||
/* Fall down to next step */
|
||||
ctx->step++;
|
||||
|
||||
case INITIALIZATION_STEP_SIM: {
|
||||
MMSim *sim = NULL;
|
||||
case INITIALIZATION_STEP_SIM:
|
||||
/* If the modem doesn't need any SIM, skip */
|
||||
if (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->create_sim &&
|
||||
MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->create_sim_finish) {
|
||||
MMSim *sim = NULL;
|
||||
|
||||
g_object_get (ctx->self,
|
||||
MM_IFACE_MODEM_SIM, &sim,
|
||||
NULL);
|
||||
if (!sim) {
|
||||
mm_sim_new (MM_BASE_MODEM (ctx->self),
|
||||
NULL, /* TODO: cancellable */
|
||||
(GAsyncReadyCallback)sim_new_ready,
|
||||
ctx);
|
||||
g_object_get (ctx->self,
|
||||
MM_IFACE_MODEM_SIM, &sim,
|
||||
NULL);
|
||||
if (!sim) {
|
||||
MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->create_sim (
|
||||
MM_IFACE_MODEM (ctx->self),
|
||||
(GAsyncReadyCallback)sim_new_ready,
|
||||
ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If already available the sim object, relaunch initialization.
|
||||
* This will try to load any missing property value that couldn't be
|
||||
* retrieved before due to having the SIM locked. */
|
||||
mm_sim_initialize (sim,
|
||||
NULL, /* TODO: cancellable */
|
||||
(GAsyncReadyCallback)sim_reinit_ready,
|
||||
ctx);
|
||||
g_object_unref (sim);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If already available the sim object, relaunch initialization.
|
||||
* This will try to load any missing property value that couldn't be
|
||||
* retrieved before due to having the SIM locked. */
|
||||
mm_sim_initialize (sim,
|
||||
NULL, /* TODO: cancellable */
|
||||
(GAsyncReadyCallback)sim_reinit_ready,
|
||||
ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
case INITIALIZATION_STEP_SUPPORTED_MODES:
|
||||
g_assert (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_supported_modes != NULL);
|
||||
g_assert (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->load_supported_modes_finish != NULL);
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include "mm-charsets.h"
|
||||
#include "mm-at-serial-port.h"
|
||||
#include "mm-bearer.h"
|
||||
#include "mm-sim.h"
|
||||
|
||||
#define MM_TYPE_IFACE_MODEM (mm_iface_modem_get_type ())
|
||||
#define MM_IFACE_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_IFACE_MODEM, MMIfaceModem))
|
||||
@@ -253,6 +254,14 @@ struct _MMIfaceModem {
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
/* Create SIM */
|
||||
void (*create_sim) (MMIfaceModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
MMSim * (*create_sim_finish) (MMIfaceModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
/* Create bearer */
|
||||
void (*create_bearer) (MMIfaceModem *self,
|
||||
MMCommonBearerProperties *properties,
|
||||
|
Reference in New Issue
Block a user