diff options
author | Dan Williams <dcbw@redhat.com> | 2014-03-24 14:39:49 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-05-06 21:51:25 -0500 |
commit | e7987b918583eafde66ed6ebd03beed5afab54e2 (patch) | |
tree | 789780f5c0d8fb122b201914bea168a576c4dda1 | |
parent | d04309419578fc2253a611125b1ab30247c6fd57 (diff) | |
download | NetworkManager-e7987b918583eafde66ed6ebd03beed5afab54e2.tar.gz |
wwan: read device & SIM identifiers from ModemManager
We'll use these later for device/SIM specific operations.
-rw-r--r-- | src/devices/wwan/nm-modem-broadband.c | 51 | ||||
-rw-r--r-- | src/devices/wwan/nm-modem-old.c | 42 | ||||
-rw-r--r-- | src/devices/wwan/nm-modem.c | 36 | ||||
-rw-r--r-- | src/devices/wwan/nm-modem.h | 2 |
4 files changed, 127 insertions, 4 deletions
diff --git a/src/devices/wwan/nm-modem-broadband.c b/src/devices/wwan/nm-modem-broadband.c index d0daaa30dd..5541bc5ea6 100644 --- a/src/devices/wwan/nm-modem-broadband.c +++ b/src/devices/wwan/nm-modem-broadband.c @@ -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); @@ -839,6 +840,45 @@ nm_modem_broadband_new (GObject *object, GError **error) } 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) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (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 */ diff --git a/src/devices/wwan/nm-modem-old.c b/src/devices/wwan/nm-modem-old.c index 917c37fe6c..6bed4cdf8d 100644 --- a/src/devices/wwan/nm-modem-old.c +++ b/src/devices/wwan/nm-modem-old.c @@ -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; } diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c index 494f85e641..9239bbacd8 100644 --- a/src/devices/wwan/nm-modem.c +++ b/src/devices/wwan/nm-modem.c @@ -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] = diff --git a/src/devices/wwan/nm-modem.h b/src/devices/wwan/nm-modem.h index 7bb0b8802e..69031291b3 100644 --- a/src/devices/wwan/nm-modem.h +++ b/src/devices/wwan/nm-modem.h @@ -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" |