diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/devices/nm-device-olpc-mesh.c | 36 | ||||
-rw-r--r-- | src/nm-device-manager.c | 61 | ||||
-rw-r--r-- | src/nm-device-manager.h | 50 | ||||
-rw-r--r-- | src/nm-manager.c | 73 | ||||
-rw-r--r-- | src/nm-manager.h | 5 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 20 | ||||
-rw-r--r-- | src/settings/nm-settings.h | 4 |
8 files changed, 171 insertions, 80 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index d67583367c..20fc6441a4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -220,6 +220,8 @@ nm_sources = \ nm-atm-manager.h \ nm-connection-provider.c \ nm-connection-provider.h \ + nm-device-manager.c \ + nm-device-manager.h \ nm-dbus-manager.c \ nm-dbus-manager.h \ nm-dhcp4-config.c \ diff --git a/src/devices/nm-device-olpc-mesh.c b/src/devices/nm-device-olpc-mesh.c index 4a5c5f949a..209568e367 100644 --- a/src/devices/nm-device-olpc-mesh.c +++ b/src/devices/nm-device-olpc-mesh.c @@ -50,7 +50,7 @@ #include "nm-activation-request.h" #include "nm-setting-connection.h" #include "nm-setting-olpc-mesh.h" -#include "nm-manager.h" +#include "nm-device-manager.h" #include "nm-enum-types.h" #include "nm-dbus-manager.h" #include "wifi-utils.h" @@ -357,7 +357,7 @@ dispose (GObject *object) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (object); NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); - NMManager *manager; + NMDeviceManager *device_manager; if (priv->dispose_has_run) { G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->dispose (object); @@ -370,12 +370,11 @@ dispose (GObject *object) companion_cleanup (self); - manager = nm_manager_get (); + device_manager = nm_device_manager_get (); if (priv->device_added_id) - g_signal_handler_disconnect (manager, priv->device_added_id); + g_signal_handler_disconnect (device_manager, priv->device_added_id); if (priv->device_removed_id) - g_signal_handler_disconnect (manager, priv->device_removed_id); - g_object_unref (manager); + g_signal_handler_disconnect (device_manager, priv->device_removed_id); G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->dispose (object); } @@ -531,7 +530,6 @@ is_companion (NMDeviceOlpcMesh *self, NMDevice *other) NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); const guint8 *my_addr, *their_addr; guint their_addr_len; - NMManager *manager; if (!NM_IS_DEVICE_WIFI (other)) return FALSE; @@ -545,12 +543,10 @@ is_companion (NMDeviceOlpcMesh *self, NMDevice *other) priv->companion = other; /* When we've found the companion, stop listening for other devices */ - manager = nm_manager_get (); if (priv->device_added_id) { - g_signal_handler_disconnect (manager, priv->device_added_id); + g_signal_handler_disconnect (nm_device_manager_get (), priv->device_added_id); priv->device_added_id = 0; } - g_object_unref (manager); nm_device_state_changed (NM_DEVICE (self), NM_DEVICE_STATE_DISCONNECTED, @@ -578,7 +574,7 @@ is_companion (NMDeviceOlpcMesh *self, NMDevice *other) } static void -device_added_cb (NMManager *manager, NMDevice *other, gpointer user_data) +device_added_cb (NMDeviceManager *device_manager, NMDevice *other, gpointer user_data) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (user_data); @@ -586,7 +582,7 @@ device_added_cb (NMManager *manager, NMDevice *other, gpointer user_data) } static void -device_removed_cb (NMManager *manager, NMDevice *other, gpointer user_data) +device_removed_cb (NMDeviceManager *device_manager, NMDevice *other, gpointer user_data) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (user_data); @@ -599,8 +595,8 @@ check_companion_cb (gpointer user_data) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (user_data); NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); - NMManager *manager; - GSList *list; + NMDeviceManager *device_manager; + const GSList *list; if (priv->companion != NULL) { nm_device_state_changed (NM_DEVICE (user_data), @@ -612,23 +608,21 @@ check_companion_cb (gpointer user_data) if (priv->device_added_id != 0) return FALSE; - manager = nm_manager_get (); + device_manager = nm_device_manager_get (); - priv->device_added_id = g_signal_connect (manager, "device-added", + priv->device_added_id = g_signal_connect (device_manager, NM_DM_SIGNAL_DEVICE_ADDED, G_CALLBACK (device_added_cb), self); if (!priv->device_removed_id) { - priv->device_removed_id = g_signal_connect (manager, "device-removed", + priv->device_removed_id = g_signal_connect (device_manager, NM_DM_SIGNAL_DEVICE_REMOVED, G_CALLBACK (device_removed_cb), self); } - /* Try to find the companion if it's already known to the NMManager */ - for (list = nm_manager_get_devices (manager); list ; list = g_slist_next (list)) { + /* Try to find the companion if it's already known to the NMDeviceManager */ + for (list = nm_device_manager_get_devices (device_manager); list ; list = g_slist_next (list)) { if (is_companion (self, NM_DEVICE (list->data))) break; } - g_object_unref (manager); - return FALSE; } diff --git a/src/nm-device-manager.c b/src/nm-device-manager.c new file mode 100644 index 0000000000..4e4509c16e --- /dev/null +++ b/src/nm-device-manager.c @@ -0,0 +1,61 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* + * 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: + * + * Copyright 2013 Red Hat, Inc. + */ + +#include "nm-device-manager.h" + +G_DEFINE_INTERFACE (NMDeviceManager, nm_device_manager, G_TYPE_OBJECT) + +/** + * nm_device_manager_get_devices: + * @self: the #NMDeviceManager + * + * Returns: a #GSList of #NMDevice objects representing all known + * devices. Returned list is owned by the device manager and must + * not be freed. + */ +const GSList * +nm_device_manager_get_devices (NMDeviceManager *self) +{ + g_return_val_if_fail (NM_IS_DEVICE_MANAGER (self), NULL); + + if (NM_DEVICE_MANAGER_GET_INTERFACE (self)->get_devices) + return NM_DEVICE_MANAGER_GET_INTERFACE (self)->get_devices (self); + return NULL; +} + +/*****************************************************************************/ + +static void +nm_device_manager_default_init (NMDeviceManagerInterface *iface) +{ + GType iface_type = G_TYPE_FROM_INTERFACE (iface); + + /* Signals */ + g_signal_new (NM_DM_SIGNAL_DEVICE_ADDED, + iface_type, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMDeviceManagerInterface, device_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, NM_TYPE_DEVICE); + + g_signal_new (NM_DM_SIGNAL_DEVICE_REMOVED, + iface_type, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMDeviceManagerInterface, device_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, NM_TYPE_DEVICE); +} diff --git a/src/nm-device-manager.h b/src/nm-device-manager.h new file mode 100644 index 0000000000..426bcc602a --- /dev/null +++ b/src/nm-device-manager.h @@ -0,0 +1,50 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* + * 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: + * + * Copyright 2013 Red Hat, Inc. + */ + +#ifndef NM_DEVICE_MANAGER_H +#define NM_DEVICE_MANAGER_H + +#include <glib-object.h> +#include <nm-device.h> + +#define NM_TYPE_DEVICE_MANAGER (nm_device_manager_get_type ()) +#define NM_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_MANAGER, NMDeviceManager)) +#define NM_IS_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_MANAGER)) +#define NM_DEVICE_MANAGER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NM_TYPE_DEVICE_MANAGER, NMDeviceManagerInterface)) + +typedef struct _NMDeviceManager NMDeviceManager; +typedef struct _NMDeviceManagerInterface NMDeviceManagerInterface; + +#define NM_DM_SIGNAL_DEVICE_ADDED "dm-device-added" +#define NM_DM_SIGNAL_DEVICE_REMOVED "dm-device-removed" + +struct _NMDeviceManagerInterface { + GTypeInterface g_iface; + + /* Methods */ + const GSList * (*get_devices) (NMDeviceManager *self); + + /* Signals */ + void (*device_added) (NMDeviceManager *self, NMDevice *device); + void (*device_removed) (NMDeviceManager *self, NMDevice *device); +}; + +GType nm_device_manager_get_type (void); + +NMDeviceManager *nm_device_manager_get (void); + +const GSList *nm_device_manager_get_devices (NMDeviceManager *self); + +#endif /* NM_DEVICE_MANAGER_H */ diff --git a/src/nm-manager.c b/src/nm-manager.c index 6b59cf085c..1c63dc6627 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -40,8 +40,9 @@ #include "nm-dbus-manager.h" #include "nm-vpn-manager.h" #include "nm-modem-manager.h" -#include "nm-device-bt.h" #include "nm-device.h" +#include "nm-device-manager.h" +#include "nm-device-bt.h" #include "nm-device-ethernet.h" #include "nm-device-wifi.h" #include "nm-device-olpc-mesh.h" @@ -150,6 +151,7 @@ static void bluez_manager_bdaddr_removed_cb (NMBluezManager *bluez_mgr, static void add_device (NMManager *self, NMDevice *device); static void hostname_provider_init (NMHostnameProviderInterface *provider_iface); +static void device_manager_init (NMDeviceManagerInterface *manager_iface); static NMActiveConnection *internal_activate_device (NMManager *manager, NMDevice *device, @@ -260,12 +262,12 @@ typedef struct { #define NM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MANAGER, NMManagerPrivate)) G_DEFINE_TYPE_EXTENDED (NMManager, nm_manager, G_TYPE_OBJECT, 0, - G_IMPLEMENT_INTERFACE (NM_TYPE_HOSTNAME_PROVIDER, - hostname_provider_init)) + G_IMPLEMENT_INTERFACE (NM_TYPE_HOSTNAME_PROVIDER, + hostname_provider_init) + G_IMPLEMENT_INTERFACE (NM_TYPE_DEVICE_MANAGER, + device_manager_init)) enum { - DEVICE_ADDED, - DEVICE_REMOVED, STATE_CHANGED, CHECK_PERMISSIONS, USER_PERMISSIONS_CHANGED, @@ -438,24 +440,6 @@ nm_manager_get_device_by_path (NMManager *manager, const char *path) } NMDevice * -nm_manager_get_device_by_master (NMManager *manager, const char *master, const char *driver) -{ - GSList *iter; - - g_return_val_if_fail (master != NULL, NULL); - - for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) { - NMDevice *device = NM_DEVICE (iter->data); - - if (!strcmp (nm_device_get_iface (device), master) && - (!driver || !strcmp (nm_device_get_driver (device), driver))) - return device; - } - - return NULL; -} - -NMDevice * nm_manager_get_device_by_ifindex (NMManager *manager, int ifindex) { GSList *iter; @@ -625,8 +609,6 @@ remove_one_device (NMManager *manager, NMDevice *device, gboolean quitting) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); - if (nm_device_get_managed (device)) { /* When quitting, we want to leave up interfaces & connections * that can be taken over again (ie, "assumed") when NM restarts @@ -644,8 +626,7 @@ remove_one_device (NMManager *manager, g_signal_handlers_disconnect_by_func (device, manager_device_state_changed, manager); - nm_settings_device_removed (priv->settings, device); - g_signal_emit (manager, signals[DEVICE_REMOVED], 0, device); + g_signal_emit_by_name (manager, NM_DM_SIGNAL_DEVICE_REMOVED, 0, device); g_object_unref (device); return g_slist_remove (list, device); @@ -726,6 +707,18 @@ hostname_provider_init (NMHostnameProviderInterface *provider_iface) provider_iface->get_hostname = hostname_provider_get_hostname; } +static const GSList * +device_manager_get_devices (NMDeviceManager *device_manager) +{ + return NM_MANAGER_GET_PRIVATE (device_manager)->devices; +} + +static void +device_manager_init (NMDeviceManagerInterface *manager_iface) +{ + manager_iface->get_devices = device_manager_get_devices; +} + NMState nm_manager_get_state (NMManager *manager) { @@ -1999,8 +1992,7 @@ add_device (NMManager *self, NMDevice *device) NM_DEVICE_STATE_REASON_NOW_MANAGED); } - nm_settings_device_added (priv->settings, device); - g_signal_emit (self, signals[DEVICE_ADDED], 0, device); + g_signal_emit_by_name (self, NM_DM_SIGNAL_DEVICE_ADDED, 0, device); /* New devices might be master interfaces for virtual interfaces; so we may * need to create new virtual interfaces now. @@ -4047,6 +4039,13 @@ nm_manager_get (void) return g_object_ref (singleton); } +NMDeviceManager * +nm_device_manager_get (void) +{ + g_assert (singleton); + return NM_DEVICE_MANAGER (singleton); +} + NMManager * nm_manager_new (NMSettings *settings, const char *state_file, @@ -4725,22 +4724,6 @@ nm_manager_class_init (NMManagerClass *manager_class) G_PARAM_READABLE)); /* signals */ - signals[DEVICE_ADDED] = - g_signal_new ("device-added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMManagerClass, device_added), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - - signals[DEVICE_REMOVED] = - g_signal_new ("device-removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMManagerClass, device_removed), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - signals[STATE_CHANGED] = g_signal_new ("state-changed", G_OBJECT_CLASS_TYPE (object_class), diff --git a/src/nm-manager.h b/src/nm-manager.h index 5aeeaab62a..0a4e26b6cf 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -77,8 +77,6 @@ typedef struct { GObjectClass parent; /* Signals */ - void (*device_added) (NMManager *manager, NMDevice *device); - void (*device_removed) (NMManager *manager, NMDevice *device); void (*state_changed) (NMManager *manager, guint state); } NMManagerClass; @@ -103,9 +101,6 @@ const GSList *nm_manager_get_active_connections (NMManager *manager); GSList *nm_manager_get_devices (NMManager *manager); -NMDevice *nm_manager_get_device_by_master (NMManager *manager, - const char *master, - const char *driver); NMDevice *nm_manager_get_device_by_ifindex (NMManager *manager, int ifindex); diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 9ea9f644fc..48d12427df 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -68,6 +68,7 @@ #include "nm-settings-utils.h" #include "nm-connection-provider.h" #include "nm-config.h" +#include "nm-device-manager.h" /* LINKER CRACKROCK */ #define EXPORT(sym) void * __export_##sym = &sym; @@ -123,7 +124,6 @@ G_DEFINE_TYPE_EXTENDED (NMSettings, nm_settings, G_TYPE_OBJECT, 0, typedef struct { NMDBusManager *dbus_mgr; - NMAgentManager *agent_mgr; NMConfig *config; @@ -1481,8 +1481,8 @@ default_wired_try_update (NMDefaultWiredConnection *wired, g_object_unref (wired); } -void -nm_settings_device_added (NMSettings *self, NMDevice *device) +static void +device_added (NMDeviceManager *device_mgr, NMDevice *device, NMSettings *self) { NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self); NMDefaultWiredConnection *wired; @@ -1525,8 +1525,8 @@ nm_settings_device_added (NMSettings *self, NMDevice *device) g_object_set_data (G_OBJECT (device), DEFAULT_WIRED_TAG, wired); } -void -nm_settings_device_removed (NMSettings *self, NMDevice *device) +static void +device_removed (NMDeviceManager *device_mgr, NMDevice *device, NMSettings *self) { NMDefaultWiredConnection *connection; @@ -1650,6 +1650,11 @@ nm_settings_new (GError **error) priv->config = nm_config_get (); priv->dbus_mgr = nm_dbus_manager_get (); + g_signal_connect (nm_device_manager_get (), NM_DM_SIGNAL_DEVICE_ADDED, + G_CALLBACK (device_added), self); + g_signal_connect (nm_device_manager_get (), NM_DM_SIGNAL_DEVICE_REMOVED, + G_CALLBACK (device_removed), self); + /* Load the plugins; fail if a plugin is not found. */ if (!load_plugins (self, nm_config_get_plugins (priv->config), error)) { g_object_unref (self); @@ -1701,6 +1706,11 @@ dispose (GObject *object) priv->dbus_mgr = NULL; + g_signal_handlers_disconnect_by_func (nm_device_manager_get (), + G_CALLBACK (device_added), self); + g_signal_handlers_disconnect_by_func (nm_device_manager_get (), + G_CALLBACK (device_removed), self); + g_object_unref (priv->session_monitor); g_object_unref (priv->agent_mgr); diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h index ba8153ec8a..a7f6dbe582 100644 --- a/src/settings/nm-settings.h +++ b/src/settings/nm-settings.h @@ -118,8 +118,4 @@ const GSList *nm_settings_get_unmanaged_specs (NMSettings *self); char *nm_settings_get_hostname (NMSettings *self); -void nm_settings_device_added (NMSettings *self, NMDevice *device); - -void nm_settings_device_removed (NMSettings *self, NMDevice *device); - #endif /* __NM_SETTINGS_H__ */ |