diff --git a/introspection/nm-active-connection.xml b/introspection/nm-active-connection.xml
index d77f0d06df..56a10132a9 100644
--- a/introspection/nm-active-connection.xml
+++ b/introspection/nm-active-connection.xml
@@ -45,12 +45,42 @@
whether it currently owns the default IPv4 route.
+
+
+ Object path of the Ip4Config object describing the configuration of the
+ connection. Only valid when the connection is in the
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATED state.
+
+
+
+
+ Object path of the Dhcp4Config object describing the DHCP options
+ returned by the DHCP server (assuming the connection used DHCP). Only
+ valid when the connection is in the NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+ state.
+
+
Whether this active connection is the default IPv6 connection, i.e.
whether it currently owns the default IPv6 route.
+
+
+ Object path of the Ip6Config object describing the configuration of the
+ connection. Only valid when the connection is in the
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATED state.
+
+
+
+
+ Object path of the Dhcp6Config object describing the DHCP options
+ returned by the DHCP server (assuming the connection used DHCP). Only
+ valid when the connection is in the NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+ state.
+
+
Whether this active connection is also a VPN connection.
diff --git a/src/nm-activation-request.c b/src/nm-activation-request.c
index 0f3c91ed78..5fa0fc3b9f 100644
--- a/src/nm-activation-request.c
+++ b/src/nm-activation-request.c
@@ -56,6 +56,16 @@ typedef struct {
GSList *share_rules;
} NMActRequestPrivate;
+enum {
+ PROP_0,
+ PROP_IP4_CONFIG,
+ PROP_DHCP4_CONFIG,
+ PROP_IP6_CONFIG,
+ PROP_DHCP6_CONFIG,
+
+ LAST_PROP
+};
+
/*******************************************************************/
NMConnection *
@@ -281,6 +291,14 @@ nm_act_request_add_share_rule (NMActRequest *req,
/********************************************************************/
+static void
+device_notify (GObject *object,
+ GParamSpec *pspec,
+ gpointer self)
+{
+ g_object_notify (self, pspec->name);
+}
+
static void
device_state_changed (NMActiveConnection *active,
NMDevice *device,
@@ -301,6 +319,15 @@ device_state_changed (NMActiveConnection *active,
break;
case NM_DEVICE_STATE_ACTIVATED:
ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATED;
+
+ g_signal_connect (device, "notify::" NM_DEVICE_IP4_CONFIG,
+ G_CALLBACK (device_notify), active);
+ g_signal_connect (device, "notify::" NM_DEVICE_DHCP4_CONFIG,
+ G_CALLBACK (device_notify), active);
+ g_signal_connect (device, "notify::" NM_DEVICE_IP6_CONFIG,
+ G_CALLBACK (device_notify), active);
+ g_signal_connect (device, "notify::" NM_DEVICE_DHCP6_CONFIG,
+ G_CALLBACK (device_notify), active);
break;
case NM_DEVICE_STATE_DEACTIVATING:
ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATING;
@@ -310,6 +337,8 @@ device_state_changed (NMActiveConnection *active,
case NM_DEVICE_STATE_UNMANAGED:
case NM_DEVICE_STATE_UNAVAILABLE:
ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATED;
+
+ g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_notify), active);
break;
default:
break;
@@ -413,6 +442,37 @@ dispose (GObject *object)
G_OBJECT_CLASS (nm_act_request_parent_class)->dispose (object);
}
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ NMDevice *device;
+
+ device = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (object));
+ if (!device) {
+ g_value_set_boxed (value, "/");
+ return;
+ }
+
+ switch (prop_id) {
+ case PROP_IP4_CONFIG:
+ g_object_get_property (G_OBJECT (device), NM_DEVICE_IP4_CONFIG, value);
+ break;
+ case PROP_DHCP4_CONFIG:
+ g_object_get_property (G_OBJECT (device), NM_DEVICE_DHCP4_CONFIG, value);
+ break;
+ case PROP_IP6_CONFIG:
+ g_object_get_property (G_OBJECT (device), NM_DEVICE_IP6_CONFIG, value);
+ break;
+ case PROP_DHCP6_CONFIG:
+ g_object_get_property (G_OBJECT (device), NM_DEVICE_DHCP6_CONFIG, value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
static void
nm_act_request_class_init (NMActRequestClass *req_class)
{
@@ -423,7 +483,18 @@ nm_act_request_class_init (NMActRequestClass *req_class)
/* virtual methods */
object_class->dispose = dispose;
+ object_class->get_property = get_property;
active_class->master_failed = master_failed;
active_class->device_state_changed = device_state_changed;
+
+ /* properties */
+ g_object_class_override_property (object_class, PROP_IP4_CONFIG,
+ NM_ACTIVE_CONNECTION_IP4_CONFIG);
+ g_object_class_override_property (object_class, PROP_DHCP4_CONFIG,
+ NM_ACTIVE_CONNECTION_DHCP4_CONFIG);
+ g_object_class_override_property (object_class, PROP_IP6_CONFIG,
+ NM_ACTIVE_CONNECTION_IP6_CONFIG);
+ g_object_class_override_property (object_class, PROP_DHCP6_CONFIG,
+ NM_ACTIVE_CONNECTION_DHCP6_CONFIG);
}
diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c
index a8a422c158..3631470318 100644
--- a/src/nm-active-connection.c
+++ b/src/nm-active-connection.c
@@ -74,7 +74,11 @@ enum {
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
+ PROP_IP4_CONFIG,
+ PROP_DHCP4_CONFIG,
PROP_DEFAULT6,
+ PROP_IP6_CONFIG,
+ PROP_DHCP6_CONFIG,
PROP_VPN,
PROP_MASTER,
@@ -152,6 +156,14 @@ nm_active_connection_set_state (NMActiveConnection *self,
}
}
+ if ( new_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+ || old_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+ g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_IP4_CONFIG);
+ g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DHCP4_CONFIG);
+ g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_IP6_CONFIG);
+ g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DHCP6_CONFIG);
+ }
+
if (priv->state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
/* Device is no longer relevant when deactivated. So remove it and
* emit property change notification so clients re-read the value,
@@ -712,9 +724,22 @@ get_property (GObject *object, guint prop_id,
case PROP_DEFAULT:
g_value_set_boolean (value, priv->is_default);
break;
+ case PROP_IP4_CONFIG:
+ /* The IP and DHCP config properties may be overridden by a subclass */
+ g_value_set_boxed (value, "/");
+ break;
+ case PROP_DHCP4_CONFIG:
+ g_value_set_boxed (value, "/");
+ break;
case PROP_DEFAULT6:
g_value_set_boolean (value, priv->is_default6);
break;
+ case PROP_IP6_CONFIG:
+ g_value_set_boxed (value, "/");
+ break;
+ case PROP_DHCP6_CONFIG:
+ g_value_set_boxed (value, "/");
+ break;
case PROP_VPN:
g_value_set_boolean (value, priv->vpn);
break;
@@ -838,6 +863,20 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class)
FALSE,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class, PROP_IP4_CONFIG,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_IP4_CONFIG,
+ "IP4 Config",
+ "IP4 Config",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class, PROP_DHCP4_CONFIG,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_DHCP4_CONFIG,
+ "DHCP4 Config",
+ "DHCP4 Config",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+
g_object_class_install_property (object_class, PROP_DEFAULT6,
g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT6,
"Default6",
@@ -845,6 +884,20 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class)
FALSE,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class, PROP_IP6_CONFIG,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_IP6_CONFIG,
+ "IP6 Config",
+ "IP6 Config",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class, PROP_DHCP6_CONFIG,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_DHCP6_CONFIG,
+ "DHCP6 Config",
+ "DHCP6 Config",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+
g_object_class_install_property (object_class, PROP_VPN,
g_param_spec_boolean (NM_ACTIVE_CONNECTION_VPN,
"VPN",
diff --git a/src/nm-active-connection.h b/src/nm-active-connection.h
index 43b76bd53b..2a4df9705a 100644
--- a/src/nm-active-connection.h
+++ b/src/nm-active-connection.h
@@ -40,7 +40,11 @@
#define NM_ACTIVE_CONNECTION_DEVICES "devices"
#define NM_ACTIVE_CONNECTION_STATE "state"
#define NM_ACTIVE_CONNECTION_DEFAULT "default"
+#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config"
+#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config"
#define NM_ACTIVE_CONNECTION_DEFAULT6 "default6"
+#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config"
+#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config"
#define NM_ACTIVE_CONNECTION_VPN "vpn"
#define NM_ACTIVE_CONNECTION_MASTER "master"
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index 500c72b831..a4bc431300 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -105,6 +105,8 @@ enum {
PROP_0,
PROP_VPN_STATE,
PROP_BANNER,
+ PROP_IP4_CONFIG,
+ PROP_IP6_CONFIG,
PROP_MASTER = 2000,
LAST_PROP
@@ -1011,6 +1013,8 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
nm_ip4_config_merge_setting (config, nm_connection_get_setting_ip4_config (priv->connection));
priv->ip4_config = config;
+ nm_ip4_config_export (config);
+ g_object_notify (G_OBJECT (connection), NM_ACTIVE_CONNECTION_IP4_CONFIG);
nm_vpn_connection_config_maybe_complete (connection, TRUE);
}
@@ -1152,6 +1156,8 @@ nm_vpn_connection_ip6_config_get (DBusGProxy *proxy,
nm_ip6_config_merge_setting (config, nm_connection_get_setting_ip6_config (priv->connection));
priv->ip6_config = config;
+ nm_ip6_config_export (config);
+ g_object_notify (G_OBJECT (connection), NM_ACTIVE_CONNECTION_IP6_CONFIG);
nm_vpn_connection_config_maybe_complete (connection, TRUE);
}
@@ -1787,6 +1793,18 @@ get_property (GObject *object, guint prop_id,
case PROP_BANNER:
g_value_set_string (value, priv->banner ? priv->banner : "");
break;
+ case PROP_IP4_CONFIG:
+ if (priv->vpn_state == NM_VPN_CONNECTION_STATE_ACTIVATED && priv->ip4_config)
+ g_value_set_boxed (value, nm_ip4_config_get_dbus_path (priv->ip4_config));
+ else
+ g_value_set_boxed (value, "/");
+ break;
+ case PROP_IP6_CONFIG:
+ if (priv->vpn_state == NM_VPN_CONNECTION_STATE_ACTIVATED && priv->ip6_config)
+ g_value_set_boxed (value, nm_ip6_config_get_dbus_path (priv->ip6_config));
+ else
+ g_value_set_boxed (value, "/");
+ break;
case PROP_MASTER:
parent_dev = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (object));
g_value_set_boxed (value, parent_dev ? nm_device_get_path (parent_dev) : "/");
@@ -1832,6 +1850,11 @@ nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class)
NULL,
G_PARAM_READABLE));
+ g_object_class_override_property (object_class, PROP_IP4_CONFIG,
+ NM_ACTIVE_CONNECTION_IP4_CONFIG);
+ g_object_class_override_property (object_class, PROP_IP6_CONFIG,
+ NM_ACTIVE_CONNECTION_IP6_CONFIG);
+
/* signals */
signals[VPN_STATE_CHANGED] =
g_signal_new ("vpn-state-changed",