summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-03-24 14:39:49 -0500
committerDan Williams <dcbw@redhat.com>2014-05-06 21:51:25 -0500
commite7987b918583eafde66ed6ebd03beed5afab54e2 (patch)
tree789780f5c0d8fb122b201914bea168a576c4dda1
parentd04309419578fc2253a611125b1ab30247c6fd57 (diff)
downloadNetworkManager-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.c51
-rw-r--r--src/devices/wwan/nm-modem-old.c42
-rw-r--r--src/devices/wwan/nm-modem.c36
-rw-r--r--src/devices/wwan/nm-modem.h2
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"