diff options
author | Dan Williams <dcbw@redhat.com> | 2008-03-26 13:43:01 +0000 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2008-03-26 13:43:01 +0000 |
commit | ec89663e7da344f54e11dbd5848c2828fa258b92 (patch) | |
tree | bc34dd46bf2e93a142a8a414e2fd9cc6f324278c /libnm-glib | |
parent | 7d694073be91c000ff02f55704f687390213d83f (diff) | |
download | NetworkManager-ec89663e7da344f54e11dbd5848c2828fa258b92.tar.gz |
2008-03-26 Dan Williams <dcbw@redhat.com>
Rework VPN connection handling for a more consistent D-Bus API. The
VPNManager object has been removed, and active VPN connections are now the
same as any other active connection. The Manager object's ActivateConnection
and DeactivateConnection methods are used to start and stop a VPN connection,
and the VPNConnection objects are subclasses of the ActiveConnection objects.
When activating a VPN connection, pass the path of the active connection
to which the VPN connection is tied in the 'specific_object' argument.
Consequently, the libnm-glib API has been reworked to match this arrangement,
with the VPNManager object removed, and the NMVPNConnection objects now
being subclasses of NMActiveConnection.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3504 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'libnm-glib')
-rw-r--r-- | libnm-glib/Makefile.am | 6 | ||||
-rw-r--r-- | libnm-glib/nm-active-connection.c | 38 | ||||
-rw-r--r-- | libnm-glib/nm-active-connection.h | 2 | ||||
-rw-r--r-- | libnm-glib/nm-client.c | 43 | ||||
-rw-r--r-- | libnm-glib/nm-vpn-connection.c | 55 | ||||
-rw-r--r-- | libnm-glib/nm-vpn-connection.h | 13 | ||||
-rw-r--r-- | libnm-glib/nm-vpn-manager.c | 136 | ||||
-rw-r--r-- | libnm-glib/nm-vpn-manager.h | 46 |
8 files changed, 94 insertions, 245 deletions
diff --git a/libnm-glib/Makefile.am b/libnm-glib/Makefile.am index a88ca59e56..47d4f1e8e3 100644 --- a/libnm-glib/Makefile.am +++ b/libnm-glib/Makefile.am @@ -10,7 +10,6 @@ BUILT_SOURCES = \ nm-marshal.c \ nm-exported-connection-glue.h \ nm-settings-glue.h \ - nm-vpn-manager-bindings.h \ nm-vpn-connection-bindings.h \ nm-vpn-plugin-glue.h \ nm-active-connection-bindings.h @@ -39,7 +38,6 @@ libnminclude_HEADERS = \ nm-gsm-device.h \ nm-cdma-device.h \ nm-vpn-connection.h \ - nm-vpn-manager.h \ nm-vpn-plugin.h \ nm-types.h \ nm-active-connection.h @@ -61,7 +59,6 @@ libnm_glib_la_SOURCES = \ nm-gsm-device.c \ nm-cdma-device.c \ nm-vpn-connection.c \ - nm-vpn-manager.c \ nm-marshal-main.c \ nm-types.c \ nm-types-private.h \ @@ -123,9 +120,6 @@ nm-settings-glue.h: $(top_srcdir)/introspection/nm-settings.xml nm-exported-connection-glue.h: $(top_srcdir)/introspection/nm-exported-connection.xml dbus-binding-tool --prefix=nm_exported_connection --mode=glib-server --output=nm-exported-connection-glue.h $(top_srcdir)/introspection/nm-exported-connection.xml -nm-vpn-manager-bindings.h: $(top_srcdir)/introspection/nm-vpn-manager.xml - dbus-binding-tool --prefix=nm_vpn_manager --mode=glib-client --output=nm-vpn-manager-bindings.h $(top_srcdir)/introspection/nm-vpn-manager.xml - nm-vpn-connection-bindings.h: $(top_srcdir)/introspection/nm-vpn-connection.xml dbus-binding-tool --prefix=nm_vpn_connection --mode=glib-client --output=nm-vpn-connection-bindings.h $(top_srcdir)/introspection/nm-vpn-connection.xml diff --git a/libnm-glib/nm-active-connection.c b/libnm-glib/nm-active-connection.c index d8d5dd0517..8ee8a8e3c0 100644 --- a/libnm-glib/nm-active-connection.c +++ b/libnm-glib/nm-active-connection.c @@ -7,6 +7,7 @@ #include "nm-object-private.h" #include "nm-types-private.h" #include "nm-device.h" +#include "nm-connection.h" #include "nm-active-connection-bindings.h" @@ -22,6 +23,7 @@ typedef struct { DBusGProxy *proxy; char *service_name; + NMConnectionScope scope; char *connection; char *specific_object; char *shared_service_name; @@ -60,6 +62,17 @@ nm_active_connection_new (DBusGConnection *connection, const char *path) NULL); } +static NMConnectionScope +get_scope_for_service_name (const char *service_name) +{ + if (service_name && !strcmp (service_name, NM_DBUS_SERVICE_USER_SETTINGS)) + return NM_CONNECTION_SCOPE_USER; + else if (service_name && !strcmp (service_name, NM_DBUS_SERVICE_SYSTEM_SETTINGS)) + return NM_CONNECTION_SCOPE_SYSTEM; + + return NM_CONNECTION_SCOPE_UNKNOWN; +} + const char * nm_active_connection_get_service_name (NMActiveConnection *connection) { @@ -72,11 +85,22 @@ nm_active_connection_get_service_name (NMActiveConnection *connection) priv->service_name = nm_object_get_string_property (NM_OBJECT (connection), NM_DBUS_INTERFACE_ACTIVE_CONNECTION, DBUS_PROP_SERVICE_NAME); + priv->scope = get_scope_for_service_name (priv->service_name); } return priv->service_name; } +NMConnectionScope +nm_active_connection_get_scope (NMActiveConnection *connection) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NM_CONNECTION_SCOPE_UNKNOWN); + + /* Make sure service_name and scope are up-to-date */ + nm_active_connection_get_service_name (connection); + return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->scope; +} + const char * nm_active_connection_get_connection (NMActiveConnection *connection) { @@ -256,12 +280,24 @@ demarshal_devices (NMObject *object, GParamSpec *pspec, GValue *value, gpointer return TRUE; } +static gboolean +demarshal_service (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) +{ + NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object); + + if (nm_object_demarshal_generic (object, pspec, value, field)) { + priv->scope = get_scope_for_service_name (priv->service_name); + return TRUE; + } + return FALSE; +} + static void register_for_property_changed (NMActiveConnection *connection) { NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (connection); const NMPropertiesChangedInfo property_changed_info[] = { - { NM_ACTIVE_CONNECTION_SERVICE_NAME, nm_object_demarshal_generic, &priv->service_name }, + { NM_ACTIVE_CONNECTION_SERVICE_NAME, demarshal_service, &priv->service_name }, { NM_ACTIVE_CONNECTION_CONNECTION, nm_object_demarshal_generic, &priv->connection }, { NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, nm_object_demarshal_generic, &priv->specific_object }, { NM_ACTIVE_CONNECTION_SHARED_SERVICE_NAME, nm_object_demarshal_generic, &priv->shared_service_name }, diff --git a/libnm-glib/nm-active-connection.h b/libnm-glib/nm-active-connection.h index b42aa51221..bf4129f7f5 100644 --- a/libnm-glib/nm-active-connection.h +++ b/libnm-glib/nm-active-connection.h @@ -4,6 +4,7 @@ #include <glib/gtypes.h> #include <glib-object.h> #include "nm-object.h" +#include <nm-connection.h> G_BEGIN_DECLS @@ -34,6 +35,7 @@ GType nm_active_connection_get_type (void); GObject *nm_active_connection_new (DBusGConnection *connection, const char *path); const char * nm_active_connection_get_service_name (NMActiveConnection *connection); +NMConnectionScope nm_active_connection_get_scope (NMActiveConnection *connection); const char * nm_active_connection_get_connection (NMActiveConnection *connection); const char * nm_active_connection_get_specific_object (NMActiveConnection *connection); const char * nm_active_connection_get_shared_service_name (NMActiveConnection *connection); diff --git a/libnm-glib/nm-client.c b/libnm-glib/nm-client.c index 1d028f4be8..126e658209 100644 --- a/libnm-glib/nm-client.c +++ b/libnm-glib/nm-client.c @@ -14,6 +14,7 @@ #include "nm-types-private.h" #include "nm-object-private.h" #include "nm-active-connection.h" +#include "nm-vpn-connection.h" #include "nm-object-cache.h" #include "nm-dbus-glib-types.h" @@ -131,6 +132,46 @@ wireless_enabled_cb (GObject *object, GParamSpec *pspec, gpointer user_data) poke_wireless_devices_with_rf_status (NM_CLIENT (object)); } +static GObject * +new_active_connection (DBusGConnection *connection, const char *path) +{ + DBusGProxy *proxy; + GError *error = NULL; + GValue value = {0,}; + GObject *object = NULL; + + proxy = dbus_g_proxy_new_for_name (connection, + NM_DBUS_SERVICE, + path, + "org.freedesktop.DBus.Properties"); + if (!proxy) { + g_warning ("%s: couldn't create D-Bus object proxy.", __func__); + return NULL; + } + + /* Have to create an NMVPNConnection if it's a VPN connection, otherwise + * a plain NMActiveConnection. + */ + if (dbus_g_proxy_call (proxy, + "Get", &error, + G_TYPE_STRING, NM_DBUS_INTERFACE_ACTIVE_CONNECTION, + G_TYPE_STRING, "Vpn", + G_TYPE_INVALID, + G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + if (g_value_get_boolean (&value)) + object = nm_vpn_connection_new (connection, path); + else + object = nm_active_connection_new (connection, path); + } else { + g_warning ("Error in getting active connection 'Vpn' property: (%d) %s", + error->code, error->message); + g_error_free (error); + } + + g_object_unref (proxy); + return object; +} + static gboolean demarshal_active_connections (NMObject *object, GParamSpec *pspec, @@ -140,7 +181,7 @@ demarshal_active_connections (NMObject *object, DBusGConnection *connection; connection = nm_object_get_connection (object); - if (!nm_object_array_demarshal (value, (GPtrArray **) field, connection, nm_active_connection_new)) + if (!nm_object_array_demarshal (value, (GPtrArray **) field, connection, new_active_connection)) return FALSE; nm_object_queue_notify (object, NM_CLIENT_ACTIVE_CONNECTIONS); diff --git a/libnm-glib/nm-vpn-connection.c b/libnm-glib/nm-vpn-connection.c index ff18de924f..e256bef3af 100644 --- a/libnm-glib/nm-vpn-connection.c +++ b/libnm-glib/nm-vpn-connection.c @@ -27,14 +27,14 @@ #include "nm-vpn-connection-bindings.h" #include "nm-marshal.h" #include "nm-object-private.h" +#include "nm-active-connection.h" -G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_OBJECT) +G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION) #define NM_VPN_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_CONNECTION, NMVPNConnectionPrivate)) typedef struct { DBusGProxy *proxy; - char *name; char *banner; NMVPNConnectionState state; } NMVPNConnectionPrivate; @@ -48,38 +48,16 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; -NMVPNConnection * -nm_vpn_connection_new (DBusGConnection *dbus_connection, - const char *path) +GObject * +nm_vpn_connection_new (DBusGConnection *dbus_connection, const char *path) { - NMVPNConnection *connection; - g_return_val_if_fail (dbus_connection != NULL, NULL); g_return_val_if_fail (path != NULL, NULL); - connection = (NMVPNConnection *) g_object_new (NM_TYPE_VPN_CONNECTION, - NM_OBJECT_DBUS_CONNECTION, dbus_connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - - nm_vpn_connection_get_name (connection); - - return connection; -} - -const char * -nm_vpn_connection_get_name (NMVPNConnection *vpn) -{ - NMVPNConnectionPrivate *priv; - - g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NULL); - - priv = NM_VPN_CONNECTION_GET_PRIVATE (vpn); - if (!priv->name) - priv->name = nm_object_get_string_property (NM_OBJECT (vpn), - NM_DBUS_INTERFACE_VPN_CONNECTION, - "Name"); - return priv->name; + return g_object_new (NM_TYPE_VPN_CONNECTION, + NM_OBJECT_DBUS_CONNECTION, dbus_connection, + NM_OBJECT_DBUS_PATH, path, + NULL); } const char * @@ -136,20 +114,6 @@ state_changed_proxy (DBusGProxy *proxy, } } -void -nm_vpn_connection_disconnect (NMVPNConnection *vpn) -{ - GError *err = NULL; - - g_return_if_fail (NM_IS_VPN_CONNECTION (vpn)); - - org_freedesktop_NetworkManager_VPN_Connection_disconnect (NM_VPN_CONNECTION_GET_PRIVATE (vpn)->proxy, &err); - if (err) { - nm_warning ("Error in VPN disconnect: %s", err->message); - g_error_free (err); - } -} - /*****************************************************************************/ static void @@ -199,12 +163,11 @@ finalize (GObject *object) { NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object); - if (priv->name) - g_free (priv->name); if (priv->banner) g_free (priv->banner); g_object_unref (priv->proxy); + G_OBJECT_CLASS (nm_vpn_connection_parent_class)->finalize (object); } diff --git a/libnm-glib/nm-vpn-connection.h b/libnm-glib/nm-vpn-connection.h index a32cc66640..6b60988436 100644 --- a/libnm-glib/nm-vpn-connection.h +++ b/libnm-glib/nm-vpn-connection.h @@ -26,7 +26,7 @@ #include <glib/gtypes.h> #include <glib-object.h> #include <dbus/dbus-glib.h> -#include "nm-object.h" +#include "nm-active-connection.h" #include "NetworkManagerVPN.h" G_BEGIN_DECLS @@ -39,11 +39,11 @@ G_BEGIN_DECLS #define NM_VPN_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_VPN_CONNECTION, NMVPNConnectionClass)) typedef struct { - NMObject parent; + NMActiveConnection parent; } NMVPNConnection; typedef struct { - NMObjectClass parent; + NMActiveConnectionClass parent; /* Signals */ void (*state_changed) (NMVPNConnection *connection, @@ -53,16 +53,11 @@ typedef struct { GType nm_vpn_connection_get_type (void); +GObject * nm_vpn_connection_new (DBusGConnection *dbus_connection, const char *path); -NMVPNConnection * nm_vpn_connection_new (DBusGConnection *dbus_connection, - const char *path); - -const char * nm_vpn_connection_get_name (NMVPNConnection *vpn); NMVPNConnectionState nm_vpn_connection_get_state (NMVPNConnection *vpn); const char * nm_vpn_connection_get_banner (NMVPNConnection *vpn); -void nm_vpn_connection_disconnect (NMVPNConnection *vpn); - G_END_DECLS #endif /* NM_VPN_CONNECTION_H */ diff --git a/libnm-glib/nm-vpn-manager.c b/libnm-glib/nm-vpn-manager.c deleted file mode 100644 index 2c57687884..0000000000 --- a/libnm-glib/nm-vpn-manager.c +++ /dev/null @@ -1,136 +0,0 @@ -/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ - -#include <dbus/dbus-glib.h> -#include <string.h> -#include "nm-vpn-manager.h" -#include "nm-marshal.h" - -#include "nm-vpn-manager-bindings.h" - -G_DEFINE_TYPE (NMVPNManager, nm_vpn_manager, NM_TYPE_OBJECT) - -#define NM_VPN_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_MANAGER, NMVPNManagerPrivate)) - -typedef struct { - DBusGProxy *manager_proxy; -} NMVPNManagerPrivate; - -NMVPNManager * -nm_vpn_manager_new (void) -{ - DBusGConnection *connection; - GError *err = NULL; - - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err); - if (!connection) { - g_warning ("Couldn't connect to system bus: %s", err->message); - g_error_free (err); - return NULL; - } - - return (NMVPNManager *) g_object_new (NM_TYPE_VPN_MANAGER, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, NM_DBUS_PATH_VPN, - NULL); - -} - -NMVPNConnection * -nm_vpn_manager_connect (NMVPNManager *manager, - const char *connection_type, - const char *connection_path, - NMDevice *device) -{ - char *vpn_connection = NULL; - GError *err = NULL; - - g_return_val_if_fail (NM_IS_VPN_MANAGER (manager), NULL); - g_return_val_if_fail (connection_type != NULL, NULL); - g_return_val_if_fail (connection_path, NULL); - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - if (!org_freedesktop_NetworkManager_VPN_Manager_connect (NM_VPN_MANAGER_GET_PRIVATE (manager)->manager_proxy, - connection_type, - connection_path, - nm_object_get_path (NM_OBJECT (device)), - &vpn_connection, - &err)) { - g_warning ("Error in VPN Connect: %s", err->message); - g_error_free (err); - return NULL; - } - - return nm_vpn_connection_new (nm_object_get_connection (NM_OBJECT (manager)), vpn_connection); -} - -GSList * -nm_vpn_manager_get_connections (NMVPNManager *manager) -{ - GPtrArray *array = NULL; - GSList *list = NULL; - DBusGConnection *dbus_connection; - int i; - GError *err = NULL; - - g_return_val_if_fail (NM_IS_VPN_MANAGER (manager), NULL); - - if (!org_freedesktop_NetworkManager_VPN_Manager_list_connections (NM_VPN_MANAGER_GET_PRIVATE (manager)->manager_proxy, - &array, &err)) { - g_warning ("Error in getting VPN connections: %s", err->message); - g_error_free (err); - return NULL; - } - - dbus_connection = nm_object_get_connection (NM_OBJECT (manager)); - - for (i = 0; i < array->len; i++) - list = g_slist_prepend (list, nm_vpn_connection_new (dbus_connection, (char *) g_ptr_array_index (array, i))); - - return list; -} - -/*****************************************************************************/ - -static void -nm_vpn_manager_init (NMVPNManager *manager) -{ -} - -static GObject* -constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - NMObject *object; - - object = (NMObject *) G_OBJECT_CLASS (nm_vpn_manager_parent_class)->constructor (type, - n_construct_params, - construct_params); - if (!object) - return NULL; - - NM_VPN_MANAGER_GET_PRIVATE (object)->manager_proxy = dbus_g_proxy_new_for_name (nm_object_get_connection (object), - NM_DBUS_SERVICE, - nm_object_get_path (object), - NM_DBUS_INTERFACE_VPN); - return G_OBJECT (object); -} - -static void -finalize (GObject *object) -{ - g_object_unref (NM_VPN_MANAGER_GET_PRIVATE (object)->manager_proxy); - G_OBJECT_CLASS (nm_vpn_manager_parent_class)->finalize (object); -} - -static void -nm_vpn_manager_class_init (NMVPNManagerClass *manager_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (manager_class); - - g_type_class_add_private (manager_class, sizeof (NMVPNManagerPrivate)); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->finalize = finalize; -} diff --git a/libnm-glib/nm-vpn-manager.h b/libnm-glib/nm-vpn-manager.h deleted file mode 100644 index 50797b4c90..0000000000 --- a/libnm-glib/nm-vpn-manager.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ - -#ifndef NM_VPN_MANAGER_H -#define NM_VPN_MANAGER_H 1 - -#include <glib/gtypes.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include <NetworkManager.h> -#include <NetworkManagerVPN.h> -#include "nm-object.h" -#include "nm-device.h" -#include "nm-connection.h" -#include "nm-vpn-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_VPN_MANAGER (nm_vpn_manager_get_type ()) -#define NM_VPN_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_MANAGER, NMVPNManager)) -#define NM_VPN_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_VPN_MANAGER, NMVPNManagerClass)) -#define NM_IS_VPN_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_MANAGER)) -#define NM_IS_VPN_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_VPN_MANAGER)) -#define NM_VPN_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_VPN_MANAGER, NMVPNManagerClass)) - -typedef struct { - NMObject parent; -} NMVPNManager; - -typedef struct { - NMObjectClass parent; -} NMVPNManagerClass; - -GType nm_vpn_manager_get_type (void); - - -NMVPNManager *nm_vpn_manager_new (void); -NMVPNConnection *nm_vpn_manager_connect (NMVPNManager *manager, - const char *connection_type, - const char *connection_path, - NMDevice *device); - -GSList *nm_vpn_manager_get_connections (NMVPNManager *manager); - -G_END_DECLS - -#endif /* NM_MANAGER_H */ |