summaryrefslogtreecommitdiff
path: root/mesh/dbus.c
diff options
context:
space:
mode:
authorInga Stotland <inga.stotland@intel.com>2018-12-14 13:48:59 -0800
committerBrian Gix <brian.gix@intel.com>2019-01-08 08:26:04 -0800
commit82e5d87fac3f6ca905a3a58ac70549cc7065b062 (patch)
tree52c905c9b9ff254aa24c33a7a01138311bcf4646 /mesh/dbus.c
parente3512c74016071aa15ef8984ca3ebc606053e645 (diff)
downloadbluez-82e5d87fac3f6ca905a3a58ac70549cc7065b062.tar.gz
mesh: Add utilities for DBus support
These files implement helper routines for common D-Bus functionality.
Diffstat (limited to 'mesh/dbus.c')
-rw-r--r--mesh/dbus.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/mesh/dbus.c b/mesh/dbus.c
new file mode 100644
index 000000000..3b2e2aa81
--- /dev/null
+++ b/mesh/dbus.c
@@ -0,0 +1,151 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2018 Intel Corporation. All rights reserved.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <time.h>
+#include <ell/ell.h>
+#include <json-c/json.h>
+
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+
+#include "src/shared/mgmt.h"
+
+#include "mesh/mesh-defs.h"
+#include "mesh/mesh-io.h"
+#include "mesh/node.h"
+#include "mesh/net.h"
+#include "mesh/storage.h"
+#include "mesh/cfgmod.h"
+#include "mesh/model.h"
+#include "mesh/mesh.h"
+#include "mesh/error.h"
+#include "mesh/dbus.h"
+
+static struct l_dbus *dbus;
+
+struct error_entry {
+ const char *dbus_err;
+ const char *default_desc;
+};
+
+/*
+ * Important: The entries in this table follow the order of
+ * enumerated values in mesh_error (file error.h)
+ */
+static struct error_entry const error_table[] =
+{
+ { NULL, NULL },
+ { ERROR_INTERFACE ".Failed", "Operation failed" },
+ { ERROR_INTERFACE ".NotAuthorized", "Permission denied"},
+ { ERROR_INTERFACE ".NotFound", "Object not found"},
+ { ERROR_INTERFACE ".InvalidArgs", "Invalid arguments"},
+ { ERROR_INTERFACE ".InProgress", "Already in progress"},
+ { ERROR_INTERFACE ".AlreadyExists", "Already exists"},
+ { ERROR_INTERFACE ".DoesNotExist", "Does not exist"},
+ { ERROR_INTERFACE ".Canceled", "Operation canceled"}
+};
+
+struct l_dbus_message *dbus_error(struct l_dbus_message *msg, int err,
+ const char *description)
+{
+ int array_len = L_ARRAY_SIZE(error_table);
+
+ /* Default to ".Failed" */
+ if (!err || err >= array_len)
+ err = MESH_ERROR_FAILED;
+
+ if (description)
+ return l_dbus_message_new_error(msg,
+ error_table[err].dbus_err,
+ "%s", description);
+ else
+ return l_dbus_message_new_error(msg,
+ error_table[err].dbus_err,
+ "%s", error_table[err].default_desc);
+}
+
+struct l_dbus *dbus_get_bus(void)
+{
+ return dbus;
+}
+
+bool dbus_init(struct l_dbus *bus)
+{
+ /* Network interface */
+ if (!mesh_dbus_init(bus))
+ return false;
+
+ /* Node interface */
+ if (!node_dbus_init(bus))
+ return false;
+
+ dbus = bus;
+
+ return true;
+}
+
+bool dbus_match_interface(struct l_dbus_message_iter *interfaces,
+ const char *match)
+{
+ const char *interface;
+ struct l_dbus_message_iter properties;
+
+ while (l_dbus_message_iter_next_entry(interfaces, &interface,
+ &properties)) {
+ if (!strcmp(match, interface))
+ return true;
+ }
+
+ return false;
+}
+
+bool dbus_append_byte_array(struct l_dbus_message_builder *builder,
+ const uint8_t *data, int len)
+{
+ int i;
+
+ if (!l_dbus_message_builder_enter_array(builder, "y"))
+ return false;
+
+ for (i = 0; i < len; i++)
+ if (!l_dbus_message_builder_append_basic(builder, 'y',
+ data + i))
+ return false;
+
+ if (!l_dbus_message_builder_leave_array(builder))
+ return false;
+
+ return true;
+}
+
+void dbus_append_dict_entry_basic(struct l_dbus_message_builder *builder,
+ const char *key, const char *signature,
+ const void *data)
+{
+ l_dbus_message_builder_enter_dict(builder, "sv");
+ l_dbus_message_builder_append_basic(builder, 's', key);
+ l_dbus_message_builder_enter_variant(builder, signature);
+ l_dbus_message_builder_append_basic(builder, signature[0], data);
+ l_dbus_message_builder_leave_variant(builder);
+ l_dbus_message_builder_leave_dict(builder);
+}