core: make NMActiveConnection a base class for NMActRequest and NMVPNConnection

That was always the goal, but never got there.  This time we need it
for real to abstract handling of dependent connections so bite the
bullet and make it happen.
This commit is contained in:
Dan Williams
2012-02-03 14:53:09 -06:00
parent 8fd900c2dc
commit b378c3089c
15 changed files with 412 additions and 579 deletions

View File

@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* Copyright (C) 2005 - 2011 Red Hat, Inc. * Copyright (C) 2005 - 2012 Red Hat, Inc.
* Copyright (C) 2007 - 2008 Novell, Inc. * Copyright (C) 2007 - 2008 Novell, Inc.
*/ */
@@ -34,25 +34,16 @@
#include "nm-setting-8021x.h" #include "nm-setting-8021x.h"
#include "nm-dbus-manager.h" #include "nm-dbus-manager.h"
#include "nm-device.h" #include "nm-device.h"
#include "nm-properties-changed-signal.h"
#include "nm-active-connection.h" #include "nm-active-connection.h"
#include "nm-dbus-glib-types.h"
#include "nm-active-connection-glue.h"
#include "nm-settings-connection.h" #include "nm-settings-connection.h"
G_DEFINE_TYPE (NMActRequest, nm_act_request, G_TYPE_OBJECT) G_DEFINE_TYPE (NMActRequest, nm_act_request, NM_TYPE_ACTIVE_CONNECTION)
#define NM_ACT_REQUEST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ #define NM_ACT_REQUEST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_ACT_REQUEST, \ NM_TYPE_ACT_REQUEST, \
NMActRequestPrivate)) NMActRequestPrivate))
enum {
PROPERTIES_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
typedef struct { typedef struct {
char *table; char *table;
char *rule; char *rule;
@@ -65,35 +56,18 @@ typedef struct {
GSList *secrets_calls; GSList *secrets_calls;
char *specific_object;
NMDevice *device; NMDevice *device;
gboolean user_requested; gboolean user_requested;
gulong user_uid; gulong user_uid;
NMActiveConnectionState state;
gboolean is_default;
gboolean is_default6;
gboolean shared; gboolean shared;
GSList *share_rules; GSList *share_rules;
char *ac_path;
gboolean assumed; gboolean assumed;
} NMActRequestPrivate; } NMActRequestPrivate;
enum { enum {
PROP_0, PROP_MASTER = 2000,
PROP_CONNECTION,
PROP_UUID,
PROP_SPECIFIC_OBJECT,
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
PROP_DEFAULT6,
PROP_VPN,
PROP_MASTER,
LAST_PROP
}; };
/*******************************************************************/ /*******************************************************************/
@@ -200,29 +174,6 @@ nm_act_request_get_connection (NMActRequest *req)
return NM_ACT_REQUEST_GET_PRIVATE (req)->connection; return NM_ACT_REQUEST_GET_PRIVATE (req)->connection;
} }
const char *
nm_act_request_get_specific_object (NMActRequest *req)
{
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), NULL);
return NM_ACT_REQUEST_GET_PRIVATE (req)->specific_object;
}
void
nm_act_request_set_specific_object (NMActRequest *req,
const char *specific_object)
{
NMActRequestPrivate *priv;
g_return_if_fail (NM_IS_ACT_REQUEST (req));
g_return_if_fail (specific_object != NULL);
priv = NM_ACT_REQUEST_GET_PRIVATE (req);
g_free (priv->specific_object);
priv->specific_object = g_strdup (specific_object);
}
gboolean gboolean
nm_act_request_get_user_requested (NMActRequest *req) nm_act_request_get_user_requested (NMActRequest *req)
{ {
@@ -231,60 +182,6 @@ nm_act_request_get_user_requested (NMActRequest *req)
return NM_ACT_REQUEST_GET_PRIVATE (req)->user_requested; return NM_ACT_REQUEST_GET_PRIVATE (req)->user_requested;
} }
const char *
nm_act_request_get_active_connection_path (NMActRequest *req)
{
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), NULL);
return NM_ACT_REQUEST_GET_PRIVATE (req)->ac_path;
}
void
nm_act_request_set_default (NMActRequest *req, gboolean is_default)
{
NMActRequestPrivate *priv;
g_return_if_fail (NM_IS_ACT_REQUEST (req));
priv = NM_ACT_REQUEST_GET_PRIVATE (req);
if (priv->is_default == is_default)
return;
priv->is_default = is_default;
g_object_notify (G_OBJECT (req), NM_ACTIVE_CONNECTION_DEFAULT);
}
gboolean
nm_act_request_get_default (NMActRequest *req)
{
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
return NM_ACT_REQUEST_GET_PRIVATE (req)->is_default;
}
void
nm_act_request_set_default6 (NMActRequest *req, gboolean is_default6)
{
NMActRequestPrivate *priv;
g_return_if_fail (NM_IS_ACT_REQUEST (req));
priv = NM_ACT_REQUEST_GET_PRIVATE (req);
if (priv->is_default6 == is_default6)
return;
priv->is_default6 = is_default6;
g_object_notify (G_OBJECT (req), NM_ACTIVE_CONNECTION_DEFAULT6);
}
gboolean
nm_act_request_get_default6 (NMActRequest *req)
{
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
return NM_ACT_REQUEST_GET_PRIVATE (req)->is_default6;
}
GObject * GObject *
nm_act_request_get_device (NMActRequest *req) nm_act_request_get_device (NMActRequest *req)
{ {
@@ -424,9 +321,7 @@ device_state_changed (NMDevice *device,
gpointer user_data) gpointer user_data)
{ {
NMActRequest *self = NM_ACT_REQUEST (user_data); NMActRequest *self = NM_ACT_REQUEST (user_data);
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self);
NMActiveConnectionState new_ac_state; NMActiveConnectionState new_ac_state;
gboolean new_default = FALSE, new_default6 = FALSE;
/* Set NMActiveConnection state based on the device's state */ /* Set NMActiveConnection state based on the device's state */
switch (new_state) { switch (new_state) {
@@ -440,32 +335,18 @@ device_state_changed (NMDevice *device,
break; break;
case NM_DEVICE_STATE_ACTIVATED: case NM_DEVICE_STATE_ACTIVATED:
new_ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATED; new_ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATED;
new_default = priv->is_default;
new_default6 = priv->is_default6;
break; break;
case NM_DEVICE_STATE_DEACTIVATING: case NM_DEVICE_STATE_DEACTIVATING:
new_ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATING; new_ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATING;
break; break;
default: default:
new_ac_state = NM_ACTIVE_CONNECTION_STATE_UNKNOWN; new_ac_state = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
new_default = new_default6 = FALSE; nm_active_connection_set_default (NM_ACTIVE_CONNECTION (self), FALSE);
nm_active_connection_set_default6 (NM_ACTIVE_CONNECTION (self), FALSE);
break; break;
} }
if (new_ac_state != priv->state) { nm_active_connection_set_state (NM_ACTIVE_CONNECTION (self), new_ac_state);
priv->state = new_ac_state;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_STATE);
}
if (new_default != priv->is_default) {
priv->is_default = new_default;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DEFAULT);
}
if (new_default6 != priv->is_default6) {
priv->is_default6 = new_default6;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DEFAULT6);
}
} }
/********************************************************************/ /********************************************************************/
@@ -484,16 +365,15 @@ nm_act_request_new (NMConnection *connection,
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_DEVICE (device), NULL); g_return_val_if_fail (NM_DEVICE (device), NULL);
object = g_object_new (NM_TYPE_ACT_REQUEST, NULL); object = g_object_new (NM_TYPE_ACT_REQUEST,
NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object,
NULL);
if (!object) if (!object)
return NULL; return NULL;
priv = NM_ACT_REQUEST_GET_PRIVATE (object); priv = NM_ACT_REQUEST_GET_PRIVATE (object);
priv->connection = g_object_ref (connection); priv->connection = g_object_ref (connection);
if (specific_object)
priv->specific_object = g_strdup (specific_object);
priv->device = NM_DEVICE (device); priv->device = NM_DEVICE (device);
g_signal_connect (device, "state-changed", g_signal_connect (device, "state-changed",
G_CALLBACK (device_state_changed), G_CALLBACK (device_state_changed),
@@ -503,23 +383,19 @@ nm_act_request_new (NMConnection *connection,
priv->user_requested = user_requested; priv->user_requested = user_requested;
priv->assumed = assumed; priv->assumed = assumed;
return NM_ACT_REQUEST (object); if (!nm_active_connection_export (NM_ACTIVE_CONNECTION (object),
connection,
nm_device_get_path (NM_DEVICE (device)))) {
g_object_unref (object);
object = NULL;
}
return (NMActRequest *) object;
} }
static void static void
nm_act_request_init (NMActRequest *req) nm_act_request_init (NMActRequest *req)
{ {
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (req);
NMDBusManager *dbus_mgr;
priv->ac_path = nm_active_connection_get_next_object_path ();
priv->state = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
dbus_mgr = nm_dbus_manager_get ();
dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (dbus_mgr),
priv->ac_path,
G_OBJECT (req));
g_object_unref (dbus_mgr);
} }
static void static void
@@ -527,38 +403,8 @@ get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec) GValue *value, GParamSpec *pspec)
{ {
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object); NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object);
GPtrArray *devices;
switch (prop_id) { switch (prop_id) {
case PROP_CONNECTION:
g_value_set_boxed (value, nm_connection_get_path (priv->connection));
break;
case PROP_UUID:
g_value_set_string (value, nm_connection_get_uuid (priv->connection));
break;
case PROP_SPECIFIC_OBJECT:
if (priv->specific_object)
g_value_set_boxed (value, priv->specific_object);
else
g_value_set_boxed (value, "/");
break;
case PROP_DEVICES:
devices = g_ptr_array_sized_new (1);
g_ptr_array_add (devices, g_strdup (nm_device_get_path (priv->device)));
g_value_take_boxed (value, devices);
break;
case PROP_STATE:
g_value_set_uint (value, priv->state);
break;
case PROP_DEFAULT:
g_value_set_boolean (value, priv->is_default);
break;
case PROP_DEFAULT6:
g_value_set_boolean (value, priv->is_default6);
break;
case PROP_VPN:
g_value_set_boolean (value, FALSE);
break;
case PROP_MASTER: case PROP_MASTER:
g_value_set_string (value, nm_device_get_master_path (priv->device)); g_value_set_string (value, nm_device_get_master_path (priv->device));
break; break;
@@ -605,11 +451,6 @@ dispose (GObject *object)
static void static void
finalize (GObject *object) finalize (GObject *object)
{ {
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object);
g_free (priv->specific_object);
g_free (priv->ac_path);
clear_share_rules (NM_ACT_REQUEST (object)); clear_share_rules (NM_ACT_REQUEST (object));
G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object); G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object);
@@ -627,24 +468,6 @@ nm_act_request_class_init (NMActRequestClass *req_class)
object_class->dispose = dispose; object_class->dispose = dispose;
object_class->finalize = finalize; object_class->finalize = finalize;
/* properties */ g_object_class_override_property (object_class, PROP_MASTER, NM_ACTIVE_CONNECTION_MASTER);
nm_active_connection_install_properties (object_class,
PROP_CONNECTION,
PROP_UUID,
PROP_SPECIFIC_OBJECT,
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
PROP_DEFAULT6,
PROP_VPN,
PROP_MASTER);
/* Signals */
signals[PROPERTIES_CHANGED] =
nm_properties_changed_signal_new (object_class,
G_STRUCT_OFFSET (NMActRequestClass, properties_changed));
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (req_class),
&dbus_glib_nm_active_connection_object_info);
} }

View File

@@ -55,23 +55,9 @@ NMActRequest *nm_act_request_new (NMConnection *connection,
gpointer *device); /* An NMDevice */ gpointer *device); /* An NMDevice */
NMConnection *nm_act_request_get_connection (NMActRequest *req); NMConnection *nm_act_request_get_connection (NMActRequest *req);
const char * nm_act_request_get_specific_object (NMActRequest *req);
void nm_act_request_set_specific_object (NMActRequest *req,
const char *specific_object);
gboolean nm_act_request_get_user_requested (NMActRequest *req); gboolean nm_act_request_get_user_requested (NMActRequest *req);
const char * nm_act_request_get_active_connection_path (NMActRequest *req);
void nm_act_request_set_default (NMActRequest *req, gboolean is_default);
gboolean nm_act_request_get_default (NMActRequest *req);
void nm_act_request_set_default6 (NMActRequest *req, gboolean is_default6);
gboolean nm_act_request_get_default6 (NMActRequest *req);
gboolean nm_act_request_get_shared (NMActRequest *req); gboolean nm_act_request_get_shared (NMActRequest *req);
void nm_act_request_set_shared (NMActRequest *req, gboolean shared); void nm_act_request_set_shared (NMActRequest *req, gboolean shared);

View File

@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* Copyright (C) 2008 - 2010 Red Hat, Inc. * Copyright (C) 2008 - 2012 Red Hat, Inc.
*/ */
#include <glib.h> #include <glib.h>
@@ -23,56 +23,300 @@
#include "NetworkManager.h" #include "NetworkManager.h"
#include "nm-logging.h" #include "nm-logging.h"
#include "nm-dbus-glib-types.h" #include "nm-dbus-glib-types.h"
#include "nm-dbus-manager.h"
#include "nm-properties-changed-signal.h"
char * #include "nm-active-connection-glue.h"
nm_active_connection_get_next_object_path (void)
/* Base class for anything implementing the Connection.Active D-Bus interface */
G_DEFINE_ABSTRACT_TYPE (NMActiveConnection, nm_active_connection, G_TYPE_OBJECT)
#define NM_ACTIVE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_ACTIVE_CONNECTION, \
NMActiveConnectionPrivate))
typedef struct {
gboolean disposed;
NMConnection *connection;
char *path;
char *specific_object;
char *device_path;
gboolean is_default;
gboolean is_default6;
NMActiveConnectionState state;
gboolean vpn;
} NMActiveConnectionPrivate;
enum {
PROP_0,
PROP_CONNECTION,
PROP_UUID,
PROP_SPECIFIC_OBJECT,
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
PROP_DEFAULT6,
PROP_VPN,
PROP_MASTER,
LAST_PROP
};
enum {
PROPERTIES_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
/****************************************************************/
void
nm_active_connection_set_state (NMActiveConnection *self,
NMActiveConnectionState new_state)
{ {
static guint32 counter = 0; NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
return g_strdup_printf (NM_DBUS_PATH "/ActiveConnection/%d", counter++); if (priv->state != new_state) {
priv->state = new_state;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_STATE);
}
}
NMConnection *
nm_active_connection_get_connection (NMActiveConnection *self)
{
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->connection;
}
const char *
nm_active_connection_get_path (NMActiveConnection *self)
{
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->path;
}
const char *
nm_active_connection_get_specific_object (NMActiveConnection *self)
{
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->specific_object;
} }
void void
nm_active_connection_install_properties (GObjectClass *object_class, nm_active_connection_set_specific_object (NMActiveConnection *self,
guint prop_connection, const char *specific_object)
guint prop_uuid,
guint prop_specific_object,
guint prop_devices,
guint prop_state,
guint prop_default,
guint prop_default6,
guint prop_vpn,
guint prop_master)
{ {
g_object_class_install_property (object_class, prop_connection, NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
if (g_strcmp0 (priv->specific_object, specific_object) == 0)
return;
g_free (priv->specific_object);
priv->specific_object = g_strdup (specific_object);
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT);
}
void
nm_active_connection_set_default (NMActiveConnection *self, gboolean is_default)
{
NMActiveConnectionPrivate *priv;
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (self));
priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
if (priv->is_default == is_default)
return;
priv->is_default = is_default;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DEFAULT);
}
gboolean
nm_active_connection_get_default (NMActiveConnection *self)
{
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (self), FALSE);
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->is_default;
}
void
nm_active_connection_set_default6 (NMActiveConnection *self, gboolean is_default6)
{
NMActiveConnectionPrivate *priv;
g_return_if_fail (NM_IS_ACTIVE_CONNECTION (self));
priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
if (priv->is_default6 == is_default6)
return;
priv->is_default6 = is_default6;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DEFAULT6);
}
gboolean
nm_active_connection_get_default6 (NMActiveConnection *self)
{
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (self), FALSE);
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->is_default6;
}
gboolean
nm_active_connection_export (NMActiveConnection *self,
NMConnection *connection,
const char *devpath)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
NMDBusManager *dbus_mgr;
static guint32 counter = 0;
g_return_val_if_fail (connection != NULL, FALSE);
g_return_val_if_fail (devpath != NULL, FALSE);
priv->connection = g_object_ref (connection);
priv->path = g_strdup_printf (NM_DBUS_PATH "/ActiveConnection/%d", counter++);
priv->device_path = g_strdup (devpath);
dbus_mgr = nm_dbus_manager_get ();
dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (dbus_mgr),
priv->path, G_OBJECT (self));
g_object_unref (dbus_mgr);
return TRUE;
}
/****************************************************************/
static void
nm_active_connection_init (NMActiveConnection *self)
{
}
static void
dispose (GObject *object)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
if (!priv->disposed) {
priv->disposed = TRUE;
g_free (priv->path);
g_free (priv->specific_object);
g_free (priv->device_path);
g_object_unref (priv->connection);
}
G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object);
}
static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
switch (prop_id) {
case PROP_SPECIFIC_OBJECT:
priv->specific_object = g_value_dup_boxed (value);
break;
case PROP_DEFAULT:
priv->is_default = g_value_get_boolean (value);
break;
case PROP_DEFAULT6:
priv->is_default6 = g_value_get_boolean (value);
break;
case PROP_VPN:
priv->vpn = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
GPtrArray *devices;
switch (prop_id) {
case PROP_CONNECTION:
g_value_set_boxed (value, nm_connection_get_path (priv->connection));
break;
case PROP_UUID:
g_value_set_string (value, nm_connection_get_uuid (priv->connection));
break;
case PROP_SPECIFIC_OBJECT:
g_value_set_boxed (value, priv->specific_object ? priv->specific_object : "/");
break;
case PROP_DEVICES:
devices = g_ptr_array_sized_new (1);
g_ptr_array_add (devices, g_strdup (priv->device_path));
g_value_take_boxed (value, devices);
break;
case PROP_STATE:
g_value_set_uint (value, priv->state);
break;
case PROP_DEFAULT:
g_value_set_boolean (value, priv->is_default);
break;
case PROP_DEFAULT6:
g_value_set_boolean (value, priv->is_default6);
break;
case PROP_VPN:
g_value_set_boolean (value, priv->vpn);
break;
case PROP_MASTER:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
nm_active_connection_class_init (NMActiveConnectionClass *vpn_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (vpn_class);
g_type_class_add_private (vpn_class, sizeof (NMActiveConnectionPrivate));
/* virtual methods */
object_class->get_property = get_property;
object_class->set_property = set_property;
object_class->dispose = dispose;
/* properties */
g_object_class_install_property (object_class, PROP_CONNECTION,
g_param_spec_boxed (NM_ACTIVE_CONNECTION_CONNECTION, g_param_spec_boxed (NM_ACTIVE_CONNECTION_CONNECTION,
"Connection", "Connection",
"Connection", "Connection",
DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_OBJECT_PATH,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (object_class, prop_uuid, g_object_class_install_property (object_class, PROP_UUID,
g_param_spec_string (NM_ACTIVE_CONNECTION_UUID, g_param_spec_string (NM_ACTIVE_CONNECTION_UUID,
"Connection UUID", "Connection UUID",
"Connection UUID", "Connection UUID",
NULL, NULL,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (object_class, prop_specific_object, g_object_class_install_property (object_class, PROP_SPECIFIC_OBJECT,
g_param_spec_boxed (NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, g_param_spec_boxed (NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT,
"Specific object", "Specific object",
"Specific object", "Specific object",
DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_OBJECT_PATH,
G_PARAM_READABLE)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, prop_devices, g_object_class_install_property (object_class, PROP_DEVICES,
g_param_spec_boxed (NM_ACTIVE_CONNECTION_DEVICES, g_param_spec_boxed (NM_ACTIVE_CONNECTION_DEVICES,
"Devices", "Devices",
"Devices", "Devices",
DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (object_class, prop_state, g_object_class_install_property (object_class, PROP_STATE,
g_param_spec_uint (NM_ACTIVE_CONNECTION_STATE, g_param_spec_uint (NM_ACTIVE_CONNECTION_STATE,
"State", "State",
"State", "State",
@@ -81,32 +325,40 @@ nm_active_connection_install_properties (GObjectClass *object_class,
NM_ACTIVE_CONNECTION_STATE_UNKNOWN, NM_ACTIVE_CONNECTION_STATE_UNKNOWN,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (object_class, prop_default, g_object_class_install_property (object_class, PROP_DEFAULT,
g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT, g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT,
"Default", "Default",
"Is the default IPv4 active connection", "Is the default IPv4 active connection",
FALSE, FALSE,
G_PARAM_READABLE)); G_PARAM_READWRITE));
g_object_class_install_property (object_class, prop_default6, g_object_class_install_property (object_class, PROP_DEFAULT6,
g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT6, g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT6,
"Default6", "Default6",
"Is the default IPv6 active connection", "Is the default IPv6 active connection",
FALSE, FALSE,
G_PARAM_READABLE)); G_PARAM_READWRITE));
g_object_class_install_property (object_class, prop_vpn, g_object_class_install_property (object_class, PROP_VPN,
g_param_spec_boolean (NM_ACTIVE_CONNECTION_VPN, g_param_spec_boolean (NM_ACTIVE_CONNECTION_VPN,
"VPN", "VPN",
"Is a VPN connection", "Is a VPN connection",
FALSE, FALSE,
G_PARAM_READABLE)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, prop_master, g_object_class_install_property (object_class, PROP_MASTER,
g_param_spec_string (NM_ACTIVE_CONNECTION_MASTER, g_param_spec_string (NM_ACTIVE_CONNECTION_MASTER,
"Master", "Master",
"Path of master device", "Path of master device",
NULL, NULL,
G_PARAM_READABLE)); G_PARAM_READABLE));
/* Signals */
signals[PROPERTIES_CHANGED] =
nm_properties_changed_signal_new (object_class,
G_STRUCT_OFFSET (NMActiveConnectionClass, properties_changed));
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (vpn_class),
&dbus_glib_nm_active_connection_object_info);
} }

View File

@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* Copyright (C) 2008 - 2010 Red Hat, Inc. * Copyright (C) 2008 - 2012 Red Hat, Inc.
*/ */
#ifndef NM_ACTIVE_CONNECTION_H #ifndef NM_ACTIVE_CONNECTION_H
@@ -24,27 +24,61 @@
#include <glib-object.h> #include <glib-object.h>
#include "nm-connection.h" #include "nm-connection.h"
#define NM_ACTIVE_CONNECTION_CONNECTION "connection" #define NM_TYPE_ACTIVE_CONNECTION (nm_active_connection_get_type ())
#define NM_ACTIVE_CONNECTION_UUID "uuid" #define NM_ACTIVE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnection))
#define NM_ACTIVE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionClass))
#define NM_IS_ACTIVE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_ACTIVE_CONNECTION))
#define NM_IS_ACTIVE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_ACTIVE_CONNECTION))
#define NM_ACTIVE_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionClass))
/* Properties */
#define NM_ACTIVE_CONNECTION_CONNECTION "connection"
#define NM_ACTIVE_CONNECTION_UUID "uuid"
#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT "specific-object" #define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT "specific-object"
#define NM_ACTIVE_CONNECTION_DEVICES "devices" #define NM_ACTIVE_CONNECTION_DEVICES "devices"
#define NM_ACTIVE_CONNECTION_STATE "state" #define NM_ACTIVE_CONNECTION_STATE "state"
#define NM_ACTIVE_CONNECTION_DEFAULT "default" #define NM_ACTIVE_CONNECTION_DEFAULT "default"
#define NM_ACTIVE_CONNECTION_DEFAULT6 "default6" #define NM_ACTIVE_CONNECTION_DEFAULT6 "default6"
#define NM_ACTIVE_CONNECTION_VPN "vpn" #define NM_ACTIVE_CONNECTION_VPN "vpn"
#define NM_ACTIVE_CONNECTION_MASTER "master" #define NM_ACTIVE_CONNECTION_MASTER "master"
char *nm_active_connection_get_next_object_path (void); typedef struct {
GObject parent;
} NMActiveConnection;
void nm_active_connection_install_properties (GObjectClass *object_class, typedef struct {
guint prop_connection, GObjectClass parent;
guint prop_uuid,
guint prop_specific_object, /* Signals */
guint prop_devices, void (*properties_changed) (NMActiveConnection *req, GHashTable *properties);
guint prop_state, } NMActiveConnectionClass;
guint prop_default,
guint prop_default6, GType nm_active_connection_get_type (void);
guint prop_vpn,
guint prop_master); gboolean nm_active_connection_export (NMActiveConnection *self,
NMConnection *connection,
const char *devpath);
NMConnection *nm_active_connection_get_connection (NMActiveConnection *self);
const char * nm_active_connection_get_path (NMActiveConnection *self);
const char * nm_active_connection_get_specific_object (NMActiveConnection *self);
void nm_active_connection_set_specific_object (NMActiveConnection *self,
const char *specific_object);
void nm_active_connection_set_default (NMActiveConnection *self,
gboolean is_default);
gboolean nm_active_connection_get_default (NMActiveConnection *self);
void nm_active_connection_set_default6 (NMActiveConnection *self,
gboolean is_default6);
gboolean nm_active_connection_get_default6 (NMActiveConnection *self);
void nm_active_connection_set_state (NMActiveConnection *self,
NMActiveConnectionState state);
#endif /* NM_ACTIVE_CONNECTION_H */ #endif /* NM_ACTIVE_CONNECTION_H */

View File

@@ -1720,7 +1720,7 @@ cull_scan_list (NMDeviceWifi *self)
req = nm_device_get_act_request (NM_DEVICE (self)); req = nm_device_get_act_request (NM_DEVICE (self));
if (req) if (req)
cur_ap_path = nm_act_request_get_specific_object (req); cur_ap_path = nm_active_connection_get_specific_object (NM_ACTIVE_CONNECTION (req));
nm_log_dbg (LOGD_WIFI_SCAN, "(%s): checking scan list for outdated APs", nm_log_dbg (LOGD_WIFI_SCAN, "(%s): checking scan list for outdated APs",
nm_device_get_iface (NM_DEVICE (self))); nm_device_get_iface (NM_DEVICE (self)));
@@ -2573,7 +2573,7 @@ real_act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
g_signal_emit (self, signals[ACCESS_POINT_ADDED], 0, ap); g_signal_emit (self, signals[ACCESS_POINT_ADDED], 0, ap);
} }
nm_act_request_set_specific_object (req, nm_ap_get_dbus_path (ap)); nm_active_connection_set_specific_object (NM_ACTIVE_CONNECTION (req), nm_ap_get_dbus_path (ap));
done: done:
set_current_ap (self, ap); set_current_ap (self, ap);
@@ -2873,7 +2873,8 @@ activation_success_handler (NMDevice *dev)
if (!ssid || nm_utils_is_empty_ssid (ssid->data, ssid->len)) if (!ssid || nm_utils_is_empty_ssid (ssid->data, ssid->len))
nm_ap_set_ssid (tmp_ap, nm_ap_get_ssid (ap)); nm_ap_set_ssid (tmp_ap, nm_ap_get_ssid (ap));
nm_act_request_set_specific_object (req, nm_ap_get_dbus_path (tmp_ap)); nm_active_connection_set_specific_object (NM_ACTIVE_CONNECTION (req),
nm_ap_get_dbus_path (tmp_ap));
priv->ap_list = g_slist_remove (priv->ap_list, ap); priv->ap_list = g_slist_remove (priv->ap_list, ap);
g_object_unref (ap); g_object_unref (ap);
@@ -3036,7 +3037,7 @@ nm_device_wifi_get_activation_ap (NMDeviceWifi *self)
if (!req) if (!req)
return NULL; return NULL;
ap_path = nm_act_request_get_specific_object (req); ap_path = nm_active_connection_get_specific_object (NM_ACTIVE_CONNECTION (req));
return ap_path ? get_ap_by_path (self, ap_path) : NULL; return ap_path ? get_ap_by_path (self, ap_path) : NULL;
} }

View File

@@ -2869,7 +2869,7 @@ clear_act_request (NMDevice *self)
priv->secrets_failed_id = 0; priv->secrets_failed_id = 0;
} }
nm_act_request_set_default (priv->act_request, FALSE); nm_active_connection_set_default (NM_ACTIVE_CONNECTION (priv->act_request), FALSE);
g_object_unref (priv->act_request); g_object_unref (priv->act_request);
priv->act_request = NULL; priv->act_request = NULL;
@@ -3708,7 +3708,7 @@ get_property (GObject *object, guint prop_id,
break; break;
case PROP_ACTIVE_CONNECTION: case PROP_ACTIVE_CONNECTION:
if (priv->act_request) if (priv->act_request)
ac_path = nm_act_request_get_active_connection_path (priv->act_request); ac_path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (priv->act_request));
g_value_set_boxed (value, ac_path ? ac_path : "/"); g_value_set_boxed (value, ac_path ? ac_path : "/");
break; break;
case PROP_DEVICE_TYPE: case PROP_DEVICE_TYPE:

View File

@@ -920,7 +920,7 @@ get_active_connections (NMManager *manager, NMConnection *filter)
continue; continue;
if (!filter || (nm_act_request_get_connection (req) == filter)) { if (!filter || (nm_act_request_get_connection (req) == filter)) {
path = nm_act_request_get_active_connection_path (req); path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (req));
g_ptr_array_add (active, g_strdup (path)); g_ptr_array_add (active, g_strdup (path));
} }
} }
@@ -2123,7 +2123,7 @@ nm_manager_get_act_request_by_path (NMManager *manager,
if (!req) if (!req)
continue; continue;
ac_path = nm_act_request_get_active_connection_path (req); ac_path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (req));
if (!strcmp (path, ac_path)) { if (!strcmp (path, ac_path)) {
*device = NM_DEVICE (iter->data); *device = NM_DEVICE (iter->data);
return req; return req;
@@ -2172,7 +2172,7 @@ internal_activate_device (NMManager *manager,
success = nm_device_activate (device, req, error); success = nm_device_activate (device, req, error);
g_object_unref (req); g_object_unref (req);
return success ? nm_act_request_get_active_connection_path (req) : NULL; return success ? nm_active_connection_get_path (NM_ACTIVE_CONNECTION (req)) : NULL;
} }
const char * const char *
@@ -2239,7 +2239,7 @@ nm_manager_activate_connection (NMManager *manager,
NMActRequest *candidate_req; NMActRequest *candidate_req;
candidate_req = nm_device_get_act_request (candidate); candidate_req = nm_device_get_act_request (candidate);
if (candidate_req && nm_act_request_get_default (candidate_req)) { if (candidate_req && nm_active_connection_get_default (NM_ACTIVE_CONNECTION (candidate_req))) {
device = candidate; device = candidate;
parent_req = candidate_req; parent_req = candidate_req;
break; break;
@@ -2257,12 +2257,12 @@ nm_manager_activate_connection (NMManager *manager,
vpn_connection = nm_vpn_manager_activate_connection (priv->vpn_manager, vpn_connection = nm_vpn_manager_activate_connection (priv->vpn_manager,
connection, connection,
device, device,
nm_act_request_get_active_connection_path (parent_req), nm_active_connection_get_path (NM_ACTIVE_CONNECTION (parent_req)),
TRUE, TRUE,
sender_uid, sender_uid,
error); error);
if (vpn_connection) if (vpn_connection)
path = nm_vpn_connection_get_active_connection_path (vpn_connection); path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (vpn_connection));
} else { } else {
NMDeviceState state; NMDeviceState state;
@@ -2472,7 +2472,7 @@ nm_manager_deactivate_connection (NMManager *manager,
if (!req) if (!req)
continue; continue;
if (!strcmp (connection_path, nm_act_request_get_active_connection_path (req))) { if (!strcmp (connection_path, nm_active_connection_get_path (NM_ACTIVE_CONNECTION (req)))) {
nm_device_state_changed (device, nm_device_state_changed (device,
NM_DEVICE_STATE_DISCONNECTED, NM_DEVICE_STATE_DISCONNECTED,
reason); reason);
@@ -2551,7 +2551,7 @@ impl_manager_deactivate_connection (NMManager *self,
req = nm_device_get_act_request (NM_DEVICE (iter->data)); req = nm_device_get_act_request (NM_DEVICE (iter->data));
if (req) if (req)
req_path = nm_act_request_get_active_connection_path (req); req_path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (req));
if (req_path && !strcmp (active_path, req_path)) { if (req_path && !strcmp (active_path, req_path)) {
connection = nm_act_request_get_connection (req); connection = nm_act_request_get_connection (req);

View File

@@ -534,7 +534,7 @@ update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update)
req = nm_device_get_act_request (dev); req = nm_device_get_act_request (dev);
if (req && (req != best_req)) if (req && (req != best_req))
nm_act_request_set_default (req, FALSE); nm_active_connection_set_default (NM_ACTIVE_CONNECTION (req), FALSE);
} }
dns_mgr = nm_dns_manager_get (NULL); dns_mgr = nm_dns_manager_get (NULL);
@@ -545,7 +545,7 @@ update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update)
* if the connection is shared dnsmasq picks up the right stuff. * if the connection is shared dnsmasq picks up the right stuff.
*/ */
if (best_req) if (best_req)
nm_act_request_set_default (best_req, TRUE); nm_active_connection_set_default (NM_ACTIVE_CONNECTION (best_req), TRUE);
if (connection) if (connection)
s_con = nm_connection_get_setting_connection (connection); s_con = nm_connection_get_setting_connection (connection);
@@ -661,7 +661,7 @@ update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update)
req = nm_device_get_act_request (dev); req = nm_device_get_act_request (dev);
if (req && (req != best_req)) if (req && (req != best_req))
nm_act_request_set_default6 (req, FALSE); nm_active_connection_set_default6 (NM_ACTIVE_CONNECTION (req), FALSE);
} }
dns_mgr = nm_dns_manager_get (NULL); dns_mgr = nm_dns_manager_get (NULL);
@@ -672,7 +672,7 @@ update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update)
* if the connection is shared dnsmasq picks up the right stuff. * if the connection is shared dnsmasq picks up the right stuff.
*/ */
if (best_req) if (best_req)
nm_act_request_set_default6 (best_req, TRUE); nm_active_connection_set_default6 (NM_ACTIVE_CONNECTION (best_req), TRUE);
if (connection) if (connection)
s_con = nm_connection_get_setting_connection (connection); s_con = nm_connection_get_setting_connection (connection);
@@ -832,7 +832,9 @@ auto_activate_device (gpointer user_data)
NULL, NULL,
&error)) { &error)) {
nm_log_info (LOGD_DEVICE, "Connection '%s' auto-activation failed: (%d) %s", nm_log_info (LOGD_DEVICE, "Connection '%s' auto-activation failed: (%d) %s",
nm_connection_get_id (best_connection), error->code, error->message); nm_connection_get_id (best_connection),
error ? error->code : -1,
error ? error->message : "(none)");
g_error_free (error); g_error_free (error);
} }
} }

View File

@@ -17,8 +17,6 @@ libvpn_manager_la_SOURCES = \
nm-vpn-manager.h \ nm-vpn-manager.h \
nm-vpn-service.c \ nm-vpn-service.c \
nm-vpn-service.h \ nm-vpn-service.h \
nm-vpn-connection-base.c \
nm-vpn-connection-base.h \
nm-vpn-connection.c \ nm-vpn-connection.c \
nm-vpn-connection.h nm-vpn-connection.h
@@ -36,9 +34,6 @@ libvpn_manager_la_LIBADD = \
$(DBUS_LIBS) \ $(DBUS_LIBS) \
$(GLIB_LIBS) $(GLIB_LIBS)
nm-vpn-connection-base-glue.h: $(top_srcdir)/introspection/nm-active-connection.xml
$(AM_V_GEN) dbus-binding-tool --prefix=nm_vpn_connection_base --mode=glib-server --output=$@ $<
nm-vpn-connection-glue.h: $(top_srcdir)/introspection/nm-vpn-connection.xml nm-vpn-connection-glue.h: $(top_srcdir)/introspection/nm-vpn-connection.xml
$(AM_V_GEN) dbus-binding-tool --prefix=nm_vpn_connection --mode=glib-server --output=$@ $< $(AM_V_GEN) dbus-binding-tool --prefix=nm_vpn_connection --mode=glib-server --output=$@ $<

View File

@@ -1,213 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* NetworkManager -- Network link manager
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright (C) 2005 - 2011 Red Hat, Inc.
* Copyright (C) 2007 - 2008 Novell, Inc.
*/
#include "NetworkManager.h"
#include "nm-vpn-connection-base.h"
#include "nm-active-connection.h"
#include "nm-vpn-connection-base-glue.h"
#include "nm-dbus-manager.h"
G_DEFINE_ABSTRACT_TYPE (NMVpnConnectionBase, nm_vpn_connection_base, G_TYPE_OBJECT)
#define NM_VPN_CONNECTION_BASE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_VPN_CONNECTION_BASE, \
NMVpnConnectionBasePrivate))
typedef struct {
gboolean disposed;
NMConnection *connection;
char *ac_path;
char *specific_object;
gboolean is_default;
gboolean is_default6;
NMActiveConnectionState state;
} NMVpnConnectionBasePrivate;
enum {
PROP_0,
PROP_CONNECTION,
PROP_UUID,
PROP_SPECIFIC_OBJECT,
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
PROP_DEFAULT6,
PROP_VPN,
PROP_MASTER,
LAST_PROP
};
/****************************************************************/
void
nm_vpn_connection_base_set_state (NMVpnConnectionBase *self,
NMVPNConnectionState vpn_state)
{
NMVpnConnectionBasePrivate *priv = NM_VPN_CONNECTION_BASE_GET_PRIVATE (self);
NMActiveConnectionState new_ac_state = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
/* Set the NMActiveConnection state based on VPN state */
switch (vpn_state) {
case NM_VPN_CONNECTION_STATE_PREPARE:
case NM_VPN_CONNECTION_STATE_NEED_AUTH:
case NM_VPN_CONNECTION_STATE_CONNECT:
case NM_VPN_CONNECTION_STATE_IP_CONFIG_GET:
new_ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATING;
break;
case NM_VPN_CONNECTION_STATE_ACTIVATED:
new_ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATED;
break;
default:
break;
}
if (new_ac_state != priv->state) {
priv->state = new_ac_state;
g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_STATE);
}
}
const char *
nm_vpn_connection_base_get_ac_path (NMVpnConnectionBase *self)
{
return NM_VPN_CONNECTION_BASE_GET_PRIVATE (self)->ac_path;
}
const char *
nm_vpn_connection_base_get_specific_object (NMVpnConnectionBase *self)
{
return NM_VPN_CONNECTION_BASE_GET_PRIVATE (self)->specific_object;
}
void
nm_vpn_connection_base_export (NMVpnConnectionBase *self,
NMConnection *connection,
const char *specific_object)
{
NMVpnConnectionBasePrivate *priv = NM_VPN_CONNECTION_BASE_GET_PRIVATE (self);
NMDBusManager *dbus_mgr;
g_return_if_fail (priv->connection == NULL);
priv->connection = g_object_ref (connection);
priv->specific_object = g_strdup (specific_object);
dbus_mgr = nm_dbus_manager_get ();
dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (dbus_mgr),
priv->ac_path, G_OBJECT (self));
g_object_unref (dbus_mgr);
}
/****************************************************************/
static void
nm_vpn_connection_base_init (NMVpnConnectionBase *self)
{
NMVpnConnectionBasePrivate *priv = NM_VPN_CONNECTION_BASE_GET_PRIVATE (self);
priv->state = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
priv->ac_path = nm_active_connection_get_next_object_path ();
}
static void
dispose (GObject *object)
{
NMVpnConnectionBasePrivate *priv = NM_VPN_CONNECTION_BASE_GET_PRIVATE (object);
if (!priv->disposed) {
priv->disposed = TRUE;
g_free (priv->ac_path);
g_free (priv->specific_object);
g_object_unref (priv->connection);
}
G_OBJECT_CLASS (nm_vpn_connection_base_parent_class)->dispose (object);
}
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
NMVpnConnectionBasePrivate *priv = NM_VPN_CONNECTION_BASE_GET_PRIVATE (object);
switch (prop_id) {
case PROP_CONNECTION:
g_value_set_boxed (value, nm_connection_get_path (priv->connection));
break;
case PROP_UUID:
g_value_set_string (value, nm_connection_get_uuid (priv->connection));
break;
case PROP_SPECIFIC_OBJECT:
g_value_set_boxed (value, priv->specific_object);
break;
case PROP_DEVICES:
g_value_take_boxed (value, g_ptr_array_new ());
break;
case PROP_STATE:
g_value_set_uint (value, priv->state);
break;
case PROP_DEFAULT:
g_value_set_boolean (value, priv->is_default);
break;
case PROP_DEFAULT6:
g_value_set_boolean (value, priv->is_default6);
break;
case PROP_VPN:
g_value_set_boolean (value, TRUE);
break;
case PROP_MASTER:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
nm_vpn_connection_base_class_init (NMVpnConnectionBaseClass *vpn_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (vpn_class);
g_type_class_add_private (vpn_class, sizeof (NMVpnConnectionBasePrivate));
/* virtual methods */
object_class->get_property = get_property;
object_class->dispose = dispose;
/* properties */
nm_active_connection_install_properties (object_class,
PROP_CONNECTION,
PROP_UUID,
PROP_SPECIFIC_OBJECT,
PROP_DEVICES,
PROP_STATE,
PROP_DEFAULT,
PROP_DEFAULT6,
PROP_VPN,
PROP_MASTER);
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (vpn_class),
&dbus_glib_nm_vpn_connection_base_object_info);
}

View File

@@ -1,57 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* NetworkManager -- Network link manager
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* (C) Copyright 2005 - 2011 Red Hat, Inc.
*/
#ifndef NM_VPN_CONNECTION_BASE_H
#define NM_VPN_CONNECTION_BASE_H
#include <glib-object.h>
#include "NetworkManagerVPN.h"
#include "nm-connection.h"
#define NM_TYPE_VPN_CONNECTION_BASE (nm_vpn_connection_base_get_type ())
#define NM_VPN_CONNECTION_BASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_CONNECTION_BASE, NMVpnConnectionBase))
#define NM_VPN_CONNECTION_BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_VPN_CONNECTION_BASE, NMVpnConnectionBaseClass))
#define NM_IS_VPN_CONNECTION_BASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_CONNECTION_BASE))
#define NM_IS_VPN_CONNECTION_BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_VPN_CONNECTION_BASE))
#define NM_VPN_CONNECTION_BASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_VPN_CONNECTION_BASE, NMVpnConnectionBaseClass))
typedef struct {
GObject parent;
} NMVpnConnectionBase;
typedef struct {
GObjectClass parent;
} NMVpnConnectionBaseClass;
GType nm_vpn_connection_base_get_type (void);
const char *nm_vpn_connection_base_get_ac_path (NMVpnConnectionBase *self);
const char *nm_vpn_connection_base_get_specific_object (NMVpnConnectionBase *self);
void nm_vpn_connection_base_export (NMVpnConnectionBase *self,
NMConnection *connection,
const char *specific_object);
void nm_vpn_connection_base_set_state (NMVpnConnectionBase *self,
NMVPNConnectionState vpn_state);
#endif /* NM_VPN_CONNECTION_BASE_H */

View File

@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* Copyright (C) 2005 - 2011 Red Hat, Inc. * Copyright (C) 2005 - 2012 Red Hat, Inc.
* Copyright (C) 2006 - 2008 Novell, Inc. * Copyright (C) 2006 - 2008 Novell, Inc.
*/ */
@@ -51,7 +51,7 @@
#include "nm-vpn-connection-glue.h" #include "nm-vpn-connection-glue.h"
G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_VPN_CONNECTION_BASE) G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION)
typedef enum { typedef enum {
/* Only system secrets */ /* Only system secrets */
@@ -113,6 +113,24 @@ enum {
static void get_secrets (NMVPNConnection *self, SecretsReq secrets_idx); static void get_secrets (NMVPNConnection *self, SecretsReq secrets_idx);
static NMActiveConnectionState
ac_state_from_vpn_state (NMVPNConnectionState vpn_state)
{
/* Set the NMActiveConnection state based on VPN state */
switch (vpn_state) {
case NM_VPN_CONNECTION_STATE_PREPARE:
case NM_VPN_CONNECTION_STATE_NEED_AUTH:
case NM_VPN_CONNECTION_STATE_CONNECT:
case NM_VPN_CONNECTION_STATE_IP_CONFIG_GET:
return NM_ACTIVE_CONNECTION_STATE_ACTIVATING;
case NM_VPN_CONNECTION_STATE_ACTIVATED:
return NM_ACTIVE_CONNECTION_STATE_ACTIVATED;
default:
break;
}
return NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
}
static void static void
nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, nm_vpn_connection_set_vpn_state (NMVPNConnection *connection,
NMVPNConnectionState vpn_state, NMVPNConnectionState vpn_state,
@@ -133,7 +151,8 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection,
priv->vpn_state = vpn_state; priv->vpn_state = vpn_state;
/* Update active connection base class state */ /* Update active connection base class state */
nm_vpn_connection_base_set_state (NM_VPN_CONNECTION_BASE (connection), vpn_state); nm_active_connection_set_state (NM_ACTIVE_CONNECTION (connection),
ac_state_from_vpn_state (vpn_state));
/* Save ip_iface since when the VPN goes down it may get freed /* Save ip_iface since when the VPN goes down it may get freed
* before we're done with it. * before we're done with it.
@@ -230,7 +249,10 @@ nm_vpn_connection_new (NMConnection *connection,
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 (parent_device), NULL); g_return_val_if_fail (NM_IS_DEVICE (parent_device), NULL);
self = (NMVPNConnection *) g_object_new (NM_TYPE_VPN_CONNECTION, NULL); self = (NMVPNConnection *) g_object_new (NM_TYPE_VPN_CONNECTION,
NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object,
NM_ACTIVE_CONNECTION_VPN, TRUE,
NULL);
if (!self) if (!self)
return NULL; return NULL;
@@ -249,7 +271,12 @@ nm_vpn_connection_new (NMConnection *connection,
G_CALLBACK (device_ip4_config_changed), G_CALLBACK (device_ip4_config_changed),
self); self);
nm_vpn_connection_base_export (NM_VPN_CONNECTION_BASE (self), connection, specific_object); if (!nm_active_connection_export (NM_ACTIVE_CONNECTION (self),
connection,
nm_device_get_path (parent_device))) {
g_object_unref (self);
self = NULL;
}
return self; return self;
} }
@@ -735,14 +762,6 @@ nm_vpn_connection_activate (NMVPNConnection *connection)
NM_VPN_CONNECTION_STATE_REASON_NONE); NM_VPN_CONNECTION_STATE_REASON_NONE);
} }
const char *
nm_vpn_connection_get_active_connection_path (NMVPNConnection *connection)
{
g_return_val_if_fail (NM_IS_VPN_CONNECTION (connection), NULL);
return nm_vpn_connection_base_get_ac_path (NM_VPN_CONNECTION_BASE (connection));
}
const char * const char *
nm_vpn_connection_get_name (NMVPNConnection *connection) nm_vpn_connection_get_name (NMVPNConnection *connection)
{ {
@@ -1198,10 +1217,6 @@ nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class)
G_TYPE_NONE, 2, G_TYPE_NONE, 2,
G_TYPE_UINT, G_TYPE_UINT); G_TYPE_UINT, G_TYPE_UINT);
signals[PROPERTIES_CHANGED] =
nm_properties_changed_signal_new (object_class,
G_STRUCT_OFFSET (NMVPNConnectionClass, properties_changed));
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (object_class), dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (object_class),
&dbus_glib_nm_vpn_connection_object_info); &dbus_glib_nm_vpn_connection_object_info);
} }

View File

@@ -26,7 +26,6 @@
#include <glib-object.h> #include <glib-object.h>
#include "NetworkManagerVPN.h" #include "NetworkManagerVPN.h"
#include "nm-device.h" #include "nm-device.h"
#include "nm-vpn-connection-base.h"
#define NM_TYPE_VPN_CONNECTION (nm_vpn_connection_get_type ()) #define NM_TYPE_VPN_CONNECTION (nm_vpn_connection_get_type ())
#define NM_VPN_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_CONNECTION, NMVPNConnection)) #define NM_VPN_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_CONNECTION, NMVPNConnection))
@@ -39,18 +38,16 @@
#define NM_VPN_CONNECTION_BANNER "banner" #define NM_VPN_CONNECTION_BANNER "banner"
typedef struct { typedef struct {
NMVpnConnectionBase parent; NMActiveConnection parent;
} NMVPNConnection; } NMVPNConnection;
typedef struct { typedef struct {
NMVpnConnectionBaseClass parent; NMActiveConnectionClass parent;
/* Signals */ /* Signals */
void (*vpn_state_changed) (NMVPNConnection *connection, void (*vpn_state_changed) (NMVPNConnection *connection,
NMVPNConnectionState state, NMVPNConnectionState state,
NMVPNConnectionStateReason reason); NMVPNConnectionStateReason reason);
void (*properties_changed) (NMVPNConnection *connection, GHashTable *properties);
} NMVPNConnectionClass; } NMVPNConnectionClass;
GType nm_vpn_connection_get_type (void); GType nm_vpn_connection_get_type (void);
@@ -63,8 +60,6 @@ NMVPNConnection * nm_vpn_connection_new (NMConnection *connection,
void nm_vpn_connection_activate (NMVPNConnection *connection); void nm_vpn_connection_activate (NMVPNConnection *connection);
NMConnection * nm_vpn_connection_get_connection (NMVPNConnection *connection); NMConnection * nm_vpn_connection_get_connection (NMVPNConnection *connection);
const char * nm_vpn_connection_get_active_connection_path (NMVPNConnection *connection);
const char * nm_vpn_connection_get_specific_object_path (NMVPNConnection *connection);
const char * nm_vpn_connection_get_name (NMVPNConnection *connection); const char * nm_vpn_connection_get_name (NMVPNConnection *connection);
NMVPNConnectionState nm_vpn_connection_get_vpn_state (NMVPNConnection *connection); NMVPNConnectionState nm_vpn_connection_get_vpn_state (NMVPNConnection *connection);
const char * nm_vpn_connection_get_banner (NMVPNConnection *connection); const char * nm_vpn_connection_get_banner (NMVPNConnection *connection);

View File

@@ -243,7 +243,7 @@ nm_vpn_manager_deactivate_connection (NMVPNManager *self,
NMVPNConnection *vpn = NM_VPN_CONNECTION (aiter->data); NMVPNConnection *vpn = NM_VPN_CONNECTION (aiter->data);
const char *vpn_path; const char *vpn_path;
vpn_path = nm_vpn_connection_get_active_connection_path (vpn); vpn_path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (vpn));
if (!strcmp (path, vpn_path)) { if (!strcmp (path, vpn_path)) {
nm_vpn_connection_disconnect (vpn, reason); nm_vpn_connection_disconnect (vpn, reason);
success = TRUE; success = TRUE;
@@ -279,7 +279,7 @@ nm_vpn_manager_add_active_connections (NMVPNManager *self,
const char *path; const char *path;
if (!filter || (nm_vpn_connection_get_connection (vpn) == filter)) { if (!filter || (nm_vpn_connection_get_connection (vpn) == filter)) {
path = nm_vpn_connection_get_active_connection_path (vpn); path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (vpn));
g_ptr_array_add (array, g_strdup (path)); g_ptr_array_add (array, g_strdup (path));
} }
} }
@@ -326,7 +326,7 @@ nm_vpn_manager_get_vpn_connection_for_active (NMVPNManager *manager,
NMVPNConnection *vpn = NM_VPN_CONNECTION (elt->data); NMVPNConnection *vpn = NM_VPN_CONNECTION (elt->data);
const char *ac_path; const char *ac_path;
ac_path = nm_vpn_connection_get_active_connection_path (vpn); ac_path = nm_active_connection_get_path (NM_ACTIVE_CONNECTION (vpn));
if (ac_path && !strcmp (ac_path, active_path)) if (ac_path && !strcmp (ac_path, active_path))
return vpn; return vpn;
} }

View File

@@ -728,7 +728,7 @@ real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
if (!req) if (!req)
return NM_ACT_STAGE_RETURN_FAILURE; return NM_ACT_STAGE_RETURN_FAILURE;
path = nm_act_request_get_specific_object (req); path = nm_active_connection_get_specific_object (NM_ACTIVE_CONNECTION (req));
if (!path) if (!path)
return NM_ACT_STAGE_RETURN_FAILURE; return NM_ACT_STAGE_RETURN_FAILURE;