dbus: utility to create dbus message from wpabuf array

If a wpabuf array is used to store basic typed data that we would like
to send over D-Bus then this utility will be of help when it places the
data in a variant with format aa? (array of an array of type ?, with ?
indicating any basic type).

Signed-hostap: Jayant Sane <jayant.sane@intel.com>
Signed-hostap: Angie Chinchilla <angie.v.chinchilla@intel.com>
intended-for: hostap-1
This commit is contained in:
Jayant Sane 2012-02-25 10:45:17 +02:00 committed by Jouni Malinen
parent dddc70455b
commit 96c4f3a707
2 changed files with 76 additions and 0 deletions

View file

@ -447,6 +447,76 @@ dbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
} }
/**
* wpas_dbus_simple_array_array_property_getter - Get array array type property
* @iter: Pointer to incoming dbus message iterator
* @type: DBus type of property array elements (must be basic type)
* @array: pointer to array of elements to put into response message
* @array_len: length of above array
* @error: a pointer to an error to fill on failure
* Returns: TRUE if the request succeeded, FALSE if it failed
*
* Generic getter for array type properties. Array elements type is
* required to be basic.
*/
dbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
const int type,
struct wpabuf **array,
size_t array_len,
DBusError *error)
{
DBusMessageIter variant_iter, array_iter;
char type_str[] = "aa?";
char inner_type_str[] = "a?";
const char *sub_type_str;
size_t i;
if (!dbus_type_is_basic(type)) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"%s: given type is not basic", __func__);
return FALSE;
}
sub_type_str = wpa_dbus_type_as_string(type);
type_str[2] = sub_type_str[0];
inner_type_str[1] = sub_type_str[0];
if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
type_str, &variant_iter)) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"%s: failed to construct message 1", __func__);
return FALSE;
}
if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
inner_type_str, &array_iter)) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"%s: failed to construct message 2", __func__);
return FALSE;
}
for (i = 0; i < array_len; i++) {
wpa_dbus_dict_bin_array_add_element(&array_iter,
wpabuf_head(array[i]),
wpabuf_len(array[i]));
}
if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"%s: failed to close message 2", __func__);
return FALSE;
}
if (!dbus_message_iter_close_container(iter, &variant_iter)) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"%s: failed to close message 1", __func__);
return FALSE;
}
return TRUE;
}
/** /**
* wpas_dbus_handler_create_interface - Request registration of a network iface * wpas_dbus_handler_create_interface - Request registration of a network iface
* @message: Pointer to incoming dbus message * @message: Pointer to incoming dbus message

View file

@ -41,6 +41,12 @@ dbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
size_t array_len, size_t array_len,
DBusError *error); DBusError *error);
dbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
const int type,
struct wpabuf **array,
size_t array_len,
DBusError *error);
DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
struct wpa_global *global); struct wpa_global *global);