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:
parent
dddc70455b
commit
96c4f3a707
2 changed files with 76 additions and 0 deletions
|
@ -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
|
||||
* @message: Pointer to incoming dbus message
|
||||
|
|
|
@ -41,6 +41,12 @@ dbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
|
|||
size_t array_len,
|
||||
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,
|
||||
struct wpa_global *global);
|
||||
|
||||
|
|
Loading…
Reference in a new issue