36
36
#include "nm-dbus-glib-types.h"
37
37
#include "nm-types-private.h"
39
#include "nm-device-wifi-bindings.h"
41
39
G_DEFINE_TYPE (NMDeviceWifi, nm_device_wifi, NM_TYPE_DEVICE)
43
41
#define NM_DEVICE_WIFI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_WIFI, NMDeviceWifiPrivate))
45
static gboolean demarshal_active_ap (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field);
47
43
void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enabled);
103
98
nm_device_wifi_new (DBusGConnection *connection, const char *path)
105
102
g_return_val_if_fail (connection != NULL, NULL);
106
103
g_return_val_if_fail (path != NULL, NULL);
108
return g_object_new (NM_TYPE_DEVICE_WIFI,
109
NM_OBJECT_DBUS_CONNECTION, connection,
110
NM_OBJECT_DBUS_PATH, path,
105
device = g_object_new (NM_TYPE_DEVICE_WIFI,
106
NM_OBJECT_DBUS_CONNECTION, connection,
107
NM_OBJECT_DBUS_PATH, path,
109
_nm_object_ensure_inited (NM_OBJECT (device));
124
123
nm_device_wifi_get_hw_address (NMDeviceWifi *device)
126
NMDeviceWifiPrivate *priv;
128
125
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
130
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
131
if (!priv->hw_address) {
132
priv->hw_address = _nm_object_get_string_property (NM_OBJECT (device),
133
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
134
DBUS_PROP_HW_ADDRESS,
138
return priv->hw_address;
127
_nm_object_ensure_inited (NM_OBJECT (device));
128
return NM_DEVICE_WIFI_GET_PRIVATE (device)->hw_address;
151
141
nm_device_wifi_get_permanent_hw_address (NMDeviceWifi *device)
153
NMDeviceWifiPrivate *priv;
155
143
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
157
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
158
if (!priv->perm_hw_address) {
159
priv->perm_hw_address = _nm_object_get_string_property (NM_OBJECT (device),
160
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
161
DBUS_PROP_PERM_HW_ADDRESS,
165
return priv->perm_hw_address;
145
_nm_object_ensure_inited (NM_OBJECT (device));
146
return NM_DEVICE_WIFI_GET_PRIVATE (device)->perm_hw_address;
177
158
nm_device_wifi_get_mode (NMDeviceWifi *device)
179
NMDeviceWifiPrivate *priv;
181
160
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0);
183
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
185
priv->mode = _nm_object_get_uint_property (NM_OBJECT (device),
186
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
162
_nm_object_ensure_inited (NM_OBJECT (device));
163
return NM_DEVICE_WIFI_GET_PRIVATE (device)->mode;
241
205
NMDeviceWifiCapabilities
242
206
nm_device_wifi_get_capabilities (NMDeviceWifi *device)
244
NMDeviceWifiPrivate *priv;
246
208
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0);
248
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
249
if (!priv->wireless_caps) {
250
priv->wireless_caps = _nm_object_get_uint_property (NM_OBJECT (device),
251
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
252
DBUS_PROP_WIRELESS_CAPABILITIES,
256
return priv->wireless_caps;
210
_nm_object_ensure_inited (NM_OBJECT (device));
211
return NM_DEVICE_WIFI_GET_PRIVATE (device)->wireless_caps;
294
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
295
if (priv->got_active_ap == TRUE)
296
return priv->active_ap;
298
path = _nm_object_get_object_path_property (NM_OBJECT (device),
299
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
300
DBUS_PROP_ACTIVE_ACCESS_POINT,
303
g_value_init (&value, DBUS_TYPE_G_OBJECT_PATH);
304
g_value_take_boxed (&value, path);
305
demarshal_active_ap (NM_OBJECT (device), NULL, &value, &priv->active_ap);
306
g_value_unset (&value);
308
g_clear_error (&error);
310
return priv->active_ap;
245
_nm_object_ensure_inited (NM_OBJECT (device));
246
return NM_DEVICE_WIFI_GET_PRIVATE (device)->active_ap;
323
259
const GPtrArray *
324
260
nm_device_wifi_get_access_points (NMDeviceWifi *device)
326
NMDeviceWifiPrivate *priv;
327
DBusGConnection *connection;
328
GValue value = { 0, };
329
GError *error = NULL;
332
262
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
334
priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
336
return handle_ptr_array_return (priv->aps);
338
if (!org_freedesktop_NetworkManager_Device_Wireless_get_access_points (priv->proxy, &temp, &error)) {
339
g_warning ("%s: error getting access points: %s", __func__, error->message);
340
g_error_free (error);
344
g_value_init (&value, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH);
345
g_value_take_boxed (&value, temp);
346
connection = nm_object_get_connection (NM_OBJECT (device));
347
_nm_object_array_demarshal (&value, &priv->aps, connection, nm_access_point_new);
348
g_value_unset (&value);
350
return handle_ptr_array_return (priv->aps);
264
_nm_object_ensure_inited (NM_OBJECT (device));
265
return handle_ptr_array_return (NM_DEVICE_WIFI_GET_PRIVATE (device)->aps);
389
access_point_added_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
304
access_point_added (NMObject *self, NMObject *ap)
391
NMDeviceWifi *self = NM_DEVICE_WIFI (user_data);
392
NMDeviceWifiPrivate *priv;
395
g_return_if_fail (self != NULL);
397
ap = G_OBJECT (nm_device_wifi_get_access_point_by_path (self, path));
399
DBusGConnection *connection = nm_object_get_connection (NM_OBJECT (self));
401
priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
402
ap = G_OBJECT (_nm_object_cache_get (path));
404
g_ptr_array_add (priv->aps, ap);
406
ap = G_OBJECT (nm_access_point_new (connection, path));
408
g_ptr_array_add (priv->aps, ap);
413
g_signal_emit (self, signals[ACCESS_POINT_ADDED], 0, NM_ACCESS_POINT (ap));
306
g_signal_emit (self, signals[ACCESS_POINT_ADDED], 0, ap);
417
access_point_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
310
access_point_removed (NMObject *self_obj, NMObject *ap_obj)
419
NMDeviceWifi *self = NM_DEVICE_WIFI (user_data);
312
NMDeviceWifi *self = NM_DEVICE_WIFI (self_obj);
420
313
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
423
g_return_if_fail (self != NULL);
425
ap = nm_device_wifi_get_access_point_by_path (self, path);
427
if (ap == priv->active_ap) {
428
g_object_unref (priv->active_ap);
429
priv->active_ap = NULL;
430
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
433
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
436
g_signal_emit (self, signals[ACCESS_POINT_REMOVED], 0, ap);
437
g_ptr_array_remove (priv->aps, ap);
438
g_object_unref (G_OBJECT (ap));
314
NMAccessPoint *ap = NM_ACCESS_POINT (ap_obj);
316
if (ap == priv->active_ap) {
317
g_object_unref (priv->active_ap);
318
priv->active_ap = NULL;
319
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
322
_nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
325
g_signal_emit (self, signals[ACCESS_POINT_REMOVED], 0, ap);
633
demarshal_active_ap (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
635
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object);
637
NMAccessPoint *ap = NULL;
638
DBusGConnection *connection;
641
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH))
644
path = g_value_get_boxed (value);
646
ap = NM_ACCESS_POINT (_nm_object_cache_get (path));
648
connection = nm_object_get_connection (object);
649
ap = NM_ACCESS_POINT (nm_access_point_new (connection, path));
654
priv->got_active_ap = TRUE;
656
if (priv->active_ap) {
657
g_object_unref (priv->active_ap);
658
priv->active_ap = NULL;
662
priv->active_ap = ap;
664
_nm_object_queue_notify (object, NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT);
669
register_for_property_changed (NMDeviceWifi *device)
519
register_properties (NMDeviceWifi *device)
671
521
NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
672
const NMPropertiesChangedInfo property_changed_info[] = {
673
{ NM_DEVICE_WIFI_HW_ADDRESS, _nm_object_demarshal_generic, &priv->hw_address },
674
{ NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS, _nm_object_demarshal_generic, &priv->perm_hw_address },
675
{ NM_DEVICE_WIFI_MODE, _nm_object_demarshal_generic, &priv->mode },
676
{ NM_DEVICE_WIFI_BITRATE, _nm_object_demarshal_generic, &priv->rate },
677
{ NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT, demarshal_active_ap, &priv->active_ap },
678
{ NM_DEVICE_WIFI_CAPABILITIES, _nm_object_demarshal_generic, &priv->wireless_caps },
522
const NMPropertiesInfo property_info[] = {
523
{ NM_DEVICE_WIFI_HW_ADDRESS, &priv->hw_address },
524
{ NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS, &priv->perm_hw_address },
525
{ NM_DEVICE_WIFI_MODE, &priv->mode },
526
{ NM_DEVICE_WIFI_BITRATE, &priv->rate },
527
{ NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT, &priv->active_ap, NULL, NM_TYPE_ACCESS_POINT },
528
{ NM_DEVICE_WIFI_CAPABILITIES, &priv->wireless_caps },
682
_nm_object_handle_properties_changed (NM_OBJECT (device),
532
_nm_object_register_properties (NM_OBJECT (device),
536
_nm_object_register_pseudo_property (NM_OBJECT (device),
684
property_changed_info);
540
NM_TYPE_ACCESS_POINT,
542
access_point_removed);
688
constructor (GType type,
689
guint n_construct_params,
690
GObjectConstructParam *construct_params)
546
constructed (GObject *object)
693
548
NMDeviceWifiPrivate *priv;
695
object = G_OBJECT_CLASS (nm_device_wifi_parent_class)->constructor (type,
550
G_OBJECT_CLASS (nm_device_wifi_parent_class)->constructed (object);
701
552
priv = NM_DEVICE_WIFI_GET_PRIVATE (object);
705
556
nm_object_get_path (NM_OBJECT (object)),
706
557
NM_DBUS_INTERFACE_DEVICE_WIRELESS);
708
dbus_g_proxy_add_signal (priv->proxy, "AccessPointAdded",
709
DBUS_TYPE_G_OBJECT_PATH,
711
dbus_g_proxy_connect_signal (priv->proxy, "AccessPointAdded",
712
G_CALLBACK (access_point_added_proxy),
715
dbus_g_proxy_add_signal (priv->proxy, "AccessPointRemoved",
716
DBUS_TYPE_G_OBJECT_PATH,
718
dbus_g_proxy_connect_signal (priv->proxy, "AccessPointRemoved",
719
G_CALLBACK (access_point_removed_proxy),
722
register_for_property_changed (NM_DEVICE_WIFI (object));
559
register_properties (NM_DEVICE_WIFI (object));
724
561
g_signal_connect (NM_DEVICE (object),
725
562
"notify::" NM_DEVICE_STATE,
726
563
G_CALLBACK (state_changed_cb),
729
/* Get initial access points to prevent possible errors on
730
* AccessPointRemoved signal processing. We could make D-Bus
731
* GetAccessPoints() call on a removed WiFi device object (when
732
* AccessPointRemoved was triggered by removing the device).
734
nm_device_wifi_get_access_points (NM_DEVICE_WIFI (object));