From 67aa8b8b933483bd754927f209b40fa95b466ad4 Mon Sep 17 00:00:00 2001 From: englebass Date: Wed, 5 Nov 2008 20:30:29 +0000 Subject: [PATCH] More work on nm object api. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@37490 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/nm.c | 8 +- src/lib/nm/E_Nm.h | 26 ++-- src/lib/nm/e_nm.c | 64 ++-------- src/lib/nm/e_nm_access_point.c | 67 ++++------- src/lib/nm/e_nm_device.c | 120 +++++++------------ src/lib/nm/e_nm_ip4_config.c | 12 +- src/lib/nm/e_nm_manager.c | 2 +- src/lib/nm/e_nm_private.h | 23 +--- src/lib/nm/e_nm_util.c | 263 +++++++++++++++++++++-------------------- 9 files changed, 244 insertions(+), 341 deletions(-) diff --git a/src/bin/nm.c b/src/bin/nm.c index 84aa1ee..c9031a9 100644 --- a/src/bin/nm.c +++ b/src/bin/nm.c @@ -4,12 +4,10 @@ E_NM *nm = NULL; static int -cb_get_devices(void *data, void *reply) +cb_get_devices(void *data, Ecore_List *list) { - Ecore_List *list; E_NM_Device *device; - list = reply; if (list) { ecore_list_first_goto(list); @@ -17,12 +15,12 @@ cb_get_devices(void *data, void *reply) e_nm_device_dump(device); ecore_list_destroy(list); } - ecore_main_loop_quit(); + //ecore_main_loop_quit(); return 1; } static int -cb_nm(void *data, void *reply) +cb_nm(void *data, E_NM *reply) { if (!reply) { diff --git a/src/lib/nm/E_Nm.h b/src/lib/nm/E_Nm.h index 58d6c11..f9a5d1f 100644 --- a/src/lib/nm/E_Nm.h +++ b/src/lib/nm/E_Nm.h @@ -217,9 +217,7 @@ struct E_NM_IP4_Config /* TODO typedef struct E_NM_DHCP4_Config E_NM_DHCP4_Config; */ typedef struct E_NMS E_NMS; -struct E_NMS -{ -}; +/* No properties */ /* TODO typedef struct E_NMS_Connection E_NMS_Connection */ /* TODO typedef struct E_NMS_Connection_Secrets E_NMS_Connection_Secrets */ @@ -232,12 +230,12 @@ extern "C" { #endif /* org.freedesktop.NetworkManager api */ - EAPI int e_nm_get(int (*cb_func)(void *data, void *reply), void *data); + EAPI int e_nm_get(int (*cb_func)(void *data, E_NM *nm), void *data); EAPI void e_nm_free(E_NM *nm); EAPI void e_nm_dump(E_NM *nm); /* TODO: e_nm_wireless_enabled_set */ - EAPI int e_nm_get_devices(E_NM *nm, int (*cb_func)(void *data, void *reply), void *data); + EAPI int e_nm_get_devices(E_NM *nm, int (*cb_func)(void *data, Ecore_List *list), void *data); /* TODO: e_nm_activate_connection */ /* TODO: e_nm_deactivate_connection */ EAPI int e_nm_sleep(E_NM *nm, int sleep); @@ -251,7 +249,7 @@ extern "C" { /* org.freedesktop.NetworkManager.AccessPoint api */ EAPI int e_nm_access_point_get(E_NM *nm, const char *access_point, - int (*cb_func)(void *data, void *reply), + int (*cb_func)(void *data, E_NM_Access_Point *ap), void *data); EAPI void e_nm_access_point_free(E_NM_Access_Point *access_point); EAPI void e_nm_access_point_dump(E_NM_Access_Point *access_point); @@ -262,7 +260,7 @@ extern "C" { /* org.freedesktop.NetworkManager.Device api */ EAPI int e_nm_device_get(E_NM *nm, const char *device, - int (*cb_func)(void *data, void *reply), + int (*cb_func)(void *data, E_NM_Device *dev), void *data); EAPI void e_nm_device_free(E_NM_Device *device); EAPI void e_nm_device_dump(E_NM_Device *device); @@ -277,14 +275,22 @@ extern "C" { /* TODO: e_nm_device_wireless_callback_access_point_removed_set */ /* org.freedesktop.NetworkManager.IP4Config api */ - EAPI int e_nm_ip4_config_get(E_NM *nm, const char *device, - int (*cb_func)(void *data, void *reply), + EAPI int e_nm_ip4_config_get(E_NM *nm, const char *config, + int (*cb_func)(void *data, E_NM_IP4_Config *config), void *data); EAPI void e_nm_ip4_config_free(E_NM_IP4_Config *config); EAPI void e_nm_ip4_config_dump(E_NM_IP4_Config *config); /* TODO: org.freedesktop.NetworkManager.DHCP4Config api */ - /* TODO: org.freedesktop.NetworkManagerSettings api */ + + /* org.freedesktop.NetworkManagerSettings api */ + EAPI void e_nms_get(E_NM *nm); + EAPI void e_nms_free(E_NMS *nms); + EAPI void e_nms_dump(E_NMS *nms); + EAPI int e_nms_list_connections(E_NMS *nms, + int (*cb_func)(void *data, Ecore_List *list), + void *data); + /* TODO: org.freedesktop.NetworkManagerSettings.Connection api */ /* TODO: org.freedesktop.NetworkManagerSettings.Connection.Secrets api */ /* TODO: org.freedesktop.NetworkManager.Connection.Active api */ diff --git a/src/lib/nm/e_nm.c b/src/lib/nm/e_nm.c index 62d9330..6a5e5a0 100644 --- a/src/lib/nm/e_nm.c +++ b/src/lib/nm/e_nm.c @@ -4,63 +4,15 @@ #include static Property properties[] = { - { .name = "WirelessEnabled", .func = property_bool, .offset = offsetof(E_NM, wireless_enabled) }, - { .name = "WirelessHardwareEnabled", .func = property_bool, .offset = offsetof(E_NM, wireless_hardware_enabled) }, + { .name = "WirelessEnabled", .sig = "b", .offset = offsetof(E_NM, wireless_enabled) }, + { .name = "WirelessHardwareEnabled", .sig = "b", .offset = offsetof(E_NM, wireless_hardware_enabled) }, #if 0 - { .name = "ActiveConnections", .func = property_object_path_list, .offset = offsetof(E_NM, ...) }, + { .name = "ActiveConnections", .sig = "ao", .offset = offsetof(E_NM, ...) }, #endif - { .name = "State", .func = property_uint32, .offset = offsetof(E_NM, state) }, - { .name = NULL, .func = NULL, .offset = 0 } + { .name = "State", .sig = "u", .offset = offsetof(E_NM, state) }, + { .name = NULL } }; -static int -parse_properties(E_NM_Internal *nmi, DBusMessage *msg, DBusError *err) -{ - DBusMessageIter iter, a_iter; - - if (dbus_error_is_set(err)) - return 0; - if (!dbus_message_has_signature(msg, "a{sv}")) - return 0; - - dbus_message_iter_init(msg, &iter); - - dbus_message_iter_recurse(&iter, &a_iter); - while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) - { - DBusMessageIter d_iter, v_iter; - const char *name, *value; - - dbus_message_iter_recurse(&a_iter, &d_iter); - dbus_message_iter_get_basic(&d_iter, &name); - - dbus_message_iter_next(&d_iter); - dbus_message_iter_recurse(&d_iter, &v_iter); - if (!strcmp(name, "WirelessEnabled")) - { - if (!nm_check_arg_type(&v_iter, 'b')) return 0; - dbus_message_iter_get_basic(&v_iter, &(nmi->nm.wireless_enabled)); - } - else if (!strcmp(name, "WirelessHardwareEnabled")) - { - if (!nm_check_arg_type(&v_iter, 'b')) return 0; - dbus_message_iter_get_basic(&v_iter, &(nmi->nm.wireless_hardware_enabled)); - } - else if (!strcmp(name, "ActiveConnections")) - { - if (!nm_check_arg_type(&v_iter, 'a')) return 0; - /* TODO */ - } - else if (!strcmp(name, "State")) - { - if (!nm_check_arg_type(&v_iter, 'u')) return 0; - dbus_message_iter_get_basic(&v_iter, &(nmi->nm.state)); - } - dbus_message_iter_next(&a_iter); - } - return 1; -} - static void cb_state_changed(void *data, DBusMessage *msg) { @@ -90,7 +42,7 @@ cb_properties_changed(void *data, DBusMessage *msg) if (!msg || !data) return; nmi = data; - if (!parse_properties(nmi, msg, NULL)) return; + parse_properties(nmi, properties, msg); if (nmi->properties_changed) nmi->properties_changed(&(nmi->nm)); @@ -153,7 +105,7 @@ cb_devices(void *data, void *reply) #endif EAPI int -e_nm_get(int (*cb_func)(void *data, void *reply), void *data) +e_nm_get(int (*cb_func)(void *data, E_NM *nm), void *data) { E_NM_Internal *nmi = NULL; E_NM_Data *d = NULL; @@ -178,7 +130,7 @@ e_nm_get(int (*cb_func)(void *data, void *reply), void *data) d->property = properties; d->object = strdup(_E_NM_PATH); - return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, d->property->func, d) ? 1 : 0; + return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0; error: if (d) free(d); diff --git a/src/lib/nm/e_nm_access_point.c b/src/lib/nm/e_nm_access_point.c index 5a61c12..09d2771 100644 --- a/src/lib/nm/e_nm_access_point.c +++ b/src/lib/nm/e_nm_access_point.c @@ -4,57 +4,34 @@ #include static Property access_point_properties[] = { - { .name = "HwAddress", .func = property_string, .offset = offsetof(E_NM_Device, wired.hw_address) }, - { .name = "Speed", .func = property_uint32, .offset = offsetof(E_NM_Device, wired.speed) }, - { .name = "Carrier", .func = property_bool, .offset = offsetof(E_NM_Device, wired.carrier) }, - { .name = NULL, .func = NULL, .offset = 0 } + { .name = "Flags", .sig = "u", .offset = offsetof(E_NM_Access_Point, flags) }, + { .name = "WpaFlags", .sig = "u", .offset = offsetof(E_NM_Access_Point, wpa_flags) }, + { .name = "RsnFlags", .sig = "u", .offset = offsetof(E_NM_Access_Point, rsn_flags) }, + { .name = "Ssid", .sig = "ay", .offset = offsetof(E_NM_Access_Point, ssid) }, + { .name = "Frequency", .sig = "u", .offset = offsetof(E_NM_Access_Point, frequency) }, + { .name = "HwAddress", .sig = "s", .offset = offsetof(E_NM_Access_Point, hw_address) }, + { .name = "Mode", .sig = "u", .offset = offsetof(E_NM_Access_Point, mode) }, + { .name = "MaxBitrate", .sig = "u", .offset = offsetof(E_NM_Access_Point, max_bitrate) }, + { .name = "Strength", .sig = "y", .offset = offsetof(E_NM_Access_Point, strength) }, + { .name = NULL } }; -static int -parse_properties(E_NM_Device_Internal *dev, DBusMessage *msg, DBusError *err) -{ - DBusMessageIter iter, a_iter; - - if (dbus_error_is_set(err)) - return 0; - if (!dbus_message_has_signature(msg, "a{sv}")) - return 0; - - dbus_message_iter_init(msg, &iter); - - dbus_message_iter_recurse(&iter, &a_iter); - while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) - { - DBusMessageIter d_iter, v_iter; - const char *name, *value; - - dbus_message_iter_recurse(&a_iter, &d_iter); - dbus_message_iter_get_basic(&d_iter, &name); - - dbus_message_iter_next(&d_iter); - dbus_message_iter_recurse(&d_iter, &v_iter); - /* TODO */ - dbus_message_iter_next(&a_iter); - } - return 1; -} - static void cb_properties_changed(void *data, DBusMessage *msg) { - E_NM_Device_Internal *dev; + E_NM_Access_Point_Internal *ap; if (!msg || !data) return; - dev = data; - if (!parse_properties(dev, msg, NULL)) return; + ap = data; + parse_properties(ap, access_point_properties, msg); - if (dev->properties_changed) - dev->properties_changed(&(dev->dev)); + if (ap->properties_changed) + ap->properties_changed(&(ap->ap)); } EAPI int e_nm_access_point_get(E_NM *nm, const char *access_point, - int (*cb_func)(void *data, void *reply), + int (*cb_func)(void *data, E_NM_Access_Point *ap), void *data) { E_NM_Internal *nmi; @@ -73,9 +50,9 @@ e_nm_access_point_get(E_NM *nm, const char *access_point, d->object = strdup(access_point); ap->handlers = ecore_list_new(); - ecore_list_append(ap->handlers, e_nm_device_signal_handler_add(nmi->conn, access_point, "PropertiesChanged", cb_properties_changed, nmi)); + ecore_list_append(ap->handlers, e_nm_access_point_signal_handler_add(nmi->conn, access_point, "PropertiesChanged", cb_properties_changed, nmi)); - return e_nm_access_point_properties_get(nmi->conn, d->object, d->property->name, d->property->func, d) ? 1 : 0; + return e_nm_access_point_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0; } EAPI void @@ -86,6 +63,14 @@ e_nm_access_point_free(E_NM_Access_Point *access_point) if (!access_point) return; ap = (E_NM_Access_Point_Internal *)access_point; /* TODO */ + if (ap->handlers) + { + E_DBus_Signal_Handler *sh; + + while ((sh = ecore_list_first_remove(ap->handlers))) + e_dbus_signal_handler_del(ap->nmi->conn, sh); + ecore_list_destroy(ap->handlers); + } free(ap); } diff --git a/src/lib/nm/e_nm_device.c b/src/lib/nm/e_nm_device.c index c9a33b1..0a3fa63 100644 --- a/src/lib/nm/e_nm_device.c +++ b/src/lib/nm/e_nm_device.c @@ -8,66 +8,60 @@ #include -static void property_device_type(void *data, DBusMessage *msg, DBusError *err); +static void property_device_type(void *data, DBusMessageIter *iter); #if 0 -static void property_ip4_config(void *data, DBusMessage *msg, DBusError *err); +static void property_ip4_config(void *data, DBusMessageIter *iter); #endif static Property device_wired_properties[] = { - { .name = "HwAddress", .func = property_string, .offset = offsetof(E_NM_Device, wired.hw_address) }, - { .name = "Speed", .func = property_uint32, .offset = offsetof(E_NM_Device, wired.speed) }, - { .name = "Carrier", .func = property_bool, .offset = offsetof(E_NM_Device, wired.carrier) }, - { .name = NULL, .func = NULL, .offset = 0 } + { .name = "HwAddress", .sig = "s", .offset = offsetof(E_NM_Device, wired.hw_address) }, + { .name = "Speed", .sig = "u", .offset = offsetof(E_NM_Device, wired.speed) }, + { .name = "Carrier", .sig = "b", .offset = offsetof(E_NM_Device, wired.carrier) }, + { .name = NULL } }; static Property device_wireless_properties[] = { - { .name = "HwAddress", .func = property_string, .offset = offsetof(E_NM_Device, wireless.hw_address) }, - { .name = "Mode", .func = property_uint32, .offset = offsetof(E_NM_Device, wireless.mode) }, - { .name = "Bitrate", .func = property_uint32, .offset = offsetof(E_NM_Device, wireless.bitrate) }, - { .name = "ActiveAccessPoint", .func = property_object_path, .offset = offsetof(E_NM_Device, wireless.active_access_point) }, - { .name = "WirelessCapabilities", .func = property_uint32, .offset = offsetof(E_NM_Device, wireless.wireless_capabilities) }, - { .name = NULL, .func = NULL, .offset = 0 } + { .name = "HwAddress", .sig = "s", .offset = offsetof(E_NM_Device, wireless.hw_address) }, + { .name = "Mode", .sig = "u", .offset = offsetof(E_NM_Device, wireless.mode) }, + { .name = "Bitrate", .sig = "u", .offset = offsetof(E_NM_Device, wireless.bitrate) }, + { .name = "ActiveAccessPoint", .sig = "o", .offset = offsetof(E_NM_Device, wireless.active_access_point) }, + { .name = "WirelessCapabilities", .sig = "u", .offset = offsetof(E_NM_Device, wireless.wireless_capabilities) }, + { .name = NULL } }; static Property device_properties[] = { - { .name = "Udi", .func = property_string, .offset = offsetof(E_NM_Device, udi) }, - { .name = "Interface", .func = property_string, .offset = offsetof(E_NM_Device, interface) }, - { .name = "Driver", .func = property_string, .offset = offsetof(E_NM_Device, driver) }, - { .name = "Capabilities", .func = property_uint32, .offset = offsetof(E_NM_Device, capabilities) }, - { .name = "Ip4Address", .func = property_uint32, .offset = offsetof(E_NM_Device, ip4_address) }, - { .name = "State", .func = property_uint32, .offset = offsetof(E_NM_Device, state) }, - { .name = "Ip4Config", .func = property_object_path, .offset = offsetof(E_NM_Device, ip4_config) }, - { .name = "Dhcp4Config", .func = property_object_path, .offset = offsetof(E_NM_Device, dhcp4_config) }, - { .name = "Managed", .func = property_bool, .offset = offsetof(E_NM_Device, managed) }, + { .name = "Udi", .sig = "s", .offset = offsetof(E_NM_Device, udi) }, + { .name = "Interface", .sig = "s", .offset = offsetof(E_NM_Device, interface) }, + { .name = "Driver", .sig = "s", .offset = offsetof(E_NM_Device, driver) }, + { .name = "Capabilities", .sig = "u", .offset = offsetof(E_NM_Device, capabilities) }, + { .name = "Ip4Address", .sig = "u", .offset = offsetof(E_NM_Device, ip4_address) }, + { .name = "State", .sig = "u", .offset = offsetof(E_NM_Device, state) }, + { .name = "Ip4Config", .sig = "o", .offset = offsetof(E_NM_Device, ip4_config) }, + { .name = "Dhcp4Config", .sig = "o", .offset = offsetof(E_NM_Device, dhcp4_config) }, + { .name = "Managed", .sig = "b", .offset = offsetof(E_NM_Device, managed) }, { .name = "DeviceType", .func = property_device_type, .offset = offsetof(E_NM_Device, device_type) }, - { .name = NULL, .func = NULL, .offset = 0 } + { .name = NULL } }; #if 0 static void -property_ip4_config(void *data, DBusMessage *msg, DBusError *err) +property_ip4_config(void *data, DBusMessageIter *iter) { - DBusMessageIter iter, v_iter; E_NM_Data *d; E_NM_Device *device; const char *str; d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'o')) goto error; + if (!nm_check_arg_type(iter, 'o')) goto error; device = d->reply; - dbus_message_iter_get_basic(&v_iter, &str); + dbus_message_iter_get_basic(iter, &str); device->ip4_config = strdup(str); e_nm_ip4_config_get(&(d->nmi->nm), str, NULL, NULL); d->property++; if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); + e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, property, d); else { if (d->cb_func) d->cb_func(d->data, d->reply); @@ -83,31 +77,25 @@ error: #endif static void -property_device_type(void *data, DBusMessage *msg, DBusError *err) +property_device_type(void *data, DBusMessageIter *iter) { - DBusMessageIter iter, v_iter; E_NM_Data *d; E_NM_Device *device; d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'u')) goto error; + if (!nm_check_arg_type(iter, 'u')) goto error; device = d->reply; - dbus_message_iter_get_basic(&v_iter, &(device->device_type)); + dbus_message_iter_get_basic(iter, &(device->device_type)); switch (device->device_type) { case E_NM_DEVICE_TYPE_WIRED: d->property = device_wired_properties; - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); + e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, property, d); break; case E_NM_DEVICE_TYPE_WIRELESS: d->property = device_wireless_properties; - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); + e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, property, d); break; default: if (d->cb_func) d->cb_func(d->data, device); @@ -122,35 +110,6 @@ error: e_nm_data_free(d); } -static int -parse_properties(E_NM_Device_Internal *dev, DBusMessage *msg, DBusError *err) -{ - DBusMessageIter iter, a_iter; - - if (dbus_error_is_set(err)) - return 0; - if (!dbus_message_has_signature(msg, "a{sv}")) - return 0; - - dbus_message_iter_init(msg, &iter); - - dbus_message_iter_recurse(&iter, &a_iter); - while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) - { - DBusMessageIter d_iter, v_iter; - const char *name, *value; - - dbus_message_iter_recurse(&a_iter, &d_iter); - dbus_message_iter_get_basic(&d_iter, &name); - - dbus_message_iter_next(&d_iter); - dbus_message_iter_recurse(&d_iter, &v_iter); - /* TODO */ - dbus_message_iter_next(&a_iter); - } - return 1; -} - static void cb_state_changed(void *data, DBusMessage *msg) { @@ -180,7 +139,16 @@ cb_properties_changed(void *data, DBusMessage *msg) if (!msg || !data) return; dev = data; - if (!parse_properties(dev, msg, NULL)) return; + parse_properties(dev, device_properties, msg); + switch (dev->dev.device_type) + { + case E_NM_DEVICE_TYPE_WIRED: + parse_properties(dev, device_wired_properties, msg); + break; + case E_NM_DEVICE_TYPE_WIRELESS: + parse_properties(dev, device_wireless_properties, msg); + break; + } if (dev->properties_changed) dev->properties_changed(&(dev->dev)); @@ -188,7 +156,7 @@ cb_properties_changed(void *data, DBusMessage *msg) EAPI int e_nm_device_get(E_NM *nm, const char *device, - int (*cb_func)(void *data, void *reply), + int (*cb_func)(void *data, E_NM_Device *device), void *data) { E_NM_Internal *nmi; @@ -210,7 +178,7 @@ e_nm_device_get(E_NM *nm, const char *device, ecore_list_append(dev->handlers, e_nm_device_signal_handler_add(nmi->conn, device, "StateChanged", cb_state_changed, nmi)); ecore_list_append(dev->handlers, e_nm_device_signal_handler_add(nmi->conn, device, "PropertiesChanged", cb_properties_changed, nmi)); - return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, d->property->func, d) ? 1 : 0; + return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0; } EAPI void @@ -241,7 +209,7 @@ e_nm_device_free(E_NM_Device *device) while ((sh = ecore_list_first_remove(dev->handlers))) e_dbus_signal_handler_del(dev->nmi->conn, sh); - ecore_list_destroy(dev->nmi->handlers); + ecore_list_destroy(dev->handlers); } free(dev); } diff --git a/src/lib/nm/e_nm_ip4_config.c b/src/lib/nm/e_nm_ip4_config.c index 190a590..49fd3f8 100644 --- a/src/lib/nm/e_nm_ip4_config.c +++ b/src/lib/nm/e_nm_ip4_config.c @@ -5,19 +5,19 @@ static Property ip4_config_properties[] = { #if 0 - { .name = "Addresses", .func = property_uint32_list_list, .offset = offsetof(E_NM_IP4_Config, addresses) }, - { .name = "Nameservers", .func = property_uint32_list, .offset = offsetof(E_NM_IP4_Config, nameservers) }, + { .name = "Addresses", .sig = "aau", .offset = offsetof(E_NM_IP4_Config, addresses) }, + { .name = "Nameservers", .sig = "au", .offset = offsetof(E_NM_IP4_Config, nameservers) }, #endif - { .name = "Domains", .func = property_string_list, .offset = offsetof(E_NM_IP4_Config, domains) }, + { .name = "Domains", .sig = "as", .offset = offsetof(E_NM_IP4_Config, domains) }, #if 0 - { .name = "Routes", .func = property_uint32_list_list, .offset = offsetof(E_NM_IP4_Config, routes) }, + { .name = "Routes", .sig = "aau", .offset = offsetof(E_NM_IP4_Config, routes) }, #endif - { .name = NULL, .func = NULL, .offset = 0 } + { .name = NULL } }; EAPI int e_nm_ip4_config_get(E_NM *nm, const char *ip4_config, - int (*cb_func)(void *data, void *reply), + int (*cb_func)(void *data, E_NM_IP4_Config *config), void *data) { E_NM_Internal *nmi; diff --git a/src/lib/nm/e_nm_manager.c b/src/lib/nm/e_nm_manager.c index eefaf20..8358b26 100644 --- a/src/lib/nm/e_nm_manager.c +++ b/src/lib/nm/e_nm_manager.c @@ -66,7 +66,7 @@ cb_nm_devices(void *data, void *reply, DBusError *err) * @param data user data to pass to the callback function **/ EAPI int -e_nm_get_devices(E_NM *nm, int (*cb_func)(void *data, void *reply), void *data) +e_nm_get_devices(E_NM *nm, int (*cb_func)(void *data, Ecore_List *list), void *data) { DBusMessage *msg; E_NM_Data *d; diff --git a/src/lib/nm/e_nm_private.h b/src/lib/nm/e_nm_private.h index ee68b15..ff4e3cc 100644 --- a/src/lib/nm/e_nm_private.h +++ b/src/lib/nm/e_nm_private.h @@ -17,13 +17,15 @@ #define e_nm_ip4_config_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_IP4CONFIG, prop, (E_DBus_Method_Return_Cb) cb, data) #define e_nm_signal_handler_add(con, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, _E_NM_PATH, _E_NM_INTERFACE, sig, cb, data) -#define e_nm_device_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE, sig, cb, data) +#define e_nm_access_point_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_ACCESSPOINT, sig, cb, data) +#define e_nm_device_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE, sig, cb, data) typedef struct Property Property; struct Property { const char *name; - void (*func)(void *data, DBusMessage *msg, DBusError *err); + const char *sig; + void (*func)(void *data, DBusMessageIter *iter); size_t offset; }; @@ -96,22 +98,9 @@ struct E_NM_Data Property *property; }; -void property_string(void *data, DBusMessage *msg, DBusError *err); -void property_object_path(void *data, DBusMessage *msg, DBusError *err); -void property_uint32(void *data, DBusMessage *msg, DBusError *err); -void property_bool(void *data, DBusMessage *msg, DBusError *err); -void property_uint32_list_list(void *data, DBusMessage *msg, DBusError *err); -void property_uint32_list(void *data, DBusMessage *msg, DBusError *err); -void property_string_list(void *data, DBusMessage *msg, DBusError *err); +void property(void *data, DBusMessage *msg, DBusError *err); +void parse_properties(void *data, Property *properties, DBusMessage *msg); -#if 0 -void *cb_nm_generic(DBusMessage *msg, DBusError *err); -void free_nm_generic(void *data); -void *cb_nm_int32(DBusMessage *msg, DBusError *err); -void *cb_nm_uint32(DBusMessage *msg, DBusError *err); -void *cb_nm_object_path(DBusMessage *msg, DBusError *err); -void *cb_nm_boolean(DBusMessage *msg, DBusError *err); -#endif void *cb_nm_object_path_list(DBusMessage *msg, DBusError *err); void free_nm_object_path_list(void *data); diff --git a/src/lib/nm/e_nm_util.c b/src/lib/nm/e_nm_util.c index 7454a1d..6aa5857 100644 --- a/src/lib/nm/e_nm_util.c +++ b/src/lib/nm/e_nm_util.c @@ -17,131 +17,149 @@ return NULL; \ } -void -property_string(void *data, DBusMessage *msg, DBusError *err) -{ - DBusMessageIter iter, v_iter; - E_NM_Data *d; - const char *str; - char **value; +static void property_string(DBusMessageIter *iter, void *value); +static void property_object_path(DBusMessageIter *iter, void *value); +static void property_uint32(DBusMessageIter *iter, void *value); +static void property_bool(DBusMessageIter *iter, void *value); +static void property_string_list(DBusMessageIter *iter, void *value); - d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; +typedef void (*property_cb)(DBusMessageIter *iter, void *value); - dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 's')) goto error; +typedef struct SigProperty SigProperty; +struct SigProperty +{ + const char *sig; + property_cb func; +}; + +static SigProperty sigs[] = { + { .sig = "s", property_string }, + { .sig = "o", property_object_path }, + { .sig = "u", property_uint32 }, + { .sig = "b", property_bool }, + { .sig = "as", property_string_list }, + { .sig = NULL } +}; + +static property_cb +find_property_cb(const char *sig) +{ + SigProperty *t; - dbus_message_iter_get_basic(&v_iter, &str); + if (!sig) return NULL; - value = (char **)((char *)d->reply + d->property->offset); - *value = strdup(str); - d->property++; - if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); - else + for (t = sigs; t->sig; t++) { - if (d->cb_func) d->cb_func(d->data, d->reply); - e_nm_data_free(d); + if (!strcmp(t->sig, sig)) + return t->func; } - return; + return NULL; +} -error: - if (d->reply) free(d->reply); /* TODO: Correct free for object */ - if (d->cb_func) d->cb_func(d->data, NULL); - e_nm_data_free(d); +static Property * +find_property(const char *name, Property *properties) +{ + Property *p; + + if (!name) return NULL; + + for (p = properties; p->name; p++) + { + if (!strcmp(p->name, name)) + return p; + } + return NULL; } -void -property_object_path(void *data, DBusMessage *msg, DBusError *err) +static void +property_string(DBusMessageIter *iter, void *value) { - DBusMessageIter iter, v_iter; - E_NM_Data *d; const char *str; - char **value; - d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; + if (!nm_check_arg_type(iter, 's')) return; - dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'o')) goto error; + dbus_message_iter_get_basic(iter, &str); + *((char **)value) = strdup(str); +} - dbus_message_iter_get_basic(&v_iter, &str); +static void +property_object_path(DBusMessageIter *iter, void *value) +{ + const char *str; - value = (char **)((char *)d->reply + d->property->offset); - *value = strdup(str); - d->property++; - if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); - else - { - if (d->cb_func) d->cb_func(d->data, d->reply); - e_nm_data_free(d); - } - return; + if (!nm_check_arg_type(iter, 'o')) return; -error: - if (d->reply) free(d->reply); /* TODO: Correct free for object */ - if (d->cb_func) d->cb_func(d->data, NULL); - e_nm_data_free(d); + dbus_message_iter_get_basic(iter, &str); + *((char **)value) = strdup(str); } -void -property_uint32(void *data, DBusMessage *msg, DBusError *err) +static void +property_uint32(DBusMessageIter *iter, void *value) { - DBusMessageIter iter, v_iter; - E_NM_Data *d; - uint *value; + if (!nm_check_arg_type(iter, 'u')) return; - d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; + dbus_message_iter_get_basic(iter, value); +} - dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'u')) goto error; +static void +property_bool(DBusMessageIter *iter, void *value) +{ + if (!nm_check_arg_type(iter, 'b')) return; - value = (uint *)((char *)d->reply + d->property->offset); - dbus_message_iter_get_basic(&v_iter, value); - d->property++; - if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); - else + dbus_message_iter_get_basic(iter, value); +} + +static void +property_string_list(DBusMessageIter *iter, void *value) +{ + DBusMessageIter a_iter; + Ecore_List **list; + + if (!nm_check_arg_type(iter, 'a')) return; + dbus_message_iter_recurse(iter, &a_iter); + if (!nm_check_arg_type(&a_iter, 's')) return; + + list = (Ecore_List **)value; + *list = ecore_list_new(); + ecore_list_free_cb_set(*list, free); + while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) { - if (d->cb_func) d->cb_func(d->data, d->reply); - e_nm_data_free(d); - } - return; + const char *str; -error: - if (d->reply) free(d->reply); /* TODO: Correct free for object */ - if (d->cb_func) d->cb_func(d->data, NULL); - e_nm_data_free(d); + dbus_message_iter_get_basic(&a_iter, &str); + if (str) ecore_list_append(*list, strdup(str)); + dbus_message_iter_next(&a_iter); + } } void -property_bool(void *data, DBusMessage *msg, DBusError *err) +property(void *data, DBusMessage *msg, DBusError *err) { DBusMessageIter iter, v_iter; E_NM_Data *d; - dbus_bool_t *value; + void *value; + void (*func)(DBusMessageIter *iter, void *value) = NULL; d = data; if (dbus_error_is_set(err)) goto error; if (!dbus_message_has_signature(msg, "v")) goto error; - dbus_message_iter_init(msg, &iter); dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'b')) goto error; + if (d->property->func) + { + d->property->func(data, &v_iter); + return; + } + + value = ((char *)d->reply + d->property->offset); + func = find_property_cb(d->property->sig); + if (func) (*func)(&v_iter, value); - value = (uint *)((char *)d->reply + d->property->offset); - dbus_message_iter_get_basic(&v_iter, value); d->property++; if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); + { + e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, property, d); + } else { if (d->cb_func) d->cb_func(d->data, d->reply); @@ -156,58 +174,45 @@ error: } void -property_uint32_list_list(void *data, DBusMessage *msg, DBusError *err) +parse_properties(void *data, Property *properties, DBusMessage *msg) { -} - -void -property_uint32_list(void *data, DBusMessage *msg, DBusError *err) -{ -} + DBusMessageIter iter, a_iter; -void -property_string_list(void *data, DBusMessage *msg, DBusError *err) -{ - DBusMessageIter iter, v_iter, a_iter; - E_NM_Data *d; - Ecore_List **value; - - d = data; - if (dbus_error_is_set(err)) goto error; - if (!dbus_message_has_signature(msg, "v")) goto error; + if (!dbus_message_has_signature(msg, "a{sv}")) return; dbus_message_iter_init(msg, &iter); - dbus_message_iter_recurse(&iter, &v_iter); - if (!nm_check_arg_type(&v_iter, 'a')) goto error; - dbus_message_iter_recurse(&v_iter, &a_iter); - if (!nm_check_arg_type(&a_iter, 's')) goto error; - value = (Ecore_List **)((char *)d->reply + d->property->offset); - *value = ecore_list_new(); - ecore_list_free_cb_set(*value, free); + dbus_message_iter_recurse(&iter, &a_iter); while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) { - const char *str; - - dbus_message_iter_get_basic(&a_iter, &str); - if (str) ecore_list_append(*value, strdup(str)); + DBusMessageIter d_iter, v_iter; + Property *p; + const char *name; + void *value; + + dbus_message_iter_recurse(&a_iter, &d_iter); + dbus_message_iter_get_basic(&d_iter, &name); + + dbus_message_iter_next(&d_iter); + dbus_message_iter_recurse(&d_iter, &v_iter); + + p = find_property(name, properties); + if (!p) goto next; + value = ((char *)data + p->offset); + if (p->func) + p->func(&v_iter, value); + else + { + property_cb func; + + func = find_property_cb(p->sig); + if (!func) goto next; + func(&v_iter, value); + } + +next: dbus_message_iter_next(&a_iter); } - - d->property++; - if (d->property->name) - e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, d->property->func, d); - else - { - if (d->cb_func) d->cb_func(d->data, d->reply); - e_nm_data_free(d); - } - return; - -error: - if (d->reply) free(d->reply); /* TODO: Correct free for object */ - if (d->cb_func) d->cb_func(d->data, NULL); - e_nm_data_free(d); } /** -- 2.7.4