summaryrefslogtreecommitdiff
path: root/src/nm-activation-request.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2008-03-20 19:56:12 +0000
committerDan Williams <dcbw@redhat.com>2008-03-20 19:56:12 +0000
commit393685203fa966fc2ae857fd629b3995f27e736d (patch)
tree09e30a5a00c0035ab31dd532cc244edb303cce13 /src/nm-activation-request.c
parent2a8011191345e484535207c99c58cc3a9ebea667 (diff)
2008-03-20 Dan Williams <dcbw@redhat.com>
* introspection/nm-manager.xml introspection/nm-manager-client.xml - (ActivateConnection): return the object path of the active connection on success - (GetActiveConnections): remove - (DeactivateConnection): new function; deactivate a currently active connection - Add an ActiveConnections property which returns an array of active connection object paths * introspection/nm-device.xml - (Deactivate): remove * introspection/all.xml - Add ActiveConnection introspection * introspection/nm-active-connection.xml - Add the ActiveConnection object * include/NetworkManager.h - Add the Connection.Active D-Bus interface * src/nm-device-interface.c - (impl_device_deactivate): remove * src/nm-activation-request.c src/nm-activation-request.c src/Makefile.am - Implement the Connection.Active D-Bus interface * src/nm-manager.c - (get_property, nm_manager_class_init): add ACTIVE_CONNECTIONS property - (nm_manager_activate_device): return the active connection path - (connection_added_default_handler, impl_manager_activate_connection): return the active connection to the caller - (add_one_connection_element, impl_manager_get_active_connections): remove - (impl_manager_deactivate_connection): new function; deactivate an active connection * libnm-glib/nm-device.c libnm-glib/nm-device.h - Remove Deactivate() function git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3484 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'src/nm-activation-request.c')
-rw-r--r--src/nm-activation-request.c203
1 files changed, 181 insertions, 22 deletions
diff --git a/src/nm-activation-request.c b/src/nm-activation-request.c
index 3e45ae2a88..1d4d7259b7 100644
--- a/src/nm-activation-request.c
+++ b/src/nm-activation-request.c
@@ -27,6 +27,10 @@
#include "nm-utils.h"
#include "nm-setting-wireless-security.h"
#include "nm-setting-8021x.h"
+#include "nm-dbus-manager.h"
+#include "nm-device.h"
+#include "nm-properties-changed-signal.h"
+#include "nm-active-connection-glue.h"
#include "nm-manager.h" /* FIXME! */
@@ -39,6 +43,7 @@ G_DEFINE_TYPE (NMActRequest, nm_act_request, G_TYPE_OBJECT)
enum {
CONNECTION_SECRETS_UPDATED,
CONNECTION_SECRETS_FAILED,
+ PROPERTIES_CHANGED,
LAST_SIGNAL
};
@@ -49,9 +54,59 @@ static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
NMConnection *connection;
char *specific_object;
+ NMConnection *shared;
+ NMDevice *device;
gboolean user_requested;
+
+ char *ac_path;
} NMActRequestPrivate;
+enum {
+ PROP_0,
+ PROP_SERVICE_NAME,
+ PROP_CONNECTION,
+ PROP_SPECIFIC_OBJECT,
+ PROP_SHARED_SERVICE_NAME,
+ PROP_SHARED_CONNECTION,
+ PROP_DEVICES,
+
+ LAST_PROP
+};
+
+
+NMActRequest *
+nm_act_request_new (NMConnection *connection,
+ const char *specific_object,
+ gboolean user_requested,
+ gpointer *device)
+{
+ GObject *object;
+ NMActRequestPrivate *priv;
+ DBusGConnection *g_connection;
+ static guint32 counter = 0;
+
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (NM_DEVICE (device), NULL);
+
+ object = g_object_new (NM_TYPE_ACT_REQUEST, NULL);
+ if (!object)
+ return NULL;
+
+ priv = NM_ACT_REQUEST_GET_PRIVATE (object);
+
+ priv->connection = g_object_ref (connection);
+ if (specific_object)
+ priv->specific_object = g_strdup (specific_object);
+ priv->device = NM_DEVICE (device);
+ priv->user_requested = user_requested;
+
+ g_connection = nm_dbus_manager_get_connection (nm_dbus_manager_get ());
+ priv->ac_path = g_strdup_printf (NM_DBUS_PATH "/ActiveConnection/%d", counter++);
+ dbus_g_connection_register_g_object (g_connection, priv->ac_path, object);
+
+ return NM_ACT_REQUEST (object);
+}
+
static void
nm_act_request_init (NMActRequest *req)
{
@@ -79,6 +134,9 @@ dispose (GObject *object)
CONNECTION_GET_SECRETS_CALL_TAG, NULL);
g_object_unref (priv->connection);
+ if (priv->shared)
+ g_object_unref (priv->shared);
+
out:
G_OBJECT_CLASS (nm_act_request_parent_class)->dispose (object);
}
@@ -89,20 +147,129 @@ finalize (GObject *object)
NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object);
g_free (priv->specific_object);
+ g_free (priv->ac_path);
G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object);
}
static void
+scope_to_value (NMConnection *connection, GValue *value)
+{
+ if (!connection) {
+ g_value_set_string (value, "");
+ return;
+ }
+
+ switch (nm_connection_get_scope (connection)) {
+ case NM_CONNECTION_SCOPE_SYSTEM:
+ g_value_set_string (value, NM_DBUS_SERVICE_SYSTEM_SETTINGS);
+ break;
+ case NM_CONNECTION_SCOPE_USER:
+ g_value_set_string (value, NM_DBUS_SERVICE_USER_SETTINGS);
+ break;
+ default:
+ g_warning ("%s: unknown connection scope!", __func__);
+ break;
+ }
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object);
+ GPtrArray *devices;
+
+ switch (prop_id) {
+ case PROP_SERVICE_NAME:
+ scope_to_value (priv->connection, value);
+ break;
+ case PROP_CONNECTION:
+ g_value_set_boxed (value, nm_connection_get_path (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_SHARED_SERVICE_NAME:
+ scope_to_value (priv->shared, value);
+ break;
+ case PROP_SHARED_CONNECTION:
+ if (!priv->shared) {
+ g_value_set_boxed (value, "/");
+ break;
+ }
+ g_value_set_boxed (value, nm_connection_get_path (priv->shared));
+ break;
+ case PROP_DEVICES:
+ devices = g_ptr_array_sized_new (1);
+ g_ptr_array_add (devices, g_strdup (nm_device_get_udi (priv->device)));
+ g_value_take_boxed (value, devices);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
nm_act_request_class_init (NMActRequestClass *req_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (req_class);
g_type_class_add_private (req_class, sizeof (NMActRequestPrivate));
+ /* virtual methods */
+ object_class->get_property = get_property;
object_class->dispose = dispose;
object_class->finalize = finalize;
+ /* properties */
+ g_object_class_install_property
+ (object_class, PROP_SERVICE_NAME,
+ g_param_spec_string (NM_ACTIVE_CONNECTION_SERVICE_NAME,
+ "Service name",
+ "Service name",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property
+ (object_class, PROP_CONNECTION,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_CONNECTION,
+ "Connection",
+ "Connection",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+ g_object_class_install_property
+ (object_class, PROP_SPECIFIC_OBJECT,
+ g_param_spec_string (NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT,
+ "Specific object",
+ "Specific object",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property
+ (object_class, PROP_SHARED_SERVICE_NAME,
+ g_param_spec_string (NM_ACTIVE_CONNECTION_SHARED_SERVICE_NAME,
+ "Shared service name",
+ "Shared service name",
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property
+ (object_class, PROP_SHARED_CONNECTION,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_SHARED_CONNECTION,
+ "Shared connection",
+ "Shared connection",
+ DBUS_TYPE_G_OBJECT_PATH,
+ G_PARAM_READABLE));
+ g_object_class_install_property
+ (object_class, PROP_DEVICES,
+ g_param_spec_boxed (NM_ACTIVE_CONNECTION_DEVICES,
+ "Devices",
+ "Devices",
+ dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH),
+ G_PARAM_READABLE));
+
/* Signals */
signals[CONNECTION_SECRETS_UPDATED] =
g_signal_new ("connection-secrets-updated",
@@ -123,30 +290,13 @@ nm_act_request_class_init (NMActRequestClass *req_class)
nm_marshal_VOID__OBJECT_STRING,
G_TYPE_NONE, 2,
G_TYPE_OBJECT, G_TYPE_STRING);
-}
-
-NMActRequest *
-nm_act_request_new (NMConnection *connection,
- const char *specific_object,
- gboolean user_requested)
-{
- GObject *obj;
- NMActRequestPrivate *priv;
- g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
-
- obj = g_object_new (NM_TYPE_ACT_REQUEST, NULL);
- if (!obj)
- return NULL;
-
- priv = NM_ACT_REQUEST_GET_PRIVATE (obj);
-
- priv->connection = g_object_ref (connection);
- priv->user_requested = user_requested;
- if (specific_object)
- priv->specific_object = g_strdup (specific_object);
+ signals[PROPERTIES_CHANGED] =
+ nm_properties_changed_signal_new (object_class,
+ G_STRUCT_OFFSET (NMActRequestClass, properties_changed));
- return NM_ACT_REQUEST (obj);
+ dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (req_class),
+ &dbus_glib_nm_active_connection_object_info);
}
typedef struct GetSecretsInfo {
@@ -407,3 +557,12 @@ nm_act_request_get_user_requested (NMActRequest *req)
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), FALSE);
+
+ return NM_ACT_REQUEST_GET_PRIVATE (req)->ac_path;
+}
+