mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-09-06 17:14:02 +00:00
2007-10-03 Dan Williams <dcbw@redhat.com>
Add a GetActiveConnections() method on the Manager object. * src/nm-manager.c src/nm-manager.h introspection/nm-manager.xml - (connection_get_settings_cb): keep connection type around too - (impl_manager_get_active_connections, add_one_connection_element): implement; returns all active connections and what devices they apply to * libnm-glib/nm-client.c libnm-glib/nm-client.h introspection/nm-manager-client.xml - (nm_client_get_devices): GPtrArray elements are allocated and owned by the caller; free here to avoid memory leak - (nm_client_get_active_connections): implement; return the list of active connections - (nm_client_free_active_connection_element): implement; free an element of the GSList returned by nm_client_get_active_connections() git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2927 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
parent
d7f6aa32f9
commit
f9fd8667d1
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
|||
2007-10-03 Dan Williams <dcbw@redhat.com>
|
||||
|
||||
Add a GetActiveConnections() method on the Manager object.
|
||||
|
||||
* src/nm-manager.c
|
||||
src/nm-manager.h
|
||||
introspection/nm-manager.xml
|
||||
- (connection_get_settings_cb): keep connection type around too
|
||||
- (impl_manager_get_active_connections, add_one_connection_element):
|
||||
implement; returns all active connections and what devices they
|
||||
apply to
|
||||
|
||||
* libnm-glib/nm-client.c
|
||||
libnm-glib/nm-client.h
|
||||
introspection/nm-manager-client.xml
|
||||
- (nm_client_get_devices): GPtrArray elements are allocated and owned
|
||||
by the caller; free here to avoid memory leak
|
||||
- (nm_client_get_active_connections): implement; return the list of
|
||||
active connections
|
||||
- (nm_client_free_active_connection_element): implement; free an element
|
||||
of the GSList returned by nm_client_get_active_connections()
|
||||
|
||||
2007-10-03 Dan Williams <dcbw@redhat.com>
|
||||
|
||||
* src/nm-device-802-11-wireless.c
|
||||
|
|
|
@ -23,6 +23,18 @@
|
|||
<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"/>
|
||||
</method>
|
||||
|
||||
<method name="Sleep">
|
||||
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_sleep"/>
|
||||
<arg name="sleep" type="b" direction="in"/>
|
||||
|
|
|
@ -23,6 +23,18 @@
|
|||
<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"/>
|
||||
</method>
|
||||
|
||||
<method name="Sleep">
|
||||
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_sleep"/>
|
||||
<arg name="sleep" type="b" direction="in"/>
|
||||
|
|
|
@ -359,10 +359,12 @@ nm_client_get_devices (NMClient *client)
|
|||
|
||||
for (i = 0; i < array->len; i++) {
|
||||
NMDevice *device;
|
||||
char *path = g_ptr_array_index (array, i);
|
||||
|
||||
device = get_device (client, (const char *) g_ptr_array_index (array, i), TRUE);
|
||||
device = get_device (client, (const char *) path, TRUE);
|
||||
if (device)
|
||||
list = g_slist_append (list, device);
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
g_ptr_array_free (array, TRUE);
|
||||
|
@ -444,6 +446,105 @@ nm_client_activate_device (NMClient *client,
|
|||
info);
|
||||
}
|
||||
|
||||
|
||||
GSList *
|
||||
nm_client_get_active_connections (NMClient *client)
|
||||
{
|
||||
NMClientPrivate *priv;
|
||||
GSList *connections = NULL;
|
||||
GPtrArray *array = NULL;
|
||||
GError *err;
|
||||
int i, j;
|
||||
static GType type = 0, ao_type = 0;
|
||||
|
||||
g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
|
||||
|
||||
priv = NM_CLIENT_GET_PRIVATE (client);
|
||||
if (!org_freedesktop_NetworkManager_get_active_connections (priv->client_proxy, &array, &err)) {
|
||||
g_warning ("Error in get_active_connections: %s", err->message);
|
||||
g_error_free (err);
|
||||
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;
|
||||
|
||||
ac_elt = g_slice_new0 (NMClientActiveConnection);
|
||||
if (!ac_elt) {
|
||||
g_warning ("Error in get_active_connections: not enough memory.");
|
||||
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);
|
||||
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++) {
|
||||
NMDevice *device;
|
||||
char *path = g_ptr_array_index (devices, j);
|
||||
|
||||
device = get_device (client, (const char *) path, TRUE);
|
||||
ac_elt->devices = g_slist_append (ac_elt->devices, g_object_ref (device));
|
||||
g_free (path);
|
||||
}
|
||||
g_ptr_array_free (devices, TRUE);
|
||||
|
||||
connections = g_slist_append (connections, ac_elt);
|
||||
}
|
||||
|
||||
g_ptr_array_free (array, TRUE);
|
||||
return connections;
|
||||
}
|
||||
|
||||
void
|
||||
nm_client_free_active_connection_element (NMClientActiveConnection *elt)
|
||||
{
|
||||
GSList *iter;
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -43,6 +43,16 @@ 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);
|
||||
|
||||
typedef void (*NMClientActivateDeviceFn) (gpointer user_data, GError *error);
|
||||
|
||||
void nm_client_activate_device (NMClient *client,
|
||||
|
|
108
src/nm-manager.c
108
src/nm-manager.c
|
@ -18,6 +18,10 @@ static void impl_manager_activate_device (NMManager *manager,
|
|||
char *specific_object_path,
|
||||
DBusGMethodInvocation *context);
|
||||
|
||||
static gboolean impl_manager_get_active_connections (NMManager *manager,
|
||||
GPtrArray **connections,
|
||||
GError **err);
|
||||
|
||||
static gboolean impl_manager_sleep (NMManager *manager, gboolean sleep, GError **err);
|
||||
|
||||
/* Legacy 0.6 compatibility interface */
|
||||
|
@ -386,6 +390,10 @@ connection_get_settings_cb (DBusGProxy *proxy,
|
|||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
g_object_set_data (G_OBJECT (connection),
|
||||
NM_MANAGER_CONNECTION_TYPE_TAG,
|
||||
GUINT_TO_POINTER (connection_type));
|
||||
|
||||
g_signal_emit (manager, signals[CONNECTION_ADDED], 0, connection, connection_type);
|
||||
} else {
|
||||
// FIXME: merge settings? or just replace?
|
||||
|
@ -986,6 +994,106 @@ impl_manager_activate_device (NMManager *manager,
|
|||
}
|
||||
}
|
||||
|
||||
static GValueArray *
|
||||
add_one_connection_element (NMManager *manager,
|
||||
NMDevice *device)
|
||||
{
|
||||
GValueArray *elt;
|
||||
static GType type = 0, ao_type = 0;
|
||||
GValue entry = {0, };
|
||||
GPtrArray *dev_array = NULL;
|
||||
NMActRequest *req;
|
||||
const char *service_name;
|
||||
NMConnection *connection;
|
||||
const char *specific_object;
|
||||
gpointer type_ptr;
|
||||
|
||||
req = nm_device_get_act_request (device);
|
||||
g_assert (req);
|
||||
|
||||
connection = nm_act_request_get_connection (req);
|
||||
type_ptr = g_object_get_data (G_OBJECT (connection), NM_MANAGER_CONNECTION_TYPE_TAG);
|
||||
g_return_val_if_fail (type_ptr != NULL, NULL);
|
||||
|
||||
switch ((NMConnectionType) GPOINTER_TO_UINT (type_ptr)) {
|
||||
case NM_CONNECTION_TYPE_USER:
|
||||
service_name = NM_DBUS_SERVICE_USER_SETTINGS;
|
||||
break;
|
||||
case NM_CONNECTION_TYPE_SYSTEM:
|
||||
service_name = NM_DBUS_SERVICE_SYSTEM_SETTINGS;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
dev_array = g_ptr_array_sized_new (1);
|
||||
if (!dev_array)
|
||||
return NULL;
|
||||
g_ptr_array_add (dev_array, g_strdup (nm_device_get_dbus_path (device)));
|
||||
|
||||
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_manager_get_connection_dbus_path (manager, connection),
|
||||
2, specific_object ? specific_object : "/",
|
||||
3, dev_array,
|
||||
G_MAXUINT);
|
||||
return g_value_get_boxed (&entry);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
impl_manager_get_active_connections (NMManager *manager,
|
||||
GPtrArray **connections,
|
||||
GError **err)
|
||||
{
|
||||
NMManagerPrivate *priv;
|
||||
GType type, aoao_type, ao_type;
|
||||
DBusGTypeSpecializedAppendContext ctx;
|
||||
GValue val = {0, };
|
||||
GSList *iter;
|
||||
|
||||
g_return_val_if_fail (NM_IS_MANAGER (manager), FALSE);
|
||||
|
||||
priv = NM_MANAGER_GET_PRIVATE (manager);
|
||||
|
||||
// GPtrArray of GValueArrays of (gchar * and GPtrArray of gchar *)
|
||||
*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;
|
||||
|
||||
if ( (nm_device_get_state (dev) != NM_DEVICE_STATE_ACTIVATED)
|
||||
&& !nm_device_is_activating (dev))
|
||||
continue;
|
||||
|
||||
item = add_one_connection_element (manager, dev);
|
||||
if (!item)
|
||||
continue;
|
||||
|
||||
g_ptr_array_add (*connections, item);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_manager_wireless_enabled (NMManager *manager)
|
||||
{
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#define NM_MANAGER_WIRELESS_ENABLED "wireless-enabled"
|
||||
|
||||
#define NM_MANAGER_CONNECTION_PROXY_TAG "dbus-proxy"
|
||||
#define NM_MANAGER_CONNECTION_TYPE_TAG "service-type"
|
||||
|
||||
typedef enum {
|
||||
NM_CONNECTION_TYPE_UNKNOWN = 0,
|
||||
|
|
Loading…
Reference in a new issue