linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH BlueZ] shell: Allow multiple prompt inputs
@ 2019-02-22 11:42 Luiz Augusto von Dentz
  2019-02-25 12:24 ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2019-02-22 11:42 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This allow queueing input prompts so that the application don't have to
queue themselves.
---
 src/shared/shell.c | 66 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 58 insertions(+), 8 deletions(-)

diff --git a/src/shared/shell.c b/src/shared/shell.c
index 709d20556..d7fbf46aa 100644
--- a/src/shared/shell.c
+++ b/src/shared/shell.c
@@ -66,6 +66,12 @@ struct bt_shell_env {
 
 static char *cmplt = "help";
 
+struct bt_shell_prompt_input {
+	char *str;
+	bt_shell_prompt_input_func func;
+	void *user_data;
+};
+
 static struct {
 	bool init;
 	char *name;
@@ -81,6 +87,8 @@ static struct {
 	bt_shell_prompt_input_func saved_func;
 	void *saved_user_data;
 
+	struct queue *prompts;
+
 	const struct bt_shell_menu *menu;
 	const struct bt_shell_menu *main;
 	struct queue *submenus;
@@ -560,6 +568,17 @@ void bt_shell_usage()
 					data.exec->arg ? data.exec->arg : "");
 }
 
+static void prompt_input(const char *str, bt_shell_prompt_input_func func,
+							void *user_data)
+{
+	data.saved_prompt = true;
+	data.saved_func = func;
+	data.saved_user_data = user_data;
+
+	rl_save_prompt();
+	bt_shell_set_prompt(str);
+}
+
 void bt_shell_prompt_input(const char *label, const char *msg,
 			bt_shell_prompt_input_func func, void *user_data)
 {
@@ -568,25 +587,43 @@ void bt_shell_prompt_input(const char *label, const char *msg,
 	if (!data.init || data.mode)
 		return;
 
-	/* Normal use should not prompt for user input to the value a second
-	 * time before it releases the prompt, but we take a safe action. */
-	if (data.saved_prompt)
+	if (data.saved_prompt) {
+		struct bt_shell_prompt_input *prompt;
+
+		prompt = new0(struct bt_shell_prompt_input, 1);
+
+		if (asprintf(&prompt->str, "[%s] %s ", label, msg) < 0) {
+			free(prompt);
+			return;
+		}
+
+		prompt->func = func;
+		prompt->user_data = user_data;
+
+		queue_push_tail(data.prompts, prompt);
+
 		return;
+	}
 
 	if (asprintf(&str, "[%s] %s ", label, msg) < 0)
 		return;
 
-	data.saved_prompt = true;
-	data.saved_func = func;
-	data.saved_user_data = user_data;
+	prompt_input(str, func, user_data);
 
-	rl_save_prompt();
-	bt_shell_set_prompt(str);
 	free(str);
 }
 
+static void prompt_free(void *data)
+{
+	struct bt_shell_prompt_input *prompt = data;
+
+	free(prompt->str);
+	free(prompt);
+}
+
 int bt_shell_release_prompt(const char *input)
 {
+	struct bt_shell_prompt_input *prompt;
 	bt_shell_prompt_input_func func;
 	void *user_data;
 
@@ -600,11 +637,20 @@ int bt_shell_release_prompt(const char *input)
 	func = data.saved_func;
 	user_data = data.saved_user_data;
 
+	prompt = queue_pop_head(data.prompts);
+	if (prompt)
+		data.saved_prompt = true;
+
 	data.saved_func = NULL;
 	data.saved_user_data = NULL;
 
 	func(input, user_data);
 
+	if (prompt) {
+		prompt_input(prompt->str, prompt->func, prompt->user_data);
+		prompt_free(prompt);
+	}
+
 	return 0;
 }
 
@@ -1070,6 +1116,7 @@ done:
 	rl_init();
 
 	data.init = true;
+	data.prompts = queue_new();
 }
 
 static void rl_cleanup(void)
@@ -1118,6 +1165,9 @@ void bt_shell_cleanup(void)
 
 	rl_cleanup();
 
+	queue_destroy(data.prompts, prompt_free);
+	data.prompts = NULL;
+
 	data.init = false;
 	free(data.name);
 }
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH BlueZ] shell: Allow multiple prompt inputs
  2019-02-22 11:42 [PATCH BlueZ] shell: Allow multiple prompt inputs Luiz Augusto von Dentz
@ 2019-02-25 12:24 ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2019-02-25 12:24 UTC (permalink / raw)
  To: linux-bluetooth

Hi,
On Fri, Feb 22, 2019 at 1:42 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This allow queueing input prompts so that the application don't have to
> queue themselves.
> ---
>  src/shared/shell.c | 66 ++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 58 insertions(+), 8 deletions(-)
>
> diff --git a/src/shared/shell.c b/src/shared/shell.c
> index 709d20556..d7fbf46aa 100644
> --- a/src/shared/shell.c
> +++ b/src/shared/shell.c
> @@ -66,6 +66,12 @@ struct bt_shell_env {
>
>  static char *cmplt = "help";
>
> +struct bt_shell_prompt_input {
> +       char *str;
> +       bt_shell_prompt_input_func func;
> +       void *user_data;
> +};
> +
>  static struct {
>         bool init;
>         char *name;
> @@ -81,6 +87,8 @@ static struct {
>         bt_shell_prompt_input_func saved_func;
>         void *saved_user_data;
>
> +       struct queue *prompts;
> +
>         const struct bt_shell_menu *menu;
>         const struct bt_shell_menu *main;
>         struct queue *submenus;
> @@ -560,6 +568,17 @@ void bt_shell_usage()
>                                         data.exec->arg ? data.exec->arg : "");
>  }
>
> +static void prompt_input(const char *str, bt_shell_prompt_input_func func,
> +                                                       void *user_data)
> +{
> +       data.saved_prompt = true;
> +       data.saved_func = func;
> +       data.saved_user_data = user_data;
> +
> +       rl_save_prompt();
> +       bt_shell_set_prompt(str);
> +}
> +
>  void bt_shell_prompt_input(const char *label, const char *msg,
>                         bt_shell_prompt_input_func func, void *user_data)
>  {
> @@ -568,25 +587,43 @@ void bt_shell_prompt_input(const char *label, const char *msg,
>         if (!data.init || data.mode)
>                 return;
>
> -       /* Normal use should not prompt for user input to the value a second
> -        * time before it releases the prompt, but we take a safe action. */
> -       if (data.saved_prompt)
> +       if (data.saved_prompt) {
> +               struct bt_shell_prompt_input *prompt;
> +
> +               prompt = new0(struct bt_shell_prompt_input, 1);
> +
> +               if (asprintf(&prompt->str, "[%s] %s ", label, msg) < 0) {
> +                       free(prompt);
> +                       return;
> +               }
> +
> +               prompt->func = func;
> +               prompt->user_data = user_data;
> +
> +               queue_push_tail(data.prompts, prompt);
> +
>                 return;
> +       }
>
>         if (asprintf(&str, "[%s] %s ", label, msg) < 0)
>                 return;
>
> -       data.saved_prompt = true;
> -       data.saved_func = func;
> -       data.saved_user_data = user_data;
> +       prompt_input(str, func, user_data);
>
> -       rl_save_prompt();
> -       bt_shell_set_prompt(str);
>         free(str);
>  }
>
> +static void prompt_free(void *data)
> +{
> +       struct bt_shell_prompt_input *prompt = data;
> +
> +       free(prompt->str);
> +       free(prompt);
> +}
> +
>  int bt_shell_release_prompt(const char *input)
>  {
> +       struct bt_shell_prompt_input *prompt;
>         bt_shell_prompt_input_func func;
>         void *user_data;
>
> @@ -600,11 +637,20 @@ int bt_shell_release_prompt(const char *input)
>         func = data.saved_func;
>         user_data = data.saved_user_data;
>
> +       prompt = queue_pop_head(data.prompts);
> +       if (prompt)
> +               data.saved_prompt = true;
> +
>         data.saved_func = NULL;
>         data.saved_user_data = NULL;
>
>         func(input, user_data);
>
> +       if (prompt) {
> +               prompt_input(prompt->str, prompt->func, prompt->user_data);
> +               prompt_free(prompt);
> +       }
> +
>         return 0;
>  }
>
> @@ -1070,6 +1116,7 @@ done:
>         rl_init();
>
>         data.init = true;
> +       data.prompts = queue_new();
>  }
>
>  static void rl_cleanup(void)
> @@ -1118,6 +1165,9 @@ void bt_shell_cleanup(void)
>
>         rl_cleanup();
>
> +       queue_destroy(data.prompts, prompt_free);
> +       data.prompts = NULL;
> +
>         data.init = false;
>         free(data.name);
>  }
> --
> 2.17.2

Applied.

-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-02-25 12:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-22 11:42 [PATCH BlueZ] shell: Allow multiple prompt inputs Luiz Augusto von Dentz
2019-02-25 12:24 ` Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).