wwan: read device & SIM identifiers from ModemManager

We'll use these later for device/SIM specific operations.
This commit is contained in:
Dan Williams 2014-03-24 14:39:49 -05:00
parent d043094195
commit e7987b9185
4 changed files with 127 additions and 4 deletions

View file

@ -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 */

View file

@ -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;
}

View file

@ -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] =

View file

@ -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"