From: Enlightenment S. <no-...@en...> - 2008-10-29 07:14:11
|
Log: Start rework of nm interface. Make the nm interface more object like. Author: englebass Date: 2008-10-29 00:14:05 -0700 (Wed, 29 Oct 2008) New Revision: 37294 Modified: trunk/e_dbus/src/bin/nm.c trunk/e_dbus/src/lib/nm/E_Nm.h trunk/e_dbus/src/lib/nm/e_nm_device.c trunk/e_dbus/src/lib/nm/e_nm_manager.c trunk/e_dbus/src/lib/nm/e_nm_private.h trunk/e_dbus/src/lib/nm/e_nm_util.c Modified: trunk/e_dbus/src/bin/nm.c =================================================================== --- trunk/e_dbus/src/bin/nm.c 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/bin/nm.c 2008-10-29 07:14:05 UTC (rev 37294) @@ -13,251 +13,27 @@ }; static void -cb_manager_get_udi(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - char *udi; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &udi); - - printf("Got udi: %s\n", udi); -} - -static void -cb_manager_get_interface(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - char *interface; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &interface); - - printf("Got interface: %s\n", interface); -} - -static void -cb_manager_get_driver(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - char *driver; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &driver); - - printf("Got driver: %s\n", driver); -} - -static void -cb_manager_get_capabilities(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - dbus_uint32_t caps; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &caps); - - printf("Got capabilities:\n"); - if (caps & E_NM_DEVICE_CAP_NM_SUPPORTED) - printf("\tNM_DEVICE_CAP_NM_SUPPORTED\n"); - if (caps & E_NM_DEVICE_CAP_CARRIER_DETECT) - printf("\tNM_DEVICE_CAP_CARRIER_DETECT\n"); - if (!caps) - printf("\tNM_DEVICE_CAP_NONE\n"); - -} - -static void -cb_manager_get_ip4address(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - dbus_int32_t ip; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &ip); - - printf("Got IPv4 address: %i.%i.%i.%i\n", - (ip & 0xff), - ((ip >> 8 ) & 0xff), - ((ip >> 16) & 0xff), - ((ip >> 24) & 0xff) - ); -} - -static void -cb_manager_get_state(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - dbus_uint32_t state; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &state); - - printf("Got state: %i = ", state); - switch (state) - { - case E_NM_DEVICE_STATE_UNKNOWN: - printf("NM_DEVICE_STATE_UNKNOWN\n"); - break; - case E_NM_DEVICE_STATE_DOWN: - printf("NM_DEVICE_STATE_DOWN\n"); - break; - case E_NM_DEVICE_STATE_DISCONNECTED: - printf("NM_DEVICE_STATE_DISCONNECTED\n"); - break; - case E_NM_DEVICE_STATE_PREPARE: - printf("NM_DEVICE_STATE_PREPARE\n"); - break; - case E_NM_DEVICE_STATE_CONFIG: - printf("NM_DEVICE_STATE_CONFIG\n"); - break; - case E_NM_DEVICE_STATE_NEED_AUTH: - printf("NM_DEVICE_STATE_NEED_AUTH\n"); - break; - case E_NM_DEVICE_STATE_IP_CONFIG: - printf("NM_DEVICE_STATE_IP_CONFIG\n"); - break; - case E_NM_DEVICE_STATE_ACTIVATED: - printf("NM_DEVICE_STATE_ACTIVATED\n"); - break; - case E_NM_DEVICE_STATE_FAILED: - printf("NM_DEVICE_STATE_FAILED\n"); - break; - case E_NM_DEVICE_STATE_CANCELLED: - printf("NM_DEVICE_STATE_CANCELLED\n"); - break; - } -} - -static void -cb_manager_get_ip4config(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - char *ip4config; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &ip4config); - - printf("Got IPv4 config path: %s\n", ip4config); -} - -static void -cb_manager_get_carrier(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - dbus_uint32_t carrier; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &carrier); - - printf("Got carrier: %i\n", carrier); -} - -static void -cb_manager_get_type(void *data, void *reply, DBusError *err) -{ - DBusMessageIter iter, sub; - dbus_uint32_t type; - - if (dbus_error_is_set(err)) - { - printf("Error: %s - %s\n", err->name, err->message); - return; - } - - dbus_message_iter_init(reply, &iter); - dbus_message_iter_recurse(&iter, &sub); - dbus_message_iter_get_basic(&sub, &type); - - printf("Got type: %i (1 = ethernet, 2 = wireless)\n", type); -} - -static void cb_manager_get_devices(void *data, void *reply, DBusError *err) { NM_Manager *app = data; - const char *dev; + E_NM_Device *device; if (dbus_error_is_set(err)) { printf("Error: %s - %s\n", err->name, err->message); + ecore_list_destroy(reply); + ecore_main_loop_quit(); return; } app->devices = reply; ecore_list_first_goto(app->devices); - printf("Got devices:\n"); - while ((dev = ecore_list_next(app->devices))) + while ((device = ecore_list_next(app->devices))) { - printf("%s\n", dev); - e_nm_device_get_udi(app->ctx, dev, cb_manager_get_udi, app); - e_nm_device_get_interface(app->ctx, dev, cb_manager_get_interface, app); - e_nm_device_get_driver(app->ctx, dev, cb_manager_get_driver, app); - e_nm_device_get_capabilities(app->ctx, dev, cb_manager_get_capabilities, app); - e_nm_device_get_ip4address(app->ctx, dev, cb_manager_get_ip4address, app); - e_nm_device_get_state(app->ctx, dev, cb_manager_get_state, app); - /* FIXME: Getting the ip4config needs fixing */ - //e_nm_device_get_ip4config(app->ctx, dev, cb_manager_get_ip4config, app); - /* FIXME: Only call this when the device supports it */ - // e_nm_device_get_carrier(app->ctx, dev, cb_manager_get_carrier, app); - e_nm_device_get_type(app->ctx, dev, cb_manager_get_type, app); - } + e_nm_device_dump_device(device); + } + ecore_list_destroy(app->devices); + ecore_main_loop_quit(); } int Modified: trunk/e_dbus/src/lib/nm/E_Nm.h =================================================================== --- trunk/e_dbus/src/lib/nm/E_Nm.h 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/lib/nm/E_Nm.h 2008-10-29 07:14:05 UTC (rev 37294) @@ -61,10 +61,11 @@ char *interface; char *driver; E_NM_Device_Cap capabilities; - int ip4address; + unsigned int ip4address; E_NM_Device_State state; char *ip4config; /* object_path */ - unsigned char managed; + char *dhcp4config; /* object_path */ + dbus_bool_t managed; unsigned int device_type; }; @@ -165,25 +166,12 @@ /* org.freedesktop.NetworkManager.Device api */ - EAPI int e_nm_device_get_udi(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_interface(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_driver(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_capabilities(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_ip4address(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_state(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_ip4config(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_carrier(E_NM_Context *ctx, const char *device, + EAPI int e_nm_device_get_device(E_NM_Context *ctx, const char *device, E_DBus_Callback_Func cb_func, void *data); - EAPI int e_nm_device_get_type(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data); + EAPI void e_nm_device_free_device(E_NM_Device *device); + EAPI void e_nm_device_dump_device(E_NM_Device *device); + /* org.freedesktop.NetworkManager.Devices api */ /* TODO: EAPI int e_nm_network_get_name() */ /* TODO: EAPI int e_nm_network_get_address() */ Modified: trunk/e_dbus/src/lib/nm/e_nm_device.c =================================================================== --- trunk/e_dbus/src/lib/nm/e_nm_device.c 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/lib/nm/e_nm_device.c 2008-10-29 07:14:05 UTC (rev 37294) @@ -7,159 +7,244 @@ #include "e_nm_private.h" #include <Ecore_Data.h> +#include <string.h> -/** - * Get the UDI of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_udi(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) +static void +cb_nm_device_properties(void *data, DBusMessage *msg, DBusError *err) { - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Udi", cb_func, data); -} + DBusMessageIter iter, a_iter; + E_NM_Data *d; + E_NM_Device *device = NULL; + DBusError new_err; + d = data; + if (dbus_error_is_set(err)) + { + d->cb_func(d->data, NULL, err); + free(d); + return; + } + dbus_error_init(&new_err); + if (!dbus_message_has_signature(msg, "a{sv}")) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_SIGNATURE, ""); + goto error; + } + device = calloc(1, sizeof(E_NM_Device)); + if (!device) + { + dbus_set_error(&new_err, DBUS_ERROR_NO_MEMORY, ""); + goto error; + } -/** - * Get the interface name of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_interface(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) -{ - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Interface", cb_func, data); -} + 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; -/** - * Get the driver name of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_driver(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) -{ - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Driver", cb_func, data); -} + 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, "Udi")) + { + if (!nm_check_arg_type(&v_iter, 's')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &value); + device->udi = strdup(value); + } + else if (!strcmp(name, "Interface")) + { + if (!nm_check_arg_type(&v_iter, 's')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &value); + device->interface = strdup(value); + } + else if (!strcmp(name, "Driver")) + { + if (!nm_check_arg_type(&v_iter, 's')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &value); + device->driver = strdup(value); + } + else if (!strcmp(name, "Capabilities")) + { + if (!nm_check_arg_type(&v_iter, 'u')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &(device->capabilities)); + } + else if (!strcmp(name, "Ip4Address")) + { + if (!nm_check_arg_type(&v_iter, 'u')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &(device->ip4address)); + } + else if (!strcmp(name, "State")) + { + if (!nm_check_arg_type(&v_iter, 'u')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &(device->state)); + } + else if (!strcmp(name, "Ip4Config")) + { + if (!nm_check_arg_type(&v_iter, 'o')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &value); + device->ip4config = strdup(value); + } + else if (!strcmp(name, "Dhcp4Config")) + { + if (!nm_check_arg_type(&v_iter, 'o')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &value); + device->dhcp4config = strdup(value); + } + else if (!strcmp(name, "Managed")) + { + if (!nm_check_arg_type(&v_iter, 'b')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &(device->managed)); + } + else if (!strcmp(name, "DeviceType")) + { + if (!nm_check_arg_type(&v_iter, 'u')) + { + dbus_set_error(&new_err, DBUS_ERROR_INVALID_ARGS, "Wrong arg for %s", name); + goto error; + } + dbus_message_iter_get_basic(&v_iter, &(device->device_type)); + } + dbus_message_iter_next(&a_iter); + } -/** - * Get the capabilities of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_capabilities(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) -{ - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Capabilities", cb_func, data); -} + d->cb_func(d->data, device, &new_err); + dbus_error_free(&new_err); + free(d); + return; - -/** - * Get the IPv4 address of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_ip4address(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) -{ - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Ip4Address", cb_func, data); +error: + if (device) e_nm_device_free_device(device); + d->cb_func(d->data, NULL, &new_err); + dbus_error_free(&new_err); + free(d); } - -/** - * Get the state of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ EAPI int -e_nm_device_get_state(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) +e_nm_device_get_device(E_NM_Context *ctx, const char *device, + E_DBus_Callback_Func cb_func, void *data) { - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "State", cb_func, data); -} + E_NM_Data *d; + d = calloc(1, sizeof(E_NM_Data)); + d->ctx = ctx; + d->cb_func = cb_func; + d->data = data; -/** - * Get the IPv4 config object path of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_ip4config(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) -{ - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Ip4Config", cb_func, data); + return e_dbus_properties_get_all(ctx->conn, E_NM_SERVICE, device, + E_NM_INTERFACE_DEVICE, cb_nm_device_properties, + d) ? 1 : 0; } - -/** - * Get the carrier status of a NetworkManager device - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_carrier(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) +EAPI void +e_nm_device_free_device(E_NM_Device *device) { - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "Carrier", cb_func, data); + if (!device) return; + if (device->udi) free(device->udi); + if (device->interface) free(device->interface); + if (device->driver) free(device->driver); + if (device->ip4config) free(device->ip4config); + if (device->dhcp4config) free(device->dhcp4config); + free(device); } - -/** - * Return the type of a an NM device: - * - * 0: unknown - * 1: wired - * 2: wireless - * - * @param ctx an e_nm context - * @param device a NetworkManager device to communicate with - * @param cb a callback, used when the method returns (or an error is received) - * @param data user data to pass to the callback function - */ -EAPI int -e_nm_device_get_type(E_NM_Context *ctx, const char *device, - E_DBus_Callback_Func cb_func, void *data) +EAPI void +e_nm_device_dump_device(E_NM_Device *device) { - /* FIXME: Decide how to handle the return value for this functions */ - e_nm_device_properties_get(ctx->conn, device, "DeviceType", cb_func, data); + if (!device) return; + printf("udi : %s\n", device->udi); + printf("interface : %s\n", device->interface); + printf("driver : %s\n", device->driver); + printf("capabilities:"); + if (device->capabilities & E_NM_DEVICE_CAP_NM_SUPPORTED) + printf(" E_NM_DEVICE_CAP_NM_SUPPORTED"); + if (device->capabilities & E_NM_DEVICE_CAP_CARRIER_DETECT) + printf(" E_NM_DEVICE_CAP_CARRIER_DETECT"); + if (device->capabilities == E_NM_DEVICE_CAP_NONE) + printf(" E_NM_DEVICE_CAP_NONE"); + printf("\n"); + printf("ip4address : %i.%i.%i.%i\n", + ((device->ip4address ) & 0xff), + ((device->ip4address >> 8 ) & 0xff), + ((device->ip4address >> 16) & 0xff), + ((device->ip4address >> 24) & 0xff) + ); + printf("state : "); + switch (device->state) + { + case E_NM_DEVICE_STATE_UNKNOWN: + printf("E_NM_DEVICE_STATE_UNKNOWN\n"); + break; + case E_NM_DEVICE_STATE_DOWN: + printf("E_NM_DEVICE_STATE_DOWN\n"); + break; + case E_NM_DEVICE_STATE_DISCONNECTED: + printf("E_NM_DEVICE_STATE_DISCONNECTED\n"); + break; + case E_NM_DEVICE_STATE_PREPARE: + printf("E_NM_DEVICE_STATE_PREPARE\n"); + break; + case E_NM_DEVICE_STATE_CONFIG: + printf("E_NM_DEVICE_STATE_CONFIG\n"); + break; + case E_NM_DEVICE_STATE_NEED_AUTH: + printf("E_NM_DEVICE_STATE_NEED_AUTH\n"); + break; + case E_NM_DEVICE_STATE_IP_CONFIG: + printf("E_NM_DEVICE_STATE_IP_CONFIG\n"); + break; + case E_NM_DEVICE_STATE_ACTIVATED: + printf("E_NM_DEVICE_STATE_ACTIVATED\n"); + break; + case E_NM_DEVICE_STATE_FAILED: + printf("E_NM_DEVICE_STATE_FAILED\n"); + break; + case E_NM_DEVICE_STATE_CANCELLED: + printf("E_NM_DEVICE_STATE_CANCELLED\n"); + break; + } + printf("ip4config : %s\n", device->ip4config); + printf("dhcp4config : %s\n", device->dhcp4config); + printf("managed : %d\n", device->managed); + printf("device_type : %u\n", device->device_type); } Modified: trunk/e_dbus/src/lib/nm/e_nm_manager.c =================================================================== --- trunk/e_dbus/src/lib/nm/e_nm_manager.c 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/lib/nm/e_nm_manager.c 2008-10-29 07:14:05 UTC (rev 37294) @@ -1,7 +1,57 @@ #include "E_Nm.h" #include "e_nm_private.h" +static void +cb_nm_device(void *data, void *reply, DBusError *err) +{ + E_NM_Data *d; + E_NM_Device *device; + Ecore_List *list; + d = data; + list = d->reply; + if (!dbus_error_is_set(err)) + ecore_list_append(list, reply); + ecore_list_first_remove(list); + + ecore_list_first_goto(list); + if (ecore_list_current(list) != (void *)-1) + { + DBusError new_err; + + dbus_error_init(&new_err); + d->cb_func(d->data, list, &new_err); + dbus_error_free(&new_err); + free(d); + } +} + +static void +cb_nm_devices(void *data, void *reply, DBusError *err) +{ + E_NM_Data *d; + Ecore_List *devices; + Ecore_List *list; + const char *dev; + + d = data; + if (dbus_error_is_set(err)) + { + d->cb_func(d->data, NULL, err); + return; + } + devices = reply; + ecore_list_first_goto(devices); + list = ecore_list_new(); + ecore_list_free_cb_set(list, e_nm_device_free_device); + d->reply = list; + while ((dev = ecore_list_next(devices))) + { + ecore_list_append(list, (void *)-1); + e_nm_device_get_device(d->ctx, dev, cb_nm_device, d); + } +} + /** * Get all network devices. * @@ -16,11 +66,17 @@ e_nm_get_devices(E_NM_Context *ctx, E_DBus_Callback_Func cb_func, void *data) { DBusMessage *msg; + E_NM_Data *d; int ret; + d = calloc(1, sizeof(E_NM_Data)); + d->ctx = ctx; + d->cb_func = cb_func; + d->data = data; + msg = e_nm_manager_call_new("GetDevices"); - ret = e_dbus_method_call_send(ctx->conn, msg, cb_nm_string_list, cb_func, free_nm_string_list, -1, data) ? 1 : 0; + ret = e_dbus_method_call_send(ctx->conn, msg, cb_nm_object_path_list, cb_nm_devices, free_nm_object_path_list, -1, d) ? 1 : 0; dbus_message_unref(msg); return ret; } Modified: trunk/e_dbus/src/lib/nm/e_nm_private.h =================================================================== --- trunk/e_dbus/src/lib/nm/e_nm_private.h 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/lib/nm/e_nm_private.h 2008-10-29 07:14:05 UTC (rev 37294) @@ -18,6 +18,21 @@ #define e_nm_device_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, E_NM_SERVICE, dev, E_NM_INTERFACE_DEVICE, prop, (E_DBus_Method_Return_Cb) cb, data) +#define e_nm_device_properties_get_all(con, dev, cb, data) e_dbus_properties_get_all(con, E_NM_SERVICE, dev, E_NM_INTERFACE_DEVICE, (E_DBus_Method_Return_Cb) cb, data) + +#define E_NM_CHECK_SIGNATURE(msg, err, sig) \ + if (dbus_error_is_set((err))) \ + { \ + printf("Error: %s - %s\n", (err)->name, (err)->message); \ + return NULL; \ + } \ + \ + if (!dbus_message_has_signature((msg), (sig))) \ + { \ + dbus_set_error((err), DBUS_ERROR_INVALID_SIGNATURE, ""); \ + return NULL; \ + } + struct E_NM_Context { E_DBus_Connection *conn; @@ -32,6 +47,14 @@ void *data_manager_device_removed; }; +typedef struct E_NM_Data E_NM_Data; +struct E_NM_Data +{ + E_NM_Context *ctx; + E_DBus_Callback_Func cb_func; + void *data; + void *reply; +}; int e_nm_get_from_nm(E_NM_Context *ctx, E_DBus_Callback_Func cb_func, void *data, const char *method, int rettype); @@ -43,8 +66,10 @@ 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_string(DBusMessage *msg, DBusError *err); +void *cb_nm_object_path(DBusMessage *msg, DBusError *err); void *cb_nm_boolean(DBusMessage *msg, DBusError *err); -void *cb_nm_string_list(DBusMessage *msg, DBusError *err); -void free_nm_string_list(void *data); +void *cb_nm_object_path_list(DBusMessage *msg, DBusError *err); +void free_nm_object_path_list(void *data); + +int nm_check_arg_type(DBusMessageIter *iter, char type); #endif Modified: trunk/e_dbus/src/lib/nm/e_nm_util.c =================================================================== --- trunk/e_dbus/src/lib/nm/e_nm_util.c 2008-10-29 07:12:55 UTC (rev 37293) +++ trunk/e_dbus/src/lib/nm/e_nm_util.c 2008-10-29 07:14:05 UTC (rev 37294) @@ -14,8 +14,8 @@ { switch (rettype) { - case DBUS_TYPE_STRING: - return cb_nm_string; + case DBUS_TYPE_OBJECT_PATH: + return cb_nm_object_path; case DBUS_TYPE_INT32: return cb_nm_int32; @@ -95,8 +95,8 @@ msg = e_nm_device_call_new(device, method); ret = e_dbus_method_call_send(ctx->conn, msg, e_nm_callback_by_type(rettype), cb_func, - e_nm_free_by_type(rettype), - -1, data) ? 1 : 0; + e_nm_free_by_type(rettype), + -1, data) ? 1 : 0; dbus_message_unref(msg); return ret; } @@ -131,6 +131,8 @@ { dbus_int32_t *i; + E_NM_CHECK_SIGNATURE(msg, err, "i"); + i = malloc(sizeof(dbus_int32_t)); /* Actually emit the integer */ dbus_message_get_args(msg, err, @@ -149,6 +151,8 @@ { dbus_uint32_t *i; + E_NM_CHECK_SIGNATURE(msg, err, "u"); + i = malloc(sizeof(dbus_uint32_t)); /* Actually emit the unsigned integer */ dbus_message_get_args(msg, err, @@ -167,6 +171,8 @@ { dbus_bool_t *i; + E_NM_CHECK_SIGNATURE(msg, err, "b"); + i = malloc(sizeof(dbus_bool_t)); /* Actually emit the unsigned integer */ dbus_message_get_args(msg, err, @@ -178,16 +184,18 @@ /** * @internal - * @brief Callback for methods returning a single string + * @brief Callback for methods returning a single object path */ void * -cb_nm_string(DBusMessage *msg, DBusError *err) +cb_nm_object_path(DBusMessage *msg, DBusError *err) { char *str; - /* Actually emit the string */ + E_NM_CHECK_SIGNATURE(msg, err, "o"); + + /* Actually emit the object_path */ dbus_message_get_args(msg, err, - DBUS_TYPE_STRING, &str, + DBUS_TYPE_OBJECT_PATH, &str, DBUS_TYPE_INVALID); return str; @@ -196,17 +204,17 @@ /** * @internal - * @brief Callback for methods returning a list of strings or object paths + * @brief Callback for methods returning a list of object paths */ void * -cb_nm_string_list(DBusMessage *msg, DBusError *err) +cb_nm_object_path_list(DBusMessage *msg, DBusError *err) { Ecore_List *devices; DBusMessageIter iter, sub; + E_NM_CHECK_SIGNATURE(msg, err, "ao"); + dbus_message_iter_init(msg, &iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_OBJECT_PATH) return NULL; devices = ecore_list_new(); dbus_message_iter_recurse(&iter, &sub); @@ -223,10 +231,19 @@ } void -free_nm_string_list(void *data) +free_nm_object_path_list(void *data) { Ecore_List *list = data; if (list) ecore_list_destroy(list); } +int +nm_check_arg_type(DBusMessageIter *iter, char type) +{ + char sig; + + sig = dbus_message_iter_get_arg_type(iter); + return sig == type; +} + |