Signal wifi device scanning end and start and send out a signal to check before
starting to scan to enable other objects to disable the scan if necessary.

Signed-off-by: Sjoerd Simons <[EMAIL PROTECTED]>
---
 marshallers/nm-marshal.list |    1 +
 src/nm-device-wifi.c        |   91 ++++++++++++++++++++++++++++++++++++++++++-
 src/nm-device-wifi.h        |    3 +
 3 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/marshallers/nm-marshal.list b/marshallers/nm-marshal.list
index 577fbe4..12a203c 100644
--- a/marshallers/nm-marshal.list
+++ b/marshallers/nm-marshal.list
@@ -17,3 +17,4 @@ VOID:STRING,INT
 VOID:STRING,UINT
 VOID:OBJECT,OBJECT,ENUM
 VOID:POINTER,STRING
+BOOLEAN:VOID
diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c
index b8313a7..8b74250 100644
--- a/src/nm-device-wifi.c
+++ b/src/nm-device-wifi.c
@@ -37,6 +37,7 @@
 #include "nm-device-interface.h"
 #include "nm-device-private.h"
 #include "nm-utils.h"
+#include "nm-marshal.h"
 #include "NetworkManagerUtils.h"
 #include "NetworkManagerPolicy.h"
 #include "nm-activation-request.h"
@@ -91,6 +92,10 @@ enum {
        HIDDEN_AP_FOUND,
        PROPERTIES_CHANGED,
 
+       SCANNING_STARTED,
+       SCANNING_STOPPED,
+       SCANNING_ALLOWED,
+
        LAST_SIGNAL
 };
 
@@ -141,8 +146,9 @@ struct _NMDeviceWifiPrivate
        guint32                 rate;
        gboolean                enabled; /* rfkilled or not */
        guint                   state_to_disconnected_id;
-       
+
        gboolean                        scanning;
+       gboolean                        scan_requested;
        glong                   scheduled_scan_time;
        guint8                  scan_interval; /* seconds */
        guint               pending_scan_id;
@@ -209,6 +215,10 @@ static void supplicant_mgr_state_cb (NMSupplicantInterface 
* iface,
 
 static guint32 nm_device_wifi_get_bitrate (NMDeviceWifi *self);
 
+static gboolean scan_allowed_accumulator (GSignalInvocationHint *ihint,
+                                      GValue *return_accu,
+                                      const GValue *handler_return,
+                                      gpointer data);
 
 static GQuark
 nm_wifi_error_quark (void)
@@ -407,6 +417,7 @@ nm_device_wifi_init (NMDeviceWifi * self)
        priv->dispose_has_run = FALSE;
        priv->supplicant.iface_error_id = 0;
        priv->scanning = FALSE;
+       priv->scan_requested = FALSE;
        priv->ap_list = NULL;
        priv->we_version = 0;
 
@@ -1591,15 +1602,47 @@ can_scan (NMDeviceWifi *self)
 }
 
 static gboolean
+scan_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;
+}
+
+static gboolean
+scan_allowed (NMDeviceWifi *self) {
+       GValue instance = { 0, };
+       GValue retval = { 0, };
+
+       g_value_init (&instance, G_TYPE_OBJECT);
+       g_value_set_object (&instance, self);
+
+       g_value_init (&retval, G_TYPE_BOOLEAN);
+       g_value_set_boolean (&retval, TRUE);
+
+       g_signal_emitv (&instance, signals[SCANNING_ALLOWED], 0, &retval);
+       if (!g_value_get_boolean (&retval))
+               return FALSE;
+
+  return TRUE;
+}
+
+static gboolean
 request_wireless_scan (gpointer user_data)
 {
        NMDeviceWifi *self = NM_DEVICE_WIFI (user_data);
        NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
        gboolean backoff = FALSE;
 
-       if (can_scan (self)) {
+       if (can_scan (self) && scan_allowed(self)) {
                if (nm_supplicant_interface_request_scan 
(priv->supplicant.iface)) {
                        /* success */
+                       priv->scan_requested = TRUE;
+                       g_signal_emit (G_OBJECT(self), 
signals[SCANNING_STARTED], 0);
                        backoff = TRUE;
                }
        }
@@ -1675,6 +1718,13 @@ supplicant_iface_scan_result_cb (NMSupplicantInterface * 
iface,
                                                                 gboolean 
result,
                                                                 NMDeviceWifi * 
self)
 {
+       NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
+
+       if (priv->scan_requested) {
+               priv->scan_requested = FALSE;
+               g_signal_emit (G_OBJECT(self), signals[SCANNING_STOPPED], 0);
+       }
+
        if (can_scan (self))
                schedule_scan (self, TRUE);
 }
@@ -3264,6 +3314,33 @@ nm_device_wifi_class_init (NMDeviceWifiClass *klass)
                nm_properties_changed_signal_new (object_class,
                                                                    
G_STRUCT_OFFSET (NMDeviceWifiClass, properties_changed));
 
+       signals[SCANNING_STARTED] =
+               g_signal_new ("scanning-started",
+                                         G_OBJECT_CLASS_TYPE (object_class),
+                                         G_SIGNAL_RUN_FIRST,
+                                         0,
+                                         NULL, NULL,
+                                         g_cclosure_marshal_VOID__VOID,
+                                         G_TYPE_NONE, 0);
+
+       signals[SCANNING_STOPPED] =
+               g_signal_new ("scanning-stopped",
+                                         G_OBJECT_CLASS_TYPE (object_class),
+                                         G_SIGNAL_RUN_FIRST,
+                                         0,
+                                         NULL, NULL,
+                                         g_cclosure_marshal_VOID__VOID,
+                                         G_TYPE_NONE, 0);
+
+       signals[SCANNING_ALLOWED] =
+               g_signal_new ("scanning-allowed",
+                                         G_OBJECT_CLASS_TYPE (object_class),
+                                         G_SIGNAL_RUN_LAST,
+                                         0,
+                                         scan_allowed_accumulator, NULL,
+                                         nm_marshal_BOOLEAN__VOID,
+                                         G_TYPE_BOOLEAN, 0);
+
        dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
                                                                         
&dbus_glib_nm_device_wifi_object_info);
 
@@ -3440,3 +3517,13 @@ nm_device_wifi_set_enabled (NMDeviceWifi *self, gboolean 
enabled)
        }
 }
 
+gboolean
+nm_device_wifi_is_scanning (NMDeviceWifi *self) {
+       NMDeviceWifiPrivate *priv;
+
+       g_return_val_if_fail (NM_IS_DEVICE_WIFI (self), FALSE);
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
+
+       return priv->scan_requested;
+}
diff --git a/src/nm-device-wifi.h b/src/nm-device-wifi.h
index 3ee5641..521adef 100644
--- a/src/nm-device-wifi.h
+++ b/src/nm-device-wifi.h
@@ -102,6 +102,9 @@ NMAccessPoint * nm_device_wifi_get_activation_ap 
(NMDeviceWifi *self);
 
 void nm_device_wifi_set_enabled (NMDeviceWifi *self, gboolean enabled);
 
+/* Wireless device _currently_ doing a scan */
+gboolean nm_device_wifi_is_scanning (NMDeviceWifi *self);
+
 G_END_DECLS
 
 #endif /* NM_DEVICE_WIFI_H */
-- 
1.5.6.3

_______________________________________________
NetworkManager-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to