mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-27 21:00:10 +01:00
wwan: read device & SIM identifiers from ModemManager
We'll use these later for device/SIM specific operations.
This commit is contained in:
parent
d043094195
commit
e7987b9185
4 changed files with 127 additions and 4 deletions
|
|
@ -831,6 +831,7 @@ nm_modem_broadband_new (GObject *object, GError **error)
|
|||
NM_MODEM_CONTROL_PORT, mm_modem_get_primary_port (modem_iface),
|
||||
NM_MODEM_DATA_PORT, NULL, /* We don't know it until bearer created */
|
||||
NM_MODEM_STATE, mm_state_to_nm (mm_modem_get_state (modem_iface)),
|
||||
NM_MODEM_DEVICE_ID, mm_modem_get_device_identifier (modem_iface),
|
||||
NM_MODEM_BROADBAND_MODEM, modem_object,
|
||||
NM_MODEM_DRIVER, drivers,
|
||||
NULL);
|
||||
|
|
@ -838,6 +839,45 @@ nm_modem_broadband_new (GObject *object, GError **error)
|
|||
return modem;
|
||||
}
|
||||
|
||||
static void
|
||||
get_sim_ready (MMModem *modem,
|
||||
GAsyncResult *res,
|
||||
NMModemBroadband *self)
|
||||
{
|
||||
GError *error = NULL;
|
||||
MMSim *new_sim;
|
||||
|
||||
new_sim = mm_modem_get_sim_finish (modem, res, &error);
|
||||
if (new_sim) {
|
||||
g_object_set (G_OBJECT (self),
|
||||
NM_MODEM_SIM_ID, mm_sim_get_identifier (new_sim),
|
||||
NULL);
|
||||
g_object_unref (new_sim);
|
||||
} else {
|
||||
nm_log_warn (LOGD_MB, "(%s) failed to retrieve SIM object: %s",
|
||||
nm_modem_get_uid (NM_MODEM (self)),
|
||||
error && error->message ? error->message : "(unknown)");
|
||||
}
|
||||
g_clear_error (&error);
|
||||
g_object_unref (self);
|
||||
}
|
||||
|
||||
static void
|
||||
sim_changed (MMModem *modem, GParamSpec *pspec, gpointer user_data)
|
||||
{
|
||||
NMModemBroadband *self = NM_MODEM_BROADBAND (user_data);
|
||||
|
||||
g_return_if_fail (modem == self->priv->modem_iface);
|
||||
|
||||
if (mm_modem_get_sim_path (self->priv->modem_iface)) {
|
||||
mm_modem_get_sim (self->priv->modem_iface,
|
||||
NULL, /* cancellable */
|
||||
(GAsyncReadyCallback) get_sim_ready,
|
||||
g_object_ref (self));
|
||||
} else
|
||||
g_object_set (G_OBJECT (self), NM_MODEM_SIM_ID, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
nm_modem_broadband_init (NMModemBroadband *self)
|
||||
{
|
||||
|
|
@ -861,9 +901,14 @@ set_property (GObject *object,
|
|||
self->priv->modem_iface = mm_object_get_modem (self->priv->modem_object);
|
||||
g_assert (self->priv->modem_iface != NULL);
|
||||
g_signal_connect (self->priv->modem_iface,
|
||||
"state-changed",
|
||||
G_CALLBACK (modem_state_changed),
|
||||
self);
|
||||
"state-changed",
|
||||
G_CALLBACK (modem_state_changed),
|
||||
self);
|
||||
g_signal_connect (self->priv->modem_iface,
|
||||
"notify::sim",
|
||||
G_CALLBACK (sim_changed),
|
||||
self);
|
||||
sim_changed (self->priv->modem_iface, NULL, self);
|
||||
|
||||
/* Note: don't grab the Simple iface here; the Modem interface is the
|
||||
* only one assumed to be always valid and available */
|
||||
|
|
|
|||
|
|
@ -690,7 +690,8 @@ modem_properties_changed (DBusGProxy *proxy,
|
|||
GValue *value;
|
||||
gboolean update_state = FALSE;
|
||||
|
||||
if (strcmp (interface, MM_OLD_DBUS_INTERFACE_MODEM))
|
||||
if (strcmp (interface, MM_OLD_DBUS_INTERFACE_MODEM) &&
|
||||
strcmp (interface, MM_OLD_DBUS_INTERFACE_MODEM_GSM_CARD))
|
||||
return;
|
||||
|
||||
value = g_hash_table_lookup (props, "IpMethod");
|
||||
|
|
@ -700,6 +701,15 @@ modem_properties_changed (DBusGProxy *proxy,
|
|||
NULL);
|
||||
}
|
||||
|
||||
value = g_hash_table_lookup (props, "SimIdentifier");
|
||||
if (value && G_VALUE_HOLDS_STRING (value)) {
|
||||
const char *sim_id = g_value_get_string (value);
|
||||
|
||||
g_object_set (self,
|
||||
NM_MODEM_SIM_ID, (sim_id && *sim_id) ? sim_id : NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
value = g_hash_table_lookup (props, "UnlockRequired");
|
||||
if (value && G_VALUE_HOLDS_STRING (value)) {
|
||||
g_free (priv->unlock_required);
|
||||
|
|
@ -937,6 +947,7 @@ nm_modem_old_new (const char *path, GHashTable *properties, GError **error)
|
|||
const char *driver = NULL;
|
||||
const char *master_device = NULL;
|
||||
const char *unlock_required = NULL;
|
||||
const char *device_id = NULL;
|
||||
guint32 modem_type = MM_OLD_MODEM_TYPE_UNKNOWN;
|
||||
guint32 ip_method = MM_MODEM_IP_METHOD_PPP;
|
||||
guint32 ip_timeout = 0;
|
||||
|
|
@ -963,6 +974,8 @@ nm_modem_old_new (const char *path, GHashTable *properties, GError **error)
|
|||
state = g_value_get_uint (value);
|
||||
else if (g_strcmp0 (prop, "UnlockRequired") == 0)
|
||||
unlock_required = g_value_get_string (value);
|
||||
else if (g_strcmp0 (prop, "DeviceIdentifier") == 0)
|
||||
device_id = g_value_get_string (value);
|
||||
}
|
||||
|
||||
if (modem_type == MM_OLD_MODEM_TYPE_UNKNOWN) {
|
||||
|
|
@ -997,6 +1010,7 @@ nm_modem_old_new (const char *path, GHashTable *properties, GError **error)
|
|||
NM_MODEM_DATA_PORT, data_device,
|
||||
NM_MODEM_IP_METHOD, ip_method,
|
||||
NM_MODEM_IP_TIMEOUT, ip_timeout,
|
||||
NM_MODEM_DEVICE_ID, device_id,
|
||||
NM_MODEM_STATE, mm_state_to_nm (state, unlock_required),
|
||||
NULL);
|
||||
if (self) {
|
||||
|
|
@ -1018,6 +1032,23 @@ nm_modem_old_init (NMModemOld *self)
|
|||
{
|
||||
}
|
||||
|
||||
static void
|
||||
get_sim_id_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
||||
{
|
||||
NMModemOld *self = NM_MODEM_OLD (user_data);
|
||||
GValue value = G_VALUE_INIT;
|
||||
|
||||
if (dbus_g_proxy_end_call (proxy, call_id, NULL, G_TYPE_VALUE, &value, G_TYPE_INVALID)) {
|
||||
if (G_VALUE_HOLDS_STRING (&value)) {
|
||||
const char *sim_id = g_value_get_string (&value);
|
||||
|
||||
if (sim_id && *sim_id)
|
||||
g_object_set (G_OBJECT (self), NM_MODEM_SIM_ID, sim_id, NULL);
|
||||
}
|
||||
g_value_unset (&value);
|
||||
}
|
||||
}
|
||||
|
||||
static GObject*
|
||||
constructor (GType type,
|
||||
guint n_construct_params,
|
||||
|
|
@ -1055,6 +1086,15 @@ constructor (GType type,
|
|||
object,
|
||||
NULL);
|
||||
|
||||
/* Request the SIM ID */
|
||||
dbus_g_proxy_begin_call (priv->props_proxy,
|
||||
"Get",
|
||||
get_sim_id_done,
|
||||
g_object_ref (object), g_object_unref,
|
||||
G_TYPE_STRING, MM_OLD_DBUS_INTERFACE_MODEM_GSM_CARD,
|
||||
G_TYPE_STRING, "SimIdentifier",
|
||||
G_TYPE_INVALID);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ enum {
|
|||
PROP_IP_METHOD,
|
||||
PROP_IP_TIMEOUT,
|
||||
PROP_STATE,
|
||||
PROP_DEVICE_ID,
|
||||
PROP_SIM_ID,
|
||||
|
||||
LAST_PROP
|
||||
};
|
||||
|
|
@ -59,6 +61,8 @@ typedef struct {
|
|||
guint32 ip_method;
|
||||
NMModemState state;
|
||||
NMModemState prev_state; /* revert to this state if enable/disable fails */
|
||||
char *device_id;
|
||||
char *sim_id;
|
||||
|
||||
NMPPPManager *ppp_manager;
|
||||
|
||||
|
|
@ -853,6 +857,12 @@ get_property (GObject *object, guint prop_id,
|
|||
case PROP_STATE:
|
||||
g_value_set_enum (value, priv->state);
|
||||
break;
|
||||
case PROP_DEVICE_ID:
|
||||
g_value_set_string (value, priv->device_id);
|
||||
break;
|
||||
case PROP_SIM_ID:
|
||||
g_value_set_string (value, priv->sim_id);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -893,6 +903,14 @@ set_property (GObject *object, guint prop_id,
|
|||
case PROP_STATE:
|
||||
priv->state = g_value_get_enum (value);
|
||||
break;
|
||||
case PROP_DEVICE_ID:
|
||||
/* construct only */
|
||||
priv->device_id = g_value_dup_string (value);
|
||||
break;
|
||||
case PROP_SIM_ID:
|
||||
g_free (priv->sim_id);
|
||||
priv->sim_id = g_value_dup_string (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -922,6 +940,8 @@ finalize (GObject *object)
|
|||
g_free (priv->driver);
|
||||
g_free (priv->control_port);
|
||||
g_free (priv->data_port);
|
||||
g_free (priv->device_id);
|
||||
g_free (priv->sim_id);
|
||||
|
||||
G_OBJECT_CLASS (nm_modem_parent_class)->finalize (object);
|
||||
}
|
||||
|
|
@ -1012,6 +1032,22 @@ nm_modem_class_init (NMModemClass *klass)
|
|||
NM_MODEM_STATE_UNKNOWN,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_DEVICE_ID,
|
||||
g_param_spec_string (NM_MODEM_DEVICE_ID,
|
||||
"DeviceId",
|
||||
"Device ID",
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_SIM_ID,
|
||||
g_param_spec_string (NM_MODEM_SIM_ID,
|
||||
"SimId",
|
||||
"Sim ID",
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
|
||||
|
||||
/* Signals */
|
||||
|
||||
signals[PPP_STATS] =
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ G_BEGIN_DECLS
|
|||
#define NM_MODEM_IP_METHOD "ip-method"
|
||||
#define NM_MODEM_IP_TIMEOUT "ip-timeout"
|
||||
#define NM_MODEM_STATE "state"
|
||||
#define NM_MODEM_DEVICE_ID "device-id"
|
||||
#define NM_MODEM_SIM_ID "sim-id"
|
||||
|
||||
/* Signals */
|
||||
#define NM_MODEM_PPP_STATS "ppp-stats"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue