summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-03-16 16:33:07 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-05-12 13:31:53 -0700
commitfe16cf2a7ee343e6741bc1ef8f45f4f9dbf5c8a2 (patch)
treec45b5fb5a32e6aaa528b56595c8dc8d9eec0b307
parent24b4ba1a393618b0c6b3b33f6eaa1371bfe97a6f (diff)
downloadbluez-fe16cf2a7ee343e6741bc1ef8f45f4f9dbf5c8a2.tar.gz
client/player: Add support to Max Transports in endpoint.register
[bluetooth]# endpoint.register 00002bc9-0000-1000-8000-00805f9b34fb 0x06 [/local/endpoint/ep0] Auto Accept (yes/no): y [/local/endpoint/ep0] Max Transports (auto/value): 1 [/local/endpoint/ep0] CIG (auto/value): a [/local/endpoint/ep0] CIS (auto/value): a
-rw-r--r--client/player.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/client/player.c b/client/player.c
index 4674bd644..d14292874 100644
--- a/client/player.c
+++ b/client/player.c
@@ -73,6 +73,7 @@ struct endpoint {
struct iovec *meta;
bool auto_accept;
bool acquiring;
+ uint8_t max_transports;
uint8_t cig;
uint8_t cis;
char *transport;
@@ -1056,6 +1057,16 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn,
print_iter("\t", "Properties", &props);
free(ep->transport);
+
+ if (!ep->max_transports) {
+ bt_shell_printf("Maximum transports reached: rejecting\n");
+ return g_dbus_create_error(msg,
+ "org.bluez.Error.Rejected",
+ "Maximum transports reached");
+ }
+
+ ep->max_transports--;
+
ep->transport = strdup(path);
if (ep->auto_accept) {
@@ -1555,6 +1566,13 @@ static DBusMessage *endpoint_select_configuration(DBusConnection *conn,
bt_shell_printf("Endpoint: SelectConfiguration\n");
print_iter("\t", "Capabilities", &args);
+ if (!ep->max_transports) {
+ bt_shell_printf("Maximum transports reached: rejecting\n");
+ return g_dbus_create_error(msg,
+ "org.bluez.Error.Rejected",
+ "Maximum transports reached");
+ }
+
if (!ep->auto_accept) {
ep->msg = dbus_message_ref(msg);
bt_shell_prompt_input("Endpoint", "Enter preset/configuration:",
@@ -1571,8 +1589,11 @@ static DBusMessage *endpoint_select_configuration(DBusConnection *conn,
reply = endpoint_select_config_reply(msg, p->data.iov_base,
p->data.iov_len);
- if (!reply)
- return NULL;
+ if (!reply) {
+ reply = g_dbus_create_error(msg, "org.bluez.Error.Rejected",
+ NULL);
+ return reply;
+ }
bt_shell_printf("Auto Accepting using %s...\n", p->name);
@@ -1762,6 +1783,13 @@ static DBusMessage *endpoint_select_properties(DBusConnection *conn,
bt_shell_printf("Endpoint: SelectProperties\n");
print_iter("\t", "Properties", &args);
+ if (!ep->max_transports) {
+ bt_shell_printf("Maximum transports reached: rejecting\n");
+ return g_dbus_create_error(msg,
+ "org.bluez.Error.Rejected",
+ "Maximum transports reached");
+ }
+
if (!ep->auto_accept) {
ep->msg = dbus_message_ref(msg);
bt_shell_prompt_input("Endpoint", "Enter preset/configuration:",
@@ -1787,6 +1815,9 @@ static DBusMessage *endpoint_clear_configuration(DBusConnection *conn,
{
struct endpoint *ep = user_data;
+ if (ep->max_transports != UINT8_MAX)
+ ep->max_transports++;
+
free(ep->transport);
ep->transport = NULL;
@@ -2118,12 +2149,37 @@ static void endpoint_cig(const char *input, void *user_data)
bt_shell_prompt_input(ep->path, "CIS (auto/value):", endpoint_cis, ep);
}
+static void endpoint_max_transports(const char *input, void *user_data)
+{
+ struct endpoint *ep = user_data;
+ char *endptr = NULL;
+ int value;
+
+ if (!strcasecmp(input, "a") || !strcasecmp(input, "auto")) {
+ ep->max_transports = UINT8_MAX;
+ } else {
+ value = strtol(input, &endptr, 0);
+
+ if (!endptr || *endptr != '\0' || value > UINT8_MAX) {
+ bt_shell_printf("Invalid argument: %s\n", input);
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+
+ ep->max_transports = value;
+ }
+
+ bt_shell_prompt_input(ep->path, "CIG (auto/value):", endpoint_cig, ep);
+}
+
static void endpoint_auto_accept(const char *input, void *user_data)
{
struct endpoint *ep = user_data;
if (!strcasecmp(input, "y") || !strcasecmp(input, "yes")) {
ep->auto_accept = true;
+ bt_shell_prompt_input(ep->path, "Max Transports (auto/value):",
+ endpoint_max_transports, ep);
+ return;
} else if (!strcasecmp(input, "n") || !strcasecmp(input, "no")) {
ep->auto_accept = false;
} else {
@@ -2861,6 +2917,7 @@ static void register_endpoints(GDBusProxy *proxy)
continue;
ep = endpoint_new(cap);
+ ep->max_transports = UINT8_MAX;
ep->auto_accept = true;
ep->cig = BT_ISO_QOS_CIG_UNSET;
ep->cis = BT_ISO_QOS_CIS_UNSET;