diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-03-16 16:33:07 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-05-12 13:31:53 -0700 |
commit | fe16cf2a7ee343e6741bc1ef8f45f4f9dbf5c8a2 (patch) | |
tree | c45b5fb5a32e6aaa528b56595c8dc8d9eec0b307 | |
parent | 24b4ba1a393618b0c6b3b33f6eaa1371bfe97a6f (diff) | |
download | bluez-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.c | 61 |
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; |