Blame mesh/dbus.c

Packit Service 8264ee
/*
Packit Service 8264ee
 *
Packit Service 8264ee
 *  BlueZ - Bluetooth protocol stack for Linux
Packit Service 8264ee
 *
Packit Service 8264ee
 *  Copyright (C) 2018-2019 Intel Corporation. All rights reserved.
Packit Service 8264ee
 *
Packit Service 8264ee
 *
Packit Service 8264ee
 *  This library is free software; you can redistribute it and/or
Packit Service 8264ee
 *  modify it under the terms of the GNU Lesser General Public
Packit Service 8264ee
 *  License as published by the Free Software Foundation; either
Packit Service 8264ee
 *  version 2.1 of the License, or (at your option) any later version.
Packit Service 8264ee
 *
Packit Service 8264ee
 *  This library is distributed in the hope that it will be useful,
Packit Service 8264ee
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 8264ee
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 8264ee
 *  Lesser General Public License for more details.
Packit Service 8264ee
 *
Packit Service 8264ee
 */
Packit Service 8264ee
Packit Service 8264ee
#ifdef HAVE_CONFIG_H
Packit Service 8264ee
#include <config.h>
Packit Service 8264ee
#endif
Packit Service 8264ee
Packit Service 8264ee
#include <ell/ell.h>
Packit Service 8264ee
Packit Service 8264ee
#include "mesh/mesh-defs.h"
Packit Service 8264ee
#include "mesh/node.h"
Packit Service 8264ee
#include "mesh/manager.h"
Packit Service 8264ee
#include "mesh/mesh.h"
Packit Service 8264ee
#include "mesh/error.h"
Packit Service 8264ee
#include "mesh/dbus.h"
Packit Service 8264ee
Packit Service 8264ee
static struct l_dbus *dbus;
Packit Service 8264ee
Packit Service 8264ee
struct error_entry {
Packit Service 8264ee
	const char *dbus_err;
Packit Service 8264ee
	const char *default_desc;
Packit Service 8264ee
};
Packit Service 8264ee
Packit Service 8264ee
/*
Packit Service 8264ee
 * Important: The entries in this table follow the order of
Packit Service 8264ee
 * enumerated values in mesh_error (file error.h)
Packit Service 8264ee
 */
Packit Service 8264ee
static struct error_entry const error_table[] =
Packit Service 8264ee
{
Packit Service 8264ee
	{ NULL, NULL },
Packit Service 8264ee
	{ ERROR_INTERFACE ".Failed", "Operation failed" },
Packit Service 8264ee
	{ ERROR_INTERFACE ".NotAuthorized", "Permission denied"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".NotFound", "Object not found"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".InvalidArgs", "Invalid arguments"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".InProgress", "Already in progress"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".AlreadyExists", "Already exists"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".DoesNotExist", "Does not exist"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".Canceled", "Operation canceled"},
Packit Service 8264ee
	{ ERROR_INTERFACE ".NotImplemented", "Not implemented"},
Packit Service 8264ee
};
Packit Service 8264ee
Packit Service 8264ee
struct l_dbus_message *dbus_error(struct l_dbus_message *msg, int err,
Packit Service 8264ee
							const char *description)
Packit Service 8264ee
{
Packit Service 8264ee
	int array_len = L_ARRAY_SIZE(error_table);
Packit Service 8264ee
Packit Service 8264ee
	/* Default to ".Failed" */
Packit Service 8264ee
	if (!err || err >= array_len)
Packit Service 8264ee
		err = MESH_ERROR_FAILED;
Packit Service 8264ee
Packit Service 8264ee
	if (description)
Packit Service 8264ee
		return l_dbus_message_new_error(msg,
Packit Service 8264ee
				error_table[err].dbus_err,
Packit Service 8264ee
				"%s", description);
Packit Service 8264ee
	else
Packit Service 8264ee
		return l_dbus_message_new_error(msg,
Packit Service 8264ee
				error_table[err].dbus_err,
Packit Service 8264ee
				"%s", error_table[err].default_desc);
Packit Service 8264ee
}
Packit Service 8264ee
Packit Service 8264ee
struct l_dbus *dbus_get_bus(void)
Packit Service 8264ee
{
Packit Service 8264ee
	return dbus;
Packit Service 8264ee
}
Packit Service 8264ee
Packit Service 8264ee
bool dbus_init(struct l_dbus *bus)
Packit Service 8264ee
{
Packit Service 8264ee
	/* Network interface */
Packit Service 8264ee
	if (!mesh_dbus_init(bus))
Packit Service 8264ee
		return false;
Packit Service 8264ee
Packit Service 8264ee
	/* Node interface */
Packit Service 8264ee
	if (!node_dbus_init(bus))
Packit Service 8264ee
		return false;
Packit Service 8264ee
Packit Service 8264ee
	/* Management interface */
Packit Service 8264ee
	if (!manager_dbus_init(bus))
Packit Service 8264ee
		return false;
Packit Service 8264ee
Packit Service 8264ee
	dbus = bus;
Packit Service 8264ee
Packit Service 8264ee
	return true;
Packit Service 8264ee
}
Packit Service 8264ee
Packit Service 8264ee
bool dbus_match_interface(struct l_dbus_message_iter *interfaces,
Packit Service 8264ee
							const char *match)
Packit Service 8264ee
{
Packit Service 8264ee
	const char *interface;
Packit Service 8264ee
	struct l_dbus_message_iter properties;
Packit Service 8264ee
Packit Service 8264ee
	while (l_dbus_message_iter_next_entry(interfaces, &interface,
Packit Service 8264ee
								&properties)) {
Packit Service 8264ee
		if (!strcmp(match, interface))
Packit Service 8264ee
			return true;
Packit Service 8264ee
	}
Packit Service 8264ee
Packit Service 8264ee
	return false;
Packit Service 8264ee
}
Packit Service 8264ee
Packit Service 8264ee
void dbus_append_byte_array(struct l_dbus_message_builder *builder,
Packit Service 8264ee
						const uint8_t *data, int len)
Packit Service 8264ee
{
Packit Service 8264ee
	int i;
Packit Service 8264ee
Packit Service 8264ee
	if (!builder)
Packit Service 8264ee
		return;
Packit Service 8264ee
Packit Service 8264ee
	l_dbus_message_builder_enter_array(builder, "y");
Packit Service 8264ee
Packit Service 8264ee
	for (i = 0; i < len; i++)
Packit Service 8264ee
		l_dbus_message_builder_append_basic(builder, 'y', data + i);
Packit Service 8264ee
Packit Service 8264ee
	l_dbus_message_builder_leave_array(builder);
Packit Service 8264ee
}
Packit Service 8264ee
Packit Service 8264ee
void dbus_append_dict_entry_basic(struct l_dbus_message_builder *builder,
Packit Service 8264ee
					const char *key, const char *signature,
Packit Service 8264ee
					const void *data)
Packit Service 8264ee
{
Packit Service 8264ee
	if (!builder)
Packit Service 8264ee
		return;
Packit Service 8264ee
Packit Service 8264ee
	l_dbus_message_builder_enter_dict(builder, "sv");
Packit Service 8264ee
	l_dbus_message_builder_append_basic(builder, 's', key);
Packit Service 8264ee
	l_dbus_message_builder_enter_variant(builder, signature);
Packit Service 8264ee
	l_dbus_message_builder_append_basic(builder, signature[0], data);
Packit Service 8264ee
	l_dbus_message_builder_leave_variant(builder);
Packit Service 8264ee
	l_dbus_message_builder_leave_dict(builder);
Packit Service 8264ee
}