2020-11-20 20:58:31

by Sonny Sasaka

[permalink] [raw]
Subject: [PATCH BlueZ v3 2/7] profiles/battery: Refactor to use battery library

This refactors profiles/battery to use the internal battery library that
handles the D-Bus intricacies so that profiles/battery only handles the
GATT BAS concerns.

Reviewed-by: Daniel Winkler <[email protected]>

---
profiles/battery/battery.c | 51 +++++++++++---------------------------
1 file changed, 15 insertions(+), 36 deletions(-)

diff --git a/profiles/battery/battery.c b/profiles/battery/battery.c
index 13c80d05c..e1a61dd0b 100644
--- a/profiles/battery/battery.c
+++ b/profiles/battery/battery.c
@@ -23,14 +23,11 @@

#include <glib.h>

-#include "gdbus/gdbus.h"
-
#include "lib/bluetooth.h"
#include "lib/hci.h"
#include "lib/sdp.h"
#include "lib/uuid.h"

-#include "src/dbus-common.h"
#include "src/shared/util.h"
#include "src/shared/att.h"
#include "src/shared/queue.h"
@@ -42,6 +39,7 @@
#include "src/profile.h"
#include "src/service.h"
#include "src/log.h"
+#include "src/battery.h"
#include "attrib/att.h"

#define BATTERY_INTERFACE "org.bluez.Battery1"
@@ -50,7 +48,7 @@

/* Generic Attribute/Access Service */
struct batt {
- char *path; /* D-Bus path of device */
+ struct btd_battery *battery;
struct btd_device *device;
struct gatt_db *db;
struct bt_gatt_client *client;
@@ -69,6 +67,8 @@ static void batt_free(struct batt *batt)
bt_gatt_client_unref(batt->client);
btd_device_unref(batt->device);
g_free (batt->initial_value);
+ if (batt->battery)
+ btd_battery_unregister(batt->battery);
g_free(batt);
}

@@ -81,11 +81,9 @@ static void batt_reset(struct batt *batt)
batt->client = NULL;
g_free (batt->initial_value);
batt->initial_value = NULL;
- if (batt->path) {
- g_dbus_unregister_interface(btd_get_dbus_connection(),
- batt->path, BATTERY_INTERFACE);
- g_free(batt->path);
- batt->path = NULL;
+ if (batt->battery) {
+ btd_battery_unregister(batt->battery);
+ batt->battery = NULL;
}
}

@@ -98,8 +96,11 @@ static void parse_battery_level(struct batt *batt,
if (batt->percentage != percentage) {
batt->percentage = percentage;
DBG("Battery Level updated: %d%%", percentage);
- g_dbus_emit_property_changed(btd_get_dbus_connection(), batt->path,
- BATTERY_INTERFACE, "Percentage");
+ if (!batt->battery) {
+ warn("Trying to update an unregistered battery");
+ return;
+ }
+ btd_battery_update(batt->battery, batt->percentage);
}
}

@@ -115,22 +116,6 @@ static void batt_io_value_cb(uint16_t value_handle, const uint8_t *value,
}
}

-static gboolean property_get_percentage(
- const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct batt *batt = data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, &batt->percentage);
-
- return TRUE;
-}
-
-static const GDBusPropertyTable battery_properties[] = {
- { "Percentage", "y", property_get_percentage },
- { }
-};
-
static void batt_io_ccc_written_cb(uint16_t att_ecode, void *user_data)
{
struct batt *batt = user_data;
@@ -141,13 +126,9 @@ static void batt_io_ccc_written_cb(uint16_t att_ecode, void *user_data)
return;
}

- if (g_dbus_register_interface(btd_get_dbus_connection(),
- batt->path, BATTERY_INTERFACE,
- NULL, NULL,
- battery_properties, batt,
- NULL) == FALSE) {
- error("Unable to register %s interface for %s",
- BATTERY_INTERFACE, batt->path);
+ batt->battery = btd_battery_register(device_get_path(batt->device));
+
+ if (!batt->battery) {
batt_reset(batt);
return;
}
@@ -321,8 +302,6 @@ static int batt_accept(struct btd_service *service)
return -1;
}

- batt->path = g_strdup (device_get_path(device));
-
btd_service_connecting_complete(service, 0);

return 0;
--
2.26.2