From 8f0652a9f0f3b2b2525f48fbb46ebc2525924de7 Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Wed, 15 Jul 2009 17:22:10 -0400 Subject: core: allow devices to suppress other device's autoconnect This allows a device (or a companion) to signal that it is not a good time for a specific device to autoconnect to a network. The OLPC mesh device will use this to prevent automatic connection to WLAN networks while the mesh device is active. --- src/NetworkManagerPolicy.c | 2 +- src/nm-device.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/nm-device.h | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index b1b485c4d4..2cb39cb9ea 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -723,7 +723,7 @@ schedule_activate_check (NMPolicy *policy, NMDevice *device) if (state < NM_DEVICE_STATE_DISCONNECTED) return; - if (!nm_device_can_activate (device)) + if (!nm_device_can_activate (device) || !nm_device_autoconnect_allowed (device)) return; for (iter = policy->pending_activation_checks; iter; iter = g_slist_next (iter)) { diff --git a/src/nm-device.c b/src/nm-device.c index db71eaea1d..6f7423b385 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -50,6 +50,7 @@ #include "nm-setting-connection.h" #include "nm-dnsmasq-manager.h" #include "nm-dhcp4-config.h" +#include "nm-marshal.h" #define NM_ACT_REQUEST_IP4_CONFIG "nm-act-request-ip4-config" @@ -58,6 +59,13 @@ static void device_interface_init (NMDeviceInterface *device_interface_class); G_DEFINE_TYPE_EXTENDED (NMDevice, nm_device, G_TYPE_OBJECT, G_TYPE_FLAG_ABSTRACT, G_IMPLEMENT_INTERFACE (NM_TYPE_DEVICE_INTERFACE, device_interface_init)) +enum { + AUTOCONNECT_ALLOWED, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + #define NM_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE, NMDevicePrivate)) typedef struct { @@ -366,6 +374,34 @@ nm_device_can_activate (NMDevice *self) return TRUE; } +static gboolean +autoconnect_allowed_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, gpointer data) +{ + if (!g_value_get_boolean (handler_return)) + g_value_set_boolean (return_accu, FALSE); + return TRUE; +} + +gboolean +nm_device_autoconnect_allowed (NMDevice *self) +{ + GValue instance = { 0, }; + GValue retval = { 0, }; + + g_value_init (&instance, G_TYPE_OBJECT); + g_value_take_object (&instance, self); + + g_value_init (&retval, G_TYPE_BOOLEAN); + g_value_set_boolean (&retval, TRUE); + + /* Use g_signal_emitv() rather than g_signal_emit() to avoid the return + * value being changed if no handlers are connected */ + g_signal_emitv (&instance, signals[AUTOCONNECT_ALLOWED], 0, &retval); + return g_value_get_boolean (&retval); +} + NMConnection * nm_device_get_best_auto_connection (NMDevice *dev, GSList *connections, @@ -2399,6 +2435,15 @@ nm_device_class_init (NMDeviceClass *klass) g_object_class_override_property (object_class, NM_DEVICE_INTERFACE_PROP_TYPE_DESC, NM_DEVICE_INTERFACE_TYPE_DESC); + + signals[AUTOCONNECT_ALLOWED] = + g_signal_new ("autoconnect-allowed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + 0, + autoconnect_allowed_accumulator, NULL, + _nm_marshal_BOOLEAN__VOID, + G_TYPE_BOOLEAN, 0); } static gboolean diff --git a/src/nm-device.h b/src/nm-device.h index 45a3f9efcb..31c58fb547 100644 --- a/src/nm-device.h +++ b/src/nm-device.h @@ -154,6 +154,7 @@ void nm_device_activate_schedule_stage4_ip_config_timeout (NMDevice *device); gboolean nm_device_deactivate_quickly (NMDevice *dev); gboolean nm_device_is_activating (NMDevice *dev); gboolean nm_device_can_interrupt_activation (NMDevice *self); +gboolean nm_device_autoconnect_allowed (NMDevice *self); NMDeviceState nm_device_get_state (NMDevice *device); -- cgit v1.2.3