diff --git a/src/device.c b/src/device.c index 16d14dda..2bdc461d 100644 --- a/src/device.c +++ b/src/device.c @@ -41,6 +41,7 @@ #include "src/dbus.h" #include "src/network.h" #include "src/device.h" +#include "src/watchlist.h" struct device_watchlist_item { uint32_t id; @@ -71,6 +72,7 @@ struct device { struct l_dbus_message *disconnect_pending; bool scanning; uint32_t netdev_watch_id; + struct watchlist state_watches; struct wiphy *wiphy; struct netdev *netdev; @@ -488,6 +490,19 @@ static void periodic_scan_trigger(int err, void *user_data) IWD_DEVICE_INTERFACE, "Scanning"); } +uint32_t device_add_state_watch(struct device *device, + device_state_watch_func_t func, + void *user_data, + device_destroy_func_t destroy) +{ + return watchlist_add(&device->state_watches, func, user_data, destroy); +} + +bool device_remove_state_watch(struct device *device, uint32_t id) +{ + return watchlist_remove(&device->state_watches, id); +} + void device_enter_state(struct device *device, enum device_state state) { struct l_dbus *dbus = dbus_get_bus(); @@ -525,6 +540,9 @@ void device_enter_state(struct device *device, enum device_state state) IWD_DEVICE_INTERFACE, "State"); device->state = state; + + WATCHLIST_NOTIFY(&device->state_watches, + device_state_watch_func_t, state); } static void device_disassociated(struct device *device) @@ -1158,6 +1176,7 @@ struct device *device_create(struct wiphy *wiphy, struct netdev *netdev) device = l_new(struct device, 1); device->bss_list = l_queue_new(); device->networks = l_hashmap_new(); + watchlist_init(&device->state_watches); l_hashmap_set_hash_function(device->networks, l_str_hash); l_hashmap_set_compare_function(device->networks, (l_hashmap_compare_func_t) strcmp); @@ -1199,6 +1218,8 @@ static void device_free(void *user) dbus_pending_reply(&device->connect_pending, dbus_error_aborted(device->connect_pending)); + watchlist_destroy(&device->state_watches); + if (device->state != DEVICE_STATE_OFF) __device_watch_call_removed(device); diff --git a/src/device.h b/src/device.h index 244043c2..c0d1b8fb 100644 --- a/src/device.h +++ b/src/device.h @@ -37,6 +37,7 @@ enum device_state { }; typedef void (*device_watch_func_t)(struct device *device, void *userdata); +typedef void (*device_state_watch_func_t)(enum device_state, void *userdata); typedef void (*device_destroy_func_t)(void *userdata); uint32_t device_watch_add(device_watch_func_t added, @@ -54,6 +55,12 @@ struct wiphy *device_get_wiphy(struct device *device); uint32_t device_get_ifindex(struct device *device); const uint8_t *device_get_address(struct device *device); +uint32_t device_add_state_watch(struct device *device, + device_state_watch_func_t func, + void *user_data, + device_destroy_func_t destroy); +bool device_remove_state_watch(struct device *device, uint32_t id); + void device_enter_state(struct device *device, enum device_state state); void device_connect_network(struct device *device, struct network *network, struct scan_bss *bss,