core: allow ActiveConnections to be created without a device
The device may not be created yet (in the case of software devices) when the ActiveConnection is created; in that case we still want to proceed with authorization for the connection, but we'll create the device when authorization is complete.
This commit is contained in:
@@ -358,9 +358,11 @@ master_failed (NMActiveConnection *self)
|
|||||||
* @specific_object: the object path of the specific object (ie, WiFi access point,
|
* @specific_object: the object path of the specific object (ie, WiFi access point,
|
||||||
* etc) that will be used to activate @connection and @device
|
* etc) that will be used to activate @connection and @device
|
||||||
* @subject: the #NMAuthSubject representing the requestor of the activation
|
* @subject: the #NMAuthSubject representing the requestor of the activation
|
||||||
* @device: the device/interface to configure according to @connection
|
* @device: the device/interface to configure according to @connection; or %NULL
|
||||||
|
* if the connection describes a software device which will be created during
|
||||||
|
* connection activation
|
||||||
*
|
*
|
||||||
* Begins activation of @device using the given @connection and other details.
|
* Creates a new device-based activation request.
|
||||||
*
|
*
|
||||||
* Returns: the new activation request on success, %NULL on error.
|
* Returns: the new activation request on success, %NULL on error.
|
||||||
*/
|
*/
|
||||||
@@ -371,7 +373,7 @@ nm_act_request_new (NMConnection *connection,
|
|||||||
NMDevice *device)
|
NMDevice *device)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
|
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
|
g_return_val_if_fail (!device || NM_IS_DEVICE (device), NULL);
|
||||||
g_return_val_if_fail (NM_IS_AUTH_SUBJECT (subject), NULL);
|
g_return_val_if_fail (NM_IS_AUTH_SUBJECT (subject), NULL);
|
||||||
|
|
||||||
return (NMActRequest *) g_object_new (NM_TYPE_ACT_REQUEST,
|
return (NMActRequest *) g_object_new (NM_TYPE_ACT_REQUEST,
|
||||||
|
@@ -320,6 +320,33 @@ device_state_changed (NMDevice *device,
|
|||||||
NM_ACTIVE_CONNECTION_GET_CLASS (self)->device_state_changed (self, device, new_state, old_state);
|
NM_ACTIVE_CONNECTION_GET_CLASS (self)->device_state_changed (self, device, new_state, old_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
nm_active_connection_set_device (NMActiveConnection *self, NMDevice *device)
|
||||||
|
{
|
||||||
|
NMActiveConnectionPrivate *priv;
|
||||||
|
|
||||||
|
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (self), FALSE);
|
||||||
|
g_return_val_if_fail (!device || NM_IS_DEVICE (device), FALSE);
|
||||||
|
|
||||||
|
priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
|
||||||
|
|
||||||
|
if (device) {
|
||||||
|
g_return_val_if_fail (priv->device == NULL, FALSE);
|
||||||
|
|
||||||
|
/* Device obviously can't be its own master */
|
||||||
|
g_return_val_if_fail (!priv->master || device != nm_active_connection_get_device (priv->master), FALSE);
|
||||||
|
|
||||||
|
priv->device = g_object_ref (device);
|
||||||
|
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_INT_DEVICE);
|
||||||
|
|
||||||
|
priv->device_state_id = g_signal_connect (device,
|
||||||
|
"state-changed",
|
||||||
|
G_CALLBACK (device_state_changed),
|
||||||
|
self);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
NMActiveConnection *
|
NMActiveConnection *
|
||||||
nm_active_connection_get_master (NMActiveConnection *self)
|
nm_active_connection_get_master (NMActiveConnection *self)
|
||||||
{
|
{
|
||||||
@@ -410,7 +437,6 @@ void
|
|||||||
nm_active_connection_set_master (NMActiveConnection *self, NMActiveConnection *master)
|
nm_active_connection_set_master (NMActiveConnection *self, NMActiveConnection *master)
|
||||||
{
|
{
|
||||||
NMActiveConnectionPrivate *priv;
|
NMActiveConnectionPrivate *priv;
|
||||||
NMDevice *master_device;
|
|
||||||
|
|
||||||
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (self));
|
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (self));
|
||||||
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (master));
|
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (master));
|
||||||
@@ -420,10 +446,10 @@ nm_active_connection_set_master (NMActiveConnection *self, NMActiveConnection *m
|
|||||||
/* Master is write-once, and must be set before exporting the object */
|
/* Master is write-once, and must be set before exporting the object */
|
||||||
g_return_if_fail (priv->master == NULL);
|
g_return_if_fail (priv->master == NULL);
|
||||||
g_return_if_fail (priv->path == NULL);
|
g_return_if_fail (priv->path == NULL);
|
||||||
|
if (priv->device) {
|
||||||
master_device = nm_active_connection_get_device (master);
|
/* Note, the master ActiveConnection may not yet have a device */
|
||||||
if (master_device)
|
g_return_if_fail (priv->device != nm_active_connection_get_device (master));
|
||||||
g_return_if_fail (master_device != priv->device);
|
}
|
||||||
|
|
||||||
priv->master = g_object_ref (master);
|
priv->master = g_object_ref (master);
|
||||||
g_signal_connect (priv->master,
|
g_signal_connect (priv->master,
|
||||||
@@ -556,7 +582,6 @@ set_property (GObject *object, guint prop_id,
|
|||||||
const GValue *value, GParamSpec *pspec)
|
const GValue *value, GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
|
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
|
||||||
NMDevice *master_device;
|
|
||||||
const char *tmp;
|
const char *tmp;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
@@ -565,18 +590,7 @@ set_property (GObject *object, guint prop_id,
|
|||||||
priv->connection = g_value_dup_object (value);
|
priv->connection = g_value_dup_object (value);
|
||||||
break;
|
break;
|
||||||
case PROP_INT_DEVICE:
|
case PROP_INT_DEVICE:
|
||||||
g_return_if_fail (priv->device == NULL);
|
nm_active_connection_set_device (NM_ACTIVE_CONNECTION (object), g_value_get_object (value));
|
||||||
priv->device = g_value_dup_object (value);
|
|
||||||
if (priv->device && priv->master) {
|
|
||||||
master_device = nm_active_connection_get_device (priv->master);
|
|
||||||
g_warn_if_fail (priv->device != master_device);
|
|
||||||
}
|
|
||||||
if (priv->device) {
|
|
||||||
priv->device_state_id = g_signal_connect (priv->device,
|
|
||||||
"state-changed",
|
|
||||||
G_CALLBACK (device_state_changed),
|
|
||||||
NM_ACTIVE_CONNECTION (object));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PROP_INT_SUBJECT:
|
case PROP_INT_SUBJECT:
|
||||||
priv->subject = g_value_dup_object (value);
|
priv->subject = g_value_dup_object (value);
|
||||||
@@ -787,7 +801,7 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class)
|
|||||||
"Internal device",
|
"Internal device",
|
||||||
"Internal device",
|
"Internal device",
|
||||||
NM_TYPE_DEVICE,
|
NM_TYPE_DEVICE,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_INT_SUBJECT,
|
g_object_class_install_property (object_class, PROP_INT_SUBJECT,
|
||||||
g_param_spec_object (NM_ACTIVE_CONNECTION_INT_SUBJECT,
|
g_param_spec_object (NM_ACTIVE_CONNECTION_INT_SUBJECT,
|
||||||
|
@@ -44,7 +44,7 @@
|
|||||||
#define NM_ACTIVE_CONNECTION_VPN "vpn"
|
#define NM_ACTIVE_CONNECTION_VPN "vpn"
|
||||||
#define NM_ACTIVE_CONNECTION_MASTER "master"
|
#define NM_ACTIVE_CONNECTION_MASTER "master"
|
||||||
|
|
||||||
/* Internal non-exported construct-time properties */
|
/* Internal non-exported properties */
|
||||||
#define NM_ACTIVE_CONNECTION_INT_CONNECTION "int-connection"
|
#define NM_ACTIVE_CONNECTION_INT_CONNECTION "int-connection"
|
||||||
#define NM_ACTIVE_CONNECTION_INT_DEVICE "int-device"
|
#define NM_ACTIVE_CONNECTION_INT_DEVICE "int-device"
|
||||||
#define NM_ACTIVE_CONNECTION_INT_SUBJECT "int-subject"
|
#define NM_ACTIVE_CONNECTION_INT_SUBJECT "int-subject"
|
||||||
@@ -114,6 +114,8 @@ void nm_active_connection_set_state (NMActiveConnection *self,
|
|||||||
|
|
||||||
NMDevice * nm_active_connection_get_device (NMActiveConnection *self);
|
NMDevice * nm_active_connection_get_device (NMActiveConnection *self);
|
||||||
|
|
||||||
|
gboolean nm_active_connection_set_device (NMActiveConnection *self, NMDevice *device);
|
||||||
|
|
||||||
NMAuthSubject *nm_active_connection_get_subject (NMActiveConnection *self);
|
NMAuthSubject *nm_active_connection_get_subject (NMActiveConnection *self);
|
||||||
|
|
||||||
gboolean nm_active_connection_get_user_requested (NMActiveConnection *self);
|
gboolean nm_active_connection_get_user_requested (NMActiveConnection *self);
|
||||||
|
Reference in New Issue
Block a user