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 deletions(-)

diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c
index 6bba92f..e2d4c95 100644
--- a/src/NetworkManagerPolicy.c
+++ b/src/NetworkManagerPolicy.c
@@ -726,7 +726,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 046e795..7adbfdb 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"
 
@@ -60,6 +61,13 @@ G_DEFINE_TYPE_EXTENDED (NMDevice, nm_device, G_TYPE_OBJECT,
                                                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))
 
 struct _NMDevicePrivate
@@ -363,6 +371,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,
@@ -2383,6 +2419,15 @@ nm_device_class_init (NMDeviceClass *klass)
        g_object_class_override_property (object_class,
                                                                          
NM_DEVICE_INTERFACE_PROP_MANAGED,
                                                                          
NM_DEVICE_INTERFACE_MANAGED);
+
+       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 05409b5..9fc53da 100644
--- a/src/nm-device.h
+++ b/src/nm-device.h
@@ -157,6 +157,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);
 
-- 
1.6.4

_______________________________________________
NetworkManager-list mailing list
NetworkManager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to