2008-03-19 Dan Williams <dcbw@redhat.com>

* introspection/nm-manager.xml
	  introspection/nm-manager-client.xml
		- Rename the ActivateDevice method to ActivateConnection to better
			reflect it's usage; it's arguments get reordered a bit too
		- Convert GetActiveConnections method return from a struct to a dict

	* include/NetworkManager.h
		- Define the dict keys for return value of GetActiveConnections

	* src/nm-manager.c
		- impl_manager_activate_device -> impl_manager_activate_connection
		- (add_one_connection_element): return a populated hash table, not
			a structure

	* libnm-glib/nm-client.c
	  libnm-glib/nm-client.h
		- nm_client_activate_device -> nm_client_activate_connection
		- nm_client_free_active_connection_element -> nm_client_free_active_connections_element
		- (nm_client_get_active_connections): return a GSList of GHashTables,
			instead of the custom structures.  Each element of the returned list
			must be freed with nm_client_free_active_connections_element()



git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3482 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams 2008-03-19 20:58:21 +00:00
parent 731cacc944
commit fbb5062271
7 changed files with 216 additions and 163 deletions

View file

@ -1,3 +1,27 @@
2008-03-19 Dan Williams <dcbw@redhat.com>
* introspection/nm-manager.xml
introspection/nm-manager-client.xml
- Rename the ActivateDevice method to ActivateConnection to better
reflect it's usage; it's arguments get reordered a bit too
- Convert GetActiveConnections method return from a struct to a dict
* include/NetworkManager.h
- Define the dict keys for return value of GetActiveConnections
* src/nm-manager.c
- impl_manager_activate_device -> impl_manager_activate_connection
- (add_one_connection_element): return a populated hash table, not
a structure
* libnm-glib/nm-client.c
libnm-glib/nm-client.h
- nm_client_activate_device -> nm_client_activate_connection
- nm_client_free_active_connection_element -> nm_client_free_active_connections_element
- (nm_client_get_active_connections): return a GSList of GHashTables,
instead of the custom structures. Each element of the returned list
must be freed with nm_client_free_active_connections_element()
2008-03-18 Dan Williams <dcbw@redhat.com>
* system-settings/plugins/ifcfg-fedora/parser.c

View file

@ -139,4 +139,16 @@ typedef enum
} NMDeviceState;
/*
* Active Connection dict keys
*/
#define NM_AC_KEY_SERVICE_NAME "service-name"
#define NM_AC_KEY_CONNECTION "connection"
#define NM_AC_KEY_SPECIFIC_OBJECT "specific-object"
#define NM_AC_KEY_SHARED_TO_SERVICE_NAME "shared-to-service-name"
#define NM_AC_KEY_SHARED_TO_CONNECTION "shared-to-connection"
#define NM_AC_KEY_DEVICES "devices"
#endif /* NETWORK_MANAGER_H */

View file

@ -19,25 +19,18 @@ object. dbus-glib generates the same bound function names for D-Bus the methods
<arg name="devices" type="ao" direction="out"/>
</method>
<method name="ActivateDevice">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_activate_device"/>
<method name="ActivateConnection">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_activate_connection"/>
<annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
<arg name="device" type="o" direction="in"/>
<arg name="service_name" type="s" direction="in"/>
<arg name="connection" type="o" direction="in"/>
<arg name="device" type="o" direction="in"/>
<arg name="specific_object" type="o" direction="in"/>
</method>
<method name="GetActiveConnections">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_get_active_connections"/>
<!-- 'connections' is an array of structs
consisting of the following elements:
service name
connection object path
specific object
array of (device object path)
-->
<arg name="connections" type="a(sooao)" direction="out"/>
<arg name="connections" type="aa{sv}" direction="out"/>
</method>
<method name="Sleep">

View file

@ -21,17 +21,12 @@
</arg>
</method>
<method name="ActivateDevice">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_activate_device"/>
<method name="ActivateConnection">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_activate_connection"/>
<annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
<tp:docstring>
Activate a device using the supplied connection.
Activate a connection using the supplied device.
</tp:docstring>
<arg name="device" type="o" direction="in">
<tp:docstring>
The device to be activated.
</tp:docstring>
</arg>
<arg name="service_name" type="s" direction="in">
<tp:docstring>
The D-Bus service name of the settings service that provides this connection.
@ -42,6 +37,11 @@
The connection to activate the devices with.
</tp:docstring>
</arg>
<arg name="device" type="o" direction="in">
<tp:docstring>
The device to be activated.
</tp:docstring>
</arg>
<arg name="specific_object" type="o" direction="in">
<tp:docstring>
The path of a device-type-specific object this activation should use, for example a WiFi access point.
@ -63,16 +63,9 @@
<method name="GetActiveConnections">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_get_active_connections"/>
<!-- 'connections' is an array of structs
consisting of the following elements:
service name
connection object path
specific object
array of (device object path)
-->
<arg name="connections" type="a(sooao)" direction="out" tp:type="Active_Connection[]">
<arg name="connections" type="aa{sv}" direction="out">
<tp:docstring>
List of active connections
List of active connections, each described by a property dictionary.
</tp:docstring>
</arg>
</method>
@ -182,32 +175,6 @@
</tp:enumvalue>
</tp:enum>
<tp:struct name="Active_Connection" array-name="Active_Connection_List">
<tp:docstring>A struct representing an active connection, returned by GetActiveConnections on the NetworkManager interface.
</tp:docstring>
<tp:member type="s" name="service_name">
<tp:docstring>
The D-Bus service name of the settings service that provides this connection.
</tp:docstring>
</tp:member>
<tp:member type="o" name="connection_path">
<tp:docstring>
Object path of the active connection
</tp:docstring>
</tp:member>
<tp:member type="o" name="specific_object">
<tp:docstring>
Object path of a device-type-specific object this connection uses, for example a specific WiFi access point.
</tp:docstring>
</tp:member>
<tp:member type="ao" name="active_device_list">
<tp:docstring>
Array of object paths to the devices this connection is active on.
</tp:docstring>
</tp:member>
</tp:struct>
<!-- Legacy methods to maintain backwards compatibility for 0.6 branch. -->
<signal name="StateChange">

View file

@ -531,10 +531,10 @@ activate_cb (DBusGProxy *proxy, GError *err, gpointer user_data)
}
void
nm_client_activate_device (NMClient *client,
NMDevice *device,
nm_client_activate_connection (NMClient *client,
const char *service_name,
const char *connection_path,
NMDevice *device,
const char *specific_object,
NMClientActivateDeviceFn callback,
gpointer user_data)
@ -557,15 +557,33 @@ nm_client_activate_device (NMClient *client,
info->fn = callback;
info->user_data = user_data;
org_freedesktop_NetworkManager_activate_device_async (NM_CLIENT_GET_PRIVATE (client)->client_proxy,
nm_object_get_path (NM_OBJECT (device)),
org_freedesktop_NetworkManager_activate_connection_async (NM_CLIENT_GET_PRIVATE (client)->client_proxy,
service_name,
connection_path,
nm_object_get_path (NM_OBJECT (device)),
internal_so,
activate_cb,
info);
}
void
nm_client_free_active_connections_element (GHashTable *item)
{
GSList *devices, *iter;
g_free (g_hash_table_lookup (item, NM_AC_KEY_SERVICE_NAME));
g_free (g_hash_table_lookup (item, NM_AC_KEY_CONNECTION));
g_free (g_hash_table_lookup (item, NM_AC_KEY_SPECIFIC_OBJECT));
g_free (g_hash_table_lookup (item, NM_AC_KEY_SHARED_TO_SERVICE_NAME));
g_free (g_hash_table_lookup (item, NM_AC_KEY_SHARED_TO_CONNECTION));
devices = g_hash_table_lookup (item, NM_AC_KEY_DEVICES);
for (iter = devices; iter; iter = g_slist_next (iter))
g_object_unref (iter->data);
g_slist_free (devices);
}
#define DBUS_TYPE_G_OBJECT_PATH_ARRAY (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH))
GSList *
nm_client_get_active_connections (NMClient *client)
@ -575,7 +593,6 @@ nm_client_get_active_connections (NMClient *client)
GPtrArray *array = NULL;
GError *err = NULL;
int i, j;
static GType type = 0, ao_type = 0;
g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
@ -586,83 +603,98 @@ nm_client_get_active_connections (NMClient *client)
return NULL;
}
/* dbus signature "sooao" */
if (G_UNLIKELY (ao_type) == 0)
ao_type = dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH);
if (G_UNLIKELY (type) == 0) {
type = dbus_g_type_get_struct ("GValueArray",
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
DBUS_TYPE_G_OBJECT_PATH,
ao_type,
G_TYPE_INVALID);
}
for (i = 0; i < array->len; i++) {
NMClientActiveConnection *ac_elt;
GValue val = {0, };
GPtrArray *devices = NULL;
GHashTable *reply;
GHashTable *active;
GValue *value, *value2;
GPtrArray *devices_array = NULL;
GSList *devices = NULL;
gboolean have_shared_service = TRUE;
ac_elt = g_slice_new0 (NMClientActiveConnection);
if (!ac_elt) {
g_warning ("Error in get_active_connections: not enough memory.");
active = g_hash_table_new (g_str_hash, g_str_equal);
reply = g_ptr_array_index (array, i);
/* Service name */
value = g_hash_table_lookup (reply, NM_AC_KEY_SERVICE_NAME);
if (!value || !G_VALUE_HOLDS_STRING (value)) {
g_warning ("%s: missing item " NM_AC_KEY_SERVICE_NAME, __func__);
nm_client_free_active_connections_element (active);
g_hash_table_destroy (reply);
continue;
}
g_hash_table_insert (active, NM_AC_KEY_SERVICE_NAME, g_value_dup_string (value));
/* Connection path */
value = g_hash_table_lookup (reply, NM_AC_KEY_CONNECTION);
if (!value || !G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH)) {
g_warning ("%s: missing item " NM_AC_KEY_CONNECTION, __func__);
nm_client_free_active_connections_element (active);
g_hash_table_destroy (reply);
continue;
}
g_hash_table_insert (active, NM_AC_KEY_CONNECTION, g_value_dup_boxed (value));
/* Specific object path */
value = g_hash_table_lookup (reply, NM_AC_KEY_SPECIFIC_OBJECT);
if (value && G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
g_hash_table_insert (active, NM_AC_KEY_SPECIFIC_OBJECT, g_value_dup_boxed (value));
/* Shared to service name */
value = g_hash_table_lookup (reply, NM_AC_KEY_SHARED_TO_SERVICE_NAME);
if (!value || !G_VALUE_HOLDS_STRING (value))
have_shared_service = FALSE;
value2 = g_hash_table_lookup (reply, NM_AC_KEY_SHARED_TO_CONNECTION);
if (have_shared_service && value2 && G_VALUE_HOLDS (value2, DBUS_TYPE_G_OBJECT_PATH)) {
g_hash_table_insert (active, NM_AC_KEY_SHARED_TO_SERVICE_NAME, g_value_dup_string (value));
g_hash_table_insert (active, NM_AC_KEY_SHARED_TO_CONNECTION, g_value_dup_boxed (value2));
} else {
/* Ignore missing shared-to-service _and_ missing shared-to-connection */
if (have_shared_service) {
g_warning ("%s: missing item " NM_AC_KEY_SHARED_TO_SERVICE_NAME, __func__);
nm_client_free_active_connections_element (active);
g_hash_table_destroy (reply);
continue;
}
}
/* Device array */
value = g_hash_table_lookup (reply, NM_AC_KEY_DEVICES);
if (!value || !G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH_ARRAY)) {
g_warning ("%s: missing item " NM_AC_KEY_DEVICES, __func__);
nm_client_free_active_connections_element (active);
g_hash_table_destroy (reply);
continue;
}
g_value_init (&val, type);
g_value_take_boxed (&val, g_ptr_array_index (array, i));
dbus_g_type_struct_get (&val,
0, &(ac_elt->service_name),
1, &(ac_elt->connection_path),
2, &(ac_elt->specific_object),
3, &devices,
G_MAXUINT);
g_value_unset (&val);
if (devices == NULL || (devices->len == 0)) {
g_warning ("Error in get_active_connections: no devices returned.");
nm_client_free_active_connection_element (ac_elt);
devices_array = g_value_get_boxed (value);
if (!devices_array || (devices_array->len == 0)) {
g_warning ("%s: no devices for this active connection.", __func__);
nm_client_free_active_connections_element (active);
g_hash_table_destroy (reply);
continue;
}
if (!strcmp (ac_elt->specific_object, "/")) {
g_free (ac_elt->specific_object);
ac_elt->specific_object = NULL;
}
for (j = 0; j < devices->len; j++) {
for (j = 0; j < devices_array->len; j++) {
NMDevice *device;
char *path = g_ptr_array_index (devices, j);
const char *path;
device = get_device (client, (const char *) path, TRUE);
ac_elt->devices = g_slist_append (ac_elt->devices, g_object_ref (device));
g_free (path);
path = (const char *) g_ptr_array_index (devices_array, j);
device = get_device (client, path, TRUE);
devices = g_slist_append (devices, g_object_ref (device));
}
g_ptr_array_free (devices, TRUE);
connections = g_slist_append (connections, ac_elt);
g_hash_table_insert (active, NM_AC_KEY_DEVICES, devices);
connections = g_slist_append (connections, active);
g_hash_table_destroy (reply);
}
g_ptr_array_free (array, TRUE);
return connections;
}
void
nm_client_free_active_connection_element (NMClientActiveConnection *elt)
{
g_return_if_fail (elt != NULL);
g_free (elt->service_name);
g_free (elt->connection_path);
g_free (elt->specific_object);
g_slist_foreach (elt->devices, (GFunc) g_object_unref, NULL);
g_slist_free (elt->devices);
g_slice_free (NMClientActiveConnection, elt);
}
gboolean
nm_client_wireless_get_enabled (NMClient *client)
{

View file

@ -45,23 +45,15 @@ gboolean nm_client_manager_is_running (NMClient *client);
GSList *nm_client_get_devices (NMClient *client);
NMDevice *nm_client_get_device_by_path (NMClient *client,
const char *object_path);
typedef struct NMClientActiveConnection {
char *service_name;
char *connection_path;
char *specific_object;
GSList *devices; /* list of NMDevice objects */
} NMClientActiveConnection;
GSList * nm_client_get_active_connections (NMClient *client);
void nm_client_free_active_connection_element (NMClientActiveConnection *elt);
void nm_client_free_active_connections_element (GHashTable *item);
typedef void (*NMClientActivateDeviceFn) (gpointer user_data, GError *error);
void nm_client_activate_device (NMClient *client,
NMDevice *device,
void nm_client_activate_connection (NMClient *client,
const char *service_name,
const char *connection_path,
NMDevice *device,
const char *specific_object,
NMClientActivateDeviceFn callback,
gpointer user_data);

View file

@ -15,10 +15,10 @@
#include "nm-marshal.h"
static gboolean impl_manager_get_devices (NMManager *manager, GPtrArray **devices, GError **err);
static void impl_manager_activate_device (NMManager *manager,
char *device_path,
static void impl_manager_activate_connection (NMManager *manager,
char *service_name,
char *connection_path,
char *device_path,
char *specific_object_path,
DBusGMethodInvocation *context);
@ -1368,10 +1368,10 @@ connection_added_default_handler (NMManager *manager,
}
static void
impl_manager_activate_device (NMManager *manager,
char *device_path,
impl_manager_activate_connection (NMManager *manager,
char *service_name,
char *connection_path,
char *device_path,
char *specific_object_path,
DBusGMethodInvocation *context)
{
@ -1456,22 +1456,31 @@ impl_manager_activate_device (NMManager *manager,
g_free (real_sop);
}
static GValueArray *
static void
destroy_gvalue (gpointer data)
{
GValue *value = (GValue *) data;
g_value_unset (value);
g_slice_free (GValue, value);
}
static GHashTable *
add_one_connection_element (NMManager *manager,
NMDevice *device)
{
static GType type = 0, ao_type = 0;
GValue entry = {0, };
GPtrArray *dev_array = NULL;
GHashTable *properties;
NMActRequest *req;
const char *service_name = NULL;
NMConnection *connection;
const char *specific_object;
GPtrArray *dev_array = NULL;
GValue *value;
req = nm_device_get_act_request (device);
g_assert (req);
connection = nm_act_request_get_connection (req);
g_assert (connection);
switch (nm_connection_get_scope (connection)) {
case NM_CONNECTION_SCOPE_USER:
@ -1487,32 +1496,56 @@ add_one_connection_element (NMManager *manager,
specific_object = nm_act_request_get_specific_object (req);
/* dbus signature "sooao" */
if (G_UNLIKELY (ao_type) == 0)
ao_type = dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH);
if (G_UNLIKELY (type) == 0) {
type = dbus_g_type_get_struct ("GValueArray",
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
DBUS_TYPE_G_OBJECT_PATH,
ao_type,
G_TYPE_INVALID);
properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue);
/* Service name */
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_STRING);
g_value_set_string (value, service_name);
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_SERVICE_NAME), value);
/* Connection path */
value = g_slice_new0 (GValue);
g_value_init (value, DBUS_TYPE_G_OBJECT_PATH);
g_value_set_boxed (value, nm_connection_get_path (connection));
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_CONNECTION), value);
/* Specific object */
if (specific_object) {
value = g_slice_new0 (GValue);
g_value_init (value, DBUS_TYPE_G_OBJECT_PATH);
g_value_set_boxed (value, specific_object);
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_SPECIFIC_OBJECT), value);
}
dev_array = g_ptr_array_sized_new (1);
if (!dev_array)
return NULL;
g_ptr_array_add (dev_array, g_strdup (nm_device_get_udi (device)));
if (FALSE /* SHARED */ ) {
/* Shared connection service name */
value = g_slice_new0 (GValue);
g_value_init (value, G_TYPE_STRING);
g_value_set_string (value, service_name);
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_SHARED_TO_SERVICE_NAME), value);
g_value_init (&entry, type);
g_value_take_boxed (&entry, dbus_g_type_specialized_construct (type));
dbus_g_type_struct_set (&entry,
0, service_name,
1, nm_connection_get_path (connection),
2, specific_object ? specific_object : "/",
3, dev_array,
G_MAXUINT);
return g_value_get_boxed (&entry);
/* Shared connection connection path */
value = g_slice_new0 (GValue);
g_value_init (value, DBUS_TYPE_G_OBJECT_PATH);
g_value_set_boxed (value, nm_connection_get_path (connection));
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_SHARED_TO_CONNECTION), value);
}
/* Device list */
dev_array = g_ptr_array_sized_new (1);
if (!dev_array) {
g_hash_table_destroy (properties);
return NULL;
}
g_ptr_array_add (dev_array, g_object_ref (device));
value = g_slice_new0 (GValue);
g_value_init (value, DBUS_TYPE_G_OBJECT_ARRAY);
g_value_take_boxed (value, dev_array);
g_hash_table_insert (properties, g_strdup (NM_AC_KEY_DEVICES), value);
return properties;
}
static gboolean
@ -1527,13 +1560,13 @@ impl_manager_get_active_connections (NMManager *manager,
priv = NM_MANAGER_GET_PRIVATE (manager);
// GPtrArray of GValueArrays of (gchar * and GPtrArray of gchar *)
/* GPtrArray of GHashTables */
*connections = g_ptr_array_sized_new (1);
// FIXME: this assumes one active device per connection
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
NMDevice *dev = NM_DEVICE (iter->data);
GValueArray *item;
GHashTable *item;
if ( (nm_device_get_state (dev) != NM_DEVICE_STATE_ACTIVATED)
&& !nm_device_is_activating (dev))