summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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__ */