client/player: Add support to Max Transports in endpoint.register
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 16 Mar 2023 23:33:07 +0000 (16:33 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 10:41:34 +0000 (16:11 +0530)
[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

client/player.c

index 83a2ccc..b714093 100644 (file)
@@ -72,6 +72,7 @@ struct endpoint {
        struct iovec *meta;
        bool auto_accept;
        bool acquiring;
+       uint8_t max_transports;
        uint8_t cig;
        uint8_t cis;
        char *transport;
@@ -1055,6 +1056,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) {
@@ -1554,6 +1565,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:",
@@ -1570,8 +1588,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);
 
@@ -1761,6 +1782,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:",
@@ -1786,6 +1814,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;
 
@@ -2117,12 +2148,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 {
@@ -2860,6 +2916,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;