summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libnm/nm-device-wifi.c114
1 files changed, 29 insertions, 85 deletions
diff --git a/libnm/nm-device-wifi.c b/libnm/nm-device-wifi.c
index e2c3ba1ed4..a2920e8156 100644
--- a/libnm/nm-device-wifi.c
+++ b/libnm/nm-device-wifi.c
@@ -8,6 +8,7 @@
#include "nm-device-wifi.h"
+#include "nm-glib-aux/nm-dbus-aux.h"
#include "nm-setting-connection.h"
#include "nm-setting-wireless.h"
#include "nm-setting-wireless-security.h"
@@ -27,11 +28,6 @@ void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enable
static void state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data);
typedef struct {
- NMDeviceWifi *device;
- GSimpleAsyncResult *simple;
-} RequestScanInfo;
-
-typedef struct {
NMDBusDeviceWifi *proxy;
char *hw_address;
@@ -42,8 +38,6 @@ typedef struct {
NMDeviceWifiCapabilities wireless_caps;
GPtrArray *aps;
gint64 last_scan;
-
- RequestScanInfo *scan_info;
} NMDeviceWifiPrivate;
enum {
@@ -273,13 +267,6 @@ nm_device_wifi_get_last_scan (NMDeviceWifi *device)
return NM_DEVICE_WIFI_GET_PRIVATE (device)->last_scan;
}
-static GVariant *
-prepare_scan_options (GVariant *options)
-{
- return options
- ?: g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
-}
-
/**
* nm_device_wifi_request_scan:
* @device: a #NMDeviceWifi
@@ -355,66 +342,6 @@ NM_BACKPORT_SYMBOL (libnm_1_0_6, gboolean, nm_device_wifi_request_scan_options,
(NMDeviceWifi *device, GVariant *options, GCancellable *cancellable, GError **error),
(device, options, cancellable, error));
-static void
-request_scan_cb (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- RequestScanInfo *info = user_data;
- NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (info->device);
- GError *error = NULL;
-
- priv->scan_info = NULL;
-
- if (nmdbus_device_wifi_call_request_scan_finish (NMDBUS_DEVICE_WIFI (source),
- result, &error))
- g_simple_async_result_set_op_res_gboolean (info->simple, TRUE);
- else {
- g_dbus_error_strip_remote_error (error);
- g_simple_async_result_take_error (info->simple, error);
- }
-
- g_simple_async_result_complete (info->simple);
- g_object_unref (info->simple);
- g_slice_free (RequestScanInfo, info);
-}
-
-static void
-_device_wifi_request_scan_async (NMDeviceWifi *device,
- GVariant *options,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
- RequestScanInfo *info;
- GSimpleAsyncResult *simple;
-
- g_return_if_fail (NM_IS_DEVICE_WIFI (device));
-
- simple = g_simple_async_result_new (G_OBJECT (device), callback, user_data,
- nm_device_wifi_request_scan_async);
- if (cancellable)
- g_simple_async_result_set_check_cancellable (simple, cancellable);
-
- /* If a scan is in progress, just return */
- if (priv->scan_info) {
- g_simple_async_result_set_op_res_gboolean (simple, TRUE);
- g_simple_async_result_complete_in_idle (simple);
- g_object_unref (simple);
- return;
- }
-
- info = g_slice_new0 (RequestScanInfo);
- info->device = device;
- info->simple = simple;
-
- priv->scan_info = info;
- nmdbus_device_wifi_call_request_scan (NM_DEVICE_WIFI_GET_PRIVATE (device)->proxy,
- prepare_scan_options (g_steal_pointer (&options)),
- cancellable, request_scan_cb, info);
-}
-
/**
* nm_device_wifi_request_scan_async:
* @device: a #NMDeviceWifi
@@ -432,7 +359,7 @@ nm_device_wifi_request_scan_async (NMDeviceWifi *device,
GAsyncReadyCallback callback,
gpointer user_data)
{
- _device_wifi_request_scan_async (device, NULL, cancellable, callback, user_data);
+ nm_device_wifi_request_scan_options_async (device, NULL, cancellable, callback, user_data);
}
/**
@@ -451,6 +378,8 @@ nm_device_wifi_request_scan_async (NMDeviceWifi *device,
* D-Bus call. Valid options inside the dictionary are:
* 'ssids' => array of SSIDs (saay)
*
+ * To complete the request call nm_device_wifi_request_scan_finish().
+ *
* Since: 1.2
**/
void
@@ -460,7 +389,26 @@ nm_device_wifi_request_scan_options_async (NMDeviceWifi *device,
GAsyncReadyCallback callback,
gpointer user_data)
{
- _device_wifi_request_scan_async (device, options, cancellable, callback, user_data);
+ g_return_if_fail (NM_IS_DEVICE_WIFI (device));
+ g_return_if_fail (!options || g_variant_is_of_type (options, G_VARIANT_TYPE_VARDICT));
+ g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+ if (!options)
+ options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
+
+ _nm_object_dbus_call (device,
+ nm_device_wifi_request_scan_async,
+ cancellable,
+ callback,
+ user_data,
+ g_dbus_proxy_get_object_path (G_DBUS_PROXY (NM_DEVICE_WIFI_GET_PRIVATE (device)->proxy)),
+ NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+ "RequestScan",
+ g_variant_new ("(@a{sv})", options),
+ G_VARIANT_TYPE ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ NM_DBUS_DEFAULT_TIMEOUT_MSEC,
+ nm_dbus_connection_call_finish_void_strip_dbus_error_cb);
}
NM_BACKPORT_SYMBOL (libnm_1_0_6, void, nm_device_wifi_request_scan_options_async,
@@ -473,7 +421,8 @@ NM_BACKPORT_SYMBOL (libnm_1_0_6, void, nm_device_wifi_request_scan_options_async
* @result: the result passed to the #GAsyncReadyCallback
* @error: location for a #GError, or %NULL
*
- * Gets the result of a call to nm_device_wifi_request_scan_async().
+ * Gets the result of a call to nm_device_wifi_request_scan_async() and
+ * nm_device_wifi_request_scan_options_async().
*
* Returns: %TRUE on success, %FALSE on error, in which case @error will be
* set.
@@ -483,15 +432,10 @@ nm_device_wifi_request_scan_finish (NMDeviceWifi *device,
GAsyncResult *result,
GError **error)
{
- GSimpleAsyncResult *simple;
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (device), nm_device_wifi_request_scan_async), FALSE);
+ g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), FALSE);
+ g_return_val_if_fail (nm_g_task_is_valid (result, device, nm_device_wifi_request_scan_async), FALSE);
- simple = G_SIMPLE_ASYNC_RESULT (result);
- if (g_simple_async_result_propagate_error (simple, error))
- return FALSE;
- else
- return g_simple_async_result_get_op_res_gboolean (simple);
+ return g_task_propagate_boolean (G_TASK (result), error);
}
static void