wwan: expose the APN on the D-Bus

This is going to be useful for UIs to know which plan we're actually
using.
This commit is contained in:
Lubomir Rintel 2019-05-06 17:19:51 +02:00
parent 0b3dd18c2b
commit b5b8b23c4b
7 changed files with 80 additions and 0 deletions

View file

@ -49,6 +49,15 @@
-->
<property name="OperatorCode" type="s" access="read" />
<!--
Apn:
The access point name the modem is connected to. Blank if disconnected.
Since: 1.20
-->
<property name="Apn" type="s" access="read" />
<!--
PropertiesChanged:
@properties: A dictionary mapping property names to variant boxed values

View file

@ -7,6 +7,7 @@ global:
nm_modem_deactivate;
nm_modem_deactivate_async;
nm_modem_device_state_changed;
nm_modem_get_apn;
nm_modem_get_capabilities;
nm_modem_get_configured_mtu;
nm_modem_get_control_port;

View file

@ -42,6 +42,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDeviceModem,
PROP_CURRENT_CAPABILITIES,
PROP_DEVICE_ID,
PROP_OPERATOR_CODE,
PROP_APN,
);
typedef struct {
@ -51,6 +52,7 @@ typedef struct {
gboolean rf_enabled;
char *device_id;
char *operator_code;
char *apn;
} NMDeviceModemPrivate;
struct _NMDeviceModem {
@ -325,6 +327,20 @@ operator_code_changed_cb (NMModem *modem, GParamSpec *pspec, gpointer user_data)
}
}
static void
apn_changed_cb (NMModem *modem, GParamSpec *pspec, gpointer user_data)
{
NMDeviceModem *self = NM_DEVICE_MODEM (user_data);
NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (self);
const char *apn = nm_modem_get_apn (modem);
if (g_strcmp0 (priv->apn, apn) != 0) {
g_free (priv->apn);
priv->apn = g_strdup (apn);
_notify (self, PROP_APN);
}
}
static void
ids_changed_cb (NMModem *modem, GParamSpec *pspec, gpointer user_data)
{
@ -711,6 +727,7 @@ set_modem (NMDeviceModem *self, NMModem *modem)
g_signal_connect (modem, "notify::" NM_MODEM_SIM_ID, G_CALLBACK (ids_changed_cb), self);
g_signal_connect (modem, "notify::" NM_MODEM_SIM_OPERATOR_ID, G_CALLBACK (ids_changed_cb), self);
g_signal_connect (modem, "notify::" NM_MODEM_OPERATOR_CODE, G_CALLBACK (operator_code_changed_cb), self);
g_signal_connect (modem, "notify::" NM_MODEM_APN, G_CALLBACK (apn_changed_cb), self);
}
static guint32
@ -747,6 +764,9 @@ get_property (GObject *object, guint prop_id,
case PROP_OPERATOR_CODE:
g_value_set_string (value, priv->operator_code);
break;
case PROP_APN:
g_value_set_string (value, priv->apn);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -824,6 +844,7 @@ dispose (GObject *object)
g_clear_pointer (&priv->device_id, g_free);
g_clear_pointer (&priv->operator_code, g_free);
g_clear_pointer (&priv->apn, g_free);
G_OBJECT_CLASS (nm_device_modem_parent_class)->dispose (object);
}
@ -839,6 +860,7 @@ static const NMDBusInterfaceInfoExtended interface_info_device_modem = {
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("CurrentCapabilities", "u", NM_DEVICE_MODEM_CURRENT_CAPABILITIES),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("DeviceId", "s", NM_DEVICE_MODEM_DEVICE_ID),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("OperatorCode", "s", NM_DEVICE_MODEM_OPERATOR_CODE),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Apn", "s", NM_DEVICE_MODEM_APN),
),
),
.legacy_property_changed = TRUE,
@ -905,6 +927,13 @@ nm_device_modem_class_init (NMDeviceModemClass *klass)
obj_properties[PROP_OPERATOR_CODE] =
g_param_spec_string (NM_DEVICE_MODEM_OPERATOR_CODE, "", "",
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_APN] =
g_param_spec_string (NM_DEVICE_MODEM_APN, "", "",
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -36,6 +36,7 @@
#define NM_DEVICE_MODEM_CURRENT_CAPABILITIES "current-capabilities"
#define NM_DEVICE_MODEM_DEVICE_ID "device-id"
#define NM_DEVICE_MODEM_OPERATOR_CODE "operator-code"
#define NM_DEVICE_MODEM_APN "apn"
typedef struct _NMDeviceModem NMDeviceModem;
typedef struct _NMDeviceModemClass NMDeviceModemClass;

View file

@ -549,6 +549,8 @@ connect_context_step (NMModemBroadband *self)
else
g_assert_not_reached ();
_nm_modem_set_apn (NM_MODEM (self), mm_simple_connect_properties_get_apn (ctx->connect_properties));
_LOGD ("launching connection with ip type '%s' (try %d)",
nm_modem_ip_type_to_string (current),
ctx->ip_type_tries + 1);
@ -1159,6 +1161,7 @@ disconnect (NMModem *modem,
DisconnectContext *ctx;
connect_context_clear (self);
_nm_modem_set_apn (NM_MODEM (self), NULL);
ctx = g_slice_new0 (DisconnectContext);
ctx->self = g_object_ref (self);

View file

@ -53,6 +53,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMModem,
PROP_IP_TYPES,
PROP_SIM_OPERATOR_ID,
PROP_OPERATOR_CODE,
PROP_APN,
);
enum {
@ -92,6 +93,7 @@ typedef struct _NMModemPrivate {
NMModemIPType ip_types;
char *sim_operator_id;
char *operator_code;
char *apn;
NMPPPManager *ppp_manager;
@ -444,6 +446,12 @@ nm_modem_get_operator_code (NMModem *self)
return NM_MODEM_GET_PRIVATE (self)->operator_code;
}
const char *
nm_modem_get_apn (NMModem *self)
{
return NM_MODEM_GET_PRIVATE (self)->apn;
}
/*****************************************************************************/
/* IP method PPP */
@ -1597,6 +1605,18 @@ _nm_modem_set_operator_code (NMModem *self, const char *operator_code)
}
}
void
_nm_modem_set_apn (NMModem *self, const char *apn)
{
NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
if (g_strcmp0 (priv->apn, apn) != 0) {
g_free (priv->apn);
priv->apn = g_strdup (apn);
_notify (self, PROP_APN);
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
@ -1638,6 +1658,9 @@ get_property (GObject *object, guint prop_id,
case PROP_OPERATOR_CODE:
g_value_set_string (value, priv->operator_code);
break;
case PROP_APN:
g_value_set_string (value, priv->apn);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -1693,6 +1716,9 @@ set_property (GObject *object, guint prop_id,
case PROP_OPERATOR_CODE:
_nm_modem_set_operator_code (NM_MODEM (object), g_value_get_string (value));
break;
case PROP_APN:
_nm_modem_set_apn (NM_MODEM (object), g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -1755,6 +1781,7 @@ finalize (GObject *object)
g_free (priv->sim_id);
g_free (priv->sim_operator_id);
g_free (priv->operator_code);
g_free (priv->apn);
G_OBJECT_CLASS (nm_modem_parent_class)->finalize (object);
}
@ -1841,6 +1868,13 @@ nm_modem_class_init (NMModemClass *klass)
obj_properties[PROP_OPERATOR_CODE] =
g_param_spec_string (NM_MODEM_OPERATOR_CODE, "", "",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_APN] =
g_param_spec_string (NM_MODEM_APN, "", "",
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);

View file

@ -44,6 +44,7 @@
#define NM_MODEM_IP_TYPES "ip-types" /* Supported IP types */
#define NM_MODEM_SIM_OPERATOR_ID "sim-operator-id"
#define NM_MODEM_OPERATOR_CODE "operator-code"
#define NM_MODEM_APN "apn"
/* Signals */
#define NM_MODEM_PPP_STATS "ppp-stats"
@ -177,6 +178,7 @@ const char *nm_modem_get_sim_id (NMModem *modem);
const char *nm_modem_get_sim_operator_id (NMModem *modem);
gboolean nm_modem_get_iid (NMModem *modem, NMUtilsIPv6IfaceId *out_iid);
const char *nm_modem_get_operator_code (NMModem *modem);
const char *nm_modem_get_apn (NMModem *modem);
gboolean nm_modem_set_data_port (NMModem *self,
NMPlatform *platform,
@ -289,5 +291,6 @@ const char *nm_modem_ip_type_to_string (NMModemIPType ip_type);
guint32 nm_modem_get_configured_mtu (NMDevice *self, NMDeviceMtuSource *out_source);
void _nm_modem_set_operator_code (NMModem *self, const char *operator_code);
void _nm_modem_set_apn (NMModem *self, const char *apn);
#endif /* __NETWORKMANAGER_MODEM_H__ */