summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2013-05-23 14:11:25 -0300
committerDan Winship <danw@gnome.org>2013-08-05 09:53:55 -0400
commitceda4d828445e80e74912a3cc052b457d5bbb8ca (patch)
treee8d71e2893174f8ba66fd0f179f529a91d04826e
parent99ea3783bd276813a86c8f28a5a3d42e3662f1b2 (diff)
downloadNetworkManager-danw/devicemanager.tar.gz
core: add NMDeviceManagerdanw/devicemanager
Add an NMDeviceManager interface, implemented by NMManager, and exposing its device-keeping-track-of functionality for use by other parts of the code. Make NMSettings use this rather than having special methods that NMManager calls when devices change, and make NMDeviceOlpcMesh use this rather than calling methods on the NMManager directly. Also, remove the unused nm_manager_get_device_by_master().
-rw-r--r--src/Makefile.am2
-rw-r--r--src/devices/nm-device-olpc-mesh.c36
-rw-r--r--src/nm-device-manager.c61
-rw-r--r--src/nm-device-manager.h50
-rw-r--r--src/nm-manager.c73
-rw-r--r--src/nm-manager.h5
-rw-r--r--src/settings/nm-settings.c20
-rw-r--r--src/settings/nm-settings.h4
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__ */