Re: [PATCH BlueZ] shell: Add exists callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Mon, Dec 11, 2017 at 11:04 AM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> This adds a callback to check if the menu exists at runtime.
> ---
>  src/shared/shell.c | 58 ++++++++++++++++++++++++++++++++----------------------
>  src/shared/shell.h |  4 ++++
>  2 files changed, 39 insertions(+), 23 deletions(-)
>
> diff --git a/src/shared/shell.c b/src/shared/shell.c
> index f20c74901..3aa49597c 100644
> --- a/src/shared/shell.c
> +++ b/src/shared/shell.c
> @@ -145,6 +145,17 @@ static void cmd_menu(int argc, char *argv[])
>         shell_print_menu();
>  }
>
> +static bool cmd_menu_exists(const struct bt_shell_menu *menu)
> +{
> +       /* Skip menu command if not on main menu or if there are no
> +        * submenus.
> +        */
> +       if (menu != data.main || queue_isempty(data.submenus))
> +               return false;
> +
> +       return true;
> +}
> +
>  static void cmd_back(int argc, char *argv[])
>  {
>         if (data.menu == data.main) {
> @@ -157,10 +168,21 @@ static void cmd_back(int argc, char *argv[])
>         shell_print_menu();
>  }
>
> +static bool cmd_back_exists(const struct bt_shell_menu *menu)
> +{
> +       /* Skip back command if on main menu */
> +       if (menu == data.main)
> +               return false;
> +
> +       return true;
> +}
> +
>  static const struct bt_shell_menu_entry default_menu[] = {
> -       { "back",         NULL,       cmd_back, "Return to main menu" },
> +       { "back",         NULL,       cmd_back, "Return to main menu", NULL,
> +                                                       NULL, cmd_back_exists },
>         { "menu",         "<name>",   cmd_menu, "Select submenu",
> -                                                       menu_generator },
> +                                                       menu_generator, NULL,
> +                                                       cmd_menu_exists},
>         { "version",      NULL,       cmd_version, "Display version" },
>         { "quit",         NULL,       cmd_quit, "Quit program" },
>         { "exit",         NULL,       cmd_quit, "Quit program" },
> @@ -169,22 +191,6 @@ static const struct bt_shell_menu_entry default_menu[] = {
>         { }
>  };
>
> -static bool command_isskipped(const char *cmd)
> -{
> -       /* Skip menu command if not on main menu or if there are no
> -        * submenus.
> -        */
> -       if (!strcmp(cmd, "menu") &&
> -               (data.menu != data.main || queue_isempty(data.submenus)))
> -               return true;
> -
> -       /* Skip back command if on main menu */
> -       if (data.menu == data.main && !strcmp(cmd, "back"))
> -               return true;
> -
> -       return false;
> -}
> -
>  static void shell_print_menu(void)
>  {
>         const struct bt_shell_menu_entry *entry;
> @@ -211,7 +217,7 @@ static void shell_print_menu(void)
>         }
>
>         for (entry = default_menu; entry->cmd; entry++) {
> -               if (command_isskipped(entry->cmd))
> +               if (entry->exists && !entry->exists(data.menu))
>                         continue;
>
>                 print_menu(entry->cmd, entry->arg ? : "", entry->desc ? : "");
> @@ -490,16 +496,22 @@ done:
>  static char *find_cmd(const char *text,
>                         const struct bt_shell_menu_entry *entry, int *index)
>  {
> -       const char *cmd;
> +       const struct bt_shell_menu_entry *tmp;
>         int len;
>
>         len = strlen(text);
>
> -       while ((cmd = entry[*index].cmd)) {
> +       while ((tmp = &entry[*index])) {
>                 (*index)++;
>
> -               if (!strncmp(cmd, text, len) && !command_isskipped(cmd))
> -                       return strdup(cmd);
> +               if (!tmp->cmd)
> +                       break;
> +
> +               if (tmp->exists && !tmp->exists(data.menu))
> +                       continue;
> +
> +               if (!strncmp(tmp->cmd, text, len))
> +                       return strdup(tmp->cmd);
>         }
>
>         return NULL;
> diff --git a/src/shared/shell.h b/src/shared/shell.h
> index 2b9e918d6..5f86ed61e 100644
> --- a/src/shared/shell.h
> +++ b/src/shared/shell.h
> @@ -31,11 +31,14 @@
>  #define COLOR_BOLDWHITE        "\x1B[1;37m"
>  #define COLOR_HIGHLIGHT        "\x1B[1;39m"
>
> +struct bt_shell_menu;
> +
>  typedef void (*bt_shell_menu_cb_t)(int argc, char *argv[]);
>  typedef char * (*bt_shell_menu_gen_t)(const char *text, int state);
>  typedef void (*bt_shell_menu_disp_t) (char **matches, int num_matches,
>                                                         int max_length);
>  typedef void (*bt_shell_prompt_input_func) (const char *input, void *user_data);
> +typedef bool (*bt_shell_menu_exists_t) (const struct bt_shell_menu *menu);
>
>  struct bt_shell_menu_entry {
>         const char *cmd;
> @@ -44,6 +47,7 @@ struct bt_shell_menu_entry {
>         const char *desc;
>         bt_shell_menu_gen_t gen;
>         bt_shell_menu_disp_t disp;
> +       bt_shell_menu_exists_t exists;
>  };
>
>  struct bt_shell_menu {
> --
> 2.13.6

Applied.


-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux