All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.