diff options
Diffstat (limited to 'libnm-glib/nm-device-wifi.c')
| -rw-r--r-- | libnm-glib/nm-device-wifi.c | 90 |
1 files changed, 88 insertions, 2 deletions
diff --git a/libnm-glib/nm-device-wifi.c b/libnm-glib/nm-device-wifi.c index 0058fd10..e61554df 100644 --- a/libnm-glib/nm-device-wifi.c +++ b/libnm-glib/nm-device-wifi.c @@ -45,6 +45,12 @@ G_DEFINE_TYPE (NMDeviceWifi, nm_device_wifi, NM_TYPE_DEVICE) void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enabled); typedef struct { + NMDeviceWifi *device; + NMDeviceWifiRequestScanFn callback; + gpointer user_data; +} RequestScanInfo; + +typedef struct { DBusGProxy *proxy; char *hw_address; @@ -55,7 +61,8 @@ typedef struct { NMDeviceWifiCapabilities wireless_caps; GPtrArray *aps; - gboolean wireless_enabled; + DBusGProxyCall *scan_call; + RequestScanInfo *scan_info; } NMDeviceWifiPrivate; enum { @@ -319,6 +326,69 @@ nm_device_wifi_get_access_point_by_path (NMDeviceWifi *device, } static void +request_scan_cb (DBusGProxy *proxy, + DBusGProxyCall *call, + gpointer user_data) +{ + RequestScanInfo *info = user_data; + NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (info->device); + GError *error = NULL; + + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + + if (info->callback) + info->callback (info->device, error, info->user_data); + + g_clear_error (&error); + g_slice_free (RequestScanInfo, info); + + priv->scan_call = NULL; + priv->scan_info = NULL; +} + +/** + * nm_device_wifi_request_scan_simple: + * @device: a #NMDeviceWifi + * @callback: (scope async) (allow-none): the function to call when the call is done + * @user_data: (closure): user data to pass to the callback function + * + * Request NM to scan for access points on the #NMDeviceWifi. This function only + * instructs NM to perform scanning. Use nm_device_wifi_get_access_points() + * to get available access points. + * + **/ +void +nm_device_wifi_request_scan_simple (NMDeviceWifi *device, + NMDeviceWifiRequestScanFn callback, + gpointer user_data) +{ + RequestScanInfo *info; + GHashTable *options; + NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); + + g_return_if_fail (NM_IS_DEVICE_WIFI (device)); + + /* If a scan is in progress, just return */ + if (priv->scan_call) + return; + + options = g_hash_table_new (g_str_hash, g_str_equal); + + info = g_slice_new0 (RequestScanInfo); + info->device = device; + info->callback = callback; + info->user_data = user_data; + + priv->scan_info = info; + priv->scan_call = dbus_g_proxy_begin_call (NM_DEVICE_WIFI_GET_PRIVATE (device)->proxy, "RequestScan", + request_scan_cb, info, NULL, + DBUS_TYPE_G_MAP_OF_VARIANT, options, + G_TYPE_INVALID); + + g_hash_table_unref (options); +} + +static void access_point_added (NMObject *self, NMObject *ap) { g_signal_emit (self, signals[ACCESS_POINT_ADDED], 0, ap); @@ -608,6 +678,22 @@ static void dispose (GObject *object) { NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object); + GError *error = NULL; + + if (priv->scan_call) { + g_set_error_literal (&error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_UNKNOWN, + "Wi-Fi device was destroyed"); + if (priv->scan_info) { + if (priv->scan_info->callback) + priv->scan_info->callback (NULL, error, priv->scan_info->user_data); + g_slice_free (RequestScanInfo, priv->scan_info); + priv->scan_info = NULL; + } + g_clear_error (&error); + + dbus_g_proxy_cancel_call (priv->proxy, priv->scan_call); + priv->scan_call = NULL; + } clean_up_aps (NM_DEVICE_WIFI (object), FALSE); g_clear_object (&priv->proxy); @@ -679,7 +765,7 @@ nm_device_wifi_class_init (NMDeviceWifiClass *wifi_class) g_param_spec_uint (NM_DEVICE_WIFI_MODE, "Mode", "Mode", - NM_802_11_MODE_UNKNOWN, NM_802_11_MODE_INFRA, NM_802_11_MODE_INFRA, + NM_802_11_MODE_UNKNOWN, NM_802_11_MODE_AP, NM_802_11_MODE_INFRA, G_PARAM_READABLE)); /** |