On Sun, 30 Mar 2014 11:58:24 +0100 Hani Benhabiles <kroo...@gmail.com> wrote:
> Convert object_add and object_del commands to use the new callback. > > Signed-off-by: Hani Benhabiles <h...@linux.com> > --- > hmp-commands.hx | 2 ++ > hmp.h | 3 +++ > monitor.c | 19 +++++++++++++------ > 3 files changed, 18 insertions(+), 6 deletions(-) > > diff --git a/hmp-commands.hx b/hmp-commands.hx > index 6bf4797..1b382b6 100644 > --- a/hmp-commands.hx > +++ b/hmp-commands.hx > @@ -1254,6 +1254,7 @@ ETEXI > .params = "[qom-type=]type,id=str[,prop=value][,...]", > .help = "create QOM object", > .mhandler.cmd = hmp_object_add, > + .command_completion = object_add_completion, > }, > > STEXI > @@ -1268,6 +1269,7 @@ ETEXI > .params = "id", > .help = "destroy QOM object", > .mhandler.cmd = hmp_object_del, > + .command_completion = object_del_completion, > }, > > STEXI > diff --git a/hmp.h b/hmp.h > index ed58f0e..2f2c059 100644 > --- a/hmp.h > +++ b/hmp.h > @@ -15,6 +15,7 @@ > #define HMP_H > > #include "qemu-common.h" > +#include "qemu/readline.h" > #include "qapi-types.h" > #include "qapi/qmp/qdict.h" > > @@ -92,5 +93,7 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict); > void hmp_cpu_add(Monitor *mon, const QDict *qdict); > void hmp_object_add(Monitor *mon, const QDict *qdict); > void hmp_object_del(Monitor *mon, const QDict *qdict); > +void object_add_completion(ReadLineState *rs, int nb_args, const char *str); > +void object_del_completion(ReadLineState *rs, int nb_args, const char *str); > > #endif > diff --git a/monitor.c b/monitor.c > index 342e83b..566a83f 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -137,6 +137,7 @@ typedef struct mon_cmd_t { > * used, and mhandler of 1st level plays the role of help function. > */ > struct mon_cmd_t *sub_table; > + void (*command_completion)(ReadLineState *rs, int nb_args, const char > *str); > } mon_cmd_t; > > /* file descriptors passed via SCM_RIGHTS */ > @@ -4298,11 +4299,15 @@ static void device_add_completion(ReadLineState *rs, > const char *str) > g_slist_free(list); > } > > -static void object_add_completion(ReadLineState *rs, const char *str) > +void object_add_completion(ReadLineState *rs, int nb_args, const char *str) > { > GSList *list, *elt; > size_t len; > > + if (nb_args != 2) { > + return; > + } > + > len = strlen(str); > readline_set_completion_index(rs, len); > list = elt = object_class_get_list(TYPE_USER_CREATABLE, false); > @@ -4337,11 +4342,14 @@ static void device_del_completion(ReadLineState *rs, > BusState *bus, > } > } > > -static void object_del_completion(ReadLineState *rs, const char *str) > +void object_del_completion(ReadLineState *rs, int nb_args, const char *str) > { > ObjectPropertyInfoList *list, *start; > size_t len; > > + if (nb_args != 2) { > + return; > + } > len = strlen(str); > readline_set_completion_index(rs, len); > > @@ -4395,6 +4403,9 @@ static void monitor_find_completion_by_table(Monitor > *mon, > return monitor_find_completion_by_table(mon, cmd->sub_table, > &args[1], nb_args - 1); > } > + if (cmd->command_completion) { > + return cmd->command_completion(mon->rs, nb_args, args[nb_args - > 1]); > + } Honest question: have you checked if this plays well if the recursive call to monitor_find_completion_by_table()? > > ptype = next_arg_type(cmd->args_type); > for(i = 0; i < nb_args - 2; i++) { > @@ -4424,8 +4435,6 @@ static void monitor_find_completion_by_table(Monitor > *mon, > case 'O': > if (!strcmp(cmd->name, "device_add") && nb_args == 2) { > device_add_completion(mon->rs, str); > - } else if (!strcmp(cmd->name, "object_add") && nb_args == 2) { > - object_add_completion(mon->rs, str); > } > break; > case 's': > @@ -4445,8 +4454,6 @@ static void monitor_find_completion_by_table(Monitor > *mon, > size_t len = strlen(str); > readline_set_completion_index(mon->rs, len); > device_del_completion(mon->rs, sysbus_get_default(), str, > len); > - } else if (!strcmp(cmd->name, "object_del") && nb_args == 2) { > - object_del_completion(mon->rs, str); > } > break; > default: