api,modem: new 'CarrierConfigurationRevision' property
Which reports the version of the currently active carrier configuration. We also update the firmware 'version' reported in the firmware settings so that carrier-specific upgrades can be performed (e.g. when the firmware stays the same but the MCFG is updated).
This commit is contained in:
@@ -287,16 +287,27 @@ add_generic_version (MMBaseModem *self,
|
||||
MMFirmwareUpdateSettings *update_settings,
|
||||
GError **error)
|
||||
{
|
||||
const gchar *revision;
|
||||
const gchar *firmware_revision;
|
||||
const gchar *carrier_revision;
|
||||
gchar *combined;
|
||||
|
||||
revision = mm_iface_modem_get_revision (MM_IFACE_MODEM (self));
|
||||
if (!revision) {
|
||||
firmware_revision = mm_iface_modem_get_revision (MM_IFACE_MODEM (self));
|
||||
if (!firmware_revision) {
|
||||
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
|
||||
"Unknown revision");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mm_firmware_update_settings_set_version (update_settings, revision);
|
||||
mm_iface_modem_get_carrier_config (MM_IFACE_MODEM (self), NULL, &carrier_revision);
|
||||
|
||||
if (!carrier_revision) {
|
||||
mm_firmware_update_settings_set_version (update_settings, firmware_revision);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
combined = g_strdup_printf ("%s - %s", firmware_revision, carrier_revision);
|
||||
mm_firmware_update_settings_set_version (update_settings, combined);
|
||||
g_free (combined);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -335,8 +346,7 @@ add_generic_device_ids (MMBaseModem *self,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* carrier = g_ascii_strup (mm_iface_modem_get_carrier_config (MM_IFACE_MODEM (self)), -1); */
|
||||
aux = mm_iface_modem_get_carrier_config (MM_IFACE_MODEM (self));
|
||||
mm_iface_modem_get_carrier_config (MM_IFACE_MODEM (self), &aux, NULL);
|
||||
|
||||
ids = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
||||
if (aux) {
|
||||
|
||||
+19
-14
@@ -4363,17 +4363,19 @@ load_carrier_config_ready (MMIfaceModem *self,
|
||||
{
|
||||
InitializationContext *ctx;
|
||||
GError *error = NULL;
|
||||
gchar *carrier_configuration;
|
||||
gchar *name = NULL;
|
||||
gchar *revision = NULL;
|
||||
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
carrier_configuration = MM_IFACE_MODEM_GET_INTERFACE (self)->load_carrier_config_finish (self, res, &error);
|
||||
if (!carrier_configuration) {
|
||||
if (!MM_IFACE_MODEM_GET_INTERFACE (self)->load_carrier_config_finish (self, res, &name, &revision, &error)) {
|
||||
mm_warn ("couldn't load carrier config: '%s'", error->message);
|
||||
g_error_free (error);
|
||||
} else {
|
||||
mm_gdbus_modem_set_carrier_configuration (ctx->skeleton, carrier_configuration);
|
||||
g_free (carrier_configuration);
|
||||
mm_gdbus_modem_set_carrier_configuration (ctx->skeleton, name);
|
||||
mm_gdbus_modem_set_carrier_configuration_revision (ctx->skeleton, revision);
|
||||
g_free (name);
|
||||
g_free (revision);
|
||||
}
|
||||
|
||||
/* Go on to next step */
|
||||
@@ -5452,22 +5454,25 @@ mm_iface_modem_get_revision (MMIfaceModem *self)
|
||||
return revision;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
mm_iface_modem_get_carrier_config (MMIfaceModem *self)
|
||||
gboolean
|
||||
mm_iface_modem_get_carrier_config (MMIfaceModem *self,
|
||||
const gchar **name,
|
||||
const gchar **revision)
|
||||
{
|
||||
const gchar *carrier_config = NULL;
|
||||
MmGdbusModem *skeleton;
|
||||
|
||||
g_object_get (self,
|
||||
MM_IFACE_MODEM_DBUS_SKELETON, &skeleton,
|
||||
NULL);
|
||||
if (!skeleton)
|
||||
return FALSE;
|
||||
|
||||
if (skeleton) {
|
||||
carrier_config = mm_gdbus_modem_get_carrier_configuration (skeleton);
|
||||
g_object_unref (skeleton);
|
||||
}
|
||||
|
||||
return carrier_config;
|
||||
if (name)
|
||||
*name = mm_gdbus_modem_get_carrier_configuration (skeleton);
|
||||
if (revision)
|
||||
*revision = mm_gdbus_modem_get_carrier_configuration_revision (skeleton);
|
||||
g_object_unref (skeleton);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
@@ -362,8 +362,10 @@ struct _MMIfaceModem {
|
||||
void (* load_carrier_config) (MMIfaceModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gchar * (* load_carrier_config_finish) (MMIfaceModem *self,
|
||||
gboolean (* load_carrier_config_finish) (MMIfaceModem *self,
|
||||
GAsyncResult *res,
|
||||
gchar **carrier_config_name,
|
||||
gchar **carrier_config_revision,
|
||||
GError **error);
|
||||
|
||||
/* Setup carrier config based on IMSI */
|
||||
@@ -400,9 +402,11 @@ gboolean mm_iface_modem_is_4g (MMIfaceModem *self);
|
||||
gboolean mm_iface_modem_is_4g_only (MMIfaceModem *self);
|
||||
|
||||
/* Helpers to query properties */
|
||||
const gchar *mm_iface_modem_get_model (MMIfaceModem *self);
|
||||
const gchar *mm_iface_modem_get_revision (MMIfaceModem *self);
|
||||
const gchar *mm_iface_modem_get_carrier_config (MMIfaceModem *self);
|
||||
const gchar *mm_iface_modem_get_model (MMIfaceModem *self);
|
||||
const gchar *mm_iface_modem_get_revision (MMIfaceModem *self);
|
||||
gboolean mm_iface_modem_get_carrier_config (MMIfaceModem *self,
|
||||
const gchar **name,
|
||||
const gchar **revision);
|
||||
|
||||
/* Initialize Modem interface (async) */
|
||||
void mm_iface_modem_initialize (MMIfaceModem *self,
|
||||
|
||||
+18
-7
@@ -2419,7 +2419,6 @@ typedef struct {
|
||||
GArray *config_list;
|
||||
guint configs_loaded;
|
||||
gint config_active_i;
|
||||
gchar *config_active;
|
||||
|
||||
guint token;
|
||||
guint timeout_id;
|
||||
@@ -2458,17 +2457,31 @@ load_carrier_config_context_free (LoadCarrierConfigContext *ctx)
|
||||
|
||||
if (ctx->config_list)
|
||||
g_array_unref (ctx->config_list);
|
||||
g_free (ctx->config_active);
|
||||
g_clear_object (&ctx->client);
|
||||
g_slice_free (LoadCarrierConfigContext, ctx);
|
||||
}
|
||||
|
||||
gchar *
|
||||
gboolean
|
||||
mm_shared_qmi_load_carrier_config_finish (MMIfaceModem *self,
|
||||
GAsyncResult *res,
|
||||
gchar **carrier_config_name,
|
||||
gchar **carrier_config_revision,
|
||||
GError **error)
|
||||
{
|
||||
return g_task_propagate_pointer (G_TASK (res), error);
|
||||
Private *priv;
|
||||
ConfigInfo *config;
|
||||
gssize i;
|
||||
|
||||
i = g_task_propagate_int (G_TASK (res), error);
|
||||
if (i < 0)
|
||||
return FALSE;
|
||||
|
||||
priv = get_private (MM_SHARED_QMI (self));
|
||||
config = &g_array_index (priv->config_list, ConfigInfo, i);
|
||||
|
||||
*carrier_config_name = g_strdup (config->description);
|
||||
*carrier_config_revision = g_strdup_printf ("%08X", config->version);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void load_carrier_config_step (GTask *task);
|
||||
@@ -2543,7 +2556,6 @@ get_selected_config_indication (QmiClientPdc *client,
|
||||
if ((config->id->len == active_id->len) &&
|
||||
!memcmp (config->id->data, active_id->data, active_id->len)) {
|
||||
ctx->config_active_i = i;
|
||||
ctx->config_active = g_strdup (config->description);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2812,8 +2824,7 @@ load_carrier_config_step (GTask *task)
|
||||
priv->config_list = g_array_ref (ctx->config_list);
|
||||
priv->config_active_i = ctx->config_active_i;
|
||||
|
||||
g_assert (ctx->config_active);
|
||||
g_task_return_pointer (task, g_strdup (ctx->config_active), g_free);
|
||||
g_task_return_int (task, ctx->config_active_i);
|
||||
g_object_unref (task);
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-1
@@ -150,8 +150,10 @@ gboolean mm_shared_qmi_factory_reset_finish (MMIfaceMode
|
||||
void mm_shared_qmi_load_carrier_config (MMIfaceModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gchar *mm_shared_qmi_load_carrier_config_finish (MMIfaceModem *self,
|
||||
gboolean mm_shared_qmi_load_carrier_config_finish (MMIfaceModem *self,
|
||||
GAsyncResult *res,
|
||||
gchar **carrier_config_name,
|
||||
gchar **carrier_config_revision,
|
||||
GError **error);
|
||||
void mm_shared_qmi_setup_carrier_config (MMIfaceModem *self,
|
||||
const gchar *imsi,
|
||||
|
||||
Reference in New Issue
Block a user