summaryrefslogtreecommitdiff
path: root/src/adv_monitor.c
diff options
context:
space:
mode:
authorMiao-chen Chou <mcchou@chromium.org>2020-09-11 23:51:21 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-09-14 12:34:34 -0700
commit1b32562b7075570d63ebbcc534aca6b0102353fa (patch)
treea80ddd8abf3b7362eb602608256526ab290e9d04 /src/adv_monitor.c
parent1a515e154e524010cfa5a56f1be13bdab3009024 (diff)
downloadbluez-1b32562b7075570d63ebbcc534aca6b0102353fa.tar.gz
adv_monitor: Introduce org.bluez.AdvertisementMonitorManager1 interface
This introduces the org.bluez.AdvertisementMonitorManager1 without implementing handlers of methods and properties. The following test was performed. - Upon adapter registration, the info line of creating an ADV monitor manager gets printed, and system bus emits the interface events of org.bluez.AdvertisementMonitorManager1.
Diffstat (limited to 'src/adv_monitor.c')
-rw-r--r--src/adv_monitor.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/adv_monitor.c b/src/adv_monitor.c
new file mode 100644
index 000000000..ad3f64cbe
--- /dev/null
+++ b/src/adv_monitor.c
@@ -0,0 +1,147 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2020 Google LLC
+ *
+ *
+ * This program 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 program 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
+
+#define _GNU_SOURCE
+#include <stdint.h>
+
+#include <glib.h>
+#include <dbus/dbus.h>
+#include <gdbus/gdbus.h>
+
+#include "adapter.h"
+#include "dbus-common.h"
+#include "log.h"
+#include "src/shared/mgmt.h"
+#include "src/shared/util.h"
+
+#include "adv_monitor.h"
+
+#define ADV_MONITOR_MGR_INTERFACE "org.bluez.AdvertisementMonitorManager1"
+
+struct btd_adv_monitor_manager {
+ struct btd_adapter *adapter;
+ struct mgmt *mgmt;
+ uint16_t adapter_id;
+};
+
+static const GDBusMethodTable adv_monitor_methods[] = {
+ { GDBUS_EXPERIMENTAL_METHOD("RegisterMonitor",
+ GDBUS_ARGS({ "application", "o" }),
+ NULL, NULL) },
+ { GDBUS_EXPERIMENTAL_ASYNC_METHOD("UnregisterMonitor",
+ GDBUS_ARGS({ "application", "o" }),
+ NULL, NULL) },
+ { }
+};
+
+static const GDBusPropertyTable adv_monitor_properties[] = {
+ {"SupportedMonitorTypes", "as", NULL, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL},
+ {"SupportedFeatures", "as", NULL, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL},
+ { }
+};
+
+/* Allocates a manager object */
+static struct btd_adv_monitor_manager *manager_new(
+ struct btd_adapter *adapter,
+ struct mgmt *mgmt)
+{
+ struct btd_adv_monitor_manager *manager;
+
+ if (!adapter || !mgmt)
+ return NULL;
+
+ manager = new0(struct btd_adv_monitor_manager, 1);
+ if (!manager)
+ return NULL;
+
+ manager->adapter = adapter;
+ manager->mgmt = mgmt_ref(mgmt);
+ manager->adapter_id = btd_adapter_get_index(adapter);
+
+ return manager;
+}
+
+/* Frees a manager object */
+static void manager_free(struct btd_adv_monitor_manager *manager)
+{
+ mgmt_unref(manager->mgmt);
+
+ free(manager);
+}
+
+/* Destroys a manager object and unregisters its D-Bus interface */
+static void manager_destroy(struct btd_adv_monitor_manager *manager)
+{
+ if (!manager)
+ return;
+
+ g_dbus_unregister_interface(btd_get_dbus_connection(),
+ adapter_get_path(manager->adapter),
+ ADV_MONITOR_MGR_INTERFACE);
+
+ manager_free(manager);
+}
+
+/* Creates a manager and registers its D-Bus interface */
+struct btd_adv_monitor_manager *btd_adv_monitor_manager_create(
+ struct btd_adapter *adapter,
+ struct mgmt *mgmt)
+{
+ struct btd_adv_monitor_manager *manager;
+
+ manager = manager_new(adapter, mgmt);
+ if (!manager)
+ return NULL;
+
+ if (!g_dbus_register_interface(btd_get_dbus_connection(),
+ adapter_get_path(manager->adapter),
+ ADV_MONITOR_MGR_INTERFACE,
+ adv_monitor_methods, NULL,
+ adv_monitor_properties, manager,
+ NULL)) {
+ btd_error(manager->adapter_id,
+ "Failed to register "
+ ADV_MONITOR_MGR_INTERFACE);
+ manager_free(manager);
+ return NULL;
+ }
+
+ btd_info(manager->adapter_id,
+ "Adv Monitor Manager created for adapter %s",
+ adapter_get_path(manager->adapter));
+
+ return manager;
+}
+
+/* Destroys a manager and unregisters its D-Bus interface */
+void btd_adv_monitor_manager_destroy(struct btd_adv_monitor_manager *manager)
+{
+ if (!manager)
+ return;
+
+ btd_info(manager->adapter_id, "Destroy Adv Monitor Manager");
+
+ manager_destroy(manager);
+}