diff --git a/src/manager.c b/src/manager.c index 801ed97f..621c0bbb 100644 --- a/src/manager.c +++ b/src/manager.c @@ -30,34 +30,6 @@ #include "src/wiphy.h" #include "src/agent.h" -static struct l_dbus_message *manager_set_property(struct l_dbus *dbus, - struct l_dbus_message *message, - void *user_data) -{ - const char *property; - struct l_dbus_message_iter variant; - - if (!l_dbus_message_get_arguments(message, "sv", &property, &variant)) - return l_dbus_message_new_error(message, - "org.test.InvalidArguments", - "Invalid arguments"); - - return l_dbus_message_new_error(message, "org.test.InvalidArguments", - "Unknown Property %s", property); -} - -static struct l_dbus_message *manager_get_properties(struct l_dbus *dbus, - struct l_dbus_message *message, - void *user_data) -{ - struct l_dbus_message *reply; - - reply = l_dbus_message_new_method_return(message); - l_dbus_message_set_arguments(reply, "a{sv}", 0); - - return reply; -} - static void append_device(struct netdev *netdev, void *user_data) { struct l_dbus_message_builder *builder = user_data; @@ -91,19 +63,10 @@ static struct l_dbus_message *manager_get_devices(struct l_dbus *dbus, static void setup_manager_interface(struct l_dbus_interface *interface) { - l_dbus_interface_method(interface, "GetProperties", 0, - manager_get_properties, - "a{sv}", "", "properties"); - l_dbus_interface_method(interface, "SetProperty", 0, - manager_set_property, - "", "sv", "name", "value"); - l_dbus_interface_method(interface, "GetDevices", 0, manager_get_devices, "a{oa{sv}}", "", "devices"); - l_dbus_interface_signal(interface, "PropertyChanged", 0, - "sv", "name", "value"); l_dbus_interface_signal(interface, "DeviceAdded", 0, "oa{sv}", "path", "properties"); l_dbus_interface_signal(interface, "DeviceRemoved", 0, @@ -116,21 +79,30 @@ bool manager_init(struct l_dbus *dbus) { agent_init(); - if (!l_dbus_register_interface(dbus, IWD_MANAGER_PATH, - IWD_MANAGER_INTERFACE, - setup_manager_interface, NULL, NULL)) { + if (!l_dbus_register_interface(dbus, IWD_MANAGER_INTERFACE, + setup_manager_interface, + NULL, true)) { l_info("Unable to register %s interface", IWD_MANAGER_INTERFACE); return false; } + if (!l_dbus_object_add_interface(dbus, IWD_MANAGER_PATH, + IWD_MANAGER_INTERFACE, NULL)) { + l_info("Unable to register manager object on '%s'", + IWD_MANAGER_PATH); + l_dbus_unregister_interface(dbus, IWD_MANAGER_INTERFACE); + return false; + } + return true; } bool manager_exit(struct l_dbus *dbus) { - l_dbus_unregister_interface(dbus, IWD_MANAGER_PATH, - IWD_MANAGER_INTERFACE); + + l_dbus_unregister_object(dbus, IWD_MANAGER_PATH); + l_dbus_unregister_interface(dbus, IWD_MANAGER_INTERFACE); return true; } diff --git a/src/wiphy.c b/src/wiphy.c index 90360570..b4bb2be3 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -499,19 +499,25 @@ static struct l_dbus_message *network_connect(struct l_dbus *dbus, } } +static bool network_property_get_name(struct l_dbus *dbus, + struct l_dbus_message *message, + struct l_dbus_message_builder *builder, + void *user_data) +{ + struct network *network = user_data; + + l_dbus_message_builder_append_basic(builder, 's', network->ssid); + return true; +} + static void setup_network_interface(struct l_dbus_interface *interface) { - l_dbus_interface_method(interface, "GetProperties", 0, - network_get_properties, - "a{sv}", "", "properties"); l_dbus_interface_method(interface, "Connect", 0, network_connect, "", ""); - l_dbus_interface_signal(interface, "PropertyChanged", 0, - "sv", "name", "value"); - - l_dbus_interface_ro_property(interface, "Name", "s"); + l_dbus_interface_property(interface, "Name", 0, "s", + network_property_get_name, NULL); } static void network_emit_added(struct network *network) @@ -580,8 +586,7 @@ static void network_free(void *data) l_settings_free(network->settings); dbus = dbus_get_bus(); - l_dbus_unregister_interface(dbus, network->object_path, - IWD_NETWORK_INTERFACE); + l_dbus_unregister_object(dbus, network->object_path); network_emit_removed(network); l_free(network->object_path); @@ -675,41 +680,6 @@ static void device_emit_removed(struct netdev *netdev) l_dbus_send(dbus, signal); } -static struct l_dbus_message *device_set_property(struct l_dbus *dbus, - struct l_dbus_message *message, - void *user_data) -{ - const char *property; - struct l_dbus_message_iter variant; - - if (!l_dbus_message_get_arguments(message, "sv", &property, &variant)) - return l_dbus_message_new_error(message, - "org.test.InvalidArguments", - "Invalid arguments"); - - return l_dbus_message_new_error(message, "org.test.InvalidArguments", - "Unknown Property %s", property); -} - -static struct l_dbus_message *device_get_properties(struct l_dbus *dbus, - struct l_dbus_message *message, - void *user_data) -{ - struct netdev *netdev = user_data; - struct l_dbus_message *reply; - struct l_dbus_message_builder *builder; - - reply = l_dbus_message_new_method_return(message); - - builder = l_dbus_message_builder_new(reply); - - __iwd_device_append_properties(netdev, builder); - l_dbus_message_builder_finalize(builder); - l_dbus_message_builder_destroy(builder); - - return reply; -} - static void device_scan_triggered(int err, void *user_data) { struct netdev *netdev = user_data; @@ -839,14 +809,19 @@ static struct l_dbus_message *device_disconnect(struct l_dbus *dbus, return NULL; } +static bool device_property_get_name(struct l_dbus *dbus, + struct l_dbus_message *message, + struct l_dbus_message_builder *builder, + void *user_data) +{ + struct netdev *netdev = user_data; + + l_dbus_message_builder_append_basic(builder, 's', netdev->name); + return true; +} + static void setup_device_interface(struct l_dbus_interface *interface) { - l_dbus_interface_method(interface, "GetProperties", 0, - device_get_properties, - "a{sv}", "", "properties"); - l_dbus_interface_method(interface, "SetProperty", 0, - device_set_property, - "", "sv", "name", "value"); l_dbus_interface_method(interface, "Scan", 0, device_scan, "", ""); l_dbus_interface_method(interface, "GetNetworks", 0, @@ -855,14 +830,13 @@ static void setup_device_interface(struct l_dbus_interface *interface) l_dbus_interface_method(interface, "Disconnect", 0, device_disconnect, "", ""); - l_dbus_interface_signal(interface, "PropertyChanged", 0, - "sv", "name", "value"); l_dbus_interface_signal(interface, "NetworkAdded", 0, "oa{sv}", "path", "properties"); l_dbus_interface_signal(interface, "NetworkRemoved", 0, "o", "path"); - l_dbus_interface_ro_property(interface, "Name", "s"); + l_dbus_interface_property(interface, "Name", 0, "s", + device_property_get_name, NULL); } static bool bss_match(const void *a, const void *b) @@ -889,8 +863,7 @@ static void netdev_free(void *data) __netdev_watch_call_removed(netdev); dbus = dbus_get_bus(); - l_dbus_unregister_interface(dbus, iwd_device_get_path(netdev), - IWD_DEVICE_INTERFACE); + l_dbus_unregister_object(dbus, iwd_device_get_path(netdev)); device_emit_removed(netdev); @@ -1730,11 +1703,9 @@ static void process_bss(struct netdev *netdev, struct scan_bss *bss) l_debug("Added new Network \"%s\" security %s", network->ssid, scan_ssid_security_to_str(ssid_security)); - if (!l_dbus_register_interface(dbus_get_bus(), + if (!l_dbus_object_add_interface(dbus_get_bus(), network->object_path, - IWD_NETWORK_INTERFACE, - setup_network_interface, - network, NULL)) + IWD_NETWORK_INTERFACE, network)) l_info("Unable to register %s interface", IWD_NETWORK_INTERFACE); else @@ -1913,11 +1884,9 @@ static void interface_dump_callback(struct l_genl_msg *msg, void *user_data) l_queue_push_head(wiphy->netdev_list, netdev); - if (!l_dbus_register_interface(dbus, + if (!l_dbus_object_add_interface(dbus, iwd_device_get_path(netdev), - IWD_DEVICE_INTERFACE, - setup_device_interface, - netdev, NULL)) + IWD_DEVICE_INTERFACE, netdev)) l_info("Unable to register %s interface", IWD_DEVICE_INTERFACE); else { @@ -2357,6 +2326,21 @@ bool wiphy_init(struct l_genl_family *in) l_queue_destroy(wiphy_list, NULL); } + if (!l_dbus_register_interface(dbus_get_bus(), + IWD_NETWORK_INTERFACE, + setup_network_interface, + NULL, true)) + return false; + + if (!l_dbus_register_interface(dbus_get_bus(), + IWD_DEVICE_INTERFACE, + setup_device_interface, + NULL, true)) { + l_dbus_unregister_interface(dbus_get_bus(), + IWD_NETWORK_INTERFACE); + return false; + } + nl80211 = in; if (!l_genl_family_register(nl80211, "config", wiphy_config_notify, @@ -2407,6 +2391,9 @@ bool wiphy_exit(void) nl80211 = NULL; + l_dbus_unregister_interface(dbus_get_bus(), IWD_DEVICE_INTERFACE); + l_dbus_unregister_interface(dbus_get_bus(), IWD_NETWORK_INTERFACE); + return true; } diff --git a/src/wsc.c b/src/wsc.c index 3e0bf79d..13224002 100644 --- a/src/wsc.c +++ b/src/wsc.c @@ -302,10 +302,9 @@ static void netdev_appeared(struct netdev *netdev, void *userdata) wsc = l_new(struct wsc, 1); wsc->netdev = netdev; - if (!l_dbus_register_interface(dbus, iwd_device_get_path(netdev), - IWD_WSC_INTERFACE, - setup_wsc_interface, - wsc, wsc_free)) { + if (!l_dbus_object_add_interface(dbus, iwd_device_get_path(netdev), + IWD_WSC_INTERFACE, + wsc)) { wsc_free(wsc); l_info("Unable to register %s interface", IWD_WSC_INTERFACE); } @@ -313,15 +312,15 @@ static void netdev_appeared(struct netdev *netdev, void *userdata) static void netdev_disappeared(struct netdev *netdev, void *userdata) { - struct l_dbus *dbus = dbus_get_bus(); - - if (!l_dbus_unregister_interface(dbus, iwd_device_get_path(netdev), - IWD_WSC_INTERFACE)) - l_info("Unable to unregister %s interface", IWD_WSC_INTERFACE); } bool wsc_init(struct l_genl_family *in) { + if (!l_dbus_register_interface(dbus_get_bus(), IWD_WSC_INTERFACE, + setup_wsc_interface, + wsc_free, false)) + return false; + netdev_watch = netdev_watch_add(netdev_appeared, netdev_disappeared, NULL, NULL); if (!netdev_watch) @@ -338,6 +337,8 @@ bool wsc_exit() if (!nl80211) return false; + l_dbus_unregister_interface(dbus_get_bus(), IWD_WSC_INTERFACE); + netdev_watch_remove(netdev_watch); nl80211 = 0;